--- rpl/src/sequenceur.c 2012/01/25 16:38:30 1.49 +++ rpl/src/sequenceur.c 2012/09/30 20:46:46 1.57 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.6 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.10 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -25,13 +25,13 @@ /* ================================================================================ - Boucle principale de l'interprète RPL/2 + Boucle principale de l'interprète RPL/2 ================================================================================ - Entrées : structure sur l'état du processus + Entrées : structure sur l'état du processus -------------------------------------------------------------------------------- - Sorties : Néant + Sorties : Néant -------------------------------------------------------------------------------- - Effets de bord : néant + Effets de bord : néant ================================================================================ */ @@ -48,6 +48,7 @@ sequenceur(struct_processus *s_etat_proc logical1 drapeau_fin; logical1 drapeau_then; logical1 erreur; + logical1 presence_compteur; static logical1 completion_valide = d_faux; @@ -79,7 +80,7 @@ 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 %lu\n", (int) getpid(), (*s_etat_processus).niveau_recursivite); } else @@ -92,7 +93,7 @@ sequenceur(struct_processus *s_etat_proc { if ((*s_etat_processus).langue == 'F') { - printf("[%d] Exécution\n", (int) getpid()); + printf("[%d] Exécution\n", (int) getpid()); } else { @@ -105,7 +106,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Boucle de l'interprète RPL/2 + Boucle de l'interprète RPL/2 On boucle tant qu'on n'a pas une bonne raison de sortir... -------------------------------------------------------------------------------- */ @@ -116,7 +117,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Recherche de l'instruction suivante dans les définitions chaînées + Recherche de l'instruction suivante dans les définitions chaînées -------------------------------------------------------------------------------- */ @@ -184,8 +185,9 @@ sequenceur(struct_processus *s_etat_proc nouveau_keymap = rl_copy_keymap(ancien_keymap); rl_set_keymap(nouveau_keymap); - rl_bind_key('\n', readline_analyse_syntaxique); - rl_bind_key('\r', readline_analyse_syntaxique); + 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> "); @@ -347,7 +349,7 @@ sequenceur(struct_processus *s_etat_proc if ((*s_etat_processus).langue == 'F') { - printf("+++Erreur : Défaut d'argument\n"); + printf("+++Erreur : Défaut d'argument\n"); } else { @@ -515,8 +517,8 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Dans le cas où une instruction est retournée, celle-ci est évaluée. Dans le - cas contraire, l'interprète renvoie un message d'erreur et s'interrompt. + Dans le cas où une instruction est retournée, celle-ci est évaluée. Dans le + cas contraire, l'interprète renvoie un message d'erreur et s'interrompt. -------------------------------------------------------------------------------- */ @@ -525,8 +527,8 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Scrutation des mots clef du langage RPL/2 et exécution le cas échéant - de l'action associée. + Scrutation des mots clef du langage RPL/2 et exécution le cas échéant + de l'action associée. -------------------------------------------------------------------------------- */ @@ -555,7 +557,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - L'instruction ne correspond pas à l'un des mots clef du langage RPL/2. + L'instruction ne correspond pas à l'un des mots clef du langage RPL/2. -------------------------------------------------------------------------------- */ @@ -570,7 +572,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - L'instruction est une variable partagée + L'instruction est une variable partagée -------------------------------------------------------------------------------- */ @@ -581,7 +583,7 @@ sequenceur(struct_processus *s_etat_proc if ((*s_etat_processus).langue == 'F') { printf("[%d] Empilement de la variable " - "partagée %s de type %d\n", + "partagée %s de type %d\n", (int) getpid(), (*s_etat_processus) .instruction_courante, (*(*(*s_etat_processus) @@ -671,7 +673,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - L'instruction est une variable automatique (évaluation lors de l'empilement). + L'instruction est une variable automatique (évaluation lors de l'empilement). -------------------------------------------------------------------------------- */ @@ -682,7 +684,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- L'instruction est une variable de type 'adresse' pointant sur une - définition. Un branchement est effectué à cette adresse. + définition. Un branchement est effectué à cette adresse. -------------------------------------------------------------------------------- */ @@ -692,8 +694,8 @@ sequenceur(struct_processus *s_etat_proc { if ((*s_etat_processus).langue == 'F') { - printf("[%d] Branchement à la" - " définition %s\n", (int) getpid(), + printf("[%d] Branchement à la" + " définition %s\n", (int) getpid(), (*s_etat_processus) .instruction_courante); } @@ -807,7 +809,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - L'instruction est une donnée à empiler. + L'instruction est une donnée à empiler. -------------------------------------------------------------------------------- */ @@ -835,10 +837,10 @@ sequenceur(struct_processus *s_etat_proc (*s_etat_processus).erreur_execution = d_ex_nom_implicite; - // Si le niveau de récursivité est non nul, on + // 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. + // recherche_type(). On retourne à cette + // dernière en indiquant une erreur. if ((*s_etat_processus).niveau_recursivite != 0) { @@ -850,7 +852,7 @@ sequenceur(struct_processus *s_etat_proc } } - // Le séquenceur est appelé depuis la routine d'évaluation + // Le séquenceur est appelé depuis la routine d'évaluation if ((*s_etat_processus).evaluation_forcee == 'Y') { @@ -875,7 +877,7 @@ sequenceur(struct_processus *s_etat_proc liberation(s_etat_processus, s_objet_evaluation); } - // Le séquenceur est appelé depuis la routine de + // Le séquenceur est appelé depuis la routine de // recherche de type else if ((*s_etat_processus).recherche_type == 'Y') @@ -999,7 +1001,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Traitement des arrêts simples + Traitement des arrêts simples -------------------------------------------------------------------------------- */ @@ -1015,7 +1017,7 @@ sequenceur(struct_processus *s_etat_proc { if (strncmp(getenv("LANG"), "fr", 2) == 0) { - printf("[%d] Arrêt\n", (int) getpid()); + printf("[%d] Arrêt\n", (int) getpid()); } else { @@ -1037,7 +1039,7 @@ sequenceur(struct_processus *s_etat_proc /* * On ne sort pas du debugger en cas d'une erreur sur un programme - * en cours de débogage. + * en cours de débogage. */ if ((((*s_etat_processus).erreur_execution != d_ex) || @@ -1093,7 +1095,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Test de fin d'exécution du programme RPL/2 + Test de fin d'exécution du programme RPL/2 -------------------------------------------------------------------------------- */ @@ -1172,7 +1174,7 @@ sequenceur(struct_processus *s_etat_proc if ((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL) { - // Variable partagée + // Variable partagée } else if ((*(*(*s_etat_processus) .pointeur_variable_courante).objet).type == ADR) @@ -1219,8 +1221,8 @@ sequenceur(struct_processus *s_etat_proc } /* - * Traitement de la pile système par les - * différentes instructions. + * Traitement de la pile système par les + * différentes instructions. */ if ((strcmp(instruction_majuscule, "IF") == 0) || @@ -1228,8 +1230,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)) { @@ -1237,6 +1243,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); @@ -1269,8 +1290,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_variable_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) @@ -1311,8 +1412,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)) { @@ -1359,7 +1462,7 @@ sequenceur(struct_processus *s_etat_proc /* -------------------------------------------------------------------------------- - Messages d'erreur à afficher le cas échéant + Messages d'erreur à afficher le cas échéant -------------------------------------------------------------------------------- */