--- rpl/src/instructions_c2.c 2012/09/29 17:53:02 1.37 +++ rpl/src/instructions_c2.c 2012/12/13 16:59:41 1.41 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.10 + RPL/2 (R) version 4.1.11 Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -74,6 +74,12 @@ instruction_cycle(struct_processus *s_et printf(" ...\n"); printf(" NEXT/STEP\n\n"); + printf(" FORALL (variable)\n"); + printf(" ...\n"); + printf(" CYCLE\n"); + printf(" ...\n"); + printf(" NEXT\n\n"); + printf(" START\n"); printf(" ...\n"); printf(" CYCLE\n"); @@ -152,6 +158,7 @@ instruction_cycle(struct_processus *s_et (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, "CRITICAL") == 0) @@ -165,6 +172,7 @@ instruction_cycle(struct_processus *s_et else { if ((strcmp(instruction_majuscule, "FOR") == 0) || + (strcmp(instruction_majuscule, "FORALL") == 0) || (strcmp(instruction_majuscule, "START") == 0)) { niveau++; @@ -292,6 +300,7 @@ instruction_cycle(struct_processus *s_et (fonction == instruction_do) || (fonction == instruction_while) || (fonction == instruction_for) || + (fonction == instruction_forall) || (fonction == instruction_start) || (fonction == instruction_select) || (fonction == instruction_case) || @@ -428,6 +437,7 @@ instruction_con(struct_processus *s_etat struct_objet *s_objet_resultat; logical1 argument_nom; + logical1 variable_partagee; unsigned long i; unsigned long j; @@ -545,12 +555,7 @@ instruction_con(struct_processus *s_etat { // Variable partagée - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + variable_partagee = d_vrai; if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, @@ -563,35 +568,21 @@ instruction_con(struct_processus *s_etat (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } - s_objet_2 = (*(*s_etat_processus).s_liste_variables_partagees) - .table[(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet; - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + s_objet_2 = (*(*s_etat_processus) + .pointeur_variable_partagee_courante).objet; } else { // Variable privée s_objet_2 = (*(*s_etat_processus).pointeur_variable_courante).objet; + variable_partagee = d_faux; } } else @@ -624,6 +615,18 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; @@ -644,6 +647,19 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; @@ -658,6 +674,19 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; @@ -715,6 +744,18 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } liberation(s_etat_processus, s_objet_1); @@ -736,6 +777,18 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } liberation(s_etat_processus, s_objet_1); @@ -981,8 +1034,23 @@ instruction_con(struct_processus *s_etat } else { - (*(*s_etat_processus).pointeur_variable_courante).objet = - s_objet_resultat; + if (variable_partagee == d_vrai) + { + (*(*s_etat_processus).pointeur_variable_partagee_courante).objet = + s_objet_resultat; + + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + else + { + (*(*s_etat_processus).pointeur_variable_courante).objet = + s_objet_resultat; + } } return;