Diff for /rpl/src/formateur_flux.c between versions 1.16 and 1.33

version 1.16, 2011/11/18 10:54:21 version 1.33, 2013/03/01 09:29:30
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.4    RPL/2 (R) version 4.1.13
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2013 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 165  formateur_flux(struct_processus *s_etat_ Line 165  formateur_flux(struct_processus *s_etat_
                             {                              {
                                 printf("+++Information : "                                  printf("+++Information : "
                                         "Séquence d'échappement "                                          "Séquence d'échappement "
                                         "inconnue [%d]\n",                                          "inconnue (\\x%c%c) [%d]\n",
                                           *ptr_lecture, *(ptr_lecture + 1),
                                         (int) getpid());                                          (int) getpid());
                             }                              }
                             else                              else
                             {                              {
                                 printf("+++Warning : Unknown "                                  printf("+++Warning : Unknown "
                                         "escape code "                                          "escape code (\\x%c%c) [%d]\n",
                                         "[%d]\n", (int) getpid());                                          *ptr_lecture, *(ptr_lecture + 1),
                                           (int) getpid());
                             }                              }
                         }                          }
                     }                      }
Line 182  formateur_flux(struct_processus *s_etat_ Line 184  formateur_flux(struct_processus *s_etat_
                         {                          {
                             printf("+++Information : "                              printf("+++Information : "
                                     "Séquence d'échappement "                                      "Séquence d'échappement "
                                     "inconnue [%d]\n", (int) getpid());                                      "tronquée [%d]\n", (int) getpid());
                         }                          }
                         else                          else
                         {                          {
                             printf("+++Warning : Unknown escape code "                              printf("+++Warning : Truncated escape code "
                                     "[%d]\n", (int) getpid());                                      "[%d]\n", (int) getpid());
                         }                          }
                     }                      }
Line 212  formateur_flux(struct_processus *s_etat_ Line 214  formateur_flux(struct_processus *s_etat_
             }              }
             else              else
             {              {
                 if ((*s_etat_processus).langue == 'F')                  if ((*(ptr_lecture + 1)) == d_code_fin_chaine)
                 {                  {
                     printf("+++Information : Séquence d'échappement "                      if ((*s_etat_processus).langue == 'F')
                             "inconnue [%d]\n", (int) getpid());                      {
                           printf("+++Information : "
                                   "Séquence d'échappement "
                                   "tronquée [%d]\n", (int) getpid());
                       }
                       else
                       {
                           printf("+++Warning : Truncated escape code "
                                   "[%d]\n", (int) getpid());
                       }
                 }                  }
                 else                  else
                 {                  {   
                     printf("+++Warning : Unknown escape code "                      if ((*s_etat_processus).langue == 'F')
                             "[%d]\n", (int) getpid());                      {
                           printf("+++Information : Séquence d'échappement "
                                   "inconnue (%c%c) [%d]\n",
                                   *ptr_lecture, *(ptr_lecture + 1),
                                   (int) getpid());
                       }
                       else
                       {
                           printf("+++Warning : Unknown escape code (%c%c) "
                                   "[%d]\n", *ptr_lecture, *(ptr_lecture + 1),
                                   (int) getpid());
                       }
                 }                  }
             }              }
         }          }
