--- rpl/src/sequenceur.c 2010/02/26 19:22:05 1.6 +++ rpl/src/sequenceur.c 2019/10/31 15:40:25 1.108 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.11 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.32 + Copyright (C) 1989-2019 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -29,7 +29,7 @@ ================================================================================ Entrées : structure sur l'état du processus -------------------------------------------------------------------------------- - Sorties : Néant + Sorties : néant -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ @@ -44,10 +44,14 @@ sequenceur(struct_processus *s_etat_proc struct_objet *s_objet_evaluation; struct_objet *s_sous_objet; + integer8 niveau; + integer8 position_courante; + logical1 drapeau_appel_definition; logical1 drapeau_fin; logical1 drapeau_then; logical1 erreur; + logical1 presence_compteur; static logical1 completion_valide = d_faux; @@ -60,13 +64,10 @@ sequenceur(struct_processus *s_etat_proc unsigned char *message; unsigned char *registre; unsigned char *tampon; - unsigned char tampon_retour; unsigned char *t_ligne; - unsigned long i; - unsigned long j; - unsigned long niveau; - unsigned long position_courante; + Keymap ancien_keymap; + Keymap nouveau_keymap; (*s_etat_processus).retour_routine_evaluation = 'N'; @@ -78,12 +79,12 @@ sequenceur(struct_processus *s_etat_proc { if ((*s_etat_processus).langue == 'F') { - printf("[%d] Exécution récursive de niveau %lu\n", + printf("[%d] Exécution récursive de niveau %lld\n", (int) getpid(), (*s_etat_processus).niveau_recursivite); } else { - printf("[%d] %lu level recursive execution\n", + printf("[%d] %lld level recursive execution\n", (int) getpid(), (*s_etat_processus).niveau_recursivite); } } @@ -109,9 +110,6 @@ sequenceur(struct_processus *s_etat_proc -------------------------------------------------------------------------------- */ - i = 0; - j = 0; - do { drapeau_appel_definition = d_faux; @@ -136,7 +134,7 @@ sequenceur(struct_processus *s_etat_proc */ action.sa_handler = SIG_IGN; - action.sa_flags = SA_NODEFER | SA_ONSTACK; + action.sa_flags = 0; (*s_etat_processus).execution_pas_suivant = d_faux; (*s_etat_processus).traitement_instruction_halt = d_vrai; @@ -164,14 +162,22 @@ sequenceur(struct_processus *s_etat_proc fflush(stdout); } + if (pthread_mutex_lock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(d_erreur); + } + if (sigaction(SIGINT, &action, &action_defaut) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return(d_erreur); } if (sigaction(SIGTSTP, &action, &action_defaut2) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return(d_erreur); } @@ -182,31 +188,40 @@ sequenceur(struct_processus *s_etat_proc flockfile(stdin); flockfile(stdout); + ancien_keymap = rl_get_keymap(); + nouveau_keymap = rl_copy_keymap(ancien_keymap); + rl_set_keymap(nouveau_keymap); + + rl_bind_key(NEWLINE, readline_analyse_syntaxique); + rl_bind_key(RETURN, readline_analyse_syntaxique); + rl_bind_key(CTRL('g'), readline_effacement); + rl_done = 0; + ligne = readline("RPL/2> "); + rl_set_keymap(ancien_keymap); + rl_free(nouveau_keymap); + funlockfile(stdin); funlockfile(stdout); - if ((*s_etat_processus).var_volatile_requete_arret != 0) - { - (*s_etat_processus).requete_arret = 'Y'; - break; - } - if (ligne != NULL) { if ((t_ligne = transliteration(s_etat_processus, ligne, (*s_etat_processus).localisation, d_locale)) == NULL) { + pthread_mutex_unlock(&mutex_sigaction); + free((*s_etat_processus).instruction_courante); return(d_erreur); } free(ligne); ligne = t_ligne; - if ((ligne = compactage(ligne)) == NULL) + if ((ligne = compactage(s_etat_processus, ligne)) == NULL) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -215,16 +230,24 @@ sequenceur(struct_processus *s_etat_proc if (sigaction(SIGINT, &action_defaut, NULL) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return(d_erreur); } if (sigaction(SIGTSTP, &action_defaut2, NULL) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return(d_erreur); } + if (pthread_mutex_unlock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(d_erreur); + } + if (ligne == NULL) { if ((ligne = (unsigned char *) malloc(6 * @@ -254,6 +277,13 @@ sequenceur(struct_processus *s_etat_proc sprintf(ligne, "dup"); } + if ((*s_etat_processus).var_volatile_requete_arret != 0) + { + free(ligne); + (*s_etat_processus).requete_arret = 'Y'; + break; + } + add_history(ligne); stifle_history(ds_longueur_historique); @@ -284,6 +314,7 @@ sequenceur(struct_processus *s_etat_proc tampon = (*s_etat_processus).instruction_courante; (*s_etat_processus).instruction_courante = ligne; + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); (*s_etat_processus).instruction_courante = tampon; @@ -305,6 +336,7 @@ sequenceur(struct_processus *s_etat_proc if ((message = messages(s_etat_processus)) == NULL) { + free((*s_etat_processus).instruction_courante); return(d_erreur); } @@ -321,8 +353,15 @@ sequenceur(struct_processus *s_etat_proc } else { - tampon_retour = (*(*s_etat_processus) - .l_base_pile_systeme).retour_definition; + position_courante = + (*s_etat_processus).position_courante; + empilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } + (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; @@ -343,17 +382,18 @@ sequenceur(struct_processus *s_etat_proc printf("+++Error : Too few arguments\n"); } - (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition = tampon_retour; + depilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } fflush(stdout); } else if (evaluation(s_etat_processus, s_objet, 'I') == d_erreur) { - (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition = tampon_retour; - if ((*s_etat_processus).erreur_systeme != d_es) { if (test_cfsf(s_etat_processus, 51) == d_faux) @@ -364,12 +404,15 @@ sequenceur(struct_processus *s_etat_proc if ((message = messages(s_etat_processus)) == NULL) { + free((*s_etat_processus) + .instruction_courante); return(d_erreur); } printf("%s [%d]\n", message, (int) getpid()); - free(message); + free(message); + free((*s_etat_processus).instruction_courante); return(d_erreur); } else if ((*s_etat_processus) @@ -387,6 +430,8 @@ sequenceur(struct_processus *s_etat_proc if ((message = messages(s_etat_processus)) == NULL) { + free((*s_etat_processus) + .instruction_courante); return(d_erreur); } @@ -434,8 +479,8 @@ sequenceur(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet); } - (*(*s_etat_processus).l_base_pile_systeme) - .retour_definition = tampon_retour; + (*s_etat_processus).position_courante = + position_courante; } } else if ((*s_etat_processus).invalidation_message_erreur @@ -452,6 +497,7 @@ sequenceur(struct_processus *s_etat_proc if ((message = messages(s_etat_processus)) == NULL) { + free((*s_etat_processus).instruction_courante); free(ligne); return(d_erreur); } @@ -513,6 +559,8 @@ sequenceur(struct_processus *s_etat_proc -------------------------------------------------------------------------------- */ + (*s_etat_processus).instruction_sensible = 'N'; + analyse(s_etat_processus, NULL); if ((*s_etat_processus).traitement_cycle_exit != 'N') @@ -547,9 +595,8 @@ sequenceur(struct_processus *s_etat_proc d_vrai) && ((*s_etat_processus) .autorisation_evaluation_nom == 'Y')) { - if (((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet == NULL) + if ((*(*s_etat_processus).pointeur_variable_courante) + .objet == NULL) { /* @@ -558,63 +605,47 @@ sequenceur(struct_processus *s_etat_proc -------------------------------------------------------------------------------- */ - if ((*s_etat_processus).debug == d_vrai) - if (((*s_etat_processus).type_debug & - d_debug_variables) != 0) + if (recherche_variable_partagee(s_etat_processus, + (*(*s_etat_processus) + .pointeur_variable_courante).nom, + (*(*s_etat_processus) + .pointeur_variable_courante).variable_partagee, + 'P') != NULL) { - if ((*s_etat_processus).langue == 'F') + // La variable existe. + + if ((*s_etat_processus).debug == d_vrai) + if (((*s_etat_processus).type_debug & + d_debug_variables) != 0) { - printf("[%d] Empilement de la variable " + if ((*s_etat_processus).langue == 'F') + { + printf("[%d] Évaluation de la variable " "partagée %s de type %d\n", - (int) getpid(), - (*s_etat_processus) + (int) getpid(), (*s_etat_processus) .instruction_courante, - (*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet) - .type); - } - else - { - printf("[%d] Pushing %s as %d type shared " - "variable \n", (int) getpid(), + (*(*(*s_etat_processus) + .pointeur_variable_partagee_courante) + .objet).type); + } + else + { + printf("[%d] Pushing %s as %d type shared " + "variable\n", (int) getpid(), (*s_etat_processus) .instruction_courante, - (*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet) - .type); - } - - fflush(stdout); - } - - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } + (*(*(*s_etat_processus) + .pointeur_variable_partagee_courante) + .objet).type); + } - 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, 'P') == d_vrai) - { - // La variable existe. + fflush(stdout); + } if ((s_objet = copie_objet(s_etat_processus, (*(*s_etat_processus) - .s_liste_variables_partagees) - .table[(*(*s_etat_processus) - .s_liste_variables_partagees) - .position_variable].objet, 'P')) - == NULL) + .pointeur_variable_partagee_courante) + .objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -622,39 +653,48 @@ sequenceur(struct_processus *s_etat_proc } if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + .pointeur_variable_partagee_courante) + .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return(d_erreur); } - if (empilement(s_etat_processus, - &((*s_etat_processus).l_base_pile), - s_objet) == d_erreur) + if (evaluation(s_etat_processus, s_objet, 'E') + == d_erreur) { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; + liberation(s_etat_processus, s_objet); return(d_erreur); } + + liberation(s_etat_processus, s_objet); } else { // La variable n'existe plus. - - (*s_etat_processus).erreur_systeme = d_es; - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) - != 0) + if ((*s_etat_processus).debug == d_vrai) + if (((*s_etat_processus).type_debug & + d_debug_variables) != 0) { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } + if ((*s_etat_processus).langue == 'F') + { + printf("[%d] Tentative d'accès à la " + "variable partagée non définie %s\n", + (int) getpid(), (*s_etat_processus) + .instruction_courante); + } + else + { + printf("[%d] Trying to access to undefined " + "shared variable %s\n", + (int) getpid(), + (*s_etat_processus) + .instruction_courante); + } - recherche_type(s_etat_processus); + fflush(stdout); + } } } @@ -664,8 +704,7 @@ sequenceur(struct_processus *s_etat_proc -------------------------------------------------------------------------------- */ - else if ((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante]) + else if ((*(*(*s_etat_processus).pointeur_variable_courante) .objet).type == ADR) { @@ -721,6 +760,8 @@ sequenceur(struct_processus *s_etat_proc } } + (*s_etat_processus).debug_programme = d_faux; + (*(*s_etat_processus).l_base_pile_systeme) .adresse_retour = (*s_etat_processus) .position_courante; @@ -733,11 +774,10 @@ sequenceur(struct_processus *s_etat_proc .niveau_courant; (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante] - .objet)).objet))); + (*((integer8 *) + ((*(*(*s_etat_processus) + .pointeur_variable_courante) + .objet).objet))); drapeau_appel_definition = d_vrai; } @@ -750,14 +790,13 @@ sequenceur(struct_processus *s_etat_proc { if ((*s_etat_processus).langue == 'F') { - printf("[%d] Empilement de la variable " + printf("[%d] Évaluation de la variable " "%s de type %d\n", (int) getpid(), (*s_etat_processus) .instruction_courante, - (*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet) + (*(*(*s_etat_processus) + .pointeur_variable_courante).objet) .type); } else @@ -766,9 +805,8 @@ sequenceur(struct_processus *s_etat_proc "\n", (int) getpid(), (*s_etat_processus) .instruction_courante, - (*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet) + (*(*(*s_etat_processus) + .pointeur_variable_courante).objet) .type); } @@ -776,9 +814,8 @@ sequenceur(struct_processus *s_etat_proc } if ((s_objet = copie_objet(s_etat_processus, - ((*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante]).objet, 'P')) + (*(*s_etat_processus) + .pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = @@ -786,14 +823,14 @@ sequenceur(struct_processus *s_etat_proc return(d_erreur); } - if (empilement(s_etat_processus, - &((*s_etat_processus).l_base_pile), - s_objet) == d_erreur) + if (evaluation(s_etat_processus, s_objet, 'E') + == d_erreur) { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; + liberation(s_etat_processus, s_objet); return(d_erreur); } + + liberation(s_etat_processus, s_objet); } } else @@ -806,8 +843,47 @@ sequenceur(struct_processus *s_etat_proc */ (*s_etat_processus).erreur_systeme = d_es; + (*s_etat_processus).type_en_cours = NON; recherche_type(s_etat_processus); + if ((*s_etat_processus).autorisation_nom_implicite == 'N') + { + if ((*s_etat_processus).l_base_pile == NULL) + { + if (((*s_etat_processus).erreur_execution != + d_ex_nom_implicite) && + ((*s_etat_processus).erreur_execution != + d_ex_syntaxe)) + { + (*s_etat_processus).erreur_execution = + d_ex_manque_argument; + } + } + else if ((*(*(*s_etat_processus).l_base_pile).donnee) + .type == NOM) + { + if ((*((struct_nom *) (*(*(*s_etat_processus) + .l_base_pile).donnee).objet)).symbole + == d_faux) + { + (*s_etat_processus).erreur_execution = + d_ex_nom_implicite; + + // Si le niveau de récursivité est non nul, on + // arrive ici depuis la fonction + // recherche_type(). On retourne à cette + // dernière en indiquant une erreur. + + if ((*s_etat_processus).niveau_recursivite != 0) + { + free((*s_etat_processus) + .instruction_courante); + return(d_erreur); + } + } + } + } + // Le séquenceur est appelé depuis la routine d'évaluation if ((*s_etat_processus).evaluation_forcee == 'Y') @@ -816,6 +892,7 @@ sequenceur(struct_processus *s_etat_proc &((*s_etat_processus).l_base_pile), &s_objet_evaluation) == d_erreur) { + free((*s_etat_processus).instruction_courante); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return(d_erreur); @@ -824,12 +901,25 @@ sequenceur(struct_processus *s_etat_proc if (evaluation(s_etat_processus, s_objet_evaluation, 'N') == d_erreur) { + free((*s_etat_processus).instruction_courante); liberation(s_etat_processus, s_objet_evaluation); return(d_erreur); } liberation(s_etat_processus, s_objet_evaluation); } + + // Le séquenceur est appelé depuis la routine de + // recherche de type + + else if ((*s_etat_processus).recherche_type == 'Y') + { + if ((*s_etat_processus).erreur_execution != d_ex) + { + free((*s_etat_processus).instruction_courante); + return(d_erreur); + } + } } } else if (((*s_etat_processus).test_instruction == 'Y') && @@ -843,7 +933,8 @@ sequenceur(struct_processus *s_etat_proc */ if ((instruction_majuscule = conversion_majuscule( - (*s_etat_processus).instruction_courante)) == NULL) + s_etat_processus, (*s_etat_processus) + .instruction_courante)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -854,19 +945,7 @@ sequenceur(struct_processus *s_etat_proc != 0) && (strcmp((*s_etat_processus) .instruction_courante, ">>") != 0)) { - if ((s_objet = (struct_objet *) malloc( - sizeof(struct_objet))) == NULL) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return(d_erreur); - } - - initialisation_objet(s_objet); - (*s_objet).type = FCT; - - if (((*s_objet).objet = allocation(s_etat_processus, FCT)) - == NULL) + if ((s_objet = allocation(s_etat_processus, FCT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -876,12 +955,13 @@ sequenceur(struct_processus *s_etat_proc (*((struct_fonction *) (*s_objet).objet)) .nombre_arguments = 0; - if ((*s_etat_processus).instruction_intrinseque == 'Y') + if (((*s_etat_processus).instruction_intrinseque == 'Y') && + ((*s_etat_processus).instruction_sensible == 'N')) { if (((*((struct_fonction *) (*s_objet).objet)) .nom_fonction = conversion_majuscule( - (*s_etat_processus).instruction_courante)) - == NULL) + s_etat_processus, (*s_etat_processus) + .instruction_courante)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -929,8 +1009,8 @@ sequenceur(struct_processus *s_etat_proc free(instruction_majuscule); } - erreur |= (((*s_etat_processus).erreur_execution != d_ex) - ? d_erreur : d_absence_erreur); + erreur = (logical1) (erreur | (((*s_etat_processus) + .erreur_execution != d_ex) ? d_erreur : d_absence_erreur)); } else { @@ -949,6 +1029,7 @@ sequenceur(struct_processus *s_etat_proc fflush(stdout); + free((*s_etat_processus).instruction_courante); return(d_erreur); } @@ -1030,6 +1111,7 @@ sequenceur(struct_processus *s_etat_proc if ((message = messages(s_etat_processus)) == NULL) { + free((*s_etat_processus).instruction_courante); return(d_erreur); } @@ -1041,7 +1123,7 @@ sequenceur(struct_processus *s_etat_proc (*s_etat_processus).exception = d_ep; erreur = d_absence_erreur; - (*s_etat_processus).position_courante -= + (*s_etat_processus).position_courante -= (integer8) strlen((*s_etat_processus).instruction_courante); } @@ -1116,27 +1198,26 @@ sequenceur(struct_processus *s_etat_proc if (erreur == d_erreur) { + free((*s_etat_processus).instruction_courante); return(d_erreur); } if (recherche_variable(s_etat_processus, (*s_etat_processus).instruction_courante) == d_vrai) { - if (((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet == NULL) + if ((*(*s_etat_processus).pointeur_variable_courante) + .objet == NULL) { // Variable partagée } - else if ((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante]).objet).type == - ADR) + else if ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).type == ADR) { empilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { + free((*s_etat_processus).instruction_courante); return(d_erreur); } @@ -1152,11 +1233,10 @@ sequenceur(struct_processus *s_etat_proc .niveau_courant; (*s_etat_processus).position_courante = - (*((unsigned long *) - ((*((*s_etat_processus).s_liste_variables - [(*s_etat_processus) - .position_variable_courante] - .objet)).objet))); + (*((integer8 *) + ((*(*(*s_etat_processus) + .pointeur_variable_courante) + .objet).objet))); (*s_etat_processus) .autorisation_empilement_programme = 'N'; @@ -1166,10 +1246,12 @@ sequenceur(struct_processus *s_etat_proc { (*s_etat_processus).erreur_systeme = d_es; instruction_majuscule = conversion_majuscule( - (*s_etat_processus).instruction_courante); + s_etat_processus, (*s_etat_processus) + .instruction_courante); if (instruction_majuscule == NULL) { + free((*s_etat_processus).instruction_courante); return(d_erreur); } @@ -1183,8 +1265,12 @@ sequenceur(struct_processus *s_etat_proc (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) || (strcmp(instruction_majuscule, "CASE") == 0) || (strcmp(instruction_majuscule, "<<") == 0)) { @@ -1192,6 +1278,21 @@ sequenceur(struct_processus *s_etat_proc { 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); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } + + (*(*s_etat_processus).l_base_pile_systeme) + .type_cloture = 'L'; + } else { empilement_pile_systeme(s_etat_processus); @@ -1224,8 +1325,88 @@ sequenceur(struct_processus *s_etat_proc return(d_absence_erreur); } } + else if (((strcmp(instruction_majuscule, "NEXT") + == 0) || (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') || ((*(*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') && + (presence_compteur == d_faux)) + { + return(d_erreur); + } + + if (presence_compteur == d_vrai) + { + if (recherche_variable(s_etat_processus, + (*(*s_etat_processus) + .l_base_pile_systeme).nom_variable) + == d_faux) + { + return(d_erreur); + } + + if ((*(*s_etat_processus) + .pointeur_variable_courante).objet + == NULL) + { + return(d_erreur); + } + + (*s_etat_processus).niveau_courant--; + + if (retrait_variables_par_niveau( + s_etat_processus) == d_erreur) + { + return(d_erreur); + } + } + + depilement_pile_systeme(s_etat_processus); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return(d_erreur); + } + } else { + // Traitement spécifique pour la fin + // d'une section critique + + if ((*s_etat_processus).l_base_pile_systeme + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return(d_erreur); + } + + 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(d_erreur); + } + + (*s_etat_processus).sections_critiques--; + } + depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) @@ -1254,6 +1435,7 @@ sequenceur(struct_processus *s_etat_proc } instruction_majuscule = conversion_majuscule( + s_etat_processus, (*s_etat_processus).instruction_courante); if (instruction_majuscule == NULL) @@ -1266,8 +1448,10 @@ sequenceur(struct_processus *s_etat_proc (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) || (strcmp(instruction_majuscule, "CASE") == 0) || (strcmp(instruction_majuscule, "<<") == 0)) { @@ -1362,7 +1546,8 @@ sequenceur(struct_processus *s_etat_proc if ((*s_etat_processus).var_volatile_processus_pere == 0) { - kill((*s_etat_processus).pid_processus_pere, SIGALRM); + envoi_signal_processus((*s_etat_processus).pid_processus_pere, + rpl_sigalrm, d_faux); } else {