Diff for /rpl/src/instructions_r6.c between versions 1.13 and 1.79

version 1.13, 2010/07/14 14:19:38 version 1.79, 2020/01/10 11:15:48
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.18    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 109  instruction_recv(struct_processus *s_eta Line 109  instruction_recv(struct_processus *s_eta
          * de la structure présente dans la pile opérationnelle.           * de la structure présente dans la pile opérationnelle.
          */           */
   
         if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)          if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus))
                   != 0)
         {          {
             (*s_etat_processus).erreur_systeme_processus_fils =              (*s_etat_processus).erreur_systeme_processus_fils =
                     d_es_processus;                      d_es_processus;
Line 207  instruction_recv(struct_processus *s_eta Line 208  instruction_recv(struct_processus *s_eta
   
         if (nombre_donnees == -1)          if (nombre_donnees == -1)
         {          {
             if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)              if (pthread_mutex_unlock(&((*s_etat_processus)
                       .mutex_pile_processus)) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme_processus_fils =                  (*s_etat_processus).erreur_systeme_processus_fils =
                         d_es_processus;                          d_es_processus;
Line 223  instruction_recv(struct_processus *s_eta Line 225  instruction_recv(struct_processus *s_eta
              * On empile une valeur nulle               * On empile une valeur nulle
              */               */
   
             if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)              if (pthread_mutex_unlock(&((*s_etat_processus)
                       .mutex_pile_processus)) != 0)
             {              {
                 (*s_etat_processus).erreur_systeme_processus_fils =                  (*s_etat_processus).erreur_systeme_processus_fils =
                         d_es_processus;                          d_es_processus;
Line 266  instruction_recv(struct_processus *s_eta Line 269  instruction_recv(struct_processus *s_eta
         }          }
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)              if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
         {  
             (*s_etat_processus).erreur_systeme = d_es_processus;  
             return;  
         }  
 #       else  #       else
         if (sem_post((*s_etat_processus).semaphore_fork) != 0)              if (sem_post((*s_etat_processus).semaphore_fork) != 0)
   #       endif
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
             return;              return;
         }          }
 #       endif  
   
         if ((s_objet_resultat = lecture_pipe(s_etat_processus,          if ((s_objet_resultat = lecture_pipe(s_etat_processus,
                 (*(*((struct_processus_fils *) (*s_objet_argument).objet))                  (*(*((struct_processus_fils *) (*s_objet_argument).objet))
                 .thread).pipe_objets[0])) == NULL)                  .thread).pipe_objets[0])) == NULL)
         {          {
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                  while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #           else  #           else
             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)                  while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
 #           endif  #           endif
             {              {
                 if (errno != EINTR)                  if (errno != EINTR)
Line 313  instruction_recv(struct_processus *s_eta Line 312  instruction_recv(struct_processus *s_eta
                 profilage(s_etat_processus, NULL);                  profilage(s_etat_processus, NULL);
             }              }
   
             pthread_mutex_unlock(&((*s_etat_processus).mutex));              pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
             return;              return;
         }          }
   
 #       ifndef SEMAPHORES_NOMMES  
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)  
 #       else  
         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)  
 #       endif  
         {  
             if (errno != EINTR)  
             {  
                 (*s_etat_processus).erreur_systeme = d_es_processus;  
                 return;  
             }  
         }  
   
         if (pthread_mutex_lock(&((*(*((struct_processus_fils *)          if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
                 (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0)                  (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0)
         {          {
Line 347  instruction_recv(struct_processus *s_eta Line 333  instruction_recv(struct_processus *s_eta
             return;              return;
         }          }
   
           if (pthread_mutex_lock(&mutex_sigaction) != 0)
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
               return;
           }
   
         action.sa_handler = SIG_IGN;          action.sa_handler = SIG_IGN;
         action.sa_flags = SA_ONSTACK;          action.sa_flags = 0;
   
         if (sigaction(SIGPIPE, &action, &registre) != 0)          if (sigaction(SIGPIPE, &action, &registre) != 0)
         {          {
Line 364  instruction_recv(struct_processus *s_eta Line 356  instruction_recv(struct_processus *s_eta
                         = registre_stop;                          = registre_stop;
             }              }
   
             pthread_mutex_unlock(&((*s_etat_processus).mutex));              pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
   
             if ((*s_etat_processus).profilage == d_vrai)              if ((*s_etat_processus).profilage == d_vrai)
             {              {
                 profilage(s_etat_processus, NULL);                  profilage(s_etat_processus, NULL);
             }              }
   
               pthread_mutex_unlock(&mutex_sigaction);
             (*s_etat_processus).erreur_systeme = d_es_signal;              (*s_etat_processus).erreur_systeme = d_es_signal;
             return;              return;
         }          }
   
 #       ifndef SEMAPHORES_NOMMES  
         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)  
 #       else  
         if (sem_post((*s_etat_processus).semaphore_fork) != 0)  
 #       endif  
         {  
             (*s_etat_processus).erreur_systeme = d_es_processus;  
             return;  
         }  
   
         while((longueur_ecriture = write_atomic(s_etat_processus,          while((longueur_ecriture = write_atomic(s_etat_processus,
                 (*(*((struct_processus_fils *) (*(*l_element_courant)                  (*(*((struct_processus_fils *) (*(*l_element_courant)
                 .donnee).objet)).thread).pipe_nombre_injections[1], "+",                  .donnee).objet)).thread).pipe_nombre_injections[1], "+",
Line 398  instruction_recv(struct_processus *s_eta Line 381  instruction_recv(struct_processus *s_eta
         }          }
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)              while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #       else  #       else
         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)              while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
 #       endif  #       endif
         {          {
             if (errno != EINTR)              if (errno != EINTR)
             {              {
                   pthread_mutex_unlock(&mutex_sigaction);
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
Line 428  instruction_recv(struct_processus *s_eta Line 412  instruction_recv(struct_processus *s_eta
   
         if (sigaction(SIGPIPE, &registre, NULL) != 0)          if (sigaction(SIGPIPE, &registre, NULL) != 0)
         {          {
             pthread_mutex_unlock(&((*s_etat_processus).mutex));              pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
   
             (*s_etat_processus).erreur_systeme = d_es_signal;              (*s_etat_processus).erreur_systeme = d_es_signal;
             return;              return;
         }          }
   
         if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)          if (pthread_mutex_unlock(&mutex_sigaction) != 0)
           {
               (*s_etat_processus).erreur_systeme = d_es_processus;
               return;
           }
   
           if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus))
                   != 0)
         {          {
             (*s_etat_processus).erreur_systeme_processus_fils =              (*s_etat_processus).erreur_systeme_processus_fils =
                     d_es_processus;                      d_es_processus;
Line 496  instruction_row_fleche(struct_processus Line 487  instruction_row_fleche(struct_processus
     struct_objet                *s_objet;      struct_objet                *s_objet;
     struct_objet                *s_objet_elementaire;      struct_objet                *s_objet_elementaire;
   
     unsigned long               i;      integer8                    i;
     unsigned long               j;      integer8                    j;
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
   
Line 569  instruction_row_fleche(struct_processus Line 560  instruction_row_fleche(struct_processus
             }              }
   
             if ((((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)              if ((((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)
                     .objet)).tableau)[0] = malloc((*((struct_matrice *)                      .objet)).tableau)[0] = malloc(((size_t)
                     (*s_objet_elementaire).objet)).nombre_colonnes *                      (*((struct_matrice *) (*s_objet_elementaire).objet))
                     sizeof(integer8))) == NULL)                      .nombre_colonnes) * sizeof(integer8))) == NULL)
             {              {
                 (*s_etat_processus).erreur_systeme =                  (*s_etat_processus).erreur_systeme =
                         d_es_allocation_memoire;                          d_es_allocation_memoire;
Line 621  instruction_row_fleche(struct_processus Line 612  instruction_row_fleche(struct_processus
             }              }
   
             if ((((real8 **) (*((struct_matrice *) (*s_objet_elementaire)              if ((((real8 **) (*((struct_matrice *) (*s_objet_elementaire)
                     .objet)).tableau)[0] = malloc((*((struct_matrice *)                      .objet)).tableau)[0] = malloc(((size_t)
                     (*s_objet_elementaire).objet)).nombre_colonnes *                      (*((struct_matrice *) (*s_objet_elementaire).objet))
                     sizeof(real8))) == NULL)                      .nombre_colonnes) * sizeof(real8))) == NULL)
             {              {
                 (*s_etat_processus).erreur_systeme =                  (*s_etat_processus).erreur_systeme =
                         d_es_allocation_memoire;                          d_es_allocation_memoire;
Line 673  instruction_row_fleche(struct_processus Line 664  instruction_row_fleche(struct_processus
             }              }
   
             if ((((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)              if ((((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
                     .objet)).tableau)[0] = malloc((*((struct_matrice *)                      .objet)).tableau)[0] = malloc(((size_t)
                     (*s_objet_elementaire).objet)).nombre_colonnes *                      (*((struct_matrice *) (*s_objet_elementaire).objet))
                     sizeof(complex16))) == NULL)                      .nombre_colonnes) * sizeof(complex16))) == NULL)
             {              {
                 (*s_etat_processus).erreur_systeme =                  (*s_etat_processus).erreur_systeme =
                         d_es_allocation_memoire;                          d_es_allocation_memoire;
Line 797  instruction_rdate(struct_processus *s_et Line 788  instruction_rdate(struct_processus *s_et
     if ((*s_objet_argument).type == INT)      if ((*s_objet_argument).type == INT)
     {      {
         gettimeofday(&horodatage, NULL);          gettimeofday(&horodatage, NULL);
         horodatage.tv_sec += (*((integer8 *) (*s_objet_argument).objet));          horodatage.tv_sec += (time_t) (*((integer8 *)
                   (*s_objet_argument).objet));
   
         if (horodatage.tv_sec < 0)          if (horodatage.tv_sec < 0)
         {          {
Line 1209  instruction_rdgn(struct_processus *s_eta Line 1201  instruction_rdgn(struct_processus *s_eta
     long                        dernier;      long                        dernier;
     long                        i;      long                        i;
     long                        j;      long                        j;
       long                        nombre_types;
     long                        premier;      long                        premier;
   
     struct_objet                *s_objet_argument;      struct_objet                *s_objet_argument;
Line 1218  instruction_rdgn(struct_processus *s_eta Line 1211  instruction_rdgn(struct_processus *s_eta
     unsigned char               *requete;      unsigned char               *requete;
     unsigned char               **types_generateurs;      unsigned char               **types_generateurs;
   
     unsigned long               nombre_types;  
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
   
     types = gsl_rng_types_setup();      types = gsl_rng_types_setup();
Line 1254  instruction_rdgn(struct_processus *s_eta Line 1245  instruction_rdgn(struct_processus *s_eta
         for(nombre_types = 0, type_courant = types;          for(nombre_types = 0, type_courant = types;
                 (*type_courant) != NULL; type_courant++, nombre_types++);                  (*type_courant) != NULL; type_courant++, nombre_types++);
   
         if ((types_generateurs = malloc(nombre_types * sizeof(unsigned char *)))          if ((types_generateurs = malloc(((size_t) nombre_types) *
                 == NULL)                  sizeof(unsigned char *))) == NULL)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             return;              return;
Line 1320  instruction_rdgn(struct_processus *s_eta Line 1311  instruction_rdgn(struct_processus *s_eta
             premier = j;              premier = j;
         }          }
   
         for(i = 0; i < (long) nombre_types; i++)          for(i = 0; i < nombre_types; i++)
         {          {
             printf("  - %s\n", types_generateurs[i]);              printf("  - %s\n", types_generateurs[i]);
             free(types_generateurs[i]);              free(types_generateurs[i]);
Line 1352  instruction_rdgn(struct_processus *s_eta Line 1343  instruction_rdgn(struct_processus *s_eta
   
     if ((*s_objet_argument).type == CHN)      if ((*s_objet_argument).type == CHN)
     {      {
         if ((requete = conversion_majuscule((unsigned char *)          if ((requete = conversion_majuscule(s_etat_processus, (unsigned char *)
                 (*s_objet_argument).objet)) == NULL)                  (*s_objet_argument).objet)) == NULL)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
Line 1388  instruction_rdgn(struct_processus *s_eta Line 1379  instruction_rdgn(struct_processus *s_eta
             else              else
             {              {
                 if (((*s_objet_resultat).objet = conversion_majuscule(                  if (((*s_objet_resultat).objet = conversion_majuscule(
                         (unsigned char *) gsl_rng_name(                          s_etat_processus, (unsigned char *) gsl_rng_name(
                         (*s_etat_processus).generateur_aleatoire))) == NULL)                          (*s_etat_processus).generateur_aleatoire))) == NULL)
                 {                  {
                     (*s_etat_processus).erreur_systeme =                      (*s_etat_processus).erreur_systeme =
Line 1642  instruction_recode(struct_processus *s_e Line 1633  instruction_recode(struct_processus *s_e
             ((*s_objet_argument_2).type == CHN) &&              ((*s_objet_argument_2).type == CHN) &&
             ((*s_objet_argument_3).type == CHN))              ((*s_objet_argument_3).type == CHN))
     {      {
         if ((encodage_source = conversion_majuscule((unsigned char *)          if ((encodage_source = conversion_majuscule(s_etat_processus,
                 (*s_objet_argument_2).objet)) == NULL)                  (unsigned char *) (*s_objet_argument_2).objet)) == NULL)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             return;              return;
         }          }
   
         if ((encodage_destination = conversion_majuscule((unsigned char *)          if ((encodage_destination = conversion_majuscule(s_etat_processus,
                 (*s_objet_argument_1).objet)) == NULL)                  (unsigned char *) (*s_objet_argument_1).objet)) == NULL)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             return;              return;
Line 1718  instruction_recode(struct_processus *s_e Line 1709  instruction_recode(struct_processus *s_e
 void  void
 instruction_repl(struct_processus *s_etat_processus)  instruction_repl(struct_processus *s_etat_processus)
 {  {
       integer8                        difference;
       integer8                        difference_ecriture;
       integer8                        difference_lecture;
       integer8                        nombre_occurrences;
     integer8                        position;      integer8                        position;
   
     long                            difference;  
     long                            difference_ecriture;  
     long                            difference_lecture;  
     long                            nombre_occurrences;  
   
     struct_liste_chainee            *l_element_a_supprimer;      struct_liste_chainee            *l_element_a_supprimer;
     struct_liste_chainee            *l_element_courant;      struct_liste_chainee            *l_element_courant;
     struct_liste_chainee            *l_element_courant_2;      struct_liste_chainee            *l_element_courant_2;
Line 1843  instruction_repl(struct_processus *s_eta Line 1833  instruction_repl(struct_processus *s_eta
         // Différence est positive si la nouvelle chaîne est plus longue          // Différence est positive si la nouvelle chaîne est plus longue
         // que la chaîne originelle.          // que la chaîne originelle.
   
         difference = strlen((unsigned char *) (*s_objet_argument_1).objet)          difference = ((integer8) strlen((unsigned char *) (*s_objet_argument_1)
                 - strlen((unsigned char *) (*s_objet_argument_2).objet);                  .objet)) - ((integer8) strlen((unsigned char *)
                   (*s_objet_argument_2).objet));
   
         if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)          if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
         {          {
Line 1853  instruction_repl(struct_processus *s_eta Line 1844  instruction_repl(struct_processus *s_eta
         }          }
   
         if (((*s_objet_resultat).objet = malloc((strlen((unsigned char *)          if (((*s_objet_resultat).objet = malloc((strlen((unsigned char *)
                 (*s_objet_argument_3).objet) + (nombre_occurrences *                  (*s_objet_argument_3).objet) + ((size_t) (nombre_occurrences *
                 difference) + 1) * sizeof(unsigned char))) == NULL)                  difference)) + 1) * sizeof(unsigned char))) == NULL)
         {          {
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             return;              return;
Line 1862  instruction_repl(struct_processus *s_eta Line 1853  instruction_repl(struct_processus *s_eta
   
         pointeur_lecture = (unsigned char *) (*s_objet_argument_3).objet;          pointeur_lecture = (unsigned char *) (*s_objet_argument_3).objet;
         pointeur_ecriture = (unsigned char *) (*s_objet_resultat).objet;          pointeur_ecriture = (unsigned char *) (*s_objet_resultat).objet;
         difference_lecture = strlen((unsigned char *)          difference_lecture = (integer8) strlen((unsigned char *)
                 (*s_objet_argument_2).objet);                  (*s_objet_argument_2).objet);
         difference_ecriture = strlen((unsigned char *)          difference_ecriture = (integer8) strlen((unsigned char *)
                 (*s_objet_argument_1).objet);                  (*s_objet_argument_1).objet);
   
         for(;;)          for(;;)
Line 1882  instruction_repl(struct_processus *s_eta Line 1873  instruction_repl(struct_processus *s_eta
             }              }
   
             strncpy(ancien_pointeur_ecriture, ancien_pointeur_lecture,              strncpy(ancien_pointeur_ecriture, ancien_pointeur_lecture,
                     pointeur_lecture - ancien_pointeur_lecture);                      (size_t) (pointeur_lecture - ancien_pointeur_lecture));
             strcpy(ancien_pointeur_ecriture +              strcpy(ancien_pointeur_ecriture +
                     (pointeur_lecture - ancien_pointeur_lecture),                      (pointeur_lecture - ancien_pointeur_lecture),
                     (unsigned char *) (*s_objet_argument_1).objet);                      (unsigned char *) (*s_objet_argument_1).objet);

Removed from v.1.13  
changed lines
  Added in v.1.79


CVSweb interface <joel.bertrand@systella.fr>