Diff for /rpl/src/gestion_variables.c between versions 1.44 and 1.58

version 1.44, 2011/07/22 07:38:35 version 1.58, 2012/10/03 14:53:11
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.1    RPL/2 (R) version 4.1.11
   Copyright (C) 1989-2011 Dr. BERTRAND Joël    Copyright (C) 1989-2012 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 426  ajout_variable(struct_processus *s_etat_ Line 426  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).feuille_statique = 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).indice_tableau_pere = -1;
         (*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL;          (*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL;
Line 476  ajout_variable(struct_processus *s_etat_ Line 477  ajout_variable(struct_processus *s_etat_
             (*(*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]]).feuille_statique
                       = NULL;
               (*(*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              // Le champ noeud_pere de la structure créée pointe sur
Line 1292  retrait_variable(struct_processus *s_eta Line 1296  retrait_variable(struct_processus *s_eta
                     [(*(*variable_a_supprimer).noeud).indice_tableau_pere]))                      [(*(*variable_a_supprimer).noeud).indice_tableau_pere]))
                     .feuille = NULL;                      .feuille = NULL;
   
             while((*s_arbre_courant).noeuds_utilises == 0)              while(((*s_arbre_courant).noeuds_utilises == 0) &&
                       ((*s_arbre_courant).feuille_statique == NULL))
             {              {
                 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;
Line 1666  void Line 1671  void
 liberation_arbre_variables(struct_processus *s_etat_processus,  liberation_arbre_variables(struct_processus *s_etat_processus,
         struct_arbre_variables *arbre, logical1 retrait_definitions)          struct_arbre_variables *arbre, logical1 retrait_definitions)
 {  {
     int                     i;      int                                 i;
   
     struct_liste_chainee    *l_element_courant_liste;      struct_liste_chainee                *l_element_courant_liste;
     struct_liste_chainee    *l_element_suivant_liste;      struct_liste_chainee                *l_element_suivant_liste;
   
     struct_liste_variables  *l_element_courant;      struct_liste_variables              *l_element_courant;
     struct_liste_variables  *l_element_suivant;      struct_liste_variables              *l_element_suivant;
   
       struct_liste_variables_statiques    *l_element_statique_courant;
       struct_liste_variables_statiques    *l_element_statique_suivant;
   
     // Libération de l'arbre des variables. Le contenu des variables n'est      // Libération de l'arbre des variables. Le contenu des variables n'est
     // 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
Line 1697  liberation_arbre_variables(struct_proces Line 1705  liberation_arbre_variables(struct_proces
         (*arbre).feuille = NULL;          (*arbre).feuille = NULL;
     }      }
   
       l_element_statique_courant = (*arbre).feuille_statique;
   
       while(l_element_statique_courant != NULL)
       {
           l_element_statique_suivant = (*l_element_statique_courant).suivant;
   
           free((*(*l_element_statique_courant).variable).nom);
           liberation(s_etat_processus, (*(*l_element_statique_courant)
                   .variable).objet);
   
           l_element_statique_courant = l_element_statique_suivant;
       }
   
     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)
Line 1802  nombre_variables(struct_processus *s_eta Line 1823  nombre_variables(struct_processus *s_eta
     return(n);      return(n);
 }  }
   
   
 int  int
 liste_variables(struct_processus *s_etat_processus,  liste_variables(struct_processus *s_etat_processus,
         struct_tableau_variables *tableau, int position,          struct_tableau_variables *tableau, int position,
Line 1845  liste_variables(struct_processus *s_etat Line 1867  liste_variables(struct_processus *s_etat
     return(position);      return(position);
 }  }
   
   
 /*  /*
 ================================================================================  ================================================================================
   Procédure de copie de l'arbre des variables    Procédure de copie de l'arbre des variables
Line 1876  copie_arbre_variables(struct_processus * Line 1899  copie_arbre_variables(struct_processus *
   
     int                             i;      int                             i;
   
       logical1                        niveau_0_traite;
       logical1                        niveau_1_traite;
   
     struct_liste_chainee            *l_element_courant;      struct_liste_chainee            *l_element_courant;
   
     struct_liste_variables          *l_niveau_courant;      struct_liste_variables          *l_niveau_courant;
Line 1888  copie_arbre_variables(struct_processus * Line 1914  copie_arbre_variables(struct_processus *
     l_niveau_courant = (*s_etat_processus).l_liste_variables_par_niveau;      l_niveau_courant = (*s_etat_processus).l_liste_variables_par_niveau;
           
     // Si la variable en tête n'est pas une variable de niveau 0, le niveau      // Si la variable en tête n'est pas une variable de niveau 0, le niveau
     // 0, s'il existe est le nivau précédent la valeur courante dans la      // 0, s'il existe est le niveau précédent la valeur courante dans la
     // boucle.      // boucle.
   
     if ((*((struct_variable *) (*(*l_niveau_courant).liste).donnee)).niveau      if ((*((struct_variable *) (*(*l_niveau_courant).liste).donnee)).niveau
Line 1900  copie_arbre_variables(struct_processus * Line 1926  copie_arbre_variables(struct_processus *
     // Les variables de niveaux 0 et 1 sont accessibles en au plus trois      // Les variables de niveaux 0 et 1 sont accessibles en au plus trois
     // itérations (par construction).      // itérations (par construction).
   
       niveau_0_traite = d_faux;
       niveau_1_traite = d_faux;
   
     for(i = 0; i <= 2; i++)      for(i = 0; i <= 2; i++)
     {      {
         if ((*((struct_variable *) (*(*l_niveau_courant).liste)          if ((*((struct_variable *) (*(*l_niveau_courant).liste)
                 .donnee)).niveau == 0)                  .donnee)).niveau == 0)
         {          {
             l_element_courant = (*l_niveau_courant).liste;              if (niveau_0_traite == d_faux)
   
             while(l_element_courant != NULL)  
             {              {
                 if (ajout_variable(s_nouvel_etat_processus,                  l_element_courant = (*l_niveau_courant).liste;
                         (struct_variable *) (*l_element_courant).donnee)  
                         == d_erreur)                  while(l_element_courant != NULL)
                 {                  {
                     return;                      if (ajout_variable(s_nouvel_etat_processus,
                               (struct_variable *) (*l_element_courant).donnee)
                               == d_erreur)
                       {
                           return;
                       }
   
                       l_element_courant = (*l_element_courant).suivant;
                 }                  }
   
                 l_element_courant = (*l_element_courant).suivant;                  niveau_0_traite = d_vrai;
             }              }
         }          }
         else if ((*((struct_variable *) (*(*l_niveau_courant).liste)          else if ((*((struct_variable *) (*(*l_niveau_courant).liste)
                 .donnee)).niveau == 1)                  .donnee)).niveau == 1)
         {          {
             l_element_courant = (*l_niveau_courant).liste;              if (niveau_1_traite == d_faux)
   
             while(l_element_courant != NULL)  
             {              {
                 s_variable = (*((struct_variable *)                  l_element_courant = (*l_niveau_courant).liste;
                         (*l_element_courant).donnee));  
   
                 if ((s_variable.nom = strdup((*((struct_variable *)                  while(l_element_courant != NULL)
                         (*l_element_courant).donnee)).nom)) == NULL)  
                 {                  {
                     (*s_nouvel_etat_processus).erreur_systeme =                      s_variable = (*((struct_variable *)
                             d_es_allocation_memoire;                              (*l_element_courant).donnee));
                     return;  
                 }  
   
                 if ((s_variable.objet = copie_objet(s_nouvel_etat_processus,                      if ((s_variable.nom = strdup((*((struct_variable *)
                         (*((struct_variable *) (*l_element_courant).donnee))                              (*l_element_courant).donnee)).nom)) == NULL)
                         .objet, 'P')) == NULL)                      {
                 {                          (*s_nouvel_etat_processus).erreur_systeme =
                     (*s_nouvel_etat_processus).erreur_systeme =                                  d_es_allocation_memoire;
                             d_es_allocation_memoire;                          return;
                     return;                      }
                 }  
   
                 if (ajout_variable(s_nouvel_etat_processus, &s_variable)                      if ((s_variable.objet = copie_objet(s_nouvel_etat_processus,
                         == d_erreur)                              (*((struct_variable *) (*l_element_courant).donnee))
                 {                              .objet, 'P')) == NULL)
                     return;                      {
                           (*s_nouvel_etat_processus).erreur_systeme =
                                   d_es_allocation_memoire;
                           return;
                       }
   
                       if (ajout_variable(s_nouvel_etat_processus, &s_variable)
                               == d_erreur)
                       {
                           return;
                       }
   
                       l_element_courant = (*l_element_courant).suivant;
                 }                  }
   
                 l_element_courant = (*l_element_courant).suivant;                  niveau_1_traite = d_vrai;
             }              }
   
             // Les variables de niveau 0 ayant déjà été copiées, on              // Les variables de niveau 0 ayant déjà été copiées, on

Removed from v.1.44  
changed lines
  Added in v.1.58


CVSweb interface <joel.bertrand@systella.fr>