--- rpl/src/gestion_variables.c 2011/06/08 13:35:15 1.28 +++ rpl/src/gestion_variables.c 2011/06/11 09:36:31 1.30 @@ -66,7 +66,7 @@ ajout_variable(struct_processus *s_etat_ (*(*s_etat_processus).s_arbre_variables).noeuds_utilises = 0; (*(*s_etat_processus).s_arbre_variables).noeud_pere = NULL; - if (((*(*s_etat_processus).arbre_instructions).noeud = + if (((*(*s_etat_processus).s_arbre_variables).noeuds = malloc((*s_etat_processus).nombre_caracteres_variables * sizeof(struct_arbre_variables))) == NULL) { @@ -137,6 +137,7 @@ ajout_variable(struct_processus *s_etat_ if ((*l_variable_courante).feuille == NULL) { +printf("Nouvelle feuille\n"); // Aucune variable de même nom préexiste. On alloue le premier // élément de la liste doublement chaînée contenant toutes les // variables de même nom. Cette liste boucle en premier lieu sur @@ -527,7 +528,7 @@ recherche_variable(struct_processus *s_e if ((*s_etat_processus).s_arbre_variables == NULL) { (*s_etat_processus).erreur_systeme = d_es_variable_introuvable; - return d_faux; + return(d_faux); } l_variable_courante = (*s_etat_processus).s_arbre_variables; @@ -540,13 +541,16 @@ recherche_variable(struct_processus *s_e if (pointeur < 0) { // Caractère hors de l'alphabet des variables - return(d_erreur); + + (*s_etat_processus).erreur_systeme = d_es_variable_introuvable; + return(d_faux); } if ((*l_variable_courante).noeuds[pointeur] == NULL) { // Le chemin de la variable candidate n'existe pas. - return(d_erreur); + (*s_etat_processus).erreur_systeme = d_es_variable_introuvable; + return(d_faux); } l_variable_courante = (*l_variable_courante).noeuds[pointeur]; @@ -564,7 +568,7 @@ recherche_variable(struct_processus *s_e { // Problème : la pile système est vide ! (*s_etat_processus).erreur_systeme = d_es_pile_vide; - return(d_erreur); + return(d_faux); } while((*l_element_courant).retour_definition != 'Y') @@ -574,7 +578,7 @@ recherche_variable(struct_processus *s_e if (l_element_courant == NULL) { (*s_etat_processus).erreur_systeme = d_es_pile_vide; - return(d_erreur); + return(d_faux); } } @@ -589,7 +593,7 @@ recherche_variable(struct_processus *s_e (*(*l_variable_courante).feuille).variable; (*s_etat_processus).pointeur_feuille_courante = (*l_variable_courante).feuille; - return(d_absence_erreur); + return(d_vrai); } else { @@ -623,12 +627,85 @@ recherche_variable(struct_processus *s_e (*l_variable_courante).feuille; } - return(d_absence_erreur); + return(d_vrai); + } + } + } + + (*s_etat_processus).erreur_systeme = d_es_variable_introuvable; + return(d_faux); +} + + +logical1 +recherche_variable_globale(struct_processus *s_etat_processus, + unsigned char *nom) +{ + logical1 presence_variable; + + presence_variable = recherche_variable(s_etat_processus, nom); + + if (presence_variable == d_vrai) + { + switch((*(*s_etat_processus).pointeur_variable_courante).niveau) + { + case 0: + { + // Nous sommes en présence d'une définition et non d'une + // variable. + + presence_variable = d_faux; + break; + } + + case 1: + { + break; } + + default: + { + if ((*(*(*(*s_etat_processus).pointeur_feuille_courante) + .precedent).variable).niveau == 1) + { + (*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 if ((*(*(*(*(*s_etat_processus).pointeur_feuille_courante) + .precedent).precedent).variable).niveau == 1) + { + (*s_etat_processus).pointeur_feuille_courante = + (*(*(*s_etat_processus).pointeur_feuille_courante) + .precedent).precedent; + (*s_etat_processus).pointeur_variable_courante = + (*(*s_etat_processus).pointeur_feuille_courante) + .variable; + } + else + { + presence_variable = d_faux; + } + + break; + } + } + } + + if (presence_variable == d_vrai) + { + if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) + { + // La variable n'est pas globale, elle est partagée. + presence_variable = d_faux; + (*s_etat_processus).erreur_execution = d_ex_variable_partagee; } } - return(d_erreur); + return(presence_variable); }