/* ================================================================================ RPL/2 (R) version 4.1.14 Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. RPL/2 is free software; you can redistribute it and/or modify it under the terms of the CeCILL V2 License as published by the french CEA, CNRS and INRIA. RPL/2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License for more details. You should have received a copy of the CeCILL License along with RPL/2. If not, write to info@cecill.info. ================================================================================ */ #include "rpl-conv.h" #define TEST(instruction) (fonction == instruction) #define vers_niveau_inferieur instruction_vers_niveau_inferieur #define vers_niveau_superieur instruction_vers_niveau_superieur /* ================================================================================ Evaluation d'une expression ================================================================================ Entrées : structure processus, objet à évaluer (non libéré au retour de la routine) et type ('E' pour 'EVAL', 'I' pour interactif et 'N' pour '->NUM') -------------------------------------------------------------------------------- Sorties : objet évalué au niveau 1 de la pile -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ logical1 evaluation(struct_processus *s_etat_processus, struct_objet *s_objet, unsigned char type_evaluation) { integer8 i; integer8 j; integer8 k; integer8 l; integer8 niveau_initial; integer8 nombre_termes; integer8 registre_hauteur_pile_operationnelle; integer8 registre_position_courante; logical1 drapeau_then; logical1 erreur_evaluation; logical1 presence_compteur; logical1 presence_egalite; logical1 presence_fonction; logical1 presence_variable; logical1 presence_variable_partagee; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_egalite; struct_liste_chainee *l_element_fonction; struct_liste_chainee *l_liste1; struct_liste_chainee *l_liste2; struct_liste_chainee *l_registre_atome; struct_liste_chainee *l_registre_pile_operationnelle; struct_liste_chainee *l_sous_element_courant; struct_liste_chainee *registre_expression_courante; struct_liste_pile_systeme *pile_systeme_originelle; struct_objet *s_objet_elementaire; struct_objet *s_objet_evalue; struct_objet *s_objet_indice_i; struct_objet *s_objet_indice_j; struct_objet *s_objet_tampon; struct_objet *s_sous_objet; struct_objet *s_copie_variable_partagee; unsigned char autorisation_empilement_programme; unsigned char *instruction_courante; unsigned char *message; unsigned char registre_evaluation_expression_compilee; unsigned char registre_evaluation_forcee; unsigned char registre_instruction_valide; unsigned char registre_mode_execution_programme; unsigned char registre_retour_definition; unsigned char registre_test; unsigned char registre_test_2; unsigned char registre_type_evaluation; int registre_erreur_execution; int registre_erreur_systeme; int registre_exception; void (*fonction)(); registre_mode_execution_programme = (*s_etat_processus).mode_execution_programme; (*s_etat_processus).mode_execution_programme = 'I'; instruction_courante = (*s_etat_processus).instruction_courante; (*s_etat_processus).erreur_execution = d_ex; erreur_evaluation = d_absence_erreur; s_copie_variable_partagee = NULL; if ((*s_objet).type == NOM) { if ((s_objet_tampon = copie_objet(s_etat_processus, s_objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } registre_instruction_valide = (*s_etat_processus).instruction_valide; registre_test = (*s_etat_processus).test_instruction; (*s_etat_processus).test_instruction = 'Y'; (*s_etat_processus).instruction_courante = (*((struct_nom *) (*s_objet_tampon).objet)).nom; analyse(s_etat_processus, NULL); (*s_etat_processus).test_instruction = 'N'; if ((*s_etat_processus).constante_symbolique == 'N') { presence_fonction = d_faux; presence_variable_partagee = d_faux; if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_tampon).objet)).nom) == d_faux) { (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).autorisation_nom_implicite == 'N') { if ((*((struct_nom *) (*s_objet_tampon).objet)).symbole == d_faux) { if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return(d_erreur); } } erreur_evaluation = d_erreur; (*s_etat_processus).erreur_execution = d_ex_nom_implicite; if (type_evaluation == 'I') { (*s_etat_processus).derniere_erreur_evaluation = (*s_etat_processus).erreur_execution; } } } (*s_etat_processus).erreur_systeme = d_es; presence_variable = d_faux; } else { if ((*s_etat_processus).traitement_symbolique == 'N') { if ((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL) { // Variable partagée presence_variable_partagee = d_faux; if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante) .variable_partagee, 'E') != NULL) { presence_variable = d_vrai; presence_variable_partagee = d_vrai; if ((*(*(*s_etat_processus) .pointeur_variable_partagee_courante).objet) .type == ADR) { presence_fonction = d_vrai; } if ((s_copie_variable_partagee = copie_objet(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_partagee_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return(d_erreur); } return(d_erreur); } if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return(d_erreur); } } else { (*s_etat_processus).erreur_systeme = d_es; presence_variable = d_faux; presence_variable_partagee = d_faux; } } else { // Variable privée presence_variable = d_vrai; if ((*(*(*s_etat_processus).pointeur_variable_courante) .objet).type == ADR) { presence_fonction = d_vrai; } } } else { presence_variable = d_faux; } } liberation(s_etat_processus, s_objet_tampon); if (presence_fonction == d_vrai) { autorisation_empilement_programme = (*s_etat_processus) .autorisation_empilement_programme; registre_position_courante = (*s_etat_processus) .position_courante; empilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_variable_partagee == d_vrai) { liberation(s_etat_processus, s_copie_variable_partagee); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; (*(*s_etat_processus).l_base_pile_systeme) .origine_routine_evaluation = 'Y'; (*s_etat_processus).mode_execution_programme = 'Y'; (*s_etat_processus).autorisation_empilement_programme = 'N'; (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus).niveau_courant; if (presence_variable_partagee == d_faux) { (*s_etat_processus).position_courante = (*((integer8 *) ((*(*(*s_etat_processus) .pointeur_variable_courante).objet).objet))); } else { (*s_etat_processus).position_courante = (*((integer8 *) (*s_copie_variable_partagee) .objet)); liberation(s_etat_processus, s_copie_variable_partagee); } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante) .nom); if ((*s_etat_processus).erreur_systeme != d_es) { return(d_erreur); } } registre_evaluation_forcee = (*s_etat_processus).evaluation_forcee; if (type_evaluation == 'N') { (*s_etat_processus).evaluation_forcee = 'Y'; } if (sequenceur(s_etat_processus) == d_erreur) { depilement_pile_systeme(s_etat_processus); (*s_etat_processus).evaluation_forcee = registre_evaluation_forcee; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus).evaluation_forcee = registre_evaluation_forcee; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = 'N'; depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { return(d_erreur); } (*s_etat_processus).retour_routine_evaluation = 'N'; (*s_etat_processus).position_courante = registre_position_courante; (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; } else if (presence_variable == d_vrai) { registre_evaluation_expression_compilee = (*s_etat_processus).evaluation_expression_compilee; if (((*(*s_etat_processus).pointeur_variable_courante).origine == 'E') && ((*(*s_etat_processus) .pointeur_variable_courante).niveau == 0)) { (*s_etat_processus).evaluation_expression_compilee = 'Y'; } else { (*s_etat_processus).evaluation_expression_compilee = 'N'; } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante) .nom); if ((*s_etat_processus).erreur_systeme != d_es) { return(d_erreur); } } autorisation_empilement_programme = (*s_etat_processus) .autorisation_empilement_programme; empilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_variable_partagee == d_vrai) { liberation(s_etat_processus, s_copie_variable_partagee); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; (*(*s_etat_processus).l_base_pile_systeme) .origine_routine_evaluation = 'Y'; (*s_etat_processus).mode_execution_programme = 'Y'; (*s_etat_processus).autorisation_empilement_programme = 'N'; (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus) .niveau_courant; // ICI //empilement_pile_systeme(s_etat_processus); if (presence_variable_partagee == d_faux) { if (evaluation(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet, type_evaluation) == d_erreur) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } depilement_pile_systeme(s_etat_processus); (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } else { if (evaluation(s_etat_processus, s_copie_variable_partagee, type_evaluation) == d_erreur) { liberation(s_etat_processus, s_copie_variable_partagee); if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } depilement_pile_systeme(s_etat_processus); (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } liberation(s_etat_processus, s_copie_variable_partagee); } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { return(d_erreur); } (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; } else if ((*s_etat_processus).erreur_execution != d_ex_nom_implicite) { if ((s_objet_tampon = copie_objet(s_etat_processus, s_objet, 'Q')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*((struct_nom *) (*s_objet_tampon).objet)).symbole = d_vrai; if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_tampon) == d_erreur) { (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } } else { registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai) ? 'E' : 'N'; if (type_evaluation == 'N') { cf(s_etat_processus, 35); } else { sf(s_etat_processus, 35); } analyse(s_etat_processus, NULL); liberation(s_etat_processus, s_objet_tampon); if (registre_type_evaluation == 'E') { sf(s_etat_processus, 35); } else { cf(s_etat_processus, 35); } if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).test_instruction = registre_test; (*s_etat_processus).instruction_valide = registre_instruction_valide; } else if (((*s_objet).type == RPN) || ((*s_objet).type == ALG)) { l_element_courant = (struct_liste_chainee *) (*s_objet).objet; l_element_egalite = NULL; presence_egalite = d_faux; nombre_termes = 0; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == FCT) { if (strcmp((*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nom_fonction, "=") == 0) { presence_egalite = d_vrai; l_element_egalite = l_element_courant; } } l_element_courant = (*l_element_courant).suivant; nombre_termes++; } if (nombre_termes <= 4) { presence_egalite = d_faux; } if (presence_egalite == d_vrai) { // S'il y a un signe '=', on modifie l'expression à évaluer en ôtant // le signe '=' et en le remplaçant d'une part par SWAP DROP // et d'autre part par DROP. On évalue la première puis la // seconde normalement avant de reconstituer le tout à la fin // de la routine. l_registre_pile_operationnelle = NULL; registre_hauteur_pile_operationnelle = (*s_etat_processus) .hauteur_pile_operationnelle; l_element_courant = (*s_etat_processus).l_base_pile; while(l_element_courant != NULL) { s_sous_objet = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'O'); if (s_sous_objet == NULL) { (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); } if (empilement(s_etat_processus, &l_registre_pile_operationnelle, s_sous_objet) == d_erreur) { (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); } l_element_courant = (*l_element_courant).suivant; } free((*((struct_fonction *) (*(*l_element_egalite).donnee) .objet)).nom_fonction); if (((*((struct_fonction *) (*(*l_element_egalite).donnee).objet)) .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); } (*((struct_fonction *) (*(*l_element_egalite).donnee).objet)) .fonction = instruction_drop; strcpy((*((struct_fonction *) (*(*l_element_egalite).donnee).objet)) .nom_fonction, "DROP"); if (evaluation(s_etat_processus, s_objet, type_evaluation) == d_erreur) { (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } // Récupération de l'objet au niveau 1 résultat de l'évaluation // du premier membre de l'équation puis destruction de la pile. if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_evalue) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } instruction_clear(s_etat_processus); // Régénération de la pile initiale while(depilement(s_etat_processus, &l_registre_pile_operationnelle, &s_sous_objet) != d_erreur) { if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_sous_objet) == d_erreur) { (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } (*s_etat_processus).hauteur_pile_operationnelle = registre_hauteur_pile_operationnelle; (*s_etat_processus).erreur_execution = d_ex; (*((struct_fonction *) (*(*l_element_egalite).donnee).objet)) .fonction = instruction_swap; strcpy((*((struct_fonction *) (*(*l_element_egalite).donnee).objet)) .nom_fonction, "SWAP"); l_element_courant = (*l_element_egalite).suivant; if (((*l_element_egalite).suivant = malloc(sizeof(struct_liste_chainee))) == NULL) { liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } l_element_egalite = (*l_element_egalite).suivant; (*l_element_egalite).suivant = l_element_courant; if (((*l_element_egalite).donnee = allocation(s_etat_processus, FCT)) == NULL) { liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*((struct_fonction *) (*(*l_element_egalite).donnee).objet)) .nombre_arguments = 0; (*((struct_fonction *) (*(*l_element_egalite).donnee).objet)) .fonction = instruction_drop; if (((*((struct_fonction *) (*(*l_element_egalite).donnee).objet)) .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL) { liberation(s_etat_processus, s_objet_evalue); (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } strcpy((*((struct_fonction *) (*(*l_element_egalite).donnee).objet)) .nom_fonction, "DROP"); } /* * Exécution de la séquence d'instructions */ registre_retour_definition = (*(*s_etat_processus).l_base_pile_systeme) .retour_definition; (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N'; l_element_courant = (struct_liste_chainee *) (*s_objet).objet; autorisation_empilement_programme = (*s_etat_processus) .autorisation_empilement_programme; (*s_etat_processus).autorisation_empilement_programme = 'N'; niveau_initial = (*s_etat_processus).niveau_courant; pile_systeme_originelle = (*s_etat_processus).l_base_pile_systeme; while((l_element_courant != NULL) && ((*s_etat_processus).var_volatile_requete_arret == 0) && (erreur_evaluation == d_absence_erreur) && (*s_etat_processus).requete_arret == 'N') { (*s_etat_processus).objet_courant = (*l_element_courant).donnee; if ((*(*l_element_courant).donnee).type == FCT) { /* * Tester la cohérence avec une variable pour récupérer les * données selon les indices passés en argument (tableaux, * listes...). */ if (recherche_variable(s_etat_processus, (*((struct_fonction *) (*(*l_element_courant).donnee).objet)).nom_fonction) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nom_fonction; registre_expression_courante = (*s_etat_processus).expression_courante; (*s_etat_processus).expression_courante = l_element_courant; if (((*s_etat_processus).erreur_execution == d_ex) && ((*s_etat_processus).erreur_systeme == d_es) && ((*s_etat_processus).exception == d_ep)) { registre_evaluation_expression_compilee = (*s_etat_processus) .evaluation_expression_compilee; if (((*(*s_etat_processus).pointeur_variable_courante) .origine == 'E') && ((*(*s_etat_processus) .pointeur_variable_courante).niveau == 0)) { (*s_etat_processus).evaluation_expression_compilee = 'Y'; } else { (*s_etat_processus).evaluation_expression_compilee = 'N'; } analyse(s_etat_processus, (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .fonction); (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; if (type_evaluation == 'I') { (*s_etat_processus).derniere_erreur_evaluation = (*s_etat_processus).erreur_execution; } } if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } if ((*s_etat_processus).var_volatile_processus_pere == 0) { envoi_signal_processus((*s_etat_processus) .pid_processus_pere, rpl_sigalrm); } else { (*s_etat_processus).var_volatile_alarme = -1; } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } else if (((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if ((*s_etat_processus).arret_si_exception == d_faux) { /* * Reprise sur erreur */ if ((message = messages(s_etat_processus)) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } free(message); drapeau_then = d_faux; while(drapeau_then == d_faux) { l_registre_atome = l_element_courant; l_element_courant = (*l_element_courant).suivant; if (l_element_courant == NULL) { /* * La fin de l'expression est atteinte, * le sequenceur reprend la main. */ if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus) .mode_execution_programme = registre_mode_execution_programme; return(d_absence_erreur); } if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; if (recherche_variable(s_etat_processus, (*s_etat_processus) .instruction_courante) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; /* * Traitement de la pile système par les * différentes instructions. */ if (TEST(instruction_if) || TEST(instruction_iferr) || TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) { registre_exception = (*s_etat_processus) .exception; registre_erreur_execution = (*s_etat_processus) .erreur_execution; analyse(s_etat_processus, vers_niveau_superieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus).exception = registre_exception; (*s_etat_processus) .erreur_execution = registre_erreur_execution; } else if (TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus) .l_base_pile_systeme) .type_cloture = 'L'; } else { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_end) || TEST(instruction_next) || TEST(instruction_step) || TEST(vers_niveau_inferieur)) { if (TEST(vers_niveau_inferieur)) { registre_exception = (*s_etat_processus) .exception; registre_erreur_execution = (*s_etat_processus) .erreur_execution; analyse(s_etat_processus, vers_niveau_inferieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus).exception = registre_exception; (*s_etat_processus) .erreur_execution = registre_erreur_execution; } else if ((TEST(instruction_next) || TEST(instruction_step)) && ((*(*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)) { (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .pointeur_variable_courante) .objet == NULL) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_variable_partagee; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .niveau_courant--; if ( retrait_variables_par_niveau( s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } depilement_pile_systeme( s_etat_processus); } 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_end_incoherent; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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; liberation( s_etat_processus, s_objet_evalue); (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .sections_critiques--; } depilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_then)) { if ((*(*s_etat_processus) .l_base_pile_systeme) .clause == 'R') { (*(*s_etat_processus) .l_base_pile_systeme) .clause = 'X'; instruction_then( s_etat_processus); drapeau_then = d_vrai; } } } } } (*s_etat_processus).expression_courante = l_element_courant; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).exception = d_ep; (*s_etat_processus).erreur_execution = d_ex; } else if ((*s_etat_processus).mode_evaluation_expression == 'Y') { /* * Reprise sur erreur */ while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; if (recherche_variable(s_etat_processus, (*s_etat_processus) .instruction_courante) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; /* * Traitement de la pile système par les * différentes instructions. */ if (TEST(instruction_if) || TEST(instruction_iferr) || TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) { analyse(s_etat_processus, vers_niveau_superieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if (TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus) .l_base_pile_systeme) .type_cloture = 'L'; } else { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_end) || TEST(instruction_next) || TEST(instruction_step) || TEST(vers_niveau_inferieur)) { if (TEST(vers_niveau_inferieur)) { analyse(s_etat_processus, vers_niveau_inferieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if ((TEST(instruction_next) || TEST(instruction_step)) && ((*(*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)) { (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .pointeur_variable_courante) .objet == NULL) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_variable_partagee; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .niveau_courant--; if ( retrait_variables_par_niveau( s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } depilement_pile_systeme( s_etat_processus); } 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_end_incoherent; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .sections_critiques--; } depilement_pile_systeme( s_etat_processus); } if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } } l_element_courant = (*l_element_courant).suivant; } (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).exception = d_ep; (*s_etat_processus).erreur_execution = d_ex; erreur_evaluation = d_erreur; (*s_etat_processus).expression_courante = registre_expression_courante; } else { // On ne détruit pas les variables pour les inclure // dans le fichier rpl-core. (*s_etat_processus).gel_liste_variables = d_vrai; registre_erreur_execution = (*s_etat_processus).erreur_execution; registre_exception = (*s_etat_processus).exception; registre_erreur_systeme = (*s_etat_processus).erreur_systeme; (*s_etat_processus).s_objet_errone = s_objet; (*s_etat_processus).s_objet_erreur = (*l_element_courant).donnee; l_element_courant = (*l_element_courant).suivant; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; if (recherche_variable(s_etat_processus, (*s_etat_processus) .instruction_courante) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; /* * Traitement de la pile système par les * différentes instructions. */ if (TEST(instruction_if) || TEST(instruction_iferr) || TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) { analyse(s_etat_processus, vers_niveau_superieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if (TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus) .l_base_pile_systeme) .type_cloture = 'L'; } else { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_end) || TEST(instruction_next) || TEST(instruction_step) || TEST(vers_niveau_inferieur)) { if (TEST(vers_niveau_inferieur)) { analyse(s_etat_processus, vers_niveau_inferieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .l_base_pile_systeme) .retour_definition == 'Y') { break; } } else if ((TEST(instruction_next) || TEST(instruction_step)) && ((*(*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)) { (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .pointeur_variable_courante) .objet == NULL) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_variable_partagee; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .niveau_courant--; if ( retrait_variables_par_niveau( s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } depilement_pile_systeme( s_etat_processus); } 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_end_incoherent; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .sections_critiques--; } depilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } } } l_element_courant = (*l_element_courant).suivant; } (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } if ((*s_etat_processus) .var_volatile_processus_pere == 0) { envoi_signal_processus((*s_etat_processus) .pid_processus_pere, rpl_sigalrm); } else { (*s_etat_processus).var_volatile_alarme = -1; } (*s_etat_processus).erreur_execution = registre_erreur_execution; (*s_etat_processus).erreur_systeme = registre_erreur_systeme; (*s_etat_processus).exception = registre_exception; return(d_erreur); } } if ((*s_etat_processus).instruction_valide == 'Y') { l_element_courant = (*s_etat_processus) .expression_courante; } else { /* * Régénération de la fonction en notation algébrique */ if ((s_objet_elementaire = (struct_objet *) allocation(s_etat_processus, ALG)) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } /* * Ouverture de l'expression */ if (((*s_objet_elementaire).objet = (struct_liste_chainee *) malloc(sizeof(struct_liste_chainee))) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } l_element_fonction = (*s_objet_elementaire).objet; if (((*l_element_fonction).donnee = (struct_objet *) allocation(s_etat_processus, FCT)) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*((struct_fonction *) (*(*l_element_fonction).donnee) .objet)).nombre_arguments = 0; (*((struct_fonction *) (*(*l_element_fonction).donnee) .objet)).fonction = instruction_vers_niveau_superieur; if (((*((struct_fonction *) (*(*l_element_fonction) .donnee).objet)).nom_fonction = (unsigned char *) malloc(3 * sizeof( unsigned char))) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } strcpy((*((struct_fonction *) (*(*l_element_fonction) .donnee).objet)).nom_fonction, "<<"); /* * Ajout des arguments */ for(k = (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nombre_arguments; k >= 1; k--) { if (((*l_element_fonction).suivant = (struct_liste_chainee *) malloc(sizeof( struct_liste_chainee))) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } l_element_fonction = (*l_element_fonction).suivant; if (k > 1) { l_liste1 = (*s_etat_processus).l_base_pile; for(l = 2; l < k; l++) { l_liste1 = (*l_liste1).suivant; } l_liste2 = (*l_liste1).suivant; (*l_liste1).suivant = (*l_liste2).suivant; (*l_liste2).suivant = (*s_etat_processus) .l_base_pile; (*s_etat_processus).l_base_pile = l_liste2; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_sous_objet) == d_erreur) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } (*l_element_fonction).donnee = s_sous_objet; } /* * Ajout de la fonction */ if (((*l_element_fonction).suivant = (struct_liste_chainee *) malloc(sizeof( struct_liste_chainee))) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } l_element_fonction = (*l_element_fonction).suivant; if (((*l_element_fonction).donnee = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } /* * Clôture de l'expression */ if (((*l_element_fonction).suivant = (struct_liste_chainee *) malloc(sizeof( struct_liste_chainee))) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } l_element_fonction = (*l_element_fonction).suivant; if (((*l_element_fonction).donnee = allocation(s_etat_processus, FCT)) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*((struct_fonction *) (*(*l_element_fonction).donnee) .objet)).nombre_arguments = 0; (*((struct_fonction *) (*(*l_element_fonction).donnee) .objet)).fonction = instruction_vers_niveau_inferieur; if (((*((struct_fonction *) (*(*l_element_fonction) .donnee).objet)).nom_fonction = (unsigned char *) malloc(3 * sizeof( unsigned char))) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } strcpy((*((struct_fonction *) (*(*l_element_fonction) .donnee).objet)).nom_fonction, ">>"); (*l_element_fonction).suivant = NULL; if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_elementaire) == d_erreur) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } (*s_etat_processus).expression_courante = registre_expression_courante; } else { if ((s_objet_elementaire = allocation(s_etat_processus, NON)) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante).variable_partagee, 'E') != NULL) { // Une variable partagée existe. presence_variable_partagee = d_vrai; (*(*s_etat_processus).pointeur_variable_courante) .objet = (*(*s_etat_processus) .pointeur_variable_partagee_courante) .objet; } else { presence_variable_partagee = d_faux; } } else { presence_variable_partagee = d_faux; } /* * Recherche d'un élément dans un vecteur */ if ((*(*s_etat_processus).pointeur_variable_courante) .objet == NULL) { // La variable partagée n'existe plus. free(s_objet_elementaire); if ((s_objet_elementaire = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur);; } } else if ((((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == VIN) || ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == VRL) || ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == VCX)) && ((*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nombre_arguments == 1)) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_indice_i) == d_erreur) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } if ((*s_objet_indice_i).type != INT) { liberation(s_etat_processus, s_objet_indice_i); free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } i = (*((integer8 *) (*s_objet_indice_i).objet)); liberation(s_etat_processus, s_objet_indice_i); if ((i < 1) || (i > (integer8) (*((struct_vecteur *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)).objet)) .taille)) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_element_inexistant; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } if ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == VIN) { if (((*s_objet_elementaire).objet = malloc(sizeof( integer8))) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*s_objet_elementaire).type = INT; (*((integer8 *) (*s_objet_elementaire).objet)) = ((integer8 *) (*((struct_vecteur *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1]; } else if ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == VRL) { if (((*s_objet_elementaire).objet = malloc(sizeof( real8))) == NULL) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*s_objet_elementaire).type = REL; (*((real8 *) (*s_objet_elementaire).objet)) = ((real8 *) (*((struct_vecteur *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1]; } else if ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == VCX) { if (((*s_objet_elementaire).objet = malloc(sizeof( struct_complexe16))) == NULL) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*s_objet_elementaire).type = CPL; (*((struct_complexe16 *) (*s_objet_elementaire) .objet)).partie_reelle = ((struct_complexe16 *) (*((struct_vecteur *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_elementaire) .objet)).partie_imaginaire = ((struct_complexe16 *) (*((struct_vecteur *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1].partie_imaginaire; } } /* * Recherche d'un élément dans une matrice */ else if ((((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == MIN) || ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == MRL) || ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == MCX)) && ((*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nombre_arguments == 2)) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_indice_j) == d_erreur) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_indice_i) == d_erreur) { liberation(s_etat_processus, s_objet_indice_j); free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } if (((*s_objet_indice_i).type != INT) || ((*s_objet_indice_j).type != INT)) { liberation(s_etat_processus, s_objet_indice_i); liberation(s_etat_processus, s_objet_indice_j); free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } i = (*((integer8 *) (*s_objet_indice_i).objet)); j = (*((integer8 *) (*s_objet_indice_j).objet)); liberation(s_etat_processus, s_objet_indice_i); liberation(s_etat_processus, s_objet_indice_j); if ((i < 1) || (i > (integer8) (*((struct_matrice *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)).objet)) .nombre_lignes) || (j < 1) || (j > (integer8) (*((struct_matrice *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)).objet)) .nombre_colonnes)) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_element_inexistant; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } if ((*((*(*s_etat_processus).pointeur_variable_courante) .objet)).type == MIN) { if (((*s_objet_elementaire).objet = malloc(sizeof( integer8))) == NULL) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*s_objet_elementaire).type = INT; (*((integer8 *) (*s_objet_elementaire).objet)) = ((integer8 **) (*((struct_matrice *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1][j - 1]; } else if ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == MRL) { if (((*s_objet_elementaire).objet = malloc(sizeof( real8))) == NULL) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*s_objet_elementaire).type = REL; (*((real8 *) (*s_objet_elementaire).objet)) = ((real8 **) (*((struct_matrice *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1][j - 1]; } else if ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == MCX) { if (((*s_objet_elementaire).objet = malloc(sizeof( struct_complexe16))) == NULL) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*s_objet_elementaire).type = CPL; (*((struct_complexe16 *) (*s_objet_elementaire) .objet)).partie_reelle = ((struct_complexe16 **) (*((struct_matrice *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1][j - 1] .partie_reelle; (*((struct_complexe16 *) (*s_objet_elementaire) .objet)).partie_imaginaire = ((struct_complexe16 **) (*((struct_matrice *) (*((*(*s_etat_processus) .pointeur_variable_courante).objet)) .objet)).tableau)[i - 1][j - 1] .partie_imaginaire; } } /* * Recherche de l'élément idoine dans la liste */ else if (((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == LST) && ((*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nombre_arguments == 1)) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_indice_i) == d_erreur) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } if ((*s_objet_indice_i).type != INT) { liberation(s_etat_processus, s_objet_indice_i); free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } i = (*((integer8 *) (*s_objet_indice_i).objet)); liberation(s_etat_processus, s_objet_indice_i); l_sous_element_courant = (*((*(*s_etat_processus) .pointeur_variable_courante).objet)).objet; j = 0; while(l_sous_element_courant != NULL) { if ((++j) == i) { break; } l_sous_element_courant = (*l_sous_element_courant).suivant; } if (j != i) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_element_inexistant; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } free(s_objet_elementaire); if ((s_objet_elementaire = copie_objet(s_etat_processus, (*l_sous_element_courant).donnee, 'P')) == NULL) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } /* * Recherche de l'élément idoine dans la table */ else if (((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == TBL) && ((*((struct_fonction *) (*(*l_element_courant) .donnee).objet)).nombre_arguments == 1)) { if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_indice_i) == d_erreur) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } if ((*s_objet_indice_i).type != INT) { liberation(s_etat_processus, s_objet_indice_i); free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } i = (*((integer8 *) (*s_objet_indice_i).objet)); liberation(s_etat_processus, s_objet_indice_i); if ((i < 1) || (i > (integer8) (*((struct_tableau *) (*(*(*s_etat_processus) .pointeur_variable_courante).objet) .objet)).nombre_elements)) { free(s_objet_elementaire); if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_element_inexistant; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } free(s_objet_elementaire); if ((s_objet_elementaire = copie_objet(s_etat_processus, (*((struct_tableau *) (*(*(*s_etat_processus) .pointeur_variable_courante).objet) .objet)).elements[i - 1], 'P')) == NULL) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } else if (((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == ALG) || ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == RPN)) { registre_evaluation_expression_compilee = (*s_etat_processus) .evaluation_expression_compilee; if (((*(*s_etat_processus).pointeur_variable_courante) .origine == 'E') && ((*(*s_etat_processus) .pointeur_variable_courante).niveau == 0)) { (*s_etat_processus).evaluation_expression_compilee = 'Y'; } else { (*s_etat_processus).evaluation_expression_compilee = 'N'; } if (evaluation(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet, type_evaluation) == d_erreur) { (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; free(s_objet_elementaire); if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_elementaire) == d_erreur) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } } else if ((*((*(*s_etat_processus) .pointeur_variable_courante).objet)).type == ADR) { autorisation_empilement_programme = (*s_etat_processus) .autorisation_empilement_programme; registre_position_courante = (*s_etat_processus) .position_courante; empilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } depilement_pile_systeme(s_etat_processus); (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; (*(*s_etat_processus).l_base_pile_systeme) .origine_routine_evaluation = 'Y'; (*s_etat_processus).mode_execution_programme = 'Y'; (*s_etat_processus).autorisation_empilement_programme = 'N'; (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus) .niveau_courant; (*s_etat_processus).position_courante = (*((integer8 *) ((*(*(*s_etat_processus) .pointeur_variable_courante).objet).objet))); if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom); if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } return(d_erreur); } } registre_evaluation_forcee = (*s_etat_processus).evaluation_forcee; if (type_evaluation == 'N') { (*s_etat_processus).evaluation_forcee = 'Y'; } if (sequenceur(s_etat_processus) == d_erreur) { (*s_etat_processus).evaluation_forcee = registre_evaluation_forcee; if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } depilement_pile_systeme(s_etat_processus); (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } (*s_etat_processus).evaluation_forcee = registre_evaluation_forcee; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = 'N'; depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } return(d_erreur); } (*s_etat_processus).retour_routine_evaluation = 'N'; (*s_etat_processus).position_courante = registre_position_courante; (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; free(s_objet_elementaire); if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), &s_objet_elementaire) == d_erreur) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_manque_argument; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } } else { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_execution = d_ex_element_inexistant; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_elementaire) == d_erreur) { if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante) .mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } if (presence_variable_partagee == d_vrai) { (*(*s_etat_processus) .pointeur_variable_courante).objet = NULL; if (pthread_mutex_unlock(&((*(*s_etat_processus) .pointeur_variable_partagee_courante).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; } } } } else if (((*(*l_element_courant).donnee).type == ALG) || ((*(*l_element_courant).donnee).type == RPN)) { if (type_evaluation == 'I') { if ((s_objet_elementaire = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_elementaire) == d_erreur) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } else { if ((*s_etat_processus).autorisation_empilement_programme == 'N') { registre_evaluation_expression_compilee = (*s_etat_processus) .evaluation_expression_compilee; (*s_etat_processus).evaluation_expression_compilee = 'N'; if (evaluation(s_etat_processus, (*l_element_courant) .donnee, type_evaluation) == d_erreur) { (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } (*s_etat_processus).evaluation_expression_compilee = registre_evaluation_expression_compilee; } else { if ((s_objet_elementaire = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_elementaire) == d_erreur) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } } } else if ((*(*l_element_courant).donnee).type == NOM) { registre_instruction_valide = (*s_etat_processus) .instruction_valide; registre_test = (*s_etat_processus).test_instruction; (*s_etat_processus).test_instruction = 'Y'; (*s_etat_processus).instruction_courante = (*((struct_nom *) (*(*l_element_courant).donnee).objet)).nom; analyse(s_etat_processus, NULL); (*s_etat_processus).test_instruction = 'N'; if ((*s_etat_processus).instruction_valide == 'Y') { registre_test_2 = (*s_etat_processus).test_instruction; (*s_etat_processus).test_instruction = 'N'; registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai) ? 'E' : 'N'; if (type_evaluation == 'N') { cf(s_etat_processus, 35); } else { sf(s_etat_processus, 35); } analyse(s_etat_processus, NULL); if (registre_type_evaluation == 'E') { sf(s_etat_processus, 35); } else { cf(s_etat_processus, 35); } (*s_etat_processus).test_instruction = registre_test_2; if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } if ((*s_etat_processus).var_volatile_processus_pere == 0) { envoi_signal_processus((*s_etat_processus) .pid_processus_pere, rpl_sigalrm); } else { (*s_etat_processus).var_volatile_alarme = -1; } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } else if (((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if ((*s_etat_processus).arret_si_exception == d_faux) { /* * Reprise sur erreur */ if ((message = messages(s_etat_processus)) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } free(message); while((*(*s_etat_processus).l_base_pile_systeme) .clause != 'R') { l_registre_atome = l_element_courant; l_element_courant = (*l_element_courant).suivant; if (l_element_courant == NULL) { /* * La fin de l'expression est atteinte, * le sequenceur reprend la main. */ if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus) .mode_execution_programme = registre_mode_execution_programme; return(d_absence_erreur); } if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; if (recherche_variable(s_etat_processus, (*s_etat_processus) .instruction_courante) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; /* * Traitement de la pile système par les * différentes instructions. */ if (TEST(instruction_if) || TEST(instruction_iferr) || TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) { registre_exception = (*s_etat_processus) .exception; registre_erreur_execution = (*s_etat_processus) .erreur_execution; analyse(s_etat_processus, vers_niveau_superieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus).exception = registre_exception; (*s_etat_processus) .erreur_execution = registre_erreur_execution; } else if (TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus) .l_base_pile_systeme) .type_cloture = 'L'; } else { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_end) || TEST(instruction_next) || TEST(instruction_step) || TEST(vers_niveau_inferieur)) { if (TEST(vers_niveau_inferieur)) { registre_exception = (*s_etat_processus) .exception; registre_erreur_execution = (*s_etat_processus) .erreur_execution; analyse(s_etat_processus, vers_niveau_inferieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus).exception = registre_exception; (*s_etat_processus) .erreur_execution = registre_erreur_execution; } else if ((TEST(instruction_next) || TEST(instruction_step)) && ((*(*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)) { (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .pointeur_variable_courante) .objet == NULL) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_variable_partagee; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .niveau_courant--; if ( retrait_variables_par_niveau( s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } depilement_pile_systeme( s_etat_processus); } 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_end_incoherent; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .sections_critiques--; } depilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } } } } (*s_etat_processus).instruction_courante = instruction_courante; drapeau_then = d_faux; do { l_registre_atome = l_element_courant; if (l_element_courant == NULL) { /* * La fin de l'expression est atteinte, * le sequenceur reprend la main. */ if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus) .mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; return(d_absence_erreur); } if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus) .instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; (*s_etat_processus).instruction_courante = instruction_courante; drapeau_then = TEST(instruction_then) ? d_vrai : d_faux; } l_element_courant = (*l_element_courant) .suivant; } while(drapeau_then == d_faux); (*s_etat_processus).expression_courante = l_registre_atome; (*(*s_etat_processus).l_base_pile_systeme) .clause = 'X'; instruction_then(s_etat_processus); (*s_etat_processus).exception = d_ep; (*s_etat_processus).erreur_execution = d_ex; } else if ((*s_etat_processus).mode_evaluation_expression == 'Y') { /* * Reprise sur erreur */ while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; if (recherche_variable(s_etat_processus, (*s_etat_processus) .instruction_courante) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; /* * Traitement de la pile système par les * différentes instructions. */ if (TEST(instruction_if) || TEST(instruction_iferr) || TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) { analyse(s_etat_processus, vers_niveau_superieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if (TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus) .l_base_pile_systeme) .type_cloture = 'L'; } else { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_end) || TEST(instruction_next) || TEST(instruction_step) || TEST(vers_niveau_inferieur)) { if (TEST(vers_niveau_inferieur)) { analyse(s_etat_processus, vers_niveau_inferieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if ((TEST(instruction_next) || TEST(instruction_step)) && ((*(*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)) { (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .pointeur_variable_courante) .objet == NULL) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_variable_partagee; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .niveau_courant--; if ( retrait_variables_par_niveau( s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } depilement_pile_systeme( s_etat_processus); } 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_end_incoherent; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .sections_critiques--; } depilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } } } l_element_courant = (*l_element_courant).suivant; } (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).exception = d_ep; (*s_etat_processus).erreur_execution = d_ex; erreur_evaluation = d_erreur; } else { // On ne détruit pas les variables pour les inclure // dans le fichier rpl-core. (*s_etat_processus).gel_liste_variables = d_vrai; registre_erreur_execution = (*s_etat_processus).erreur_execution; registre_exception = (*s_etat_processus).exception; registre_erreur_systeme = (*s_etat_processus).erreur_systeme; (*s_etat_processus).s_objet_errone = s_objet; (*s_etat_processus).s_objet_erreur = (*l_element_courant).donnee; l_element_courant = (*l_element_courant).suivant; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; if (recherche_variable(s_etat_processus, (*s_etat_processus) .instruction_courante) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; /* * Traitement de la pile système par les * différentes instructions. */ if (TEST(instruction_if) || TEST(instruction_iferr) || TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) { analyse(s_etat_processus, vers_niveau_superieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if (TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus) .l_base_pile_systeme) .type_cloture = 'L'; } else { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_end) || TEST(instruction_next) || TEST(instruction_step) || TEST(vers_niveau_inferieur)) { if (TEST(vers_niveau_inferieur)) { analyse(s_etat_processus, vers_niveau_inferieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if ((TEST(instruction_next) || TEST(instruction_step)) && ((*(*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)) { (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .pointeur_variable_courante) .objet == NULL) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_variable_partagee; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .niveau_courant--; if ( retrait_variables_par_niveau( s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } depilement_pile_systeme( s_etat_processus); } 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_end_incoherent; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .sections_critiques--; } depilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } } } l_element_courant = (*l_element_courant).suivant; } (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } if ((*s_etat_processus) .var_volatile_processus_pere == 0) { envoi_signal_processus((*s_etat_processus) .pid_processus_pere, rpl_sigalrm); } else { (*s_etat_processus).var_volatile_alarme = -1; } (*s_etat_processus).erreur_execution = registre_erreur_execution; (*s_etat_processus).erreur_systeme = registre_erreur_systeme; (*s_etat_processus).exception = registre_exception; return(d_erreur); } } if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } if ((*s_etat_processus).var_volatile_processus_pere == 0) { envoi_signal_processus((*s_etat_processus) .pid_processus_pere, rpl_sigalrm); } else { (*s_etat_processus).var_volatile_alarme = -1; } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } else if (((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if ((*s_etat_processus).arret_si_exception == d_faux) { /* * Reprise sur erreur */ if ((message = messages(s_etat_processus)) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } free(message); while((*(*s_etat_processus).l_base_pile_systeme) .clause != 'R') { l_registre_atome = l_element_courant; l_element_courant = (*l_element_courant).suivant; if (l_element_courant == NULL) { /* * La fin de l'expression est atteinte, * le sequenceur reprend la main. */ if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus) .mode_execution_programme = registre_mode_execution_programme; return(d_absence_erreur); } if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; if (recherche_variable(s_etat_processus, (*s_etat_processus) .instruction_courante) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; /* * Traitement de la pile système par les * différentes instructions. */ if (TEST(instruction_if) || TEST(instruction_iferr) || TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) { registre_exception = (*s_etat_processus) .exception; registre_erreur_execution = (*s_etat_processus) .erreur_execution; analyse(s_etat_processus, vers_niveau_superieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus).exception = registre_exception; (*s_etat_processus) .erreur_execution = registre_erreur_execution; } else if (TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus) .l_base_pile_systeme) .type_cloture = 'L'; } else { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_end) || TEST(instruction_next) || TEST(instruction_step) || TEST(vers_niveau_inferieur)) { if (TEST(vers_niveau_inferieur)) { registre_exception = (*s_etat_processus) .exception; registre_erreur_execution = (*s_etat_processus) .erreur_execution; analyse(s_etat_processus, vers_niveau_inferieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus).exception = registre_exception; (*s_etat_processus) .erreur_execution = registre_erreur_execution; } else if ((TEST(instruction_next) || TEST(instruction_step)) && ((*(*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)) { (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .pointeur_variable_courante) .objet == NULL) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_variable_partagee; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .niveau_courant--; if ( retrait_variables_par_niveau( s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } depilement_pile_systeme( s_etat_processus); } 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_end_incoherent; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .sections_critiques--; } depilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } } } } (*s_etat_processus).instruction_courante = instruction_courante; drapeau_then = d_faux; do { l_registre_atome = l_element_courant; if (l_element_courant == NULL) { /* * La fin de l'expression est atteinte, * le séquenceur reprend la main. */ if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus) .mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; return(d_absence_erreur); } if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus) .instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; (*s_etat_processus).instruction_courante = instruction_courante; drapeau_then = TEST(instruction_then) ? d_vrai : d_faux; } l_element_courant = (*l_element_courant) .suivant; } while(drapeau_then == d_faux); (*s_etat_processus).expression_courante = l_registre_atome; (*(*s_etat_processus).l_base_pile_systeme) .clause = 'X'; instruction_then(s_etat_processus); (*s_etat_processus).exception = d_ep; (*s_etat_processus).erreur_execution = d_ex; } else if ((*s_etat_processus).mode_evaluation_expression == 'Y') { /* * Reprise sur erreur */ while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; if (recherche_variable(s_etat_processus, (*s_etat_processus) .instruction_courante) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; /* * Traitement de la pile système par les * différentes instructions. */ if (TEST(instruction_if) || TEST(instruction_iferr) || TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) { analyse(s_etat_processus, vers_niveau_superieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if (TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus) .l_base_pile_systeme) .type_cloture = 'L'; } else { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_end) || TEST(instruction_next) || TEST(instruction_step) || TEST(vers_niveau_inferieur)) { if (TEST(vers_niveau_inferieur)) { analyse(s_etat_processus, vers_niveau_inferieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if ((TEST(instruction_next) || TEST(instruction_step)) && ((*(*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)) { (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .pointeur_variable_courante) .objet == NULL) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_variable_partagee; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .niveau_courant--; if ( retrait_variables_par_niveau( s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } depilement_pile_systeme( s_etat_processus); } 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_end_incoherent; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .sections_critiques--; } depilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } } } l_element_courant = (*l_element_courant).suivant; } (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).exception = d_ep; (*s_etat_processus).erreur_execution = d_ex; erreur_evaluation = d_erreur; } else { // On ne détruit pas les variables pour les inclure // dans le fichier rpl-core. (*s_etat_processus).gel_liste_variables = d_vrai; registre_erreur_execution = (*s_etat_processus).erreur_execution; registre_exception = (*s_etat_processus).exception; registre_erreur_systeme = (*s_etat_processus).erreur_systeme; (*s_etat_processus).s_objet_errone = s_objet; (*s_etat_processus).s_objet_erreur = (*l_element_courant).donnee; l_element_courant = (*l_element_courant).suivant; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).nom_fonction; fonction = (*((struct_fonction *) (*(*l_element_courant).donnee) .objet)).fonction; if (recherche_variable(s_etat_processus, (*s_etat_processus) .instruction_courante) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; /* * Traitement de la pile système par les * différentes instructions. */ if (TEST(instruction_if) || TEST(instruction_iferr) || TEST(instruction_do) || TEST(instruction_while) || TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start) || TEST(instruction_select) || TEST(instruction_case) || TEST(instruction_critical) || TEST(vers_niveau_superieur)) { if (TEST(vers_niveau_superieur)) { analyse(s_etat_processus, vers_niveau_superieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if (TEST(instruction_for) || TEST(instruction_forall) || TEST(instruction_start)) { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus) .l_base_pile_systeme) .type_cloture = 'L'; } else { empilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else if (TEST(instruction_end) || TEST(instruction_next) || TEST(instruction_step) || TEST(vers_niveau_inferieur)) { if (TEST(vers_niveau_inferieur)) { analyse(s_etat_processus, vers_niveau_inferieur); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } else if ((TEST(instruction_next) || TEST(instruction_step)) && ((*(*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)) { (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_erreur_traitement_boucle; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if ((*(*s_etat_processus) .pointeur_variable_courante) .objet == NULL) { (*s_etat_processus) .erreur_systeme = d_es; (*s_etat_processus) .erreur_execution = d_ex_variable_partagee; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .niveau_courant--; if ( retrait_variables_par_niveau( s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } depilement_pile_systeme( s_etat_processus); } 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_end_incoherent; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; 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; if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } (*s_etat_processus) .sections_critiques--; } depilement_pile_systeme( s_etat_processus); if ((*s_etat_processus) .erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation( s_etat_processus, s_objet_evalue); } (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } } } l_element_courant = (*l_element_courant).suivant; } (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).instruction_courante = instruction_courante; if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } if ((*s_etat_processus) .var_volatile_processus_pere == 0) { envoi_signal_processus((*s_etat_processus) .pid_processus_pere, rpl_sigalrm); } else { (*s_etat_processus).var_volatile_alarme = -1; } (*s_etat_processus).erreur_execution = registre_erreur_execution; (*s_etat_processus).erreur_systeme = registre_erreur_systeme; (*s_etat_processus).exception = registre_exception; return(d_erreur); } } } else if ((*s_etat_processus).constante_symbolique == 'N') { if ((s_objet_elementaire = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } presence_fonction = d_faux; presence_variable_partagee = d_faux; if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_elementaire).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; presence_variable = d_faux; if ((*s_etat_processus).autorisation_nom_implicite == 'N') { if ((*((struct_nom *) (*s_objet_elementaire).objet)) .symbole == d_faux) { if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return(d_erreur); } } erreur_evaluation = d_erreur; (*s_etat_processus).erreur_execution = d_ex_nom_implicite; if (type_evaluation == 'I') { (*s_etat_processus) .derniere_erreur_evaluation = (*s_etat_processus) .erreur_execution; } } } } else { if ((*s_etat_processus).traitement_symbolique == 'N') { if ((*(*s_etat_processus) .pointeur_variable_courante).objet == NULL) { // Variable partagée presence_variable_partagee = d_faux; if (recherche_variable_partagee( s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante) .variable_partagee, 'E') != NULL) { presence_variable = d_vrai; presence_variable_partagee = d_vrai; if ((*(*(*s_etat_processus) .pointeur_variable_partagee_courante ).objet).type == ADR) { presence_fonction = d_vrai; } if ((type_evaluation == 'N') || ((*((struct_nom *) (*(*l_element_courant).donnee) .objet)).symbole == d_faux)) { if ((s_copie_variable_partagee = copie_objet(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_partagee_courante ).objet, 'P')) == NULL) { if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus) .erreur_systeme = d_es_processus; return(d_erreur); } } } else { s_copie_variable_partagee = NULL; } if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return(d_erreur); } } else { (*s_etat_processus).erreur_systeme = d_es; presence_variable = d_faux; presence_variable_partagee = d_faux; } } else { presence_variable = d_vrai; if ((*(*(*s_etat_processus) .pointeur_variable_courante).objet) .type == ADR) { presence_fonction = d_vrai; } } } else { presence_variable = d_faux; } } liberation(s_etat_processus, s_objet_elementaire); if (presence_fonction == d_vrai) { if ((*((struct_nom *) (*(*l_element_courant).donnee) .objet)).symbole == d_vrai) { // L'objet apparaît comme un symbole dans // l'expression en cours d'évaluation. On se // contente de l'empiler. if ((s_sous_objet = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_sous_objet) == d_erreur) { (*s_etat_processus).instruction_courante = instruction_courante; liberation(s_etat_processus, s_sous_objet); return(d_erreur); } } else { autorisation_empilement_programme = (*s_etat_processus) .autorisation_empilement_programme; registre_position_courante = (*s_etat_processus) .position_courante; empilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_variable_partagee == d_vrai) { liberation(s_etat_processus, s_copie_variable_partagee); } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; (*(*s_etat_processus).l_base_pile_systeme) .origine_routine_evaluation = 'Y'; (*s_etat_processus).mode_execution_programme = 'Y'; (*s_etat_processus) .autorisation_empilement_programme = 'N'; (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus) .niveau_courant; if (presence_variable_partagee == d_faux) { (*s_etat_processus).position_courante = (*((integer8 *) ((*(*(*s_etat_processus) .pointeur_variable_courante) .objet).objet))); } else { (*s_etat_processus).position_courante = (*((integer8 *) (*s_copie_variable_partagee).objet)); liberation(s_etat_processus, s_copie_variable_partagee); } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom); if ((*s_etat_processus).erreur_systeme != d_es) { return(d_erreur); } } registre_evaluation_forcee = (*s_etat_processus).evaluation_forcee; if (type_evaluation == 'N') { (*s_etat_processus).evaluation_forcee = 'Y'; } if (sequenceur(s_etat_processus) == d_erreur) { (*s_etat_processus).evaluation_forcee = registre_evaluation_forcee; if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } depilement_pile_systeme(s_etat_processus); (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } (*s_etat_processus).evaluation_forcee = registre_evaluation_forcee; (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = 'N'; depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } return(d_erreur); } (*s_etat_processus).retour_routine_evaluation = 'N'; (*s_etat_processus).position_courante = registre_position_courante; (*s_etat_processus) .autorisation_empilement_programme = autorisation_empilement_programme; } } else if (((type_evaluation == 'N') || ((*((struct_nom *) (*(*l_element_courant).donnee).objet)).symbole == d_faux)) && (presence_variable == d_vrai)) { if (type_evaluation == 'I') { if (presence_variable_partagee == d_faux) { if ((s_sous_objet = copie_objet(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet, 'P')) == NULL) { if (presence_variable_partagee == d_vrai) { liberation(s_etat_processus, s_copie_variable_partagee); } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_sous_objet) == d_erreur) { if (presence_variable_partagee == d_vrai) { liberation(s_etat_processus, s_copie_variable_partagee); } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } return(d_erreur); } } else { if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_copie_variable_partagee) == d_erreur) { if (presence_variable_partagee == d_vrai) { liberation(s_etat_processus, s_copie_variable_partagee); } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } return(d_erreur); } } } else { registre_evaluation_expression_compilee = (*s_etat_processus) .evaluation_expression_compilee; if (((*(*s_etat_processus) .pointeur_variable_courante) .origine == 'E') && ((*(*s_etat_processus) .pointeur_variable_courante).niveau == 0)) { (*s_etat_processus) .evaluation_expression_compilee = 'Y'; } else { (*s_etat_processus) .evaluation_expression_compilee = 'N'; } if (presence_variable_partagee == d_faux) { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom); if ((*s_etat_processus).erreur_systeme != d_es) { return(d_erreur); } } empilement_pile_systeme(s_etat_processus); (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus) .niveau_courant; (*(*s_etat_processus).l_base_pile_systeme) .pointeur_objet_retour = l_element_courant; (*(*s_etat_processus).l_base_pile_systeme) .origine_routine_evaluation = 'Y'; if (evaluation(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet, type_evaluation) == d_erreur) { depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus) .evaluation_expression_compilee = registre_evaluation_expression_compilee; if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } depilement_pile_systeme(s_etat_processus); } else { if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom); if ((*s_etat_processus).erreur_systeme != d_es) { return(d_erreur); } } empilement_pile_systeme(s_etat_processus); (*(*s_etat_processus).l_base_pile_systeme) .retour_definition = 'Y'; (*(*s_etat_processus).l_base_pile_systeme) .niveau_courant = (*s_etat_processus) .niveau_courant; if (evaluation(s_etat_processus, s_copie_variable_partagee, type_evaluation) == d_erreur) { depilement_pile_systeme(s_etat_processus); liberation(s_etat_processus, s_copie_variable_partagee); if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus) .evaluation_expression_compilee = registre_evaluation_expression_compilee; if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } depilement_pile_systeme(s_etat_processus); liberation(s_etat_processus, s_copie_variable_partagee); } if ((*s_etat_processus).profilage == d_vrai) { profilage(s_etat_processus, NULL); } (*s_etat_processus) .evaluation_expression_compilee = registre_evaluation_expression_compilee; } } else { if (presence_variable_partagee == d_vrai) { liberation(s_etat_processus, s_copie_variable_partagee); } if ((s_objet_elementaire = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } /* * Vérification du drapeau symbole pour * savoir si l'on met dans la pile le nom * ou le contenu de la variable. */ if (((*((struct_nom *) (*s_objet_elementaire).objet)) .symbole == d_faux) && ((*s_etat_processus) .traitement_symbolique == 'N')) { if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_elementaire) .objet)).nom) == d_vrai) { if ((*(*s_etat_processus) .pointeur_variable_courante).objet == NULL) { // Variable partagée if (recherche_variable_partagee( s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).nom, (*(*s_etat_processus) .pointeur_variable_courante) .variable_partagee, 'E') != NULL) { liberation(s_etat_processus, s_objet_elementaire); if ((s_objet_elementaire = copie_objet(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_partagee_courante ).objet, 'P')) == NULL) { if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus) .erreur_systeme = d_es_processus; return(d_erreur); } if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } if (pthread_mutex_unlock( &((*(*s_etat_processus) .pointeur_variable_partagee_courante ).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return(d_erreur); } } } else { // Variable privée liberation(s_etat_processus, s_objet_elementaire); if ((s_objet_elementaire = copie_objet(s_etat_processus, (*(*s_etat_processus) .pointeur_variable_courante).objet, 'P')) == NULL) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus) .instruction_courante = instruction_courante; return(d_erreur); } } } else { (*s_etat_processus).erreur_systeme = d_es; (*((struct_nom *) (*s_objet_elementaire) .objet)).symbole = d_vrai; } } if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_elementaire) == d_erreur) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } if ((*s_etat_processus).erreur_execution == d_ex_variable_non_definie) { (*s_etat_processus).erreur_execution = d_ex; } } } else { registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai) ? 'E' : 'N'; if (type_evaluation == 'N') { cf(s_etat_processus, 35); } else { sf(s_etat_processus, 35); } analyse(s_etat_processus, NULL); if (registre_type_evaluation == 'E') { sf(s_etat_processus, 35); } else { cf(s_etat_processus, 35); } if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { // Il est anormal de récupérer ici une erreur // d'exécution puisqu'on empile une constante // symbolique. if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).test_instruction = registre_test; (*s_etat_processus).instruction_valide = registre_instruction_valide; } else { if ((s_objet_tampon = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_tampon) == d_erreur) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } } // Traitement de l'instruction EXIT en mode interactif if ((*s_etat_processus).traitement_cycle_exit != 'N') { registre_expression_courante = (*s_etat_processus).expression_courante; (*s_etat_processus).expression_courante = l_element_courant; switch((*s_etat_processus).traitement_cycle_exit) { case 'C' : { instruction_cycle(s_etat_processus); break; } case 'E' : { instruction_exit(s_etat_processus); break; } } l_element_courant = (*s_etat_processus).expression_courante; (*s_etat_processus).expression_courante = registre_expression_courante; } if (l_element_courant != NULL) { l_element_courant = (*l_element_courant).suivant; } else { (*s_etat_processus).mode_execution_programme = 'Y'; if ((*s_etat_processus).niveau_courant == 1) { (*s_etat_processus).debug_programme = d_faux; (*s_etat_processus).execution_pas_suivant = d_vrai; } } } if (niveau_initial < (*s_etat_processus).niveau_courant) { /* * Retrait des variables dans le cas où l'évaluation de * l'expression a été interrompue */ (*s_etat_processus).niveau_courant = niveau_initial; if (retrait_variables_par_niveau(s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } } /* * Retrait des variables statiques créées dans l'expression */ if (retrait_variables_statiques_locales(s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } /* * Retrait des variables partagées créées dans l'expression */ if (retrait_variables_partagees_locales(s_etat_processus) == d_erreur) { if (presence_egalite == d_vrai) { liberation(s_etat_processus, s_objet_evalue); } (*s_etat_processus).instruction_courante = instruction_courante; (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } if ((*s_etat_processus).var_volatile_requete_arret != 0) { // Restauration de la pile système while(pile_systeme_originelle != (*s_etat_processus).l_base_pile_systeme) { depilement_pile_systeme(s_etat_processus); } } if (presence_egalite == d_vrai) { // Ajout du membre évalué lors de la première passe if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_evalue) == d_erreur) { (*s_etat_processus).instruction_courante = instruction_courante; return(d_erreur); } instruction_swap(s_etat_processus); if ((*s_etat_processus).erreur_execution != d_ex) { (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; (*s_etat_processus).instruction_courante = instruction_courante; (*(*s_etat_processus).l_base_pile_systeme).retour_definition = registre_retour_definition; return(d_erreur); } instruction_egalite(s_etat_processus); if ((*s_etat_processus).erreur_execution != d_ex) { (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; (*s_etat_processus).instruction_courante = instruction_courante; (*(*s_etat_processus).l_base_pile_systeme).retour_definition = registre_retour_definition; return(d_erreur); } } (*s_etat_processus).autorisation_empilement_programme = autorisation_empilement_programme; (*s_etat_processus).instruction_courante = instruction_courante; (*(*s_etat_processus).l_base_pile_systeme).retour_definition = registre_retour_definition; } else if ((*s_objet).type == FCT) { (*s_etat_processus).instruction_courante = (*((struct_fonction *) (*s_objet).objet)).nom_fonction; registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai) ? 'E' : 'N'; cf(s_etat_processus, 35); analyse(s_etat_processus, (*((struct_fonction *) (*s_objet).objet)).fonction); (*s_etat_processus).instruction_courante = instruction_courante; if (registre_type_evaluation == 'E') { sf(s_etat_processus, 35); } else { cf(s_etat_processus, 35); } if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return(d_erreur); } } else { (*s_etat_processus).instruction_courante = instruction_courante; if ((s_objet_tampon = copie_objet(s_etat_processus, s_objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); } if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile), s_objet_tampon) == d_erreur) { return(d_erreur); } } (*s_etat_processus).mode_execution_programme = registre_mode_execution_programme; return((erreur_evaluation == d_absence_erreur) ? d_absence_erreur : d_erreur); } // vim: ts=4