/* ================================================================================ RPL/2 (R) version 4.1.0 Copyright (C) 1989-2011 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" /* ================================================================================ Fonction 'sub' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_sub(struct_processus *s_etat_processus) { struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_precedent; struct_objet *s_copie_argument_3; struct_objet *s_objet_argument_1; struct_objet *s_objet_argument_2; struct_objet *s_objet_argument_3; struct_objet *s_objet_resultat; unsigned long i; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n SUB "); if ((*s_etat_processus).langue == 'F') { printf("(extraction)\n\n"); } else { printf("(suboject extraction)\n\n"); } printf(" 3: %s, %s\n", d_CHN, d_LST); printf(" 2: %s\n", d_INT); printf(" 1: %s\n", d_INT); printf("-> 1: %s, %s\n", d_CHN, d_LST); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 3) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument_2) == d_erreur) { liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument_3) == d_erreur) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (((*s_objet_argument_1).type != INT) || ((*s_objet_argument_2).type != INT)) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_3); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (((*((integer8 *) (*s_objet_argument_1).objet)) < 1) || ((*((integer8 *) (*s_objet_argument_2).objet)) < 1) || ((*((integer8 *) (*s_objet_argument_1).objet)) < (*((integer8 *) (*s_objet_argument_2).objet)))) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_3); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } /* -------------------------------------------------------------------------------- Traitement des chaînes de caractères -------------------------------------------------------------------------------- */ if ((*s_objet_argument_3).type == CHN) { if ((*((integer8 *) (*s_objet_argument_1).objet)) > (integer8) strlen((unsigned char *) (*s_objet_argument_3).objet)) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_3); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*s_objet_resultat).objet = extraction_chaine((unsigned char *) (*s_objet_argument_3).objet, (*((integer8 *) (*s_objet_argument_2).objet)), (*((integer8 *) (*s_objet_argument_1).objet)))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } /* -------------------------------------------------------------------------------- Traitement des listes -------------------------------------------------------------------------------- */ else if ((*s_objet_argument_3).type == LST) { if ((s_copie_argument_3 = copie_objet(s_etat_processus, s_objet_argument_3, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } liberation(s_etat_processus, s_objet_argument_3); s_objet_argument_3 = s_copie_argument_3; l_element_courant = (struct_liste_chainee *) (*s_objet_argument_3) .objet; i = 1; while(i < (unsigned long) (*((integer8 *) (*s_objet_argument_2).objet))) { if (l_element_courant == NULL) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_3); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } l_element_precedent = l_element_courant; l_element_courant = (*l_element_courant).suivant; liberation(s_etat_processus, (*l_element_precedent).donnee); free(l_element_precedent); i++; } (*s_objet_argument_3).objet = l_element_courant; while(i < (unsigned long) (*((integer8 *) (*s_objet_argument_1).objet))) { if (l_element_courant == NULL) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_3); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } l_element_courant = (*l_element_courant).suivant; i++; } l_element_precedent = l_element_courant; if (l_element_courant == NULL) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_3); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } l_element_courant = (*l_element_courant).suivant; (*l_element_precedent).suivant = NULL; while(l_element_courant != NULL) { l_element_precedent = l_element_courant; l_element_courant = (*l_element_courant).suivant; liberation(s_etat_processus, (*l_element_precedent).donnee); free(l_element_precedent); } s_objet_resultat = s_objet_argument_3; s_objet_argument_3 = NULL; } /* -------------------------------------------------------------------------------- Arguments invalides -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_3); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_3); if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { return; } return; } /* ================================================================================ Fonction 'sto+' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_sto_plus(struct_processus *s_etat_processus) { logical1 variable_partagee; struct_liste_chainee *registre_pile_last; struct_objet *s_objet_1; struct_objet *s_objet_2; struct_objet *s_objet_3; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n STO+ "); if ((*s_etat_processus).langue == 'F') { printf("(modification d'une variable par addition)\n\n"); } else { printf("(add to the content of a variable)\n\n"); } printf(" 2: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX); printf(" 1: %s\n\n", d_NOM); printf(" 2: %s\n", d_NOM); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } registre_pile_last = NULL; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } registre_pile_last = (*s_etat_processus).l_base_pile_last; (*s_etat_processus).l_base_pile_last = NULL; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_2) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } /* -------------------------------------------------------------------------------- Une valeur et un nom -------------------------------------------------------------------------------- */ variable_partagee = d_faux; if (((*s_objet_1).type == NOM) && (((*s_objet_2).type == INT) || ((*s_objet_2).type == REL) || ((*s_objet_2).type == CPL) || ((*s_objet_2).type == VIN) || ((*s_objet_2).type == VRL) || ((*s_objet_2).type == VCX) || ((*s_objet_2).type == MIN) || ((*s_objet_2).type == MRL) || ((*s_objet_2).type == MCX))) { if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_1).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_2) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_3) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_plus(s_etat_processus); s_objet_2 = NULL; /* s_objet_2 et s_objet_3 sont libérés par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } else if (((*s_objet_2).type == NOM) && (((*s_objet_1).type == INT) || ((*s_objet_1).type == REL) || ((*s_objet_1).type == CPL) || ((*s_objet_1).type == VIN) || ((*s_objet_1).type == VRL) || ((*s_objet_1).type == VCX) || ((*s_objet_1).type == MIN) || ((*s_objet_1).type == MRL) || ((*s_objet_1).type == MCX))) { if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_2).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_3) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_1) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_plus(s_etat_processus); s_objet_1 = NULL; /* s_objet_1 et s_objet_3 sont libérés par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } /* -------------------------------------------------------------------------------- Arguments incompatibles avec la fonction STO+ -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } /* ================================================================================ Fonction 'sto-' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_sto_moins(struct_processus *s_etat_processus) { logical1 variable_partagee; struct_liste_chainee *registre_pile_last; struct_objet *s_objet_1; struct_objet *s_objet_2; struct_objet *s_objet_3; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n STO- "); if ((*s_etat_processus).langue == 'F') { printf("(modification d'une variable par soustraction)\n\n"); } else { printf("(substract from the content of a variable)\n\n"); } printf(" 2: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX); printf(" 1: %s\n\n", d_NOM); printf(" 2: %s\n", d_NOM); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } registre_pile_last = NULL; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } registre_pile_last = (*s_etat_processus).l_base_pile_last; (*s_etat_processus).l_base_pile_last = NULL; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_2) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } variable_partagee = d_faux; /* -------------------------------------------------------------------------------- Une valeur et un nom -------------------------------------------------------------------------------- */ if (((*s_objet_1).type == NOM) && (((*s_objet_2).type == INT) || ((*s_objet_2).type == REL) || ((*s_objet_2).type == CPL) || ((*s_objet_2).type == VIN) || ((*s_objet_2).type == VRL) || ((*s_objet_2).type == VCX) || ((*s_objet_2).type == MIN) || ((*s_objet_2).type == MRL) || ((*s_objet_2).type == MCX))) { if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_1).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_2) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_3) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_moins(s_etat_processus); s_objet_2 = NULL; /* s_objet_2 et s_objet_3 sont libérés par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante) .objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } else if (((*s_objet_2).type == NOM) && (((*s_objet_1).type == INT) || ((*s_objet_1).type == REL) || ((*s_objet_1).type == CPL) || ((*s_objet_1).type == VIN) || ((*s_objet_1).type == VRL) || ((*s_objet_1).type == VCX) || ((*s_objet_1).type == MIN) || ((*s_objet_1).type == MRL) || ((*s_objet_1).type == MCX))) { if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_2).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_3) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_1) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_moins(s_etat_processus); s_objet_1 = NULL; /* s_objet_1 et s_objet_3 sont libérés par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante) .objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } /* -------------------------------------------------------------------------------- Arguments incompatibles avec la fonction STO- -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } /* ================================================================================ Fonction 'sto*' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_sto_fois(struct_processus *s_etat_processus) { logical1 variable_partagee; struct_liste_chainee *registre_pile_last; struct_objet *s_objet_1; struct_objet *s_objet_2; struct_objet *s_objet_3; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n STO* "); if ((*s_etat_processus).langue == 'F') { printf("(modification d'une variable par multiplication)\n\n"); } else { printf("(multiply the content of a variable)\n\n"); } printf(" 2: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX); printf(" 1: %s\n\n", d_NOM); printf(" 2: %s\n", d_NOM); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } registre_pile_last = NULL; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } registre_pile_last = (*s_etat_processus).l_base_pile_last; (*s_etat_processus).l_base_pile_last = NULL; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_2) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } /* -------------------------------------------------------------------------------- Une valeur et un nom -------------------------------------------------------------------------------- */ variable_partagee = d_faux; if (((*s_objet_1).type == NOM) && (((*s_objet_2).type == INT) || ((*s_objet_2).type == REL) || ((*s_objet_2).type == CPL) || ((*s_objet_2).type == VIN) || ((*s_objet_2).type == VRL) || ((*s_objet_2).type == VCX) || ((*s_objet_2).type == MIN) || ((*s_objet_2).type == MRL) || ((*s_objet_2).type == MCX))) { if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_1).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_2) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_3) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_multiplication(s_etat_processus); s_objet_2 = NULL; /* s_objet_2 et s_objet_3 sont libérés par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } else if (((*s_objet_2).type == NOM) && (((*s_objet_1).type == INT) || ((*s_objet_1).type == REL) || ((*s_objet_1).type == CPL) || ((*s_objet_1).type == VIN) || ((*s_objet_1).type == VRL) || ((*s_objet_1).type == VCX) || ((*s_objet_1).type == MIN) || ((*s_objet_1).type == MRL) || ((*s_objet_1).type == MCX))) { if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_2).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_3) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_1) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_multiplication(s_etat_processus); s_objet_1 = NULL; /* s_objet_1 et s_objet_3 sont libérés par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } /* -------------------------------------------------------------------------------- Arguments incompatibles avec la fonction STO* -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } /* ================================================================================ Fonction 'sto/' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_sto_division(struct_processus *s_etat_processus) { logical1 variable_partagee; struct_liste_chainee *registre_pile_last; struct_objet *s_objet_1; struct_objet *s_objet_2; struct_objet *s_objet_3; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n STO/ "); if ((*s_etat_processus).langue == 'F') { printf("(modification d'une variable par division)\n\n"); } else { printf("(divide the content of a variable)\n\n"); } printf(" 2: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX); printf(" 1: %s\n\n", d_NOM); printf(" 2: %s\n", d_NOM); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } registre_pile_last = NULL; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } registre_pile_last = (*s_etat_processus).l_base_pile_last; (*s_etat_processus).l_base_pile_last = NULL; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_2) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } /* -------------------------------------------------------------------------------- Une valeur et un nom -------------------------------------------------------------------------------- */ variable_partagee = d_faux; if (((*s_objet_1).type == NOM) && (((*s_objet_2).type == INT) || ((*s_objet_2).type == REL) || ((*s_objet_2).type == CPL) || ((*s_objet_2).type == VIN) || ((*s_objet_2).type == VRL) || ((*s_objet_2).type == VCX) || ((*s_objet_2).type == MIN) || ((*s_objet_2).type == MRL) || ((*s_objet_2).type == MCX))) { if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_1).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_2) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_3) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_division(s_etat_processus); s_objet_2 = NULL; /* s_objet_2 et s_objet_3 sont libérés par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } else if (((*s_objet_2).type == NOM) && (((*s_objet_1).type == INT) || ((*s_objet_1).type == REL) || ((*s_objet_1).type == CPL) || ((*s_objet_1).type == VIN) || ((*s_objet_1).type == VRL) || ((*s_objet_1).type == VCX) || ((*s_objet_1).type == MIN) || ((*s_objet_1).type == MRL) || ((*s_objet_1).type == MCX))) { if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_2).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_3) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_1) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_division(s_etat_processus); s_objet_1 = NULL; /* s_objet_1 et s_objet_3 sont libérés par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } /* -------------------------------------------------------------------------------- Arguments incompatibles avec la fonction STO/ -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } /* ================================================================================ Fonction 'sneg' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_sneg(struct_processus *s_etat_processus) { logical1 variable_partagee; struct_liste_chainee *registre_pile_last; struct_objet *s_objet_1; struct_objet *s_objet_2; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n SNEG "); if ((*s_etat_processus).langue == 'F') { printf("(modification d'une variable par opposition)\n\n"); } else { printf("(store the opposite of the content in a variable)\n\n"); } printf(" 1: %s\n", d_NOM); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } registre_pile_last = NULL; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } registre_pile_last = (*s_etat_processus).l_base_pile_last; (*s_etat_processus).l_base_pile_last = NULL; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } /* -------------------------------------------------------------------------------- Un nom -------------------------------------------------------------------------------- */ if ((*s_objet_1).type == NOM) { variable_partagee = d_faux; if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_1).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_2 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_2 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_2) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_neg(s_etat_processus); /* s_objet_2 est libéré par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } /* -------------------------------------------------------------------------------- Arguments incompatibles avec la fonction SNEG -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } liberation(s_etat_processus, s_objet_1); return; } /* ================================================================================ Fonction 'sinv' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_sinv(struct_processus *s_etat_processus) { logical1 variable_partagee; struct_liste_chainee *registre_pile_last; struct_objet *s_objet_1; struct_objet *s_objet_2; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n SINV "); if ((*s_etat_processus).langue == 'F') { printf("(modification d'une variable par inversion)\n\n"); } else { printf("(store the inverse of the content in a variable)\n\n"); } printf(" 1: %s\n", d_NOM); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } registre_pile_last = NULL; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } registre_pile_last = (*s_etat_processus).l_base_pile_last; (*s_etat_processus).l_base_pile_last = NULL; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } /* -------------------------------------------------------------------------------- Un nom -------------------------------------------------------------------------------- */ if ((*s_objet_1).type == NOM) { variable_partagee = d_faux; if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_1).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_2 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_2 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_2) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_inv(s_etat_processus); /* s_objet_2 est libéré par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } /* -------------------------------------------------------------------------------- Arguments incompatibles avec la fonction SINV -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } liberation(s_etat_processus, s_objet_1); return; } /* ================================================================================ Fonction 'sconj' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_sconj(struct_processus *s_etat_processus) { logical1 variable_partagee; struct_liste_chainee *registre_pile_last; struct_objet *s_objet_1; struct_objet *s_objet_2; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n SCONJ "); if ((*s_etat_processus).langue == 'F') { printf("(modification d'une variable par conjugaison)\n\n"); } else { printf("(store the conjugate of the content in a variable)\n\n"); } printf(" 1: %s\n", d_NOM); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } registre_pile_last = NULL; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } registre_pile_last = (*s_etat_processus).l_base_pile_last; (*s_etat_processus).l_base_pile_last = NULL; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } /* -------------------------------------------------------------------------------- Un nom -------------------------------------------------------------------------------- */ if ((*s_objet_1).type == NOM) { variable_partagee = d_faux; if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_1).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if ((*(*s_etat_processus).pointeur_variable_courante) .variable_verrouillee == d_vrai) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee; return; } if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } variable_partagee = d_vrai; if ((s_objet_2 = copie_objet(s_etat_processus, (*(*s_etat_processus) .s_liste_variables_partagees).table [(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet, 'P')) == NULL) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } else { if ((s_objet_2 = copie_objet(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_2) == d_erreur) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } return; } instruction_conj(s_etat_processus); /* s_objet_2 est libéré par cet appel... */ if (((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).erreur_execution != d_ex) || ((*s_etat_processus).exception != d_ep)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } return; } if (variable_partagee == d_vrai) { liberation(s_etat_processus, (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), (struct_objet **) &((*(*s_etat_processus) .s_liste_variables_partagees).table[(*(*s_etat_processus) .s_liste_variables_partagees).position_variable].objet)) == d_erreur) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } else { liberation(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).objet); if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &((*(*s_etat_processus).pointeur_variable_courante).objet)) == d_erreur) { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } } } /* -------------------------------------------------------------------------------- Arguments incompatibles avec la fonction SCONJ -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_1); if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } (*s_etat_processus).l_base_pile_last = registre_pile_last; } liberation(s_etat_processus, s_objet_1); return; } // vim: ts=4