--- rpl/src/gestion_variables.c 2011/09/16 08:14:10 1.47 +++ rpl/src/gestion_variables.c 2012/10/04 15:21:26 1.59 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.3 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.11 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -426,6 +426,7 @@ ajout_variable(struct_processus *s_etat_ } (*(*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).indice_tableau_pere = -1; (*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL; @@ -476,6 +477,9 @@ ajout_variable(struct_processus *s_etat_ (*(*l_variable_courante).noeuds[(*s_etat_processus) .pointeurs_caracteres_variables[*ptr]]).feuille = NULL; (*(*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; // Le champ noeud_pere de la structure créée pointe sur @@ -1292,7 +1296,8 @@ retrait_variable(struct_processus *s_eta [(*(*variable_a_supprimer).noeud).indice_tableau_pere])) .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_courant = (*s_arbre_courant).noeud_pere; @@ -1494,7 +1499,7 @@ retrait_variable(struct_processus *s_eta */ logical1 -retrait_variable_par_niveau(struct_processus *s_etat_processus) +retrait_variables_par_niveau(struct_processus *s_etat_processus) { struct_liste_variables *l_element_a_supprimer; @@ -1548,12 +1553,11 @@ retrait_variable_par_niveau(struct_proce .l_liste_variables_par_niveau).liste).donnee)) .variable_statique, ((*s_etat_processus) .mode_execution_programme - == 'Y') ? 'P' : 'E') == d_vrai) + == 'Y') ? 'P' : 'E') != NULL) { - (*s_etat_processus).s_liste_variables_statiques - [(*s_etat_processus) - .position_variable_statique_courante] - .objet = (*((struct_variable *) + (*(*s_etat_processus) + .pointeur_variable_statique_courante) + .objet = (*((struct_variable *) (*(*(*s_etat_processus) .l_liste_variables_par_niveau).liste) .donnee)).objet; @@ -1587,11 +1591,10 @@ retrait_variable_par_niveau(struct_proce .l_liste_variables_par_niveau).liste).donnee)) .variable_statique, ((*s_etat_processus) .mode_execution_programme - == 'Y') ? 'P' : 'E') == d_vrai) + == 'Y') ? 'P' : 'E') != NULL) { - (*s_etat_processus).s_liste_variables_statiques - [(*s_etat_processus) - .position_variable_statique_courante] + (*(*s_etat_processus) + .pointeur_variable_statique_courante) .objet = (*((struct_variable *) (*(*(*s_etat_processus) .l_liste_variables_par_niveau).liste) @@ -1666,13 +1669,16 @@ void liberation_arbre_variables(struct_processus *s_etat_processus, struct_arbre_variables *arbre, logical1 retrait_definitions) { - int i; + int i; - struct_liste_chainee *l_element_courant_liste; - struct_liste_chainee *l_element_suivant_liste; + struct_liste_chainee *l_element_courant_liste; + struct_liste_chainee *l_element_suivant_liste; - struct_liste_variables *l_element_courant; - struct_liste_variables *l_element_suivant; + struct_liste_variables *l_element_courant; + 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 // pas détruit par cette opération, il sera détruit lors de la libération @@ -1697,6 +1703,19 @@ liberation_arbre_variables(struct_proces (*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++) { if ((*arbre).noeuds[i] != NULL) @@ -1802,6 +1821,7 @@ nombre_variables(struct_processus *s_eta return(n); } + int liste_variables(struct_processus *s_etat_processus, struct_tableau_variables *tableau, int position,