--- rpl/src/sequenceur.c 2012/01/05 10:19:06 1.47 +++ rpl/src/sequenceur.c 2013/02/27 17:11:45 1.66 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.5 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.13 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -29,7 +29,7 @@ ================================================================================ Entrées : structure sur l'état du processus -------------------------------------------------------------------------------- - Sorties : Néant + Sorties : 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; @@ -66,6 +67,9 @@ sequenceur(struct_processus *s_etat_proc unsigned long niveau; unsigned long position_courante; + Keymap ancien_keymap; + Keymap nouveau_keymap; + (*s_etat_processus).retour_routine_evaluation = 'N'; if ((*s_etat_processus).debug == d_vrai) @@ -76,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 @@ -89,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 { @@ -177,8 +181,20 @@ 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); @@ -333,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 { @@ -566,7 +582,7 @@ sequenceur(struct_processus *s_etat_proc { if ((*s_etat_processus).langue == 'F') { - printf("[%d] Empilement de la variable " + printf("[%d] Évaluation de la variable " "partagée %s de type %d\n", (int) getpid(), (*s_etat_processus) .instruction_courante, @@ -588,30 +604,19 @@ sequenceur(struct_processus *s_etat_proc 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); - } - if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante).variable_partagee, - 'P') == d_vrai) + 'P') != NULL) { // La variable existe. 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; @@ -619,39 +624,26 @@ 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) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return(d_erreur); - } - - recherche_type(s_etat_processus); } } @@ -745,7 +737,7 @@ 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) @@ -778,14 +770,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 @@ -1001,7 +993,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 { @@ -1214,8 +1206,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)) { @@ -1223,6 +1219,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); @@ -1255,8 +1266,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) @@ -1297,8 +1388,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)) {