Diff for /rpl/src/compilation.c between versions 1.72 and 1.95

version 1.72, 2015/01/27 14:18:05 version 1.95, 2018/12/24 15:55:00
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.20    RPL/2 (R) version 4.1.30
   Copyright (C) 1989-2015 Dr. BERTRAND Joël    Copyright (C) 1989-2018 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 281  compilation(struct_processus *s_etat_pro Line 281  compilation(struct_processus *s_etat_pro
   
                 while(i <= position_fin_nom_definition)                  while(i <= position_fin_nom_definition)
                 {                  {
                       if ((*s_etat_processus).pointeurs_caracteres_variables
                               [(*s_etat_processus).definitions_chainees[i]] < 0)
                       {
                           free(s_variable);
   
                           (*s_etat_processus).erreur_execution = d_ex_syntaxe;
                           return(d_erreur);
                       }
   
                     *(definition++) = (*s_etat_processus)                      *(definition++) = (*s_etat_processus)
                             .definitions_chainees[i++];                              .definitions_chainees[i++];
                 }                  }
Line 290  compilation(struct_processus *s_etat_pro Line 299  compilation(struct_processus *s_etat_pro
                 if (recherche_variable(s_etat_processus, (*s_variable).nom)                  if (recherche_variable(s_etat_processus, (*s_variable).nom)
                         == d_vrai)                          == d_vrai)
                 {                  {
                       free(s_variable);
   
                     if ((*s_etat_processus).langue == 'F')                      if ((*s_etat_processus).langue == 'F')
                     {                      {
                         printf("+++Attention : Plusieurs définitions de"                          printf("+++Attention : Plusieurs définitions de"
Line 311  compilation(struct_processus *s_etat_pro Line 322  compilation(struct_processus *s_etat_pro
                 if ((*s_etat_processus).erreur_systeme != d_es)                  if ((*s_etat_processus).erreur_systeme != d_es)
                 {                  {
                     free(s_variable);                      free(s_variable);
   
                     return(d_erreur);                      return(d_erreur);
                 }                  }
   
Line 907  recherche_instruction_suivante_recursive Line 917  recherche_instruction_suivante_recursive
     int                         erreur_analyse;      int                         erreur_analyse;
     int                         erreur_format;      int                         erreur_format;
   
       integer8                    nombre_caracteres;
       integer8                    (*__type_parse)(struct_processus *, void **);
   
   
     unsigned char               base_binaire;      unsigned char               base_binaire;
     unsigned char               caractere_fin;      unsigned char               caractere_fin;
     unsigned char               *pointeur_caractere_courant;      unsigned char               *pointeur_caractere_courant;
Line 916  recherche_instruction_suivante_recursive Line 930  recherche_instruction_suivante_recursive
   
     signed long                 niveau;      signed long                 niveau;
   
       struct_liste_chainee        *l_element_courant;
   
     erreur_analyse = d_ex;      erreur_analyse = d_ex;
     erreur_format = d_ex;      erreur_format = d_ex;
     erreur = d_absence_erreur;      erreur = d_absence_erreur;
Line 935  recherche_instruction_suivante_recursive Line 951  recherche_instruction_suivante_recursive
         }          }
   
         case TBL:          case TBL:
           case REC:
         {          {
             caractere_fin = ']';              caractere_fin = ']';
             break;              break;
Line 980  recherche_instruction_suivante_recursive Line 997  recherche_instruction_suivante_recursive
         return(erreur);          return(erreur);
     }      }
   
       /*
        * On regarde s'il existe des fonctions permettant de parser
        * les objets dans les bibliothèques externes.
        */
   
       l_element_courant = (*s_etat_processus).s_bibliotheques;
       (*s_etat_processus).position_courante = pointeur_caractere_courant
               - (*s_etat_processus).definitions_chainees;
   
       while(l_element_courant != NULL)
       {
           if ((__type_parse = dlsym((*((struct_bibliotheque *)
                   (*l_element_courant).donnee)).descripteur, "__type_parse"))
                   != NULL)
           {
               // Une fonction declareTypeExtension(parse) se trouve dans la
               // bibliothèque. Si cette fonction renvoie une valeur non nulle,
               // elle a réussi à parser correctement un objet.
   
               if ((nombre_caracteres = __type_parse(s_etat_processus, NULL)) != 0)
               {
                   if (((*s_etat_processus).instruction_courante =
                           malloc((((unsigned) nombre_caracteres) + 1)
                           * sizeof(unsigned char))) == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return(d_erreur);
                   }
   
                   strncpy((*s_etat_processus).instruction_courante,
                           (*s_etat_processus).definitions_chainees +
                           (*s_etat_processus).position_courante,
                           (unsigned) nombre_caracteres);
                   (*s_etat_processus).instruction_courante[nombre_caracteres]
                           = d_code_fin_chaine;
   
                   (*s_etat_processus).position_courante += nombre_caracteres;
                   return(erreur);
               }
           }
   
           l_element_courant = (*l_element_courant).suivant;
       }
   
     pointeur_debut_instruction = pointeur_caractere_courant;      pointeur_debut_instruction = pointeur_caractere_courant;
   
     while(((*pointeur_caractere_courant) != d_code_espace) &&      while(((*pointeur_caractere_courant) != d_code_espace) &&
Line 1479  recherche_instruction_suivante_recursive Line 1541  recherche_instruction_suivante_recursive
                             pointeur_caractere_courant++;                              pointeur_caractere_courant++;
                         }                          }
   
                         if ((*pointeur_caractere_courant) == '>')                          if (((*pointeur_caractere_courant) == '>') &&
                                   ((*(pointeur_caractere_courant - 1)) ==
                                   d_code_espace))
                           {
                               pointeur_caractere_courant++;
   
                               if ((*pointeur_caractere_courant) == '>')
                               {   // Cas de '>>'
                                   drapeau_fin_objet = d_vrai;
                                   pointeur_caractere_courant++;
                                   break;
                               }
                               else if ((*pointeur_caractere_courant) == '=')
                               {   // Cas de '>='
                                   pointeur_caractere_courant++;
                               }
                               else if ((*pointeur_caractere_courant) !=
                                       d_code_espace)
                               {   // Tous les cas différents de '>'
                                   erreur_analyse = d_ex_syntaxe;
                                   break;
                               }
   
                               pointeur_caractere_courant--;
                           }
   
                           if ((erreur_format == d_absence_erreur) &&
                                   (drapeau_fin_objet == d_faux))
                           {
                               (*s_etat_processus).position_courante =
                                       pointeur_caractere_courant
                                       - (*s_etat_processus).definitions_chainees;
   
                               registre_type_en_cours = (*s_etat_processus)
                                       .type_en_cours;
                               (*s_etat_processus).type_en_cours = RPN;
   
                               if ((erreur =
                                       recherche_instruction_suivante_recursive(
                                       s_etat_processus, recursivite + 1))
                                       != d_absence_erreur)
                               {
                                   (*s_etat_processus).type_en_cours =
                                           registre_type_en_cours;
   
                                   if ((*s_etat_processus).instruction_courante
                                           != NULL)
                                   {
                                       free((*s_etat_processus)
                                               .instruction_courante);
                                       (*s_etat_processus).instruction_courante
                                               = NULL;
                                   }
   
                                   return(d_erreur);
                               }
   
                               (*s_etat_processus).type_en_cours =
                                       registre_type_en_cours;
                               pointeur_caractere_courant = (*s_etat_processus)
                                       .definitions_chainees + (*s_etat_processus)
                                       .position_courante;
   
                               free((*s_etat_processus).instruction_courante);
                           }
                       }
   
                       if (drapeau_fin_objet == d_faux)
                       {
                           erreur_analyse = d_ex_syntaxe;
                           drapeau_fin_objet = d_vrai;
                       }
                   }
                   else if ((*pointeur_caractere_courant) == '[')
                   { // Cas <[ ]>
                       if (pointeur_debut_instruction !=
                               (pointeur_caractere_courant - 1))
                       {
                           erreur_format = d_ex_syntaxe;
                       }
   
                       pointeur_caractere_courant++;
                       drapeau_fin_objet = d_faux;
   
                       while(((*pointeur_caractere_courant) != d_code_fin_chaine)
                               && (erreur_format == d_absence_erreur))
                       {
                           while((*pointeur_caractere_courant) == d_code_espace)
                           {
                               pointeur_caractere_courant++;
                           }
   
                           if ((*pointeur_caractere_courant) == ']')
                         {                          {
                             if ((*(++pointeur_caractere_courant)) == '>')                              if ((*(++pointeur_caractere_courant)) == '>')
                             {                              {
Line 1503  recherche_instruction_suivante_recursive Line 1657  recherche_instruction_suivante_recursive
   
                             registre_type_en_cours = (*s_etat_processus)                              registre_type_en_cours = (*s_etat_processus)
                                     .type_en_cours;                                      .type_en_cours;
                             (*s_etat_processus).type_en_cours = RPN;                              (*s_etat_processus).type_en_cours = TBL;
   
                             if ((erreur =                              if ((erreur =
                                     recherche_instruction_suivante_recursive(                                      recherche_instruction_suivante_recursive(
Line 1541  recherche_instruction_suivante_recursive Line 1695  recherche_instruction_suivante_recursive
                         drapeau_fin_objet = d_vrai;                          drapeau_fin_objet = d_vrai;
                     }                      }
                 }                  }
                 else if ((*pointeur_caractere_courant) == '[')  
                 { // Cas <[ ]>                  break;
               }
   
               case '|' :
               {
                   if ((*pointeur_caractere_courant) == '[')
                   { // Cas |[ ]|
                     if (pointeur_debut_instruction !=                      if (pointeur_debut_instruction !=
                             (pointeur_caractere_courant - 1))                              (pointeur_caractere_courant - 1))
                     {                      {
Line 1562  recherche_instruction_suivante_recursive Line 1722  recherche_instruction_suivante_recursive
   
                         if ((*pointeur_caractere_courant) == ']')                          if ((*pointeur_caractere_courant) == ']')
                         {                          {
                             if ((*(++pointeur_caractere_courant)) == '>')                              if ((*(++pointeur_caractere_courant)) == '|')
                             {                              {
                                 drapeau_fin_objet = d_vrai;                                  drapeau_fin_objet = d_vrai;
                             }                              }
Line 1584  recherche_instruction_suivante_recursive Line 1744  recherche_instruction_suivante_recursive
   
                             registre_type_en_cours = (*s_etat_processus)                              registre_type_en_cours = (*s_etat_processus)
                                     .type_en_cours;                                      .type_en_cours;
                             (*s_etat_processus).type_en_cours = TBL;                              (*s_etat_processus).type_en_cours = REC;
   
                             if ((erreur =                              if ((erreur =
                                     recherche_instruction_suivante_recursive(                                      recherche_instruction_suivante_recursive(
Line 1629  recherche_instruction_suivante_recursive Line 1789  recherche_instruction_suivante_recursive
   
         if ((*(pointeur_caractere_courant - 1)) == caractere_fin)          if ((*(pointeur_caractere_courant - 1)) == caractere_fin)
         {          {
             // Cas des objets composites (LST, RPN, TBL)              // Cas des objets composites (LST, RPN, TBL, REC)
             break;              break;
         }          }
         else if ((*pointeur_caractere_courant) == caractere_fin)          else if ((*pointeur_caractere_courant) == caractere_fin)
         {          {
             // Condition pour traiter les cas 123}              // Condition pour traiter les cas "123}"
             break;              break;
         }          }
     }      }
Line 1659  recherche_instruction_suivante_recursive Line 1819  recherche_instruction_suivante_recursive
             default:              default:
             {              {
                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;                  (*s_etat_processus).erreur_execution = d_ex_syntaxe;
                 return(d_erreur);  //              return(d_erreur);
             }              }
         }          }
     }      }
Line 1689  recherche_instruction_suivante_recursive Line 1849  recherche_instruction_suivante_recursive
         erreur = ((erreur_analyse == d_ex) && (erreur_format == d_ex))          erreur = ((erreur_analyse == d_ex) && (erreur_format == d_ex))
                 ? d_absence_erreur : d_erreur;                  ? d_absence_erreur : d_erreur;
         (*s_etat_processus).erreur_execution = erreur_analyse;          (*s_etat_processus).erreur_execution = erreur_analyse;
   
           if ((*s_etat_processus).erreur_execution == d_ex)
           {
               (*s_etat_processus).erreur_execution = erreur_format;
           }
     }      }
     else      else
     {      {

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


CVSweb interface <joel.bertrand@systella.fr>