--- rpl/src/gestion_variables.c 2011/06/19 17:48:27 1.33 +++ rpl/src/gestion_variables.c 2011/06/20 17:34:10 1.34 @@ -50,6 +50,12 @@ liste_variables_par_niveaux(struct_proce printf(" Liste des variables par niveaux\n"); printf("===========================================================\n"); + if ((*s_etat_processus).l_liste_variables_par_niveau == NULL) + { + printf("===========================================================\n"); + return; + } + printf("Backward\n"); l = (*s_etat_processus).l_liste_variables_par_niveau; c = 0; @@ -119,9 +125,30 @@ liste_variables_tas(struct_processus *s_ fin = d_faux; + if (arbre == NULL) + { + return; + } + + printf(">>> Position : %d\n", + (*arbre).indice_tableau_pere); + printf(">>> Nombre de noeuds utilisés : %u\n", + (*arbre).noeuds_utilises); + printf(">>> Noeuds fils : "); + + for(i = 0; i < (*s_etat_processus).nombre_caracteres_variables; i++) + { + if ((*arbre).noeuds[i] != NULL) + { + printf("%d ", i); + } + } + + printf("\b\n"); + if ((*arbre).feuille != NULL) { - printf("Feuille %p\n", (*arbre).feuille); + printf("Feuille %p [%d]\n", (*arbre).feuille, (*arbre).noeuds_utilises); printf(" Backward\n"); @@ -157,10 +184,13 @@ liste_variables_tas(struct_processus *s_ } while((*arbre).feuille != l); } + printf("-----------------------------------------------------------\n"); + for(i = 0; i < (*s_etat_processus).nombre_caracteres_variables; i++) { if ((*arbre).noeuds[i] != NULL) { + liste_variables_tas(s_etat_processus, (*arbre).noeuds[i]); } } @@ -341,6 +371,8 @@ ajout_variable(struct_processus *s_etat_ return(d_erreur); } + (*l_variable_courante).noeuds_utilises++; + (*(*l_variable_courante).feuille).suivant = (*l_variable_courante).feuille; (*(*l_variable_courante).feuille).precedent = @@ -426,13 +458,21 @@ ajout_variable(struct_processus *s_etat_ } while((l_variable_candidate != (*l_variable_courante).feuille) && ((*(*l_variable_candidate).variable).niveau <= 1)); + BUG((*s_variable).niveau == 0, + uprintf("Attempt to create a level-0 variable!\n")); + if ((*(*(*(*l_variable_courante).feuille).precedent).variable) .niveau > 1) { - // Ajout inconditionnel des variables de niveaux 0 et 1 + // La variable précédente est de niveau strictement supérieur + // à 1. Il ne peut donc y avoir aucune variable de niveau + // inférieur ou égal à 1 puisque la boucle est triée. + // On insère donc directement la variable en queue. } else { + // Le niveau de la variable précédente dans la boucle est + // inférieur ou égal à 1. l_variable_candidate = (*(*l_variable_courante).feuille) .precedent; } @@ -445,6 +485,17 @@ ajout_variable(struct_processus *s_etat_ (*(*l_variable_candidate).precedent).suivant = l_nouvelle_variable; (*l_variable_candidate).precedent = l_nouvelle_variable; + // Si la variable suivant la variable que l'on vient d'insérer + // dans la boucle est de niveau 0, la variable insérée est par + // construction de niveau 1 et il convient de modifier le + // pointeur de feuille pointant sur l'élément de plus haut niveau + // de la boucle. + + if ((*(*(*l_nouvelle_variable).precedent).variable).niveau == 0) + { + (*(*l_nouvelle_variable).noeud).feuille = l_nouvelle_variable; + } + if (((*l_nouvelle_variable).variable = malloc(sizeof(struct_variable))) == NULL) { @@ -976,10 +1027,10 @@ retrait_variable(struct_processus *s_eta unsigned char *nom_variable, unsigned char type) { logical1 erreur; + logical1 variable_supprimee; struct_arbre_variables *s_arbre_a_supprimer; struct_arbre_variables *s_arbre_courant; - struct_arbre_variables *noeud_courant; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_precedent; @@ -1069,15 +1120,16 @@ retrait_variable(struct_processus *s_eta variable_a_supprimer = (*s_etat_processus) .pointeur_feuille_courante; - s_arbre_courant = (*variable_a_supprimer).noeud_pere; - noeud_courant = (*variable_a_supprimer).noeud; - (*s_arbre_courant).noeuds[(*noeud_courant).indice_tableau_pere] - = NULL; - + //s_arbre_courant = (*variable_a_supprimer).noeud_pere; + s_arbre_courant = (*variable_a_supprimer).noeud; BUG((*s_arbre_courant).noeuds_utilises == 0, uprintf("Freed node !\n")); (*s_arbre_courant).noeuds_utilises--; + (*((*(*variable_a_supprimer).noeud_pere).noeuds + [(*(*variable_a_supprimer).noeud).indice_tableau_pere])) + .feuille = NULL; + while((*s_arbre_courant).noeuds_utilises == 0) { s_arbre_a_supprimer = s_arbre_courant; @@ -1087,6 +1139,8 @@ retrait_variable(struct_processus *s_eta { free((*s_arbre_a_supprimer).noeuds); free(s_arbre_a_supprimer); + + (*s_etat_processus).s_arbre_variables = NULL; break; } @@ -1142,8 +1196,6 @@ retrait_variable(struct_processus *s_eta (*(*s_etat_processus).pointeur_feuille_courante).suivant; (*s_etat_processus).pointeur_variable_courante = (*(*s_etat_processus).pointeur_feuille_courante).variable; - - noeud_courant = NULL; } // Dans tous les cas, on retire la variable de la liste des variables @@ -1151,6 +1203,7 @@ retrait_variable(struct_processus *s_eta niveau = (*(*variable_a_supprimer).variable).niveau; variables_par_niveau = (*s_etat_processus).l_liste_variables_par_niveau; + variable_supprimee = d_faux; if (variables_par_niveau != NULL) { @@ -1189,6 +1242,33 @@ retrait_variable(struct_processus *s_eta } free(l_element_courant); + + if ((*variables_par_niveau).liste == NULL) + { + if ((*s_etat_processus) + .l_liste_variables_par_niveau + == variables_par_niveau) + { + // On retire l'élément de la liste + // pointé par + // l_liste_variable_par_niveau + + (*s_etat_processus) + .l_liste_variables_par_niveau = + (*variables_par_niveau).suivant; + } + + (*(*variables_par_niveau).precedent) + .suivant = + (*variables_par_niveau).suivant; + (*(*variables_par_niveau).suivant) + .precedent = + (*variables_par_niveau) + .precedent; + free(variables_par_niveau); + } + + variable_supprimee = d_vrai; break; } @@ -1198,6 +1278,11 @@ retrait_variable(struct_processus *s_eta } } + if (variable_supprimee == d_vrai) + { + break; + } + variables_par_niveau = (*variables_par_niveau).suivant; } while(variables_par_niveau != (*s_etat_processus) @@ -1212,12 +1297,6 @@ retrait_variable(struct_processus *s_eta free(variable_a_supprimer); erreur = d_absence_erreur; - - if (noeud_courant != NULL) - { - free((*noeud_courant).noeuds); - free(noeud_courant); - } } else { @@ -1280,6 +1359,8 @@ retrait_variable_par_niveau(struct_proce while((*(*s_etat_processus).l_liste_variables_par_niveau).liste != NULL) { + // Nécessaire car le pointeur sur la tête de la pile + // peut être modifié par retrait_variable(). // Sauvegarde des variables statiques. if ((*((struct_variable *) (*(*(*s_etat_processus) @@ -1367,6 +1448,17 @@ retrait_variable_par_niveau(struct_proce { return(d_erreur); } + + if ((*((struct_variable *) (*(*(*s_etat_processus) + .l_liste_variables_par_niveau).liste).donnee)).niveau + <= (*s_etat_processus).niveau_courant) + { + // On a retiré de l'arbre des variables toutes les + // variables de niveau strictement supérieur au niveau + // courant. + + return(d_absence_erreur); + } } } @@ -1417,6 +1509,11 @@ liberation_arbre_variables(struct_proces // pas détruit par cette opération, il sera détruit lors de la libération // de la liste des variables par niveau. + if (arbre == NULL) + { + return; + } + l_element_courant = (*arbre).feuille; if (l_element_courant != NULL)