Diff for /rpl/src/gestion_variables.c between versions 1.26 and 1.27

version 1.26, 2011/04/21 16:00:55 version 1.27, 2011/06/01 18:17:35
Line 576  recherche_variable(struct_processus *s_e Line 576  recherche_variable(struct_processus *s_e
             // Dans ce cas, on prend la variable de niveau le plus bas              // Dans ce cas, on prend la variable de niveau le plus bas
             // si ce niveau est inférieur ou égal à 1 (variable globale              // si ce niveau est inférieur ou égal à 1 (variable globale
             // ou fonction définie par l'utilisateur). Si le niveau de la              // ou fonction définie par l'utilisateur). Si le niveau de la
             // plus ancienne variable est strictement supérieur à 1, el              // plus ancienne variable est strictement supérieur à 1, il
             // s'agit d'une variable locale inaccessible.              // s'agit d'une variable locale inaccessible.
   
             if ((*(*(*(*l_variable_courante).feuille).precedent).variable)              if ((*(*(*(*l_variable_courante).feuille).precedent).variable)
Line 586  recherche_variable(struct_processus *s_e Line 586  recherche_variable(struct_processus *s_e
                         (*(*(*l_variable_courante).feuille).precedent).variable;                          (*(*(*l_variable_courante).feuille).precedent).variable;
                 (*s_etat_processus).pointeur_feuille_courante =                  (*s_etat_processus).pointeur_feuille_courante =
                         (*l_variable_courante).feuille;                          (*l_variable_courante).feuille;
   
                   // S'il existe une variable de niveau 0 et une seconde de
                   // niveau 1, la variable de niveau 0 (fonction) est masquée
                   // par celle de niveau 1.
   
                   if (((*(*(*l_variable_courante).feuille).variable).niveau == 0)
                           && ((*(*(*(*l_variable_courante).feuille).precedent)
                           .variable).niveau == 1))
                   {
                       (*s_etat_processus).pointeur_variable_courante =
                               (*(*(*l_variable_courante).feuille).precedent)
                               .variable;
                       (*s_etat_processus).pointeur_feuille_courante =
                               (*l_variable_courante).feuille;
                   }
   
                 return(d_absence_erreur);                  return(d_absence_erreur);
             }              }
         }          }
Line 625  retrait_variable(struct_processus *s_eta Line 641  retrait_variable(struct_processus *s_eta
                 // La variable obtenue est une variable locale. il faut                  // La variable obtenue est une variable locale. il faut
                 // s'assurer qu'il existe une variable de niveau 1 de même                  // s'assurer qu'il existe une variable de niveau 1 de même
                 // nom sur la feuille.                  // nom sur la feuille.
             }  
   
             if ((*s_etat_processus).position_variable_courante > 0)                  if ((*(*(*(*s_etat_processus).pointeur_feuille_courante)
             {                          .precedent).variable).niveau <= 1)
                 while(strcmp((*s_etat_processus).s_liste_variables  
                         [(*s_etat_processus).position_variable_courante]  
                         .nom, nom_variable) == 0)  
                 {                  {
                     (*s_etat_processus).position_variable_courante--;                      (*s_etat_processus).pointeur_feuille_courante =
                               (*(*s_etat_processus).pointeur_feuille_courante)
                     if ((*s_etat_processus).position_variable_courante >=                              .precedent;
                             (*s_etat_processus).nombre_variables)                      (*s_etat_processus).pointeur_variable_courante =
                               (*(*s_etat_processus).pointeur_feuille_courante)
                               .variable;
   
                       // Si la variable retournée est de niveau 0, on regarde
                       // un peu plus loin si une variable de niveau 1 existe.
   
                       if (((*(*(*s_etat_processus).pointeur_feuille_courante)
                               .variable).niveau == 0) &&
                               ((*(*(*(*s_etat_processus)
                               .pointeur_feuille_courante).precedent).variable)
                               .niveau == 1))
                     {                      {
                         erreur = d_erreur;                          (*s_etat_processus).pointeur_feuille_courante =
                         (*s_etat_processus).erreur_execution =                                  (*(*s_etat_processus).pointeur_feuille_courante)
                                 d_ex_variable_non_definie;                                  .precedent;
                         return erreur;                          (*s_etat_processus).pointeur_variable_courante =
                                   (*(*s_etat_processus).pointeur_feuille_courante)
                                   .variable;
                     }                      }
                 }                  }
                   else
                   {
                       // Aucune variable globale (niveau 1) n'existe.
   
                 (*s_etat_processus).position_variable_courante++;                      erreur = d_erreur;
             }                      (*s_etat_processus).erreur_execution =
                               d_ex_variable_non_definie;
             if ((*s_etat_processus).s_liste_variables                      return(erreur);
                     [(*s_etat_processus).position_variable_courante]                  }
                     .niveau != 1)  
             {  
                 erreur = d_erreur;  
                 (*s_etat_processus).erreur_execution =  
                         d_ex_variable_non_definie;  
                 return erreur;  
             }              }
   
             if ((*s_etat_processus).s_liste_variables              if ((*(*s_etat_processus).pointeur_variable_courante)
                     [(*s_etat_processus).position_variable_courante]  
                     .variable_verrouillee == d_vrai)                      .variable_verrouillee == d_vrai)
             {              {
                 erreur = d_erreur;                  erreur = d_erreur;
Line 669  retrait_variable(struct_processus *s_eta Line 690  retrait_variable(struct_processus *s_eta
             }              }
         }          }
   
         if ((*s_etat_processus).nombre_variables <          // Suppression de la variable de la liste.
                 ((*s_etat_processus).nombre_variables_allouees / 2))          // Deux cas peuvent survenir :
         {          // 1/ les pointeurs sur la variable et la variable suivante
             (*s_etat_processus).nombre_variables_allouees /= 2;          // sont identiques et on supprime la variable ainsi que la feuille
           // associée ;
             // (*s_etat_processus).nombre_variables est forcément          // 2/ ces deux pointeurs sont différents et se contente de retirer
             // supérieur à 1 (la décrémentation est postérieure). Ce test          // la structure décrivant la variable.
             // est vrai lorsque le nombre de variables allouées est  
             // strictement supérieur à 2.  
   
             if ((s_nouvelle_base =  
                     realloc((*s_etat_processus).s_liste_variables,  
                     (*s_etat_processus).nombre_variables_allouees *  
                     sizeof(struct_variable))) == NULL)  
             {  
                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
                 return(d_erreur);  
             }  
   
             (*s_etat_processus).s_liste_variables = s_nouvelle_base;  
         }  
   
         position_supprimee = (*s_etat_processus).position_variable_courante;          position_supprimee = (*s_etat_processus).position_variable_courante;
   

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


CVSweb interface <joel.bertrand@systella.fr>