--- rpl/src/gestion_variables.c 2011/04/21 16:00:55 1.26 +++ rpl/src/gestion_variables.c 2011/06/01 18:17:35 1.27 @@ -576,7 +576,7 @@ recherche_variable(struct_processus *s_e // Dans ce cas, on prend la variable de niveau le plus bas // si ce niveau est inférieur ou égal à 1 (variable globale // 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. if ((*(*(*(*l_variable_courante).feuille).precedent).variable) @@ -586,6 +586,22 @@ recherche_variable(struct_processus *s_e (*(*(*l_variable_courante).feuille).precedent).variable; (*s_etat_processus).pointeur_feuille_courante = (*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); } } @@ -625,41 +641,46 @@ retrait_variable(struct_processus *s_eta // La variable obtenue est une variable locale. il faut // s'assurer qu'il existe une variable de niveau 1 de même // nom sur la feuille. - } - if ((*s_etat_processus).position_variable_courante > 0) - { - while(strcmp((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .nom, nom_variable) == 0) + if ((*(*(*(*s_etat_processus).pointeur_feuille_courante) + .precedent).variable).niveau <= 1) { - (*s_etat_processus).position_variable_courante--; - - if ((*s_etat_processus).position_variable_courante >= - (*s_etat_processus).nombre_variables) + (*s_etat_processus).pointeur_feuille_courante = + (*(*s_etat_processus).pointeur_feuille_courante) + .precedent; + (*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).erreur_execution = - d_ex_variable_non_definie; - return erreur; + (*s_etat_processus).pointeur_feuille_courante = + (*(*s_etat_processus).pointeur_feuille_courante) + .precedent; + (*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++; - } - - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .niveau != 1) - { - erreur = d_erreur; - (*s_etat_processus).erreur_execution = - d_ex_variable_non_definie; - return erreur; + erreur = d_erreur; + (*s_etat_processus).erreur_execution = + d_ex_variable_non_definie; + return(erreur); + } } - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] + if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { erreur = d_erreur; @@ -669,27 +690,13 @@ retrait_variable(struct_processus *s_eta } } - if ((*s_etat_processus).nombre_variables < - ((*s_etat_processus).nombre_variables_allouees / 2)) - { - (*s_etat_processus).nombre_variables_allouees /= 2; - - // (*s_etat_processus).nombre_variables est forcément - // supérieur à 1 (la décrémentation est postérieure). Ce test - // 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; - } + // Suppression de la variable de la liste. + // Deux cas peuvent survenir : + // 1/ les pointeurs sur la variable et la variable suivante + // sont identiques et on supprime la variable ainsi que la feuille + // associée ; + // 2/ ces deux pointeurs sont différents et se contente de retirer + // la structure décrivant la variable. position_supprimee = (*s_etat_processus).position_variable_courante;