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