Diff for /rpl/src/gestion_variables.c between versions 1.28 and 1.30

version 1.28, 2011/06/08 13:35:15 version 1.30, 2011/06/11 09:36:31
Line 66  ajout_variable(struct_processus *s_etat_ Line 66  ajout_variable(struct_processus *s_etat_
         (*(*s_etat_processus).s_arbre_variables).noeuds_utilises = 0;          (*(*s_etat_processus).s_arbre_variables).noeuds_utilises = 0;
         (*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL;          (*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL;
   
         if (((*(*s_etat_processus).arbre_instructions).noeud =          if (((*(*s_etat_processus).s_arbre_variables).noeuds =
                 malloc((*s_etat_processus).nombre_caracteres_variables                  malloc((*s_etat_processus).nombre_caracteres_variables
                 * sizeof(struct_arbre_variables))) == NULL)                  * sizeof(struct_arbre_variables))) == NULL)
         {          {
Line 137  ajout_variable(struct_processus *s_etat_ Line 137  ajout_variable(struct_processus *s_etat_
   
     if ((*l_variable_courante).feuille == NULL)      if ((*l_variable_courante).feuille == NULL)
     {      {
   printf("Nouvelle feuille\n");
         // Aucune variable de même nom préexiste. On alloue le premier          // Aucune variable de même nom préexiste. On alloue le premier
         // élément de la liste doublement chaînée contenant toutes les          // élément de la liste doublement chaînée contenant toutes les
         // variables de même nom. Cette liste boucle en premier lieu sur          // variables de même nom. Cette liste boucle en premier lieu sur
Line 527  recherche_variable(struct_processus *s_e Line 528  recherche_variable(struct_processus *s_e
     if ((*s_etat_processus).s_arbre_variables == NULL)      if ((*s_etat_processus).s_arbre_variables == NULL)
     {      {
         (*s_etat_processus).erreur_systeme = d_es_variable_introuvable;          (*s_etat_processus).erreur_systeme = d_es_variable_introuvable;
         return d_faux;          return(d_faux);
     }      }
   
     l_variable_courante = (*s_etat_processus).s_arbre_variables;      l_variable_courante = (*s_etat_processus).s_arbre_variables;
Line 540  recherche_variable(struct_processus *s_e Line 541  recherche_variable(struct_processus *s_e
         if (pointeur < 0)          if (pointeur < 0)
         {          {
             // Caractère hors de l'alphabet des variables              // Caractère hors de l'alphabet des variables
             return(d_erreur);  
               (*s_etat_processus).erreur_systeme = d_es_variable_introuvable;
               return(d_faux);
         }          }
   
         if ((*l_variable_courante).noeuds[pointeur] == NULL)          if ((*l_variable_courante).noeuds[pointeur] == NULL)
         {          {
             // Le chemin de la variable candidate n'existe pas.              // Le chemin de la variable candidate n'existe pas.
             return(d_erreur);              (*s_etat_processus).erreur_systeme = d_es_variable_introuvable;
               return(d_faux);
         }          }
   
         l_variable_courante = (*l_variable_courante).noeuds[pointeur];          l_variable_courante = (*l_variable_courante).noeuds[pointeur];
Line 564  recherche_variable(struct_processus *s_e Line 568  recherche_variable(struct_processus *s_e
         {          {
             // Problème : la pile système est vide !              // Problème : la pile système est vide !
             (*s_etat_processus).erreur_systeme = d_es_pile_vide;              (*s_etat_processus).erreur_systeme = d_es_pile_vide;
             return(d_erreur);              return(d_faux);
         }          }
   
         while((*l_element_courant).retour_definition != 'Y')          while((*l_element_courant).retour_definition != 'Y')
Line 574  recherche_variable(struct_processus *s_e Line 578  recherche_variable(struct_processus *s_e
             if (l_element_courant == NULL)              if (l_element_courant == NULL)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_pile_vide;                  (*s_etat_processus).erreur_systeme = d_es_pile_vide;
                 return(d_erreur);                  return(d_faux);
             }              }
         }          }
   
Line 589  recherche_variable(struct_processus *s_e Line 593  recherche_variable(struct_processus *s_e
                     (*(*l_variable_courante).feuille).variable;                      (*(*l_variable_courante).feuille).variable;
             (*s_etat_processus).pointeur_feuille_courante =              (*s_etat_processus).pointeur_feuille_courante =
                     (*l_variable_courante).feuille;                      (*l_variable_courante).feuille;
             return(d_absence_erreur);              return(d_vrai);
         }          }
         else          else
         {          {
Line 623  recherche_variable(struct_processus *s_e Line 627  recherche_variable(struct_processus *s_e
                             (*l_variable_courante).feuille;                              (*l_variable_courante).feuille;
                 }                  }
   
                 return(d_absence_erreur);                  return(d_vrai);
               }
           }
       }
   
       (*s_etat_processus).erreur_systeme = d_es_variable_introuvable;
       return(d_faux);
   }
   
   
   logical1
   recherche_variable_globale(struct_processus *s_etat_processus,
           unsigned char *nom)
   {
       logical1            presence_variable;
   
       presence_variable = recherche_variable(s_etat_processus, nom);
   
       if (presence_variable == d_vrai)
       {
           switch((*(*s_etat_processus).pointeur_variable_courante).niveau)
           {
               case 0:
               {
                   // Nous sommes en présence d'une définition et non d'une
                   // variable.
   
                   presence_variable = d_faux;
                   break;
               }
   
               case 1:
               {
                   break;
             }              }
   
               default:
               {
                   if ((*(*(*(*s_etat_processus).pointeur_feuille_courante)
                           .precedent).variable).niveau == 1)
                   {
                       (*s_etat_processus).pointeur_feuille_courante =
                               (*(*s_etat_processus).pointeur_feuille_courante)
                               .precedent;
                       (*s_etat_processus).pointeur_variable_courante =
                               (*(*s_etat_processus).pointeur_feuille_courante)
                               .variable;
                   }
                   else if ((*(*(*(*(*s_etat_processus).pointeur_feuille_courante)
                           .precedent).precedent).variable).niveau == 1)
                   {
                       (*s_etat_processus).pointeur_feuille_courante =
                               (*(*(*s_etat_processus).pointeur_feuille_courante)
                               .precedent).precedent;
                       (*s_etat_processus).pointeur_variable_courante =
                               (*(*s_etat_processus).pointeur_feuille_courante)
                               .variable;
                   }
                   else
                   {
                       presence_variable = d_faux;
                   }
   
                   break;
               }
           }
       }
   
       if (presence_variable == d_vrai)
       {
           if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
           {
               // La variable n'est pas globale, elle est partagée.
               presence_variable = d_faux;
               (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
         }          }
     }      }
   
     return(d_erreur);      return(presence_variable);
 }  }
   
   

Removed from v.1.28  
changed lines
  Added in v.1.30


CVSweb interface <joel.bertrand@systella.fr>