Diff for /rpl/src/analyse_notation_algebrique.c between versions 1.27 and 1.54

version 1.27, 2011/07/22 07:38:33 version 1.54, 2014/07/17 08:07:15
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.1    RPL/2 (R) version 4.1.19
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2014 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 57  analyse_algebrique(struct_processus *s_e Line 57  analyse_algebrique(struct_processus *s_e
     logical1                            presence_fonction;      logical1                            presence_fonction;
     logical1                            presence_liste;      logical1                            presence_liste;
   
     long                                k;  
   
     unsigned char                       *chaine_arguments;      unsigned char                       *chaine_arguments;
     unsigned char                       *chaine_centrale;      unsigned char                       *chaine_centrale;
     unsigned char                       *chaine_droite;      unsigned char                       *chaine_droite;
Line 76  analyse_algebrique(struct_processus *s_e Line 74  analyse_algebrique(struct_processus *s_e
     unsigned char                       registre_test;      unsigned char                       registre_test;
     unsigned char                       *sous_chaine_droite;      unsigned char                       *sous_chaine_droite;
     unsigned char                       *sous_chaine_gauche;      unsigned char                       *sous_chaine_gauche;
     unsigned char                       t0;  
     unsigned char                       t1;  
     unsigned char                       t2;  
     unsigned char                       t3;  
     unsigned char                       t4;  
     unsigned char                       *tampon;      unsigned char                       *tampon;
   
     unsigned long                       debut_zone_algebrique;      int                                 t0;
     unsigned long                       fin_zone_algebrique;      int                                 t1;
     unsigned long                       i;      int                                 t2;
     unsigned long                       j;      int                                 t3;
     unsigned long                       longueur_chaine;      int                                 t4;
     unsigned long                       longueur_tampon;  
     unsigned long                       niveau;      integer8                            debut_zone_algebrique;
     unsigned long                       niveau_liste;      integer8                            fin_zone_algebrique;
     unsigned long                       nombre_apostrophes;      integer8                            i;
     unsigned long                       nombre_arguments;      integer8                            j;
     unsigned long                       priorite;      integer8                            k;
       integer8                            longueur_chaine;
       integer8                            longueur_tampon;
       integer8                            niveau;
       integer8                            niveau_liste;
       integer8                            nombre_apostrophes;
       integer8                            nombre_arguments;
       integer8                            priorite;
   
     (*l_base_liste) = NULL;      (*l_base_liste) = NULL;
   
Line 106  analyse_algebrique(struct_processus *s_e Line 106  analyse_algebrique(struct_processus *s_e
     presence_liste = d_faux;      presence_liste = d_faux;
     niveau_liste = 0;      niveau_liste = 0;
   
     for(i = 1, chaine_invalide = d_vrai; i < strlen(chaine_algebrique) - 1; i++)      for(i = 1, chaine_invalide = d_vrai; i < ((integer8)
               strlen(chaine_algebrique)) - 1; i++)
     {      {
         if (chaine_algebrique[i] != ' ')          if (chaine_algebrique[i] != ' ')
         {          {
Line 115  analyse_algebrique(struct_processus *s_e Line 116  analyse_algebrique(struct_processus *s_e
   
         if (chaine_algebrique[i] == '"')          if (chaine_algebrique[i] == '"')
         {          {
             presence_chaine = (presence_chaine == d_faux) ? d_vrai : d_faux;              if (chaine_algebrique[i - 1] != '\\')
               {
                   presence_chaine = (presence_chaine == d_faux) ? d_vrai : d_faux;
               }
         }          }
         else if (presence_chaine == d_faux)          else if (presence_chaine == d_faux)
         {          {
Line 143  analyse_algebrique(struct_processus *s_e Line 147  analyse_algebrique(struct_processus *s_e
      * Transformation des "**" en "^ "       * Transformation des "**" en "^ "
      */       */
   
     for(i = 1; i < strlen(chaine_algebrique) - 1; i++)      for(i = 1; i < ((integer8) strlen(chaine_algebrique)) - 1; i++)
     {      {
         if (chaine_algebrique[i] == '*')          if (chaine_algebrique[i] == '*')
         {          {
Line 176  analyse_algebrique(struct_processus *s_e Line 180  analyse_algebrique(struct_processus *s_e
     {      {
         if ((*ptr1) == '"')          if ((*ptr1) == '"')
         {          {
             if (presence_chaine == d_faux)              if (ptr1 != chaine_travail)
             {              { // Il existe un caractère précédent.
                 presence_chaine = d_vrai;                  if ((*(ptr1 - 1)) != '\\')
                   {
                       if (presence_chaine == d_faux)
                       {
                           presence_chaine = d_vrai;
                       }
                       else
                       {
                           presence_chaine = d_faux;
                       }
                   }
             }              }
             else              else
             {              { // Il n'existe pas de caractère précédent.
                 presence_chaine = d_faux;                  if (presence_chaine == d_faux)
                   {
                       presence_chaine = d_vrai;
                   }
                   else
                   {
                       presence_chaine = d_faux;
                   }
             }              }
         }          }
   
Line 267  analyse_algebrique(struct_processus *s_e Line 288  analyse_algebrique(struct_processus *s_e
                 }                  }
                 else if (chaine_travail[i] == '"')                  else if (chaine_travail[i] == '"')
                 {                  {
                     presence_chaine = (presence_chaine == d_vrai)                      if (i > 0)
                             ? d_faux : d_vrai;                      {
                           if (chaine_travail[i - 1] != '\\')
                           {
                               presence_chaine = (presence_chaine == d_vrai)
                                       ? d_faux : d_vrai;
                           }
                       }
                       else
                       {
                           presence_chaine = (presence_chaine == d_vrai)
                                   ? d_faux : d_vrai;
                       }
                 }                  }
   
                 i++;                  i++;
Line 305  analyse_algebrique(struct_processus *s_e Line 337  analyse_algebrique(struct_processus *s_e
   
                 if (chaine_travail[j] == '"')                  if (chaine_travail[j] == '"')
                 {                  {
                     presence_chaine = (presence_chaine == d_vrai)                      if (j > 0)
                             ? d_faux : d_vrai;                      {
                           if (chaine_travail[j - 1] != '\\')
                           {
                               presence_chaine = (presence_chaine == d_vrai)
                                       ? d_faux : d_vrai;
                           }
                       }
                       else
                       {
                           presence_chaine = (presence_chaine == d_vrai)
                                   ? d_faux : d_vrai;
                       }
                 }                  }
   
                 j++;                  j++;
Line 323  analyse_algebrique(struct_processus *s_e Line 366  analyse_algebrique(struct_processus *s_e
                         debut_zone_algebrique + 1, fin_zone_algebrique + 1));                          debut_zone_algebrique + 1, fin_zone_algebrique + 1));
                 chaine_droite = purification_chaine(                  chaine_droite = purification_chaine(
                         extraction_chaine(chaine_travail,                          extraction_chaine(chaine_travail,
                         fin_zone_algebrique + 2, strlen(chaine_travail)));                          fin_zone_algebrique + 2,
                           (integer8) strlen(chaine_travail)));
   
                 free(chaine_travail);                  free(chaine_travail);
   
Line 352  analyse_algebrique(struct_processus *s_e Line 396  analyse_algebrique(struct_processus *s_e
                 drapeau_elimination_parentheses = d_vrai;                  drapeau_elimination_parentheses = d_vrai;
                 presence_chaine = d_faux;                  presence_chaine = d_faux;
   
                 while(i < (strlen(chaine_centrale) - 1))                  while(i < ((integer8) strlen(chaine_centrale)) - 1)
                 {                  {
                     if (chaine_centrale[i] == '"')                      if (chaine_centrale[i] == '"')
                     {                      {
                         presence_chaine = (presence_chaine == d_faux)                          if (i > 0)
                                 ? d_vrai : d_faux;                          {
                               if (chaine_centrale[i - 1] != '\\')
                               {
                                   presence_chaine = (presence_chaine == d_faux)
                                           ? d_vrai : d_faux;
                               }
                           }
                           else
                           {
                               presence_chaine = (presence_chaine == d_faux)
                                       ? d_vrai : d_faux;
                           }
   
                         if (i == 1)                          if (i == 1)
                         {                          {
Line 416  analyse_algebrique(struct_processus *s_e Line 471  analyse_algebrique(struct_processus *s_e
                 {                  {
                     if ((tampon = purification_chaine(                      if ((tampon = purification_chaine(
                             extraction_chaine(chaine_centrale, 2,                              extraction_chaine(chaine_centrale, 2,
                             strlen(chaine_centrale) - 1))) == NULL)                              ((integer8) strlen(chaine_centrale)) - 1))) == NULL)
                     {                      {
                         (*s_etat_processus).erreur_systeme =                          (*s_etat_processus).erreur_systeme =
                                 d_es_allocation_memoire;                                  d_es_allocation_memoire;
Line 473  analyse_algebrique(struct_processus *s_e Line 528  analyse_algebrique(struct_processus *s_e
                         (fin_zone_algebrique - debut_zone_algebrique > 0))                          (fin_zone_algebrique - debut_zone_algebrique > 0))
                 {                  {
                     i = 1;                      i = 1;
                     while((i < (strlen(chaine_centrale) - 1)) &&                      while((i < ((integer8) strlen(chaine_centrale)) - 1) &&
                             (chaine_centrale[i] != '('))                              (chaine_centrale[i] != '('))
                     {                      {
                         i++;                          i++;
                     }                      }
   
                     j = strlen(chaine_centrale) - 1;                      j = ((integer8) strlen(chaine_centrale)) - 1;
                     while(chaine_centrale[j] != ')')                      while(chaine_centrale[j] != ')')
                     {                      {
                         j--;                          j--;
Line 512  analyse_algebrique(struct_processus *s_e Line 567  analyse_algebrique(struct_processus *s_e
                                     extraction_chaine(chaine_arguments, 1, i));                                      extraction_chaine(chaine_arguments, 1, i));
                             sous_chaine_droite = purification_chaine(                              sous_chaine_droite = purification_chaine(
                                     extraction_chaine(chaine_arguments, i + 2,                                      extraction_chaine(chaine_arguments, i + 2,
                                     strlen(chaine_arguments)));                                      ((integer8) strlen(chaine_arguments))));
   
                             free(chaine_arguments);                              free(chaine_arguments);
   
Line 595  analyse_algebrique(struct_processus *s_e Line 650  analyse_algebrique(struct_processus *s_e
                         (*s_etat_processus).instruction_valide =                          (*s_etat_processus).instruction_valide =
                                 registre_instruction_valide;                                  registre_instruction_valide;
   
                         if (((unsigned long) (*s_etat_processus)                          if (((*s_etat_processus).nombre_arguments !=
                                 .nombre_arguments != nombre_arguments) &&                                  nombre_arguments) &&
                                 ((*s_etat_processus).nombre_arguments != -2))                                  ((*s_etat_processus).nombre_arguments != -2))
                         {                          {
                             (*s_etat_processus).erreur_execution =                              (*s_etat_processus).erreur_execution =
Line 727  analyse_algebrique(struct_processus *s_e Line 782  analyse_algebrique(struct_processus *s_e
         } while((drapeau_debut_zone_valide == d_vrai)          } while((drapeau_debut_zone_valide == d_vrai)
                 && (drapeau_fin_zone_valide == d_vrai));                  && (drapeau_fin_zone_valide == d_vrai));
   
         for(longueur_chaine = strlen(chaine_travail),          for(longueur_chaine = (integer8) strlen(chaine_travail),
                 i = nombre_apostrophes = 0; i < longueur_chaine;                  i = nombre_apostrophes = 0; i < longueur_chaine;
                 nombre_apostrophes += (chaine_travail[i++] == '\'') ? 1 : 0);                  nombre_apostrophes += (chaine_travail[i++] == '\'') ? 1 : 0);
   
Line 770  analyse_algebrique(struct_processus *s_e Line 825  analyse_algebrique(struct_processus *s_e
                             i + 1, j + 1));                              i + 1, j + 1));
                     chaine_droite = purification_chaine(                      chaine_droite = purification_chaine(
                             extraction_chaine(chaine_travail, j + 2,                              extraction_chaine(chaine_travail, j + 2,
                             strlen(chaine_travail)));                              ((integer8) strlen(chaine_travail))));
   
                     if ((chaine_gauche == NULL) || (chaine_centrale == NULL) ||                      if ((chaine_gauche == NULL) || (chaine_centrale == NULL) ||
                             (chaine_droite == NULL))                              (chaine_droite == NULL))
Line 782  analyse_algebrique(struct_processus *s_e Line 837  analyse_algebrique(struct_processus *s_e
   
                     drapeau_elimination_parentheses = d_vrai;                      drapeau_elimination_parentheses = d_vrai;
   
                     if ((longueur_tampon = strlen(chaine_centrale)) != 0)                      if ((longueur_tampon = ((integer8) strlen(chaine_centrale)))
                               != 0)
                     {                      {
                         niveau = 0;                          niveau = 0;
   
Line 810  analyse_algebrique(struct_processus *s_e Line 866  analyse_algebrique(struct_processus *s_e
   
                         if (drapeau_elimination_parentheses == d_vrai)                          if (drapeau_elimination_parentheses == d_vrai)
                         {                          {
                             if ((tampon = (unsigned char *) malloc(                              if ((tampon = (unsigned char *) malloc(((size_t)
                                     ((longueur_tampon = strlen(                                      ((longueur_tampon = (integer8) strlen(
                                     chaine_centrale)) + 1) * sizeof(                                      chaine_centrale)) + 1)) * sizeof(
                                     unsigned char))) == NULL)                                      unsigned char))) == NULL)
                             {                              {
                                 (*s_etat_processus).erreur_systeme =                                  (*s_etat_processus).erreur_systeme =
Line 838  analyse_algebrique(struct_processus *s_e Line 894  analyse_algebrique(struct_processus *s_e
                     }                      }
   
                     tampon[0] = d_code_fin_chaine;                      tampon[0] = d_code_fin_chaine;
                     longueur_chaine = strlen(chaine_centrale);                      longueur_chaine = (integer8) strlen(chaine_centrale);
                       k = ((integer8) strlen(chaine_centrale)) - 1;
                     niveau = 0;                      niveau = 0;
                     k = strlen(chaine_centrale) - 1;  
                     fin_boucle_extraction = d_faux;                      fin_boucle_extraction = d_faux;
   
                     while((k >= 0) && (fin_boucle_extraction ==                      while((k >= 0) && (fin_boucle_extraction == d_faux))
                             d_faux))  
                     {                      {
                         t0 = ((size_t) k < strlen(chaine_centrale))                          t0 = (k < ((integer8) strlen(chaine_centrale)))
                                 ? chaine_centrale[k + 1] : ' ';                                  ? chaine_centrale[k + 1] : ' ';
                         t1 = chaine_centrale[k];                          t1 = chaine_centrale[k];
                         t2 = (k < 1) ? ' ' : chaine_centrale[k - 1];                          t2 = (k < 1) ? ' ' : chaine_centrale[k - 1];
Line 1095  analyse_algebrique(struct_processus *s_e Line 1150  analyse_algebrique(struct_processus *s_e
 unsigned char *  unsigned char *
 purification_chaine(unsigned char *chaine)  purification_chaine(unsigned char *chaine)
 {  {
     long                        i;      integer8                    i;
     long                        j;      integer8                    j;
   
     unsigned char               *chaine_purifiee;      unsigned char               *chaine_purifiee;
   
     i = 0;      i = 0;
     j = strlen(chaine) - 1;      j = ((integer8) strlen(chaine)) - 1;
   
     while(chaine[i] == ' ')      while(chaine[i] == ' ')
     {      {
Line 1134  purification_chaine(unsigned char *chain Line 1189  purification_chaine(unsigned char *chain
 logical1  logical1
 test_expression_rpn(unsigned char *chaine)  test_expression_rpn(unsigned char *chaine)
 {  {
     long                    j;      int                     t;
       int                     t0;
     unsigned char           t;      int                     t1;
     unsigned char           t0;      int                     t2;
     unsigned char           t1;      int                     t3;
     unsigned char           t2;      int                     t4;
     unsigned char           t3;  
     unsigned char           t4;      integer8                compteur;
       integer8                longueur_chaine;
     unsigned long           compteur;      integer8                i;
     unsigned long           longueur_chaine;      integer8                j;
     unsigned long           i;      integer8                niveau;
     unsigned long           niveau;  
   
     /*      /*
      * On teste d'abord la chaîne pour vérifier qu'il n'y a pas de fonction       * On teste d'abord la chaîne pour vérifier qu'il n'y a pas de fonction
Line 1155  test_expression_rpn(unsigned char *chain Line 1209  test_expression_rpn(unsigned char *chain
   
     compteur = 0;      compteur = 0;
   
     for(longueur_chaine = strlen(chaine), i = 1; i < longueur_chaine; i++)      for(longueur_chaine = ((integer8) strlen(chaine)), i = 1;
               i < longueur_chaine; i++)
     {      {
         /*          /*
          * On saute les chaînes de caractères           * On saute les chaînes de caractères
Line 1164  test_expression_rpn(unsigned char *chain Line 1219  test_expression_rpn(unsigned char *chain
         if (chaine[i - 1] == '"')          if (chaine[i - 1] == '"')
         {          {
             i++;              i++;
             while(chaine[i - 1] != '"')              while(!((chaine[i - 1] == '"') && (chaine[i - 2] != '\\')))
             {              {
                 i++;                  i++;
             }              }
         }          }
   
         j = ((long) i) - 2;          j = i - 2;
         t0 = (i >= 2) ? chaine[i - 2] : '?';          t0 = (i >= 2) ? chaine[i - 2] : '?';
         t1 = chaine[i - 1];          t1 = chaine[i - 1];
         t2 = chaine[i];          t2 = chaine[i];
         t3 = ((i + 1) < strlen(chaine)) ? chaine[i + 1] : '?';          t3 = ((i + 1) < ((integer8) strlen(chaine))) ? chaine[i + 1] : '?';
         t4 = ((i + 2) < strlen(chaine)) ? chaine[i + 2] : '?';          t4 = ((i + 2) < ((integer8) strlen(chaine))) ? chaine[i + 2] : '?';
   
         /*          /*
          * Ouverture d'une parenthèse signalant une fonction           * Ouverture d'une parenthèse signalant une fonction
Line 1254  test_fonction(unsigned char *chaine) Line 1309  test_fonction(unsigned char *chaine)
 {  {
     logical1                drapeau_fonction;      logical1                drapeau_fonction;
   
     unsigned char           t;      int                     t;
   
     unsigned long           compteur;      integer8                compteur;
     unsigned long           i;      integer8                i;
     unsigned long           longueur_chaine;      integer8                longueur_chaine;
   
     longueur_chaine = strlen(chaine);      longueur_chaine = (integer8) strlen(chaine);
     i = 1;      i = 1;
   
     while(((t = chaine[i]) != '(') && (i < (longueur_chaine - 1)))      while(((t = chaine[i]) != '(') && (i < (longueur_chaine - 1)))
Line 1303  test_fonction(unsigned char *chaine) Line 1358  test_fonction(unsigned char *chaine)
   
   
 unsigned char *  unsigned char *
 extraction_chaine(unsigned char *chaine, unsigned long position_1,  extraction_chaine(unsigned char *chaine, integer8 position_1,
         unsigned long position_2)          integer8 position_2)
 {  {
     long                    i;      integer8                i;
   
     unsigned char           *pointeur_ecriture;      unsigned char           *pointeur_ecriture;
     unsigned char           *pointeur_lecture;      unsigned char           *pointeur_lecture;
     unsigned char           *sous_chaine;      unsigned char           *sous_chaine;
   
     if ((position_1 < 1) || (position_2 < position_1) ||      if ((position_1 < 1) || (position_2 < position_1) ||
             (position_2 > strlen(chaine)))              (position_2 > ((integer8) strlen(chaine))))
     {      {
         if ((sous_chaine = (unsigned char *) malloc(sizeof(unsigned char)))          if ((sous_chaine = (unsigned char *) malloc(sizeof(unsigned char)))
                 == NULL)                  == NULL)
Line 1326  extraction_chaine(unsigned char *chaine, Line 1381  extraction_chaine(unsigned char *chaine,
     }      }
   
     if ((sous_chaine = (unsigned char *)      if ((sous_chaine = (unsigned char *)
             malloc((position_2 - position_1 + 2) * sizeof(unsigned char)))              malloc(((size_t) (position_2 - position_1 + 2)) *
             == NULL)              sizeof(unsigned char))) == NULL)
     {      {
         return(NULL);          return(NULL);
     }      }

Removed from v.1.27  
changed lines
  Added in v.1.54


CVSweb interface <joel.bertrand@systella.fr>