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

version 1.30, 2011/06/11 09:36:31 version 1.31, 2011/06/17 07:55:59
Line 53  ajout_variable(struct_processus *s_etat_ Line 53  ajout_variable(struct_processus *s_etat_
   
     unsigned char               *ptr;      unsigned char               *ptr;
   
       void                        *pointeur_variable_cree;
   
     if ((*s_etat_processus).s_arbre_variables == NULL)      if ((*s_etat_processus).s_arbre_variables == NULL)
     {      {
         if (((*s_etat_processus).s_arbre_variables =          if (((*s_etat_processus).s_arbre_variables =
Line 64  ajout_variable(struct_processus *s_etat_ Line 66  ajout_variable(struct_processus *s_etat_
   
         (*(*s_etat_processus).s_arbre_variables).feuille = NULL;          (*(*s_etat_processus).s_arbre_variables).feuille = NULL;
         (*(*s_etat_processus).s_arbre_variables).noeuds_utilises = 0;          (*(*s_etat_processus).s_arbre_variables).noeuds_utilises = 0;
           (*(*s_etat_processus).s_arbre_variables).indice_tableau_pere = -1;
         (*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL;          (*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL;
   
         if (((*(*s_etat_processus).s_arbre_variables).noeuds =          if (((*(*s_etat_processus).s_arbre_variables).noeuds =
Line 93  ajout_variable(struct_processus *s_etat_ Line 96  ajout_variable(struct_processus *s_etat_
         if ((*l_variable_courante).noeuds[(*s_etat_processus)          if ((*l_variable_courante).noeuds[(*s_etat_processus)
                 .pointeurs_caracteres_variables[*ptr]] == NULL)                  .pointeurs_caracteres_variables[*ptr]] == NULL)
         {          {
             // Le noeud n'existe pas encore, on le crée.              // Le noeud n'existe pas encore, on le crée et on le marque
               // comme utilisé dans la structure parente.
   
             if (((*l_variable_courante).noeuds[(*s_etat_processus)              if (((*l_variable_courante).noeuds[(*s_etat_processus)
                     .pointeurs_caracteres_variables[*ptr]] =                      .pointeurs_caracteres_variables[*ptr]] =
Line 104  ajout_variable(struct_processus *s_etat_ Line 108  ajout_variable(struct_processus *s_etat_
             }              }
   
             (*l_variable_courante).noeuds_utilises++;              (*l_variable_courante).noeuds_utilises++;
   
               // La feuille est par défaut vide et aucun élément du tableau noeuds
               // (les branches qui peuvent être issues de ce nouveau noeud)
               // n'est encore utilisée.
   
             (*(*l_variable_courante).noeuds[(*s_etat_processus)              (*(*l_variable_courante).noeuds[(*s_etat_processus)
                     .pointeurs_caracteres_variables[*ptr]]).feuille = NULL;                      .pointeurs_caracteres_variables[*ptr]]).feuille = NULL;
             (*(*l_variable_courante).noeuds[(*s_etat_processus)              (*(*l_variable_courante).noeuds[(*s_etat_processus)
                     .pointeurs_caracteres_variables[*ptr]]).noeuds_utilises = 0;                      .pointeurs_caracteres_variables[*ptr]]).noeuds_utilises = 0;
   
               // Le champ noeud_pere de la structure créée pointe sur
               // la structure parente et l'indice tableau_pere correspond à la
               // position réelle dans le tableau noeuds[] de la structure parente
               // du noeud courant. Cette valeur sera utilisée lors de la
               // destruction du noeud pour annuler le pointeur contenu dans
               // le tableau noeuds[] de la structure parente.
   
             (*(*l_variable_courante).noeuds[(*s_etat_processus)              (*(*l_variable_courante).noeuds[(*s_etat_processus)
                     .pointeurs_caracteres_variables[*ptr]]).noeud_pere =                      .pointeurs_caracteres_variables[*ptr]]).noeud_pere =
                     l_variable_precedente;                      l_variable_courante;
               (*(*l_variable_courante).noeuds[(*s_etat_processus)
                       .pointeurs_caracteres_variables[*ptr]])
                       .indice_tableau_pere = (*s_etat_processus)
                       .pointeurs_caracteres_variables[*ptr];
   
               // Allocation du tableau noeuds[] et initialisation à zéro de
               // tous les pointeurs.
   
             if (((*(*l_variable_courante).noeuds[(*s_etat_processus)              if (((*(*l_variable_courante).noeuds[(*s_etat_processus)
                     .pointeurs_caracteres_variables[*ptr]]).noeuds =                      .pointeurs_caracteres_variables[*ptr]]).noeuds =
Line 137  ajout_variable(struct_processus *s_etat_ Line 161  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 167  printf("Nouvelle feuille\n"); Line 190  printf("Nouvelle feuille\n");
   
         (*((struct_variable *) (*(*l_variable_courante).feuille).variable)) =          (*((struct_variable *) (*(*l_variable_courante).feuille).variable)) =
                 (*s_variable);                  (*s_variable);
           pointeur_variable_cree = (*(*l_variable_courante).feuille).variable;
         if (((*((struct_variable *) (*(*l_variable_courante).feuille).variable))  
                 .nom = strdup((*s_variable).nom)) == NULL)  
         {  
             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
             return(d_erreur);  
         }  
     }      }
     else      else
     {      {
Line 217  printf("Nouvelle feuille\n"); Line 234  printf("Nouvelle feuille\n");
   
             (*((struct_variable *) (*(*l_variable_courante).feuille).variable))              (*((struct_variable *) (*(*l_variable_courante).feuille).variable))
                     = (*s_variable);                      = (*s_variable);
               pointeur_variable_cree = (*(*l_variable_courante).feuille).variable;
             if (((*((struct_variable *) (*(*l_variable_courante).feuille)  
                     .variable)).nom = strdup((*s_variable).nom)) == NULL)  
             {  
                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
                 return(d_erreur);  
             }  
         }          }
         else          else
         {          {
Line 271  printf("Nouvelle feuille\n"); Line 282  printf("Nouvelle feuille\n");
             }              }
   
             (*(*l_nouvelle_variable).variable) = (*s_variable);              (*(*l_nouvelle_variable).variable) = (*s_variable);
               pointeur_variable_cree = (*l_nouvelle_variable).variable;
             if (((*(*l_nouvelle_variable).variable).nom =  
                     strdup((*s_variable).nom)) == NULL)  
             {  
                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;  
                 return(d_erreur);  
             }  
         }          }
     }      }
   
Line 299  printf("Nouvelle feuille\n"); Line 304  printf("Nouvelle feuille\n");
         (*l_nouvelle_variable).suivant = l_nouvelle_variable;          (*l_nouvelle_variable).suivant = l_nouvelle_variable;
         (*l_nouvelle_variable).precedent = l_nouvelle_variable;          (*l_nouvelle_variable).precedent = l_nouvelle_variable;
         (*l_nouvelle_variable).noeud_pere = NULL;          (*l_nouvelle_variable).noeud_pere = NULL;
           (*l_nouvelle_variable).liste = NULL;
   
         (*s_etat_processus).l_liste_variables_par_niveau = l_nouvelle_variable;          (*s_etat_processus).l_liste_variables_par_niveau = l_nouvelle_variable;
     }      }
Line 320  printf("Nouvelle feuille\n"); Line 326  printf("Nouvelle feuille\n");
         (*l_nouvelle_variable).precedent = (*(*s_etat_processus)          (*l_nouvelle_variable).precedent = (*(*s_etat_processus)
                 .l_liste_variables_par_niveau).precedent;                  .l_liste_variables_par_niveau).precedent;
         (*l_nouvelle_variable).noeud_pere = NULL;          (*l_nouvelle_variable).noeud_pere = NULL;
           (*l_nouvelle_variable).liste = NULL;
         (*(*(*s_etat_processus).l_liste_variables_par_niveau).precedent)          (*(*(*s_etat_processus).l_liste_variables_par_niveau).precedent)
                 .suivant = l_nouvelle_variable;                  .suivant = l_nouvelle_variable;
         (*(*s_etat_processus).l_liste_variables_par_niveau).precedent =          (*(*s_etat_processus).l_liste_variables_par_niveau).precedent =
Line 327  printf("Nouvelle feuille\n"); Line 334  printf("Nouvelle feuille\n");
   
         (*s_etat_processus).l_liste_variables_par_niveau = l_nouvelle_variable;          (*s_etat_processus).l_liste_variables_par_niveau = l_nouvelle_variable;
     }      }
     else      else if ((*s_variable).niveau <= 1)
     {      {
         // Création d'une variable de niveau 0 ou 1          // Création d'une variable de niveau 0 ou 1
   
Line 342  printf("Nouvelle feuille\n"); Line 349  printf("Nouvelle feuille\n");
   
         if ((*((struct_variable *) (*(*(*(*s_etat_processus)          if ((*((struct_variable *) (*(*(*(*s_etat_processus)
                 .l_liste_variables_par_niveau).precedent).liste).donnee))                  .l_liste_variables_par_niveau).precedent).liste).donnee))
                 .niveau > 1)                  .niveau <= 1)
         {  
             // Ajout inconditionnel des variables de niveaux 0 et 1  
         }  
         else  
         {          {
             l_variable_candidate = (*(*s_etat_processus)              l_variable_candidate = (*(*s_etat_processus)
                     .l_liste_variables_par_niveau).precedent;                      .l_liste_variables_par_niveau).precedent;
Line 356  printf("Nouvelle feuille\n"); Line 359  printf("Nouvelle feuille\n");
         (*l_nouvelle_variable).precedent = (*l_variable_candidate)          (*l_nouvelle_variable).precedent = (*l_variable_candidate)
                 .precedent;                  .precedent;
         (*l_nouvelle_variable).noeud_pere = NULL;          (*l_nouvelle_variable).noeud_pere = NULL;
           (*l_nouvelle_variable).liste = NULL;
         (*(*l_variable_candidate).precedent).suivant = l_nouvelle_variable;          (*(*l_variable_candidate).precedent).suivant = l_nouvelle_variable;
         (*l_variable_candidate).precedent = l_nouvelle_variable;          (*l_variable_candidate).precedent = l_nouvelle_variable;
     }      }
Line 370  printf("Nouvelle feuille\n"); Line 374  printf("Nouvelle feuille\n");
   
     (*l_nouvel_element).suivant = (*(*s_etat_processus)      (*l_nouvel_element).suivant = (*(*s_etat_processus)
             .l_liste_variables_par_niveau).liste;              .l_liste_variables_par_niveau).liste;
     (*l_nouvel_element).donnee = (struct_objet *) s_variable;      (*l_nouvel_element).donnee = pointeur_variable_cree;
     (*l_nouvelle_variable).liste = l_nouvel_element;      (*(*s_etat_processus).l_liste_variables_par_niveau).liste =
               l_nouvel_element;
   
     return(d_absence_erreur);      return(d_absence_erreur);
 }  }
   
   
 logical1  logical1
 creation_variable(struct_processus *s_etat_processus,  creation_variable(struct_processus *s_etat_processus,
         struct_variable *s_variable,          struct_variable *s_variable,
Line 830  retrait_variable(struct_processus *s_eta Line 836  retrait_variable(struct_processus *s_eta
                 s_arbre_a_supprimer = s_arbre_courant;                  s_arbre_a_supprimer = s_arbre_courant;
                 s_arbre_courant = (*s_arbre_courant).noeud_pere;                  s_arbre_courant = (*s_arbre_courant).noeud_pere;
   
                 free((*s_arbre_a_supprimer).noeuds);  
                 free(s_arbre_a_supprimer);  
   
                 if (s_arbre_courant == NULL)                  if (s_arbre_courant == NULL)
                 {                  {
                       free((*s_arbre_a_supprimer).noeuds);
                       free(s_arbre_a_supprimer);
                     break;                      break;
                 }                  }
   
                   // s_arbre_a_supprimer contient la structure de feuille qui
                   // vient d'être libérée. Il s'agit maintenant
                   // d'annuler le pointeur dans le tableau noeuds de la structure
                   // pointée par noeud_pere, soit s_arbre_courant.
   
                   BUG((*s_arbre_a_supprimer).indice_tableau_pere < 0,
                           uprintf("Invalid pointer !\n"));
                   (*s_arbre_courant).noeuds[(*s_arbre_a_supprimer)
                           .indice_tableau_pere] = NULL;
   
                   free((*s_arbre_a_supprimer).noeuds);
                   free(s_arbre_a_supprimer);
   
                 BUG((*s_arbre_courant).noeuds_utilises == 0,                  BUG((*s_arbre_courant).noeuds_utilises == 0,
                         uprintf("Freed node !\n"));                          uprintf("Freed node !\n"));
                 (*s_arbre_courant).noeuds_utilises--;                  (*s_arbre_courant).noeuds_utilises--;
Line 865  retrait_variable(struct_processus *s_eta Line 883  retrait_variable(struct_processus *s_eta
         niveau = (*(*variable_a_supprimer).variable).niveau;          niveau = (*(*variable_a_supprimer).variable).niveau;
         variables_par_niveau = (*s_etat_processus).l_liste_variables_par_niveau;          variables_par_niveau = (*s_etat_processus).l_liste_variables_par_niveau;
   
         while(variables_par_niveau != NULL)          if (variables_par_niveau != NULL)
         {          {
             l_element_courant = (*variables_par_niveau).liste;              do
   
             if (l_element_courant != NULL)  
             {              {
                 if ((*((struct_variable *) (*l_element_courant).donnee)).niveau                  l_element_courant = (*variables_par_niveau).liste;
                         == niveau)  
                 {  
                     // On parcourt le bon niveau.  
   
                     l_element_precedent = NULL;                  if (l_element_courant != NULL)
                   {
                     while(l_element_courant != NULL)                      if ((*((struct_variable *) (*l_element_courant).donnee))
                               .niveau == niveau)
                     {                      {
                         // Tant que l_element_courant est non nul, il reste des                          // On parcourt le bon niveau.
                         // variables à explorer dans le niveau courant.  
                           l_element_precedent = NULL;
   
                         if ((*l_element_courant).donnee ==                          while(l_element_courant != NULL)
                                 (void *) (*variable_a_supprimer).variable)  
                         {                          {
                             // On a trouvé la variable à supprimer.                              // Tant que l_element_courant est non nul, il reste
                               // des variables à explorer dans le niveau courant.
   
                             if (l_element_precedent == NULL)                              if ((*l_element_courant).donnee ==
                             {                                      (void *) (*variable_a_supprimer).variable)
                                 (*variables_par_niveau).liste =  
                                         (*l_element_courant).suivant;  
                             }  
                             else  
                             {                              {
                                 (*l_element_precedent).suivant =                                  // On a trouvé la variable à supprimer.
                                         (*l_element_courant).suivant;  
                                   if (l_element_precedent == NULL)
                                   {
                                       (*variables_par_niveau).liste =
                                               (*l_element_courant).suivant;
                                   }
                                   else
                                   {
                                       (*l_element_precedent).suivant =
                                               (*l_element_courant).suivant;
                                   }
   
                                   free(l_element_courant);
                                   break;
                             }                              }
                         }  
   
                         l_element_precedent = l_element_courant;                              l_element_precedent = l_element_courant;
                         l_element_courant = (*l_element_courant).suivant;                              l_element_courant = (*l_element_courant).suivant;
                           }
                     }                      }
                 }                  }
             }  
   
             variables_par_niveau = (*variables_par_niveau).suivant;                  variables_par_niveau = (*variables_par_niveau).suivant;
   
               } while(variables_par_niveau != (*s_etat_processus)
                       .l_liste_variables_par_niveau);
         }          }
   
         // Puis on libère le contenu de la variable.          // Puis on libère le contenu de la variable.
Line 945  retrait_variable(struct_processus *s_eta Line 971  retrait_variable(struct_processus *s_eta
 logical1  logical1
 retrait_variable_par_niveau(struct_processus *s_etat_processus)  retrait_variable_par_niveau(struct_processus *s_etat_processus)
 {  {
       struct_liste_variables          *l_element_a_supprimer;
   
     // Utilisation du champ (*s_etat_processus).liste_variables_par_niveau.      // Utilisation du champ (*s_etat_processus).liste_variables_par_niveau.
     // La tête de la pile contient toujours les variables de plus haut niveau      // La tête de la pile contient toujours les variables de plus haut niveau
     // créées.      // créées.
   
     struct_liste_variables          *l_niveau_suivant;  
   
     while((*s_etat_processus).l_liste_variables_par_niveau != NULL)      while((*s_etat_processus).l_liste_variables_par_niveau != NULL)
     {      {
         l_niveau_suivant = (*(*s_etat_processus).l_liste_variables_par_niveau)  
                 .suivant;  
   
         if ((*(*s_etat_processus).l_liste_variables_par_niveau).liste == NULL)          if ((*(*s_etat_processus).l_liste_variables_par_niveau).liste == NULL)
         {          {
             // Si le niveau ne contient aucune variable, on le détruit.              // Si le niveau ne contient aucune variable, on le détruit.
Line 1070  retrait_variable_par_niveau(struct_proce Line 1093  retrait_variable_par_niveau(struct_proce
             }              }
         }          }
   
         free((*s_etat_processus).l_liste_variables_par_niveau);          // On retire l'élément de la liste doublement chaînée et circulaire.
         (*s_etat_processus).l_liste_variables_par_niveau = l_niveau_suivant;  
           (*(*(*s_etat_processus).l_liste_variables_par_niveau).precedent).suivant
                   = (*(*s_etat_processus).l_liste_variables_par_niveau).suivant;
           (*(*(*s_etat_processus).l_liste_variables_par_niveau).suivant).precedent
                   = (*(*s_etat_processus).l_liste_variables_par_niveau).precedent;
   
           l_element_a_supprimer = (*s_etat_processus)
                   .l_liste_variables_par_niveau;
           (*s_etat_processus).l_liste_variables_par_niveau =
                   (*l_element_a_supprimer).suivant;
           free(l_element_a_supprimer);
     }      }
   
     return(d_absence_erreur);      return(d_absence_erreur);
Line 1107  liberation_arbre_variables(struct_proces Line 1140  liberation_arbre_variables(struct_proces
     // pas détruit par cette opération, il sera détruit lors de la libération      // pas détruit par cette opération, il sera détruit lors de la libération
     // de la liste des variables par niveau.      // de la liste des variables par niveau.
   
       l_element_courant = (*arbre).feuille;
   
       if (l_element_courant != NULL)
       {
           do
           {
               l_element_suivant = (*l_element_courant).suivant;
               free(l_element_courant);
               l_element_courant = l_element_suivant;
           } while(l_element_courant != (*arbre).feuille);
       }
   
     for(i = 0; i < (*s_etat_processus).nombre_caracteres_variables; i++)      for(i = 0; i < (*s_etat_processus).nombre_caracteres_variables; i++)
     {      {
         if ((*arbre).noeuds[i] != NULL)          if ((*arbre).noeuds[i] != NULL)
         {          {
             l_element_courant = (*arbre).feuille;  
   
             while(l_element_courant != NULL)  
             {  
                 l_element_suivant = (*l_element_courant).suivant;  
                 free(l_element_courant);  
                 l_element_courant = l_element_suivant;  
             }  
   
             liberation_arbre_variables(s_etat_processus, (*arbre).noeuds[i],              liberation_arbre_variables(s_etat_processus, (*arbre).noeuds[i],
                     retrait_definitions);                      retrait_definitions);
         }          }
Line 1131  liberation_arbre_variables(struct_proces Line 1167  liberation_arbre_variables(struct_proces
     {      {
         l_element_courant = (*s_etat_processus).l_liste_variables_par_niveau;          l_element_courant = (*s_etat_processus).l_liste_variables_par_niveau;
   
         while(l_element_courant != NULL)          if (l_element_courant != NULL)
         {          {
             l_element_courant_liste = (*l_element_courant).liste;              do
   
             while(l_element_courant_liste != NULL)  
             {              {
                 if ((retrait_definitions == d_vrai) ||                  l_element_courant_liste = (*l_element_courant).liste;
                         ((*((struct_variable *) (*l_element_courant_liste)  
                         .donnee)).niveau >= 1))                  while(l_element_courant_liste != NULL)
                 {                  {
                     liberation(s_etat_processus, (*((struct_variable *)                      if ((retrait_definitions == d_vrai) ||
                             (*l_element_courant_liste).donnee)).objet);                              ((*((struct_variable *) (*l_element_courant_liste)
                     free((*((struct_variable *) (*l_element_courant_liste)                              .donnee)).niveau >= 1))
                             .donnee)).nom);                      {
                     free((*l_element_courant_liste).donnee);                          liberation(s_etat_processus, (*((struct_variable *)
                 }                                  (*l_element_courant_liste).donnee)).objet);
                           free((*((struct_variable *) (*l_element_courant_liste)
                                   .donnee)).nom);
                           free((*l_element_courant_liste).donnee);
                       }
   
                 l_element_suivant_liste = (*l_element_courant_liste).suivant;                      l_element_suivant_liste =
                 free(l_element_courant_liste);                              (*l_element_courant_liste).suivant;
                 l_element_courant_liste = l_element_suivant_liste;                      free(l_element_courant_liste);
             }                      l_element_courant_liste = l_element_suivant_liste;
                   }
   
             l_element_suivant = (*l_element_courant).suivant;                  l_element_suivant = (*l_element_courant).suivant;
             free(l_element_courant);                  free(l_element_courant);
             l_element_courant = l_element_suivant;                  l_element_courant = l_element_suivant;
               } while(l_element_courant != (*s_etat_processus)
                       .l_liste_variables_par_niveau);
         }          }
     }      }
   

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


CVSweb interface <joel.bertrand@systella.fr>