Diff for /rpl/src/instructions_u1.c between versions 1.3 and 1.72

version 1.3, 2010/02/10 10:14:25 version 1.72, 2020/01/10 11:15:49
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.11    RPL/2 (R) version 4.1.32
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2020 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 20 Line 20
 */  */
   
   
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
   
 /*  /*
Line 689  instruction_utpt(struct_processus *s_eta Line 689  instruction_utpt(struct_processus *s_eta
 void  void
 instruction_use(struct_processus *s_etat_processus)  instruction_use(struct_processus *s_etat_processus)
 {  {
     logical1                        erreur;  
     logical1                        existence;      logical1                        existence;
     logical1                        ouverture;      logical1                        ouverture;
   
Line 711  instruction_use(struct_processus *s_etat Line 710  instruction_use(struct_processus *s_etat
         if ((*s_etat_processus).langue == 'F')          if ((*s_etat_processus).langue == 'F')
         {          {
             printf("(insertion d'une bibliothèque dynamique)\n\n");              printf("(insertion d'une bibliothèque dynamique)\n\n");
             printf("Si le chemin ne comprend pas de '/', la bibliothèque "              printf("Si le chemin ne commence pas par '/', la bibliothèque "
                     "est recherchée\n");                      "est recherchée\n");
             printf("successivement dans le répertoire courant puis dans %s."              printf("successivement dans le répertoire courant puis dans %s."
                     "\n\n", d_exec_path);                      "\n\n", d_exec_path);
Line 719  instruction_use(struct_processus *s_etat Line 718  instruction_use(struct_processus *s_etat
         else          else
         {          {
             printf("(insert a shared library)\n\n");              printf("(insert a shared library)\n\n");
             printf("If this path does not include '/', RPL/2 tries to find "              printf("If this path does not begin with '/', RPL/2 tries to find "
                     "it in current\n");                      "it in current\n");
             printf("directory or %s in this order.\n\n", d_exec_path);              printf("directory or %s in this order.\n\n", d_exec_path);
         }          }
Line 753  instruction_use(struct_processus *s_etat Line 752  instruction_use(struct_processus *s_etat
     if ((*s_objet_argument).type == CHN)      if ((*s_objet_argument).type == CHN)
     {      {
         /*          /*
          * Si le nom contient un '/', il est traité comme un chemin           * Si le nom commence par un '/', il est traité comme un chemin
          * absolu. Dans le cas contraire, on essaye successivement           * absolu. Dans le cas contraire, on essaye successivement
          * './' puis le répertoire lib de l'installation du langage.           * './' puis le répertoire lib de l'installation du langage.
          */           */
   
         if (index((unsigned char *) (*s_objet_argument).objet, '/') == NULL)          if (((unsigned char *) (*s_objet_argument).objet)[0] != '/')
         {          {
             if ((tampon = malloc((strlen((unsigned char *) (*s_objet_argument)              if ((tampon = malloc((strlen((unsigned char *) (*s_objet_argument)
                     .objet) + 3) * sizeof(unsigned char))) == NULL)                      .objet) + 3) * sizeof(unsigned char))) == NULL)
Line 770  instruction_use(struct_processus *s_etat Line 769  instruction_use(struct_processus *s_etat
             sprintf(tampon, "./%s", (unsigned char *)              sprintf(tampon, "./%s", (unsigned char *)
                     (*s_objet_argument).objet);                      (*s_objet_argument).objet);
   
             erreur = caracteristiques_fichier(s_etat_processus, tampon,              caracteristiques_fichier(s_etat_processus, tampon,
                     &existence, &ouverture, &unite);                      &existence, &ouverture, &unite);
   
             if (existence != d_faux)              if (existence != d_faux)
Line 782  instruction_use(struct_processus *s_etat Line 781  instruction_use(struct_processus *s_etat
             {              {
                 free(tampon);                  free(tampon);
   
                 if ((tampon = malloc((strlen((unsigned char *)                  if ((*s_etat_processus).rpl_home == NULL)
                         (*s_objet_argument).objet) + strlen(d_exec_path) + 7)  
                         * sizeof(unsigned char))) == NULL)  
                 {                  {
                     (*s_etat_processus).erreur_systeme =                      if ((tampon = malloc((strlen((unsigned char *)
                             d_es_allocation_memoire;                              (*s_objet_argument).objet) + strlen(d_exec_path)
                     return;                              + 7) * sizeof(unsigned char))) == NULL)
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_allocation_memoire;
                           return;
                       }
   
                       sprintf(tampon, "/%s/lib/%s", d_exec_path, (unsigned char *)
                               (*s_objet_argument).objet);
                   }
                   else
                   {
                       if ((tampon = malloc((strlen((unsigned char *)
                               (*s_objet_argument).objet) +
                               strlen((*s_etat_processus).rpl_home)
                               + 7) * sizeof(unsigned char))) == NULL)
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_allocation_memoire;
                           return;
                       }
   
                       sprintf(tampon, "/%s/lib/%s", (*s_etat_processus).rpl_home,
                               (unsigned char *) (*s_objet_argument).objet);
                 }                  }
   
                 sprintf(tampon, "/%s/lib/%s", d_exec_path, (unsigned char *)                  // Si la chaîne commence par '//', on supprime un '/'.
                         (*s_objet_argument).objet);                  // tampon[1] existe toujours.
   
                   if (tampon[1] == '/')
                   {
                       memmove(tampon, tampon + 1, strlen(tampon));
                   }
   
                 caracteristiques_fichier(s_etat_processus, tampon,                  caracteristiques_fichier(s_etat_processus, tampon,
                         &existence, &ouverture, &unite);                          &existence, &ouverture, &unite);
Line 1059  instruction_uchol(struct_processus *s_et Line 1084  instruction_uchol(struct_processus *s_et
 void  void
 instruction_unlock(struct_processus *s_etat_processus)  instruction_unlock(struct_processus *s_etat_processus)
 {  {
     file                        *descripteur;  
   
     struct flock                lock;      struct flock                lock;
   
       struct_descripteur_fichier  *descripteur;
   
     struct_objet                *s_objet;      struct_objet                *s_objet;
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
Line 1119  instruction_unlock(struct_processus *s_e Line 1144  instruction_unlock(struct_processus *s_e
             return;              return;
         }          }
   
         if (fcntl(fileno(descripteur), F_SETLK, &lock) == -1)          if (fcntl(fileno((*descripteur).descripteur_c), F_SETLK, &lock)
                   == -1)
         {          {
             liberation(s_etat_processus, s_objet);              liberation(s_etat_processus, s_objet);
   
Line 1210  instruction_unprotect(struct_processus * Line 1236  instruction_unprotect(struct_processus *
             return;              return;
         }          }
   
         ((*s_etat_processus).s_liste_variables[(*s_etat_processus)          (*(*s_etat_processus).pointeur_variable_courante)
                 .position_variable_courante]).variable_verrouillee = d_faux;                  .variable_verrouillee = d_faux;
     }      }
     else if ((*s_objet).type == LST)      else if ((*s_objet).type == LST)
     {      {
Line 1238  instruction_unprotect(struct_processus * Line 1264  instruction_unprotect(struct_processus *
                 return;                  return;
             }              }
   
             ((*s_etat_processus).s_liste_variables[(*s_etat_processus)              (*(*s_etat_processus).pointeur_variable_courante)
                     .position_variable_courante]).variable_verrouillee = d_faux;                      .variable_verrouillee = d_faux;
   
             l_element_courant = (*l_element_courant).suivant;              l_element_courant = (*l_element_courant).suivant;
         }          }
Line 1276  instruction_ucase(struct_processus *s_et Line 1302  instruction_ucase(struct_processus *s_et
     struct_objet            *s_objet_argument;      struct_objet            *s_objet_argument;
     struct_objet            *s_objet_resultat;      struct_objet            *s_objet_resultat;
   
     unsigned char           *ptr;  
     unsigned char           registre;  
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
   
     if ((*s_etat_processus).affichage_arguments == 'Y')      if ((*s_etat_processus).affichage_arguments == 'Y')
Line 1328  instruction_ucase(struct_processus *s_et Line 1351  instruction_ucase(struct_processus *s_et
         }          }
   
         liberation(s_etat_processus, s_objet_argument);          liberation(s_etat_processus, s_objet_argument);
         ptr = (unsigned char *) (*s_objet_resultat).objet;          conversion_chaine(s_etat_processus, (unsigned char *)
                   (*s_objet_resultat).objet, 'M');
         while((*ptr) != d_code_fin_chaine)  
         {  
             registre = toupper((*ptr));  
   
             if (tolower(registre) == (*ptr))  
             {  
                 (*ptr) = registre;  
             }  
   
             ptr++;  
         }  
   
         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),          if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                 s_objet_resultat) == d_erreur)                  s_objet_resultat) == d_erreur)

Removed from v.1.3  
changed lines
  Added in v.1.72


CVSweb interface <joel.bertrand@systella.fr>