--- rpl/src/instructions_r2.c 2012/01/17 14:44:10 1.34 +++ rpl/src/instructions_r2.c 2012/10/01 11:05:06 1.41 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.6 + RPL/2 (R) version 4.1.11 Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -434,8 +434,10 @@ instruction_return(struct_processus *s_e (strcmp(instruction_majuscule, "DO") == 0) || (strcmp(instruction_majuscule, "WHILE") == 0) || (strcmp(instruction_majuscule, "FOR") == 0) || + (strcmp(instruction_majuscule, "FORALL") == 0) || (strcmp(instruction_majuscule, "START") == 0) || - (strcmp(instruction_majuscule, "SELECT") == 0) + (strcmp(instruction_majuscule, "SELECT") == 0) || + (strcmp(instruction_majuscule, "CRITICAL") == 0) || (strcmp(instruction_majuscule, "CASE") == 0) || (strcmp(instruction_majuscule, "<<") == 0)) { @@ -444,6 +446,7 @@ instruction_return(struct_processus *s_e analyse(s_etat_processus, NULL); } else if ((strcmp(instruction_majuscule, "FOR") == 0) || + (strcmp(instruction_majuscule, "FORALL") == 0) || (strcmp(instruction_majuscule, "START") == 0)) { empilement_pile_systeme(s_etat_processus); @@ -501,17 +504,18 @@ instruction_return(struct_processus *s_e } } else if (((strcmp(instruction_majuscule, "NEXT") == 0) || - (strcmp(instruction_majuscule, "STEP") == 0)) && - ((*(*s_etat_processus).l_base_pile_systeme) - .type_cloture != 'L')) + (strcmp(instruction_majuscule, "STEP") == 0)) && + ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture != 'L')) { /* * Libération des compteurs de boucle. */ - presence_compteur = ((*(*s_etat_processus) - .l_base_pile_systeme).type_cloture == 'F') - ? d_vrai : d_faux; + presence_compteur = (((*(*s_etat_processus) + .l_base_pile_systeme).type_cloture == 'F') || + ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus).l_base_pile_systeme) .type_cloture != 'S') && @@ -543,25 +547,15 @@ instruction_return(struct_processus *s_e return; } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = (*(*s_etat_processus) - .pointeur_variable_courante).objet; + (*s_etat_processus).niveau_courant--; - if (presence_compteur == d_vrai) + if (retrait_variable_par_niveau( + s_etat_processus) == d_erreur) { - (*s_etat_processus).niveau_courant--; - - if (retrait_variable_par_niveau( - s_etat_processus) == d_erreur) - { - return; - } + return; } } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = NULL; - depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) @@ -571,6 +565,27 @@ instruction_return(struct_processus *s_e } else { + if ((*s_etat_processus).l_base_pile_systeme == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + + if ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + + (*s_etat_processus).sections_critiques--; + } + depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) @@ -669,8 +684,10 @@ instruction_return(struct_processus *s_e (fonction == instruction_do) || (fonction == instruction_while) || (fonction == instruction_for) || + (fonction == instruction_forall) || (fonction == instruction_start) || (fonction == instruction_select) || + (fonction == instruction_critical) || (fonction == instruction_case) || (fonction == instruction_vers_niveau_superieur)) { @@ -680,6 +697,7 @@ instruction_return(struct_processus *s_e instruction_vers_niveau_superieur); } else if ((fonction == instruction_for) || + (fonction == instruction_forall) || (fonction == instruction_start)) { empilement_pile_systeme(s_etat_processus); @@ -741,9 +759,10 @@ instruction_return(struct_processus *s_e * Libération des compteurs de boucle. */ - presence_compteur = ((*(*s_etat_processus) - .l_base_pile_systeme).type_cloture == 'F') - ? d_vrai : d_faux; + presence_compteur = (((*(*s_etat_processus) + .l_base_pile_systeme).type_cloture == 'F') || + ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'A')) ? d_vrai : d_faux; if (((*(*s_etat_processus).l_base_pile_systeme) .type_cloture != 'S') && @@ -775,29 +794,40 @@ instruction_return(struct_processus *s_e return; } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = (*(*s_etat_processus) - .pointeur_variable_courante).objet; + (*s_etat_processus).niveau_courant--; - if (presence_compteur == d_vrai) + if (retrait_variable_par_niveau(s_etat_processus) + == d_erreur) { - (*s_etat_processus).niveau_courant--; - - if (retrait_variable_par_niveau(s_etat_processus) - == d_erreur) - { - return; - } + return; } } - (*(*s_etat_processus).l_base_pile_systeme) - .indice_boucle = NULL; - depilement_pile_systeme(s_etat_processus); } else { + if ((*s_etat_processus).l_base_pile_systeme == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + + if ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } + + (*s_etat_processus).sections_critiques--; + } + depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es)