--- rpl/src/instructions_s9.c 2011/04/21 16:00:59 1.26 +++ rpl/src/instructions_s9.c 2011/06/10 11:35:13 1.27 @@ -141,8 +141,8 @@ instruction_sort(struct_processus *s_eta return; } - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_verrouillee == d_vrai) + if ((*(*s_etat_processus).pointeur_variable_courante) + .variable_verrouillee == d_vrai) { (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; @@ -152,8 +152,7 @@ instruction_sort(struct_processus *s_eta return; } - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet == NULL) + if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -163,13 +162,10 @@ instruction_sort(struct_processus *s_eta } if (recherche_variable_partagee(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].nom, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .variable_partagee, (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].origine) - == d_faux) + (*(*s_etat_processus).pointeur_variable_courante).nom, + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee, (*(*s_etat_processus) + .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -234,12 +230,9 @@ instruction_sort(struct_processus *s_eta } else { - if (((*(*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet) - .type != LST) && - ((*(*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet) - .type != TBL)) + if (((*(*(*s_etat_processus).pointeur_variable_courante).objet) + .type != LST) && ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).type != TBL)) { (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; @@ -252,8 +245,8 @@ instruction_sort(struct_processus *s_eta liberation(s_etat_processus, s_objet_liste); - s_objet_liste = (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet; + s_objet_liste = (*(*s_etat_processus).pointeur_variable_courante) + .objet; if ((s_objet_copie = copie_objet(s_etat_processus, s_objet_liste, 'N')) == NULL) @@ -265,10 +258,7 @@ instruction_sort(struct_processus *s_eta liberation(s_etat_processus, s_objet_liste); s_objet_liste = s_objet_copie; - - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet = s_objet_liste; - + (*(*s_etat_processus).pointeur_variable_courante).objet = s_objet_liste; presence_nom = d_vrai; } else @@ -663,10 +653,6 @@ instruction_sort(struct_processus *s_eta void instruction_save(struct_processus *s_etat_processus) { - logical1 presence_variable; - - long i; - struct_objet *s_objet_1; struct_objet *s_objet_2; @@ -738,142 +724,35 @@ instruction_save(struct_processus *s_eta return; } - if (recherche_variable(s_etat_processus, (*((struct_nom *) + if (recherche_variable_globale(s_etat_processus, (*((struct_nom *) (*s_objet_1).objet)).nom) == d_vrai) { /* - * Une variable est accessible directement. + * Une variable est accessible. */ - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].niveau == 1) + if ((*(*s_etat_processus).pointeur_variable_courante) + .variable_verrouillee == d_vrai) { - // La variable accessible directement est une variable globale. - - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_verrouillee == d_vrai) - { - liberation(s_etat_processus, s_objet_1); - liberation(s_etat_processus, s_objet_2); - - (*s_etat_processus).erreur_execution = - d_ex_variable_verrouillee; - return; - } - - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet == NULL) - { - liberation(s_etat_processus, s_objet_1); - liberation(s_etat_processus, s_objet_2); - - (*s_etat_processus).erreur_execution = d_ex_variable_partagee; - return; - } - - liberation(s_etat_processus, - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet); + liberation(s_etat_processus, s_objet_1); + liberation(s_etat_processus, s_objet_2); - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet = s_objet_2; + (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; + return; } - else - { - // On cherche une variable globale de même nom. - i = (*s_etat_processus).position_variable_courante; - presence_variable = d_faux; - - while(i >= 0) - { - if ((strcmp((*s_etat_processus).s_liste_variables[i].nom, - (*((struct_nom *) (*s_objet_1).objet)).nom) == 0) && - ((*s_etat_processus).s_liste_variables[i].niveau == 1)) - { - presence_variable = d_vrai; - break; - } - - i--; - } - - if (presence_variable == d_vrai) - { - (*s_etat_processus).position_variable_courante = i; - } - else - { - (*s_etat_processus).position_variable_courante = 0; - } - - if (((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].niveau == 1) && - (presence_variable == d_vrai)) - { - // On a trouvé une variable globale correspondant au nom et - // que l'on modifie. - - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].variable_verrouillee == - d_vrai) - { - liberation(s_etat_processus, s_objet_1); - liberation(s_etat_processus, s_objet_2); - - (*s_etat_processus).erreur_execution = - d_ex_variable_verrouillee; - return; - } - - if ((*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet == NULL) - { - liberation(s_etat_processus, s_objet_1); - liberation(s_etat_processus, s_objet_2); - - (*s_etat_processus).erreur_execution = - d_ex_variable_partagee; - return; - } - - liberation(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet); - - (*s_etat_processus).s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet = s_objet_2; - } - else - { - if ((s_variable.nom = malloc((strlen((*((struct_nom *) - (*s_objet_1).objet)).nom) + 1) * sizeof(unsigned char))) - == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return; - } - - strcpy(s_variable.nom, (*((struct_nom *) - (*s_objet_1).objet)).nom); - s_variable.niveau = 1; - - /* - * Le niveau 0 correspond aux définitions. Les variables - * commencent à 1 car elles sont toujours incluses dans - * une définition. - */ - - s_variable.objet = s_objet_2; + if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) + { + liberation(s_etat_processus, s_objet_1); + liberation(s_etat_processus, s_objet_2); - if (creation_variable(s_etat_processus, &s_variable, 'V', 'P') - == d_erreur) - { - return; - } - } + (*s_etat_processus).erreur_execution = d_ex_variable_partagee; + return; } + + liberation(s_etat_processus, + (*(*s_etat_processus).pointeur_variable_courante).objet); + (*(*s_etat_processus).pointeur_variable_courante).objet = s_objet_2; } else {