Diff for /rpl/src/transliteration.c between versions 1.17 and 1.61

version 1.17, 2010/08/13 21:00:37 version 1.61, 2012/12/19 09:58:29
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.18    RPL/2 (R) version 4.1.12
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2012 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 90  reencodage(struct_processus *s_etat_proc Line 90  reencodage(struct_processus *s_etat_proc
     if ((transcodage = iconv_open(codage_sortie, codage_entree)) ==      if ((transcodage = iconv_open(codage_sortie, codage_entree)) ==
             (iconv_t) -1)              (iconv_t) -1)
     {      {
           // On affiche une erreur ici car la fonction d'affichage
           // de l'erreur utilise la macro printf() donc une
           // opération de translitération qui échouera elle aussi.
           // Le positionnement de l'erreur permet de sortir du programme.
   
           if ((*s_etat_processus).langue == 'F')
           {
               fprintf(stderr, "+++Erreur : Erreur de transcodage\n");
           }
           else
           {
               fprintf(stderr, "+++Error : Transcodage error\n");
           }
   
         (*s_etat_processus).erreur_execution = d_ex_erreur_transcodage;          (*s_etat_processus).erreur_execution = d_ex_erreur_transcodage;
         return(NULL);          return(NULL);
     }      }
Line 105  reencodage(struct_processus *s_etat_proc Line 119  reencodage(struct_processus *s_etat_proc
   
     chaine_sortie[0] = d_code_fin_chaine;      chaine_sortie[0] = d_code_fin_chaine;
   
     if ((buffer_sortie = malloc((d_LONGUEUR + 1) * sizeof(char))) == NULL)      if ((buffer_sortie = malloc((d_LONGUEUR + 1) * sizeof(unsigned char)))
               == NULL)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;          (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
         return(NULL);          return(NULL);
Line 126  reencodage(struct_processus *s_etat_proc Line 141  reencodage(struct_processus *s_etat_proc
                 free(buffer_sortie);                  free(buffer_sortie);
                 free(chaine_sortie);                  free(chaine_sortie);
   
                   // On affiche une erreur ici car la fonction d'affichage
                   // de l'erreur utilise la macro printf() donc une
                   // opération de translitération qui échouera elle aussi.
                   // Le positionnement de l'erreur permet de sortir du programme.
   
                   if ((*s_etat_processus).langue == 'F')
                   {
                       fprintf(stderr, "+++Erreur : Erreur de transcodage\n");
                   }
                   else
                   {
                       fprintf(stderr, "+++Error : Transcodage error\n");
                   }
   
                 (*s_etat_processus).erreur_execution = d_ex_erreur_transcodage;                  (*s_etat_processus).erreur_execution = d_ex_erreur_transcodage;
                 return(NULL);                  return(NULL);
             }              }
         }          }
   
         tampon = (unsigned char *) chaine_sortie;          tampon = chaine_sortie;
         (*pointeur) = d_code_fin_chaine;          (*pointeur) = d_code_fin_chaine;
   
         if ((chaine_sortie = malloc((strlen(tampon) + strlen(buffer_sortie) + 1)          if ((chaine_sortie = malloc((strlen(tampon) + strlen(buffer_sortie) + 1)
Line 158  reencodage(struct_processus *s_etat_proc Line 187  reencodage(struct_processus *s_etat_proc
 ================================================================================  ================================================================================
   Entrées :    Entrées :
 --------------------------------------------------------------------------------  --------------------------------------------------------------------------------
     Sorties :
 --------------------------------------------------------------------------------  --------------------------------------------------------------------------------
   iorties :  
   Effets de bord : néant    Effets de bord : néant
 ================================================================================  ================================================================================
 */  */
Line 175  localisation_courante(struct_processus * Line 204  localisation_courante(struct_processus *
     int                         pipes_sortie[2];      int                         pipes_sortie[2];
     int                         status;      int                         status;
   
     logical1                    drapeau_fin;  
   
     long                        i;      long                        i;
     long                        nombre_arguments;      long                        nombre_arguments;
   
     pid_t                       pid;      pid_t                       pid;
   
     sigset_t                    oldset;  
     sigset_t                    set;  
   
     struct sigaction            action_passee;      struct sigaction            action_passee;
   
     unsigned char               *tampon;      unsigned char               *tampon;
Line 216  localisation_courante(struct_processus * Line 240  localisation_courante(struct_processus *
     arguments[2] = NULL;      arguments[2] = NULL;
   
     nombre_arguments = 2;      nombre_arguments = 2;
     drapeau_fin = d_faux;  
   
     if (pipe(pipes_entree) != 0)      if (pipe(pipes_entree) != 0)
     {      {
Line 236  localisation_courante(struct_processus * Line 259  localisation_courante(struct_processus *
         return;          return;
     }      }
   
     sigfillset(&set);  
     pthread_sigmask(SIG_BLOCK, &set, &oldset);  
   
     verrouillage_threads_concurrents(s_etat_processus);      verrouillage_threads_concurrents(s_etat_processus);
     pid = fork();      pid = fork();
   
 #   ifdef OS2  
     if (pid == 0)  
     {  
         sem_init(&semaphore_liste_threads, 0, 1);  
         sem_init(&semaphore_gestionnaires_signaux, 0, 0);  
         sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);  
         sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);  
     }  
 #   endif  
   
     deverrouillage_threads_concurrents(s_etat_processus);      deverrouillage_threads_concurrents(s_etat_processus);
   
     pthread_sigmask(SIG_SETMASK, &oldset, NULL);  
     sigpending(&set);  
   
     if (pid < 0)      if (pid < 0)
     {      {
         if (close(pipes_entree[0]) != 0)          if (close(pipes_entree[0]) != 0)
Line 419  localisation_courante(struct_processus * Line 425  localisation_courante(struct_processus *
              */               */
   
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES
             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                  if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 #           else  #           else
             if (sem_post((*s_etat_processus).semaphore_fork) != 0)                  if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #           endif  #           endif
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
Line 431  localisation_courante(struct_processus * Line 437  localisation_courante(struct_processus *
             if (waitpid(pid, &status, 0) == -1)              if (waitpid(pid, &status, 0) == -1)
             {              {
 #               ifndef SEMAPHORES_NOMMES  #               ifndef SEMAPHORES_NOMMES
                 if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                      while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #               else  #               else
                 if (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 448  localisation_courante(struct_processus * Line 454  localisation_courante(struct_processus *
             }              }
   
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES
             if (sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)                  while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #           else  #           else
             if (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 472  localisation_courante(struct_processus * Line 478  localisation_courante(struct_processus *
             return;              return;
         }          }
   
           tampon[0] = d_code_fin_chaine;
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)              if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 #       else  #       else
         if (sem_post((*s_etat_processus).semaphore_fork) != 0)              if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #       endif  #       endif
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
Line 487  localisation_courante(struct_processus * Line 495  localisation_courante(struct_processus *
                 longueur_lecture)) > 0)                  longueur_lecture)) > 0)
         {          {
 #           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 513  localisation_courante(struct_processus * Line 521  localisation_courante(struct_processus *
             }              }
   
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES
             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                  if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 #           else  #           else
             if (sem_post((*s_etat_processus).semaphore_fork) != 0)                  if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #           endif  #           endif
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
Line 524  localisation_courante(struct_processus * Line 532  localisation_courante(struct_processus *
         }          }
   
 #       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 594  localisation_courante(struct_processus * Line 602  localisation_courante(struct_processus *
         free(arguments);          free(arguments);
   
 #       ifndef SEMAPHORES_NOMMES  #       ifndef SEMAPHORES_NOMMES
         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)              if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 #       else  #       else
         if (sem_post((*s_etat_processus).semaphore_fork) != 0)              if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #       endif  #       endif
         {          {
             (*s_etat_processus).erreur_systeme = d_es_processus;              (*s_etat_processus).erreur_systeme = d_es_processus;
Line 607  localisation_courante(struct_processus * Line 615  localisation_courante(struct_processus *
         {          {
             // Le processus fils renvoie une erreur.              // Le processus fils renvoie une erreur.
   
 #           ifndef SEMAPHORES_NOMMES              free(tampon);
             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)  
 #           else              if (((*s_etat_processus).localisation = malloc((strlen(d_locale)
             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)                      + 1) * sizeof(unsigned char))) == NULL)
 #           endif  
             {              {
                 if (errno != EINTR)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_processus;  
                     return;  
                 }  
             }              }
   
             (*s_etat_processus).erreur_execution = d_ex_erreur_processus;              strcpy((*s_etat_processus).localisation, d_locale);
             return;  
         }          }
   
 #       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 700  transliterated_fprintf(struct_processus Line 703  transliterated_fprintf(struct_processus
     }      }
   
 #   ifdef OS2  #   ifdef OS2
     i = 0;      if ((flux == stderr) || (flux == stdout))
     ptr_l = tampon2;  
   
     while((*ptr_l) != d_code_fin_chaine)  
     {      {
         if ((*ptr_l) == '\n')          i = 0;
         {          ptr_l = tampon2;
             i++;  
         }  
   
         ptr_l++;  
     }  
   
     if ((tampon3 = malloc((strlen(tampon2) + i + 1) * sizeof(unsigned char)))          while((*ptr_l) != d_code_fin_chaine)
             == NULL)          {
     {              if ((*ptr_l) == '\n')
         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;              {
         return(NULL);                  i++;
     }              }
   
     ptr_e = tampon3;  
     ptr_l = tampon2;  
   
     while((*ptr_l) != d_code_fin_chaine)              ptr_l++;
     {          }
         (*ptr_e) = (*ptr_l);  
   
         if ((*ptr_l) == '\n')          if ((tampon3 = malloc((strlen(tampon2) + i + 1) *
                   sizeof(unsigned char))) == NULL)
         {          {
             (*(++ptr_e)) = '\r';              (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
             ptr_e++;              return(-1);
             ptr_l++;  
         }          }
         else  
           ptr_e = tampon3;
           ptr_l = tampon2;
   
           while((*ptr_l) != d_code_fin_chaine)
         {          {
             ptr_e++;              (*ptr_e) = (*ptr_l);
             ptr_l++;  
               if ((*ptr_l) == '\n')
               {
                   (*(++ptr_e)) = '\r';
                   ptr_e++;
                   ptr_l++;
               }
               else
               {
                   ptr_e++;
                   ptr_l++;
               }
         }          }
     }  
   
     (*ptr_e) = d_code_fin_chaine;          (*ptr_e) = d_code_fin_chaine;
   
     free(tampon2);          free(tampon2);
     tampon2 = tampon3;          tampon2 = tampon3;
       }
 #   endif  #   endif
   
 #   ifdef SunOS  #   ifdef SunOS
Line 817  tex_fprintf(struct_processus *s_etat_pro Line 823  tex_fprintf(struct_processus *s_etat_pro
     return(ios);      return(ios);
 }  }
   
   #undef readline
   
   unsigned char *
   readline_wrapper(unsigned char *invite)
   {
       unsigned char       *chaine;
   
       chaine = readline(invite);
       printf("\r");
   
       return(chaine);
   }
   
   
 #define fprintf NULL  #define fprintf NULL
 #define printf NULL  #define printf NULL
   

Removed from v.1.17  
changed lines
  Added in v.1.61


CVSweb interface <joel.bertrand@systella.fr>