Line 244  formateur_flux(struct_processus *s_etat_ Line 266  formateur_flux(struct_processus *s_etat_
   
 /*  /*
 ================================================================================  ================================================================================
     Routine de d'analyse d'un flux
   ================================================================================
     Entrées : structure sur l'état du processus et objet à afficher
   --------------------------------------------------------------------------------
     Sorties : chaine de caractères
   --------------------------------------------------------------------------------
     Effets de bord : néant
   ================================================================================
   */
   
   unsigned char *
   analyse_flux(struct_processus *s_etat_processus, unsigned char *donnees,
           long longueur)
   {
       long                    longueur_courante;
       long                    offset;
   
       unsigned char           *chaine;
       unsigned char           hexadecimal[3];
       unsigned char           *ptr_ecriture;
       unsigned char           *ptr_lecture;
   
       if ((chaine = malloc((longueur_courante = longueur + 1) *
               sizeof(unsigned char))) == NULL)
       {
           (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
           return(NULL);
       }
   
       ptr_lecture = donnees;
       ptr_ecriture = chaine;
   
       while(longueur > 0)
       {
           // Début de la séquence d'échappement
   
           switch((*ptr_lecture))
           {
               case '"':
               case '\b':
               case '\n':
               case '\t':
               case '\\':
               {
                   offset = ptr_ecriture - chaine;
   
                   if ((chaine = realloc(chaine, (++longueur_courante)
                           * sizeof(unsigned char))) == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return(NULL);
                   }
   
                   ptr_ecriture = chaine + offset;
                   *ptr_ecriture++ = '\\';
   
                   switch((*ptr_lecture++))
                   {
                       case '"':
                       {
                           *ptr_ecriture++ = '"';
                           break;
                       }
   
                       case '\b':
                       {
                           *ptr_ecriture++ = 'b';
                           break;
                       }
   
                       case '\n':
                       {
                           *ptr_ecriture++ = 'n';
                           break;
                       }
   
                       case '\t':
                       {
                           *ptr_ecriture++ = 't';
                           break;
                       }
   
                       case '\\':
                       {
                           *ptr_ecriture++ = '\\';
                           break;
                       }
                   }
   
                   break;
               }
   
               case ' ':
               {
                   *ptr_ecriture++ = *ptr_lecture++;
                   break;
               }
   
               default:
               {
                   if (isgraph((*ptr_lecture)))
                   {
                       *ptr_ecriture++ = *ptr_lecture++;
                   }
                   else
                   {
                       offset = ptr_ecriture - chaine;
   
                       if ((chaine = realloc(chaine, (longueur_courante =
                               longueur_courante + 3) * sizeof(unsigned char)))
                               == NULL)
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_allocation_memoire;
                           return(NULL);
                       }
   
                       ptr_ecriture = chaine + offset;
                       *ptr_ecriture++ = '\\';
                       *ptr_ecriture++ = 'x';
   
                       sprintf(hexadecimal, "%02X", *ptr_lecture++);
   
                       *ptr_ecriture++ = hexadecimal[0];
                       *ptr_ecriture++ = hexadecimal[1];
                   }
   
                   break;
               }
           }
   
           longueur--;
       }
   
       (*ptr_ecriture) = d_code_fin_chaine;
   
       return(chaine);
   }
   
   
   /*
   ================================================================================
   Routine testant la validité d'une chaîne de caractères    Routine testant la validité d'une chaîne de caractères
 ================================================================================  ================================================================================
   Entrées : structure sur l'état du processus et chaîne courante    Entrées : structure sur l'état du processus et chaîne courante
Line 599  longueur_chaine(struct_processus *s_etat Line 764  longueur_chaine(struct_processus *s_etat
 ================================================================================  ================================================================================
   Routine retournant un pointeur sur le i-ème caractère d'une chaîne    Routine retournant un pointeur sur le i-ème caractère d'une chaîne
 ================================================================================  ================================================================================
   Entrées : structure sur l'état du processus et chaîne    Entrées : structure sur l'état du processus, chaîne et position du caractère
 --------------------------------------------------------------------------------  --------------------------------------------------------------------------------
   Sorties : longueur de la chaîne    Sorties : pointeur sur le caractère
 --------------------------------------------------------------------------------  --------------------------------------------------------------------------------
   Effets de bord : néant    Effets de bord : néant
 ================================================================================  ================================================================================
Line 633  pointeur_ieme_caractere(struct_processus Line 798  pointeur_ieme_caractere(struct_processus
     return(pointeur);      return(pointeur);
 }  }
   
   
   /*
   ================================================================================
     Routine retournant la position du caractère en fonction du pointeur
     dans la chaîne
   ================================================================================
     Entrées : structure sur l'état du processus, chaîne et position
   --------------------------------------------------------------------------------
     Sorties : quantième dans la chaîne
   --------------------------------------------------------------------------------
     Effets de bord : néant
   ================================================================================
   */
   
   integer8
   position_caractere_de_chaine(struct_processus *s_etat_processus,
           unsigned char *chaine, unsigned char *position)
   {
       integer8            i;
   
       i = 1;
   
       while(chaine != position)
       {
           chaine = prochain_caractere(s_etat_processus, chaine);
           i++;
   
           if ((*chaine) == d_code_fin_chaine)
           {
               return(0);
           }
       }
   
       return(i);
   }
   
   
   /*
   ================================================================================
     Conversion d'une chaîne en majuscule ou en minuscule
   ================================================================================
     Entrées : chaîne et indicateur ('M' pour majuscules, 'm' pour minuscules)
   --------------------------------------------------------------------------------
     Sorties : néant
   --------------------------------------------------------------------------------
     Effets de bord : néant
   ================================================================================
   */
   
   void
   conversion_chaine(struct_processus *s_etat_processus,
           unsigned char *chaine, unsigned char type)
   {
       int                 (*fonction_1)(int);
       int                 (*fonction_2)(int);
   
       unsigned char       *ptr;
       unsigned char       *ptr2;
       unsigned char       registre;
   
       if (type == 'M')
       {
           fonction_1 = toupper;
           fonction_2 = tolower;
       }
       else
       {
           fonction_1 = tolower;
           fonction_2 = toupper;
       }
   
       ptr = chaine;
   
       while((*ptr) != d_code_fin_chaine)
       {
           ptr2 = prochain_caractere(s_etat_processus, ptr);
   
           if ((ptr2 - ptr) == 1)
           {
               registre = fonction_1((*ptr));
   
               if (fonction_2(registre) == (*ptr))
               {
                   (*ptr) = registre;
               }
           }
   
           ptr = ptr2;
       }
   
       return;
   }
   
 // vim: ts=4  // vim: ts=4

Removed from v.1.16  
changed lines
  Added in v.1.33


CVSweb interface <joel.bertrand@systella.fr>