Annotation of rpl/src/evaluation.c, revision 1.1
1.1 ! bertrand 1: /*
! 2: ================================================================================
! 3: RPL/2 (R) version 4.0.9
! 4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
! 5:
! 6: This file is part of RPL/2.
! 7:
! 8: RPL/2 is free software; you can redistribute it and/or modify it
! 9: under the terms of the CeCILL V2 License as published by the french
! 10: CEA, CNRS and INRIA.
! 11:
! 12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
! 13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
! 14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
! 15: for more details.
! 16:
! 17: You should have received a copy of the CeCILL License
! 18: along with RPL/2. If not, write to info@cecill.info.
! 19: ================================================================================
! 20: */
! 21:
! 22:
! 23: #include "rpl.conv.h"
! 24:
! 25: #define TEST(instruction) (fonction == instruction)
! 26: #define vers_niveau_inferieur instruction_vers_niveau_inferieur
! 27: #define vers_niveau_superieur instruction_vers_niveau_superieur
! 28:
! 29:
! 30: /*
! 31: ================================================================================
! 32: Evaluation d'une expression
! 33: ================================================================================
! 34: Entrées :
! 35: structure processus,
! 36: objet à évaluer (non libéré au retour de la routine)
! 37: et type ('E' pour 'EVAL', 'I' pour interactif et 'N' pour '->NUM')
! 38: --------------------------------------------------------------------------------
! 39: Sorties : objet évalué au niveau 1 de la pile
! 40: --------------------------------------------------------------------------------
! 41: Effets de bord : néant
! 42: ================================================================================
! 43: */
! 44:
! 45: logical1
! 46: evaluation(struct_processus *s_etat_processus, struct_objet *s_objet,
! 47: unsigned char type_evaluation)
! 48: {
! 49: integer8 i;
! 50: integer8 j;
! 51:
! 52: logical1 drapeau_then;
! 53: logical1 erreur_evaluation;
! 54: logical1 presence_egalite;
! 55: logical1 presence_fonction;
! 56: logical1 presence_variable;
! 57: logical1 presence_variable_partagee;
! 58:
! 59: struct_liste_chainee *l_element_courant;
! 60: struct_liste_chainee *l_element_egalite;
! 61: struct_liste_chainee *l_element_fonction;
! 62: struct_liste_chainee *l_liste1;
! 63: struct_liste_chainee *l_liste2;
! 64: struct_liste_chainee *l_registre_atome;
! 65: struct_liste_chainee *l_registre_pile_operationnelle;
! 66: struct_liste_chainee *l_sous_element_courant;
! 67: struct_liste_chainee *registre_expression_courante;
! 68:
! 69: struct_liste_pile_systeme *pile_systeme_originelle;
! 70:
! 71: struct_objet *s_objet_elementaire;
! 72: struct_objet *s_objet_evalue;
! 73: struct_objet *s_objet_indice_i;
! 74: struct_objet *s_objet_indice_j;
! 75: struct_objet *s_objet_tampon;
! 76: struct_objet *s_sous_objet;
! 77: struct_objet *s_copie_variable_partagee;
! 78:
! 79: struct_variable *registre_variables;
! 80:
! 81: unsigned char autorisation_empilement_programme;
! 82: unsigned char *instruction_courante;
! 83: unsigned char *message;
! 84: unsigned char registre_evaluation_expression_compilee;
! 85: unsigned char registre_instruction_valide;
! 86: unsigned char registre_mode_execution_programme;
! 87: unsigned char registre_retour_definition;
! 88: unsigned char registre_test;
! 89: unsigned char registre_test_2;
! 90: unsigned char registre_type_evaluation;
! 91:
! 92: unsigned int registre_erreur_execution;
! 93: unsigned int registre_erreur_systeme;
! 94: unsigned int registre_exception;
! 95:
! 96: unsigned long k;
! 97: unsigned long l;
! 98: unsigned long n;
! 99: unsigned long m;
! 100: unsigned long niveau_initial;
! 101: unsigned long nombre_termes;
! 102: unsigned long registre_hauteur_pile_operationnelle;
! 103: unsigned long registre_niveau_courant;
! 104: unsigned long registre_position_courante;
! 105:
! 106: void (*fonction)();
! 107:
! 108: registre_mode_execution_programme =
! 109: (*s_etat_processus).mode_execution_programme;
! 110: (*s_etat_processus).mode_execution_programme = 'I';
! 111: instruction_courante = (*s_etat_processus).instruction_courante;
! 112: (*s_etat_processus).erreur_execution = d_ex;
! 113:
! 114: erreur_evaluation = d_absence_erreur;
! 115: s_copie_variable_partagee = NULL;
! 116:
! 117: if ((*s_objet).type == NOM)
! 118: {
! 119: if ((s_objet_tampon = copie_objet(s_etat_processus, s_objet, 'P'))
! 120: == NULL)
! 121: {
! 122: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 123: (*s_etat_processus).instruction_courante = instruction_courante;
! 124: return(d_erreur);
! 125: }
! 126:
! 127: registre_instruction_valide = (*s_etat_processus).instruction_valide;
! 128: registre_test = (*s_etat_processus).test_instruction;
! 129: (*s_etat_processus).test_instruction = 'Y';
! 130: (*s_etat_processus).instruction_courante = (*((struct_nom *)
! 131: (*s_objet_tampon).objet)).nom;
! 132:
! 133: analyse(s_etat_processus, NULL);
! 134:
! 135: (*s_etat_processus).test_instruction = 'N';
! 136:
! 137: if ((*s_etat_processus).constante_symbolique == 'N')
! 138: {
! 139: presence_fonction = d_faux;
! 140: presence_variable_partagee = d_faux;
! 141:
! 142: if (recherche_variable(s_etat_processus, (*((struct_nom *)
! 143: (*s_objet_tampon).objet)).nom) == d_faux)
! 144: {
! 145: (*s_etat_processus).erreur_systeme = d_es;
! 146: presence_variable = d_faux;
! 147: }
! 148: else
! 149: {
! 150: if ((*s_etat_processus).traitement_symbolique == 'N')
! 151: {
! 152: if ((*s_etat_processus).s_liste_variables
! 153: [(*s_etat_processus).position_variable_courante]
! 154: .objet == NULL)
! 155: {
! 156: // Variable partagée
! 157:
! 158: if (pthread_mutex_lock(&((*(*s_etat_processus)
! 159: .s_liste_variables_partagees).mutex)) != 0)
! 160: {
! 161: (*s_etat_processus).erreur_systeme =
! 162: d_es_processus;
! 163: return(d_erreur);
! 164: }
! 165:
! 166: presence_variable_partagee = d_faux;
! 167:
! 168: if (recherche_variable_partagee(s_etat_processus,
! 169: ((*s_etat_processus).s_liste_variables
! 170: [(*s_etat_processus)
! 171: .position_variable_courante]).nom,
! 172: ((*s_etat_processus).s_liste_variables
! 173: [(*s_etat_processus)
! 174: .position_variable_courante])
! 175: .variable_partagee, 'E') == d_vrai)
! 176: {
! 177: presence_variable = d_vrai;
! 178: presence_variable_partagee = d_vrai;
! 179:
! 180: if ((*((*(*s_etat_processus)
! 181: .s_liste_variables_partagees).table
! 182: [(*(*s_etat_processus)
! 183: .s_liste_variables_partagees)
! 184: .position_variable].objet)).type
! 185: == ADR)
! 186: {
! 187: presence_fonction = d_vrai;
! 188: }
! 189:
! 190: if ((s_copie_variable_partagee =
! 191: copie_objet(s_etat_processus,
! 192: (*(*s_etat_processus)
! 193: .s_liste_variables_partagees)
! 194: .table[(*(*s_etat_processus)
! 195: .s_liste_variables_partagees)
! 196: .position_variable].objet, 'P')) == NULL)
! 197: {
! 198: (*s_etat_processus).erreur_systeme =
! 199: d_es_allocation_memoire;
! 200:
! 201: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 202: .s_liste_variables_partagees).mutex))
! 203: != 0)
! 204: {
! 205: (*s_etat_processus).erreur_systeme =
! 206: d_es_processus;
! 207: return(d_erreur);
! 208: }
! 209:
! 210: return(d_erreur);
! 211: }
! 212:
! 213: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 214: .s_liste_variables_partagees).mutex))
! 215: != 0)
! 216: {
! 217: (*s_etat_processus).erreur_systeme =
! 218: d_es_processus;
! 219: return(d_erreur);
! 220: }
! 221: }
! 222: else
! 223: {
! 224: (*s_etat_processus).erreur_systeme = d_es;
! 225: presence_variable = d_faux;
! 226: presence_variable_partagee = d_faux;
! 227:
! 228: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 229: .s_liste_variables_partagees).mutex)) != 0)
! 230: {
! 231: (*s_etat_processus).erreur_systeme =
! 232: d_es_processus;
! 233: return(d_erreur);
! 234: }
! 235: }
! 236: }
! 237: else
! 238: {
! 239: // Variable privée
! 240:
! 241: presence_variable = d_vrai;
! 242:
! 243: if ((*((*s_etat_processus).s_liste_variables
! 244: [(*s_etat_processus).position_variable_courante]
! 245: .objet)).type == ADR)
! 246: {
! 247: presence_fonction = d_vrai;
! 248: }
! 249: }
! 250: }
! 251: else
! 252: {
! 253: presence_variable = d_faux;
! 254: }
! 255: }
! 256:
! 257: liberation(s_etat_processus, s_objet_tampon);
! 258:
! 259: if (presence_fonction == d_vrai)
! 260: {
! 261: autorisation_empilement_programme = (*s_etat_processus)
! 262: .autorisation_empilement_programme;
! 263: registre_position_courante = (*s_etat_processus)
! 264: .position_courante;
! 265:
! 266: empilement_pile_systeme(s_etat_processus);
! 267:
! 268: if ((*s_etat_processus).erreur_systeme != d_es)
! 269: {
! 270: if (presence_variable_partagee == d_vrai)
! 271: {
! 272: liberation(s_etat_processus, s_copie_variable_partagee);
! 273: }
! 274:
! 275: (*s_etat_processus).instruction_courante =
! 276: instruction_courante;
! 277: return(d_erreur);
! 278: }
! 279:
! 280: (*(*s_etat_processus).l_base_pile_systeme)
! 281: .retour_definition = 'Y';
! 282: (*(*s_etat_processus).l_base_pile_systeme)
! 283: .origine_routine_evaluation = 'Y';
! 284:
! 285: (*s_etat_processus).mode_execution_programme = 'Y';
! 286: (*s_etat_processus).autorisation_empilement_programme = 'N';
! 287:
! 288: (*(*s_etat_processus).l_base_pile_systeme)
! 289: .niveau_courant = (*s_etat_processus)
! 290: .niveau_courant;
! 291:
! 292: if (presence_variable_partagee == d_faux)
! 293: {
! 294: (*s_etat_processus).position_courante =
! 295: (*((unsigned long *)
! 296: ((*((*s_etat_processus).s_liste_variables
! 297: [(*s_etat_processus)
! 298: .position_variable_courante]
! 299: .objet)).objet)));
! 300: }
! 301: else
! 302: {
! 303: (*s_etat_processus).position_courante =
! 304: (*((unsigned long *) (*s_copie_variable_partagee)
! 305: .objet));
! 306: liberation(s_etat_processus, s_copie_variable_partagee);
! 307:
! 308: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 309: .s_liste_variables_partagees).mutex)) != 0)
! 310: {
! 311: (*s_etat_processus).erreur_systeme =
! 312: d_es_processus;
! 313: return(d_erreur);
! 314: }
! 315: }
! 316:
! 317: if ((*s_etat_processus).profilage == d_vrai)
! 318: {
! 319: profilage(s_etat_processus,
! 320: (*s_etat_processus).s_liste_variables
! 321: [(*s_etat_processus).position_variable_courante]
! 322: .nom);
! 323:
! 324: if ((*s_etat_processus).erreur_systeme != d_es)
! 325: {
! 326: return(d_erreur);
! 327: }
! 328: }
! 329:
! 330: if (sequenceur(s_etat_processus) == d_erreur)
! 331: {
! 332: (*s_etat_processus).mode_execution_programme =
! 333: registre_mode_execution_programme;
! 334: (*s_etat_processus).instruction_courante =
! 335: instruction_courante;
! 336: return(d_erreur);
! 337: }
! 338:
! 339: (*s_etat_processus).instruction_courante =
! 340: instruction_courante;
! 341: (*s_etat_processus).mode_execution_programme = 'N';
! 342:
! 343: depilement_pile_systeme(s_etat_processus);
! 344:
! 345: if ((*s_etat_processus).erreur_systeme != d_es)
! 346: {
! 347: return(d_erreur);
! 348: }
! 349:
! 350: (*s_etat_processus).retour_routine_evaluation = 'N';
! 351: (*s_etat_processus).position_courante =
! 352: registre_position_courante;
! 353: (*s_etat_processus).autorisation_empilement_programme =
! 354: autorisation_empilement_programme;
! 355: }
! 356: else if (presence_variable == d_vrai)
! 357: {
! 358: registre_evaluation_expression_compilee =
! 359: (*s_etat_processus).evaluation_expression_compilee;
! 360:
! 361: if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 362: .position_variable_courante].origine == 'E') &&
! 363: ((*s_etat_processus).s_liste_variables
! 364: [(*s_etat_processus).position_variable_courante].niveau
! 365: == 0))
! 366: {
! 367: (*s_etat_processus).evaluation_expression_compilee = 'Y';
! 368: }
! 369: else
! 370: {
! 371: (*s_etat_processus).evaluation_expression_compilee = 'N';
! 372: }
! 373:
! 374: if ((*s_etat_processus).profilage == d_vrai)
! 375: {
! 376: profilage(s_etat_processus,
! 377: (*s_etat_processus).s_liste_variables
! 378: [(*s_etat_processus).position_variable_courante]
! 379: .nom);
! 380:
! 381: if ((*s_etat_processus).erreur_systeme != d_es)
! 382: {
! 383: if (presence_variable_partagee == d_vrai)
! 384: {
! 385: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 386: .s_liste_variables_partagees).mutex)) != 0)
! 387: {
! 388: (*s_etat_processus).erreur_systeme =
! 389: d_es_processus;
! 390: return(d_erreur);
! 391: }
! 392: }
! 393:
! 394: return(d_erreur);
! 395: }
! 396: }
! 397:
! 398: if (presence_variable_partagee == d_faux)
! 399: {
! 400: if (evaluation(s_etat_processus, (*s_etat_processus)
! 401: .s_liste_variables[(*s_etat_processus)
! 402: .position_variable_courante].objet,
! 403: type_evaluation) == d_erreur)
! 404: {
! 405: if ((*s_etat_processus).profilage == d_vrai)
! 406: {
! 407: profilage(s_etat_processus, NULL);
! 408: }
! 409:
! 410: (*s_etat_processus).evaluation_expression_compilee =
! 411: registre_evaluation_expression_compilee;
! 412:
! 413: (*s_etat_processus).mode_execution_programme =
! 414: registre_mode_execution_programme;
! 415: (*s_etat_processus).instruction_courante =
! 416: instruction_courante;
! 417: return(d_erreur);
! 418: }
! 419: }
! 420: else
! 421: {
! 422: if (evaluation(s_etat_processus, s_copie_variable_partagee,
! 423: type_evaluation) == d_erreur)
! 424: {
! 425: liberation(s_etat_processus, s_copie_variable_partagee);
! 426:
! 427: if ((*s_etat_processus).profilage == d_vrai)
! 428: {
! 429: profilage(s_etat_processus, NULL);
! 430: }
! 431:
! 432: (*s_etat_processus).evaluation_expression_compilee =
! 433: registre_evaluation_expression_compilee;
! 434:
! 435: (*s_etat_processus).mode_execution_programme =
! 436: registre_mode_execution_programme;
! 437: (*s_etat_processus).instruction_courante =
! 438: instruction_courante;
! 439: return(d_erreur);
! 440: }
! 441:
! 442: liberation(s_etat_processus, s_copie_variable_partagee);
! 443: }
! 444:
! 445: if ((*s_etat_processus).profilage == d_vrai)
! 446: {
! 447: profilage(s_etat_processus, NULL);
! 448: }
! 449:
! 450: (*s_etat_processus).evaluation_expression_compilee =
! 451: registre_evaluation_expression_compilee;
! 452: }
! 453: else
! 454: {
! 455: if ((s_objet_tampon = copie_objet(s_etat_processus,
! 456: s_objet, 'P')) == NULL)
! 457: {
! 458: (*s_etat_processus).erreur_systeme =
! 459: d_es_allocation_memoire;
! 460: (*s_etat_processus).instruction_courante =
! 461: instruction_courante;
! 462: return(d_erreur);
! 463: }
! 464:
! 465: (*((struct_nom *) (*s_objet_tampon).objet)).symbole = d_vrai;
! 466:
! 467: if (empilement(s_etat_processus, &((*s_etat_processus)
! 468: .l_base_pile), s_objet_tampon) == d_erreur)
! 469: {
! 470: (*s_etat_processus).instruction_courante =
! 471: instruction_courante;
! 472: return(d_erreur);
! 473: }
! 474:
! 475: if ((*s_etat_processus).erreur_execution ==
! 476: d_ex_variable_non_definie)
! 477: {
! 478: (*s_etat_processus).erreur_execution = d_ex;
! 479: }
! 480: }
! 481: }
! 482: else
! 483: {
! 484: registre_type_evaluation = (test_cfsf(s_etat_processus, 35)
! 485: == d_vrai) ? 'E' : 'N';
! 486:
! 487: if (type_evaluation == 'N')
! 488: {
! 489: cf(s_etat_processus, 35);
! 490: }
! 491: else
! 492: {
! 493: sf(s_etat_processus, 35);
! 494: }
! 495:
! 496: analyse(s_etat_processus, NULL);
! 497: liberation(s_etat_processus, s_objet_tampon);
! 498:
! 499: if (registre_type_evaluation == 'E')
! 500: {
! 501: sf(s_etat_processus, 35);
! 502: }
! 503: else
! 504: {
! 505: cf(s_etat_processus, 35);
! 506: }
! 507:
! 508: if (((*s_etat_processus).erreur_systeme != d_es) ||
! 509: ((*s_etat_processus).erreur_execution != d_ex) ||
! 510: ((*s_etat_processus).exception != d_ep))
! 511: {
! 512: (*s_etat_processus).mode_execution_programme =
! 513: registre_mode_execution_programme;
! 514: (*s_etat_processus).instruction_courante = instruction_courante;
! 515: return(d_erreur);
! 516: }
! 517: }
! 518:
! 519: (*s_etat_processus).instruction_courante = instruction_courante;
! 520: (*s_etat_processus).test_instruction = registre_test;
! 521: (*s_etat_processus).instruction_valide = registre_instruction_valide;
! 522: }
! 523: else if (((*s_objet).type == RPN) || ((*s_objet).type == ALG))
! 524: {
! 525: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
! 526: l_element_egalite = NULL;
! 527: presence_egalite = d_faux;
! 528: nombre_termes = 0;
! 529:
! 530: while(l_element_courant != NULL)
! 531: {
! 532: if ((*(*l_element_courant).donnee).type == FCT)
! 533: {
! 534: if (strcmp((*((struct_fonction *) (*(*l_element_courant)
! 535: .donnee).objet)).nom_fonction, "=") == 0)
! 536: {
! 537: presence_egalite = d_vrai;
! 538: l_element_egalite = l_element_courant;
! 539: }
! 540: }
! 541:
! 542: l_element_courant = (*l_element_courant).suivant;
! 543: nombre_termes++;
! 544: }
! 545:
! 546: if (nombre_termes <= 4)
! 547: {
! 548: presence_egalite = d_faux;
! 549: }
! 550:
! 551: if (presence_egalite == d_vrai)
! 552: {
! 553: // S'il y a un signe '=', on modifie l'expression à évaluer en ôtant
! 554: // le signe '=' et en le remplaçant d'une part par SWAP DROP
! 555: // et d'autre part par DROP. On évalue la première puis la
! 556: // seconde normalement avant de reconstituer le tout à la fin
! 557: // de la routine.
! 558:
! 559: l_registre_pile_operationnelle = NULL;
! 560: registre_hauteur_pile_operationnelle = (*s_etat_processus)
! 561: .hauteur_pile_operationnelle;
! 562: l_element_courant = (*s_etat_processus).l_base_pile;
! 563:
! 564: while(l_element_courant != NULL)
! 565: {
! 566: s_sous_objet = copie_objet(s_etat_processus,
! 567: (*l_element_courant).donnee, 'O');
! 568:
! 569: if (s_sous_objet == NULL)
! 570: {
! 571: (*s_etat_processus).instruction_courante =
! 572: instruction_courante;
! 573: (*s_etat_processus).erreur_systeme =
! 574: d_es_allocation_memoire;
! 575: return(d_erreur);
! 576: }
! 577:
! 578: if (empilement(s_etat_processus,
! 579: &l_registre_pile_operationnelle, s_sous_objet)
! 580: == d_erreur)
! 581: {
! 582: (*s_etat_processus).instruction_courante =
! 583: instruction_courante;
! 584: (*s_etat_processus).erreur_systeme =
! 585: d_es_allocation_memoire;
! 586: return(d_erreur);
! 587: }
! 588:
! 589: l_element_courant = (*l_element_courant).suivant;
! 590: }
! 591:
! 592: free((*((struct_fonction *) (*(*l_element_egalite).donnee)
! 593: .objet)).nom_fonction);
! 594:
! 595: if (((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
! 596: .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
! 597: {
! 598: (*s_etat_processus).instruction_courante = instruction_courante;
! 599: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 600: return(d_erreur);
! 601: }
! 602:
! 603: (*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
! 604: .fonction = instruction_drop;
! 605: strcpy((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
! 606: .nom_fonction, "DROP");
! 607:
! 608: if (evaluation(s_etat_processus, s_objet, type_evaluation)
! 609: == d_erreur)
! 610: {
! 611: (*s_etat_processus).instruction_courante = instruction_courante;
! 612: return(d_erreur);
! 613: }
! 614:
! 615: // Récupération de l'objet au niveau 1 résultat de l'évaluation
! 616: // du premier membre de l'équation puis destruction de la pile.
! 617:
! 618: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 619: &s_objet_evalue) == d_erreur)
! 620: {
! 621: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 622: (*s_etat_processus).instruction_courante = instruction_courante;
! 623: return(d_erreur);
! 624: }
! 625:
! 626: instruction_clear(s_etat_processus);
! 627:
! 628: // Régénération de la pile initiale
! 629:
! 630: while(depilement(s_etat_processus, &l_registre_pile_operationnelle,
! 631: &s_sous_objet) != d_erreur)
! 632: {
! 633: if (empilement(s_etat_processus, &((*s_etat_processus)
! 634: .l_base_pile), s_sous_objet) == d_erreur)
! 635: {
! 636: (*s_etat_processus).instruction_courante =
! 637: instruction_courante;
! 638: return(d_erreur);
! 639: }
! 640: }
! 641:
! 642: (*s_etat_processus).hauteur_pile_operationnelle =
! 643: registre_hauteur_pile_operationnelle;
! 644: (*s_etat_processus).erreur_execution = d_ex;
! 645:
! 646: (*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
! 647: .fonction = instruction_swap;
! 648: strcpy((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
! 649: .nom_fonction, "SWAP");
! 650: l_element_courant = (*l_element_egalite).suivant;
! 651:
! 652: if (((*l_element_egalite).suivant =
! 653: malloc(sizeof(struct_liste_chainee))) == NULL)
! 654: {
! 655: liberation(s_etat_processus, s_objet_evalue);
! 656:
! 657: (*s_etat_processus).instruction_courante = instruction_courante;
! 658: return(d_erreur);
! 659: }
! 660:
! 661: l_element_egalite = (*l_element_egalite).suivant;
! 662: (*l_element_egalite).suivant = l_element_courant;
! 663:
! 664: if (((*l_element_egalite).donnee = allocation(s_etat_processus,
! 665: FCT)) == NULL)
! 666: {
! 667: liberation(s_etat_processus, s_objet_evalue);
! 668:
! 669: (*s_etat_processus).instruction_courante = instruction_courante;
! 670: return(d_erreur);
! 671: }
! 672:
! 673: (*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
! 674: .nombre_arguments = 0;
! 675: (*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
! 676: .fonction = instruction_drop;
! 677:
! 678: if (((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
! 679: .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
! 680: {
! 681: liberation(s_etat_processus, s_objet_evalue);
! 682:
! 683: (*s_etat_processus).instruction_courante = instruction_courante;
! 684: return(d_erreur);
! 685: }
! 686:
! 687: strcpy((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
! 688: .nom_fonction, "DROP");
! 689: }
! 690:
! 691: /*
! 692: * Exécution de la séquence d'instructions
! 693: */
! 694:
! 695: registre_retour_definition = (*(*s_etat_processus).l_base_pile_systeme)
! 696: .retour_definition;
! 697: (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N';
! 698:
! 699: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
! 700: autorisation_empilement_programme = (*s_etat_processus)
! 701: .autorisation_empilement_programme;
! 702: (*s_etat_processus).autorisation_empilement_programme = 'N';
! 703:
! 704: niveau_initial = (*s_etat_processus).niveau_courant;
! 705: pile_systeme_originelle = (*s_etat_processus).l_base_pile_systeme;
! 706:
! 707: while((l_element_courant != NULL) &&
! 708: ((*s_etat_processus).var_volatile_requete_arret == 0)
! 709: && (erreur_evaluation == d_absence_erreur) &&
! 710: (*s_etat_processus).requete_arret == 'N')
! 711: {
! 712: (*s_etat_processus).objet_courant = (*l_element_courant).donnee;
! 713:
! 714: if ((*(*l_element_courant).donnee).type == FCT)
! 715: {
! 716: /*
! 717: * Tester la cohérence avec une variable pour récupérer les
! 718: * données selon les indices passés en argument (tableaux,
! 719: * listes...).
! 720: */
! 721:
! 722: if (recherche_variable(s_etat_processus,
! 723: (*((struct_fonction *)
! 724: (*(*l_element_courant).donnee).objet)).nom_fonction)
! 725: == d_faux)
! 726: {
! 727: (*s_etat_processus).erreur_systeme = d_es;
! 728: (*s_etat_processus).instruction_courante =
! 729: (*((struct_fonction *) (*(*l_element_courant)
! 730: .donnee).objet)).nom_fonction;
! 731:
! 732: registre_expression_courante =
! 733: (*s_etat_processus).expression_courante;
! 734: (*s_etat_processus).expression_courante = l_element_courant;
! 735:
! 736: if (((*s_etat_processus).erreur_execution == d_ex) &&
! 737: ((*s_etat_processus).erreur_systeme == d_es) &&
! 738: ((*s_etat_processus).exception == d_ep))
! 739: {
! 740: analyse(s_etat_processus, (*((struct_fonction *)
! 741: (*(*l_element_courant).donnee).objet))
! 742: .fonction);
! 743:
! 744: if (type_evaluation == 'I')
! 745: {
! 746: (*s_etat_processus).derniere_erreur_evaluation =
! 747: (*s_etat_processus).erreur_execution;
! 748: }
! 749: }
! 750:
! 751: if ((*s_etat_processus).erreur_systeme != d_es)
! 752: {
! 753: if (presence_egalite == d_vrai)
! 754: {
! 755: liberation(s_etat_processus, s_objet_evalue);
! 756: }
! 757:
! 758: if ((*s_etat_processus).var_volatile_processus_pere
! 759: == 0)
! 760: {
! 761: kill((*s_etat_processus)
! 762: .pid_processus_pere, SIGALRM);
! 763: }
! 764: else
! 765: {
! 766: (*s_etat_processus).var_volatile_alarme = -1;
! 767: }
! 768:
! 769: (*s_etat_processus).instruction_courante =
! 770: instruction_courante;
! 771: return(d_erreur);
! 772: }
! 773: else if (((*s_etat_processus).erreur_execution != d_ex) ||
! 774: ((*s_etat_processus).exception != d_ep))
! 775: {
! 776: if ((*s_etat_processus).arret_si_exception == d_faux)
! 777: {
! 778: /*
! 779: * Reprise sur erreur
! 780: */
! 781:
! 782: if ((message = messages(s_etat_processus)) == NULL)
! 783: {
! 784: if (presence_egalite == d_vrai)
! 785: {
! 786: liberation(s_etat_processus,
! 787: s_objet_evalue);
! 788: }
! 789:
! 790: (*s_etat_processus).instruction_courante =
! 791: instruction_courante;
! 792: return(d_erreur);
! 793: }
! 794:
! 795: free(message);
! 796:
! 797: while((*(*s_etat_processus).l_base_pile_systeme)
! 798: .clause != 'R')
! 799: {
! 800: l_registre_atome = l_element_courant;
! 801: l_element_courant =
! 802: (*l_element_courant).suivant;
! 803:
! 804: if (l_element_courant == NULL)
! 805: {
! 806: /*
! 807: * La fin de l'expression est atteinte,
! 808: * le sequenceur reprend la main.
! 809: */
! 810:
! 811: if (presence_egalite == d_vrai)
! 812: {
! 813: liberation(s_etat_processus,
! 814: s_objet_evalue);
! 815: }
! 816:
! 817: (*s_etat_processus)
! 818: .mode_execution_programme =
! 819: registre_mode_execution_programme;
! 820: return(d_absence_erreur);
! 821: }
! 822:
! 823: if ((*(*l_element_courant).donnee).type == FCT)
! 824: {
! 825: (*s_etat_processus).instruction_courante =
! 826: (*((struct_fonction *)
! 827: (*(*l_element_courant).donnee)
! 828: .objet)).nom_fonction;
! 829:
! 830: if (recherche_variable(s_etat_processus,
! 831: (*s_etat_processus)
! 832: .instruction_courante) == d_faux)
! 833: {
! 834: (*s_etat_processus).erreur_systeme
! 835: = d_es;
! 836: fonction = (*((struct_fonction *)
! 837: (*(*l_element_courant).donnee)
! 838: .objet)).fonction;
! 839:
! 840: /*
! 841: * Traitement de la pile système par les
! 842: * différentes instructions.
! 843: */
! 844:
! 845: if (TEST(instruction_if) ||
! 846: TEST(instruction_iferr) ||
! 847: TEST(instruction_do) ||
! 848: TEST(instruction_while) ||
! 849: TEST(instruction_for) ||
! 850: TEST(instruction_start) ||
! 851: TEST(instruction_select) ||
! 852: TEST(instruction_case) ||
! 853: TEST(vers_niveau_superieur))
! 854: {
! 855: if (TEST(vers_niveau_superieur))
! 856: {
! 857: registre_exception =
! 858: (*s_etat_processus)
! 859: .exception;
! 860: registre_erreur_execution =
! 861: (*s_etat_processus)
! 862: .erreur_execution;
! 863:
! 864: analyse(s_etat_processus,
! 865: vers_niveau_superieur);
! 866:
! 867: (*s_etat_processus).exception
! 868: = registre_exception;
! 869: (*s_etat_processus)
! 870: .erreur_execution =
! 871: registre_erreur_execution;
! 872: }
! 873: else
! 874: {
! 875: empilement_pile_systeme(
! 876: s_etat_processus);
! 877:
! 878: if ((*s_etat_processus)
! 879: .erreur_systeme != d_es)
! 880: {
! 881: if (presence_egalite ==
! 882: d_vrai)
! 883: {
! 884: liberation(
! 885: s_etat_processus,
! 886: s_objet_evalue);
! 887: }
! 888:
! 889: (*s_etat_processus)
! 890: .instruction_courante =
! 891: instruction_courante;
! 892: return(d_erreur);
! 893: }
! 894: }
! 895: }
! 896: else if (TEST(instruction_end) ||
! 897: TEST(instruction_next) ||
! 898: TEST(instruction_step) ||
! 899: TEST(vers_niveau_inferieur))
! 900: {
! 901: if (TEST(vers_niveau_inferieur))
! 902: {
! 903: registre_exception =
! 904: (*s_etat_processus)
! 905: .exception;
! 906: registre_erreur_execution =
! 907: (*s_etat_processus)
! 908: .erreur_execution;
! 909:
! 910: analyse(s_etat_processus,
! 911: vers_niveau_inferieur);
! 912:
! 913: (*s_etat_processus).exception
! 914: = registre_exception;
! 915: (*s_etat_processus)
! 916: .erreur_execution =
! 917: registre_erreur_execution;
! 918: }
! 919: else
! 920: {
! 921: depilement_pile_systeme(
! 922: s_etat_processus);
! 923:
! 924: if ((*s_etat_processus)
! 925: .erreur_systeme != d_es)
! 926: {
! 927: if (presence_egalite ==
! 928: d_vrai)
! 929: {
! 930: liberation(
! 931: s_etat_processus,
! 932: s_objet_evalue);
! 933: }
! 934:
! 935: (*s_etat_processus)
! 936: .instruction_courante =
! 937: instruction_courante;
! 938: return(d_erreur);
! 939: }
! 940: }
! 941: }
! 942: }
! 943: }
! 944: }
! 945:
! 946: (*s_etat_processus).instruction_courante =
! 947: instruction_courante;
! 948: drapeau_then = d_faux;
! 949:
! 950: do
! 951: {
! 952: l_registre_atome = l_element_courant;
! 953:
! 954: if (l_element_courant == NULL)
! 955: {
! 956: /*
! 957: * La fin de l'expression est atteinte,
! 958: * le sequenceur reprend la main.
! 959: */
! 960:
! 961: if (presence_egalite == d_vrai)
! 962: {
! 963: liberation(s_etat_processus,
! 964: s_objet_evalue);
! 965: }
! 966:
! 967: (*s_etat_processus)
! 968: .mode_execution_programme =
! 969: registre_mode_execution_programme;
! 970: (*s_etat_processus).instruction_courante =
! 971: instruction_courante;
! 972: return(d_absence_erreur);
! 973: }
! 974:
! 975: if ((*(*l_element_courant).donnee).type == FCT)
! 976: {
! 977: (*s_etat_processus)
! 978: .instruction_courante =
! 979: (*((struct_fonction *)
! 980: (*(*l_element_courant).donnee)
! 981: .objet)).nom_fonction;
! 982: fonction = (*((struct_fonction *)
! 983: (*(*l_element_courant).donnee)
! 984: .objet)).fonction;
! 985: (*s_etat_processus).instruction_courante =
! 986: instruction_courante;
! 987:
! 988: drapeau_then = TEST(instruction_then)
! 989: ? d_vrai : d_faux;
! 990: }
! 991:
! 992: l_element_courant = (*l_element_courant)
! 993: .suivant;
! 994: } while(drapeau_then == d_faux);
! 995:
! 996: (*s_etat_processus).expression_courante =
! 997: l_registre_atome;
! 998:
! 999: (*(*s_etat_processus).l_base_pile_systeme)
! 1000: .clause = 'X';
! 1001: instruction_then(s_etat_processus);
! 1002:
! 1003: (*s_etat_processus).exception = d_ep;
! 1004: (*s_etat_processus).erreur_execution = d_ex;
! 1005: }
! 1006: else if ((*s_etat_processus).mode_evaluation_expression
! 1007: == 'Y')
! 1008: {
! 1009: /*
! 1010: * Reprise sur erreur
! 1011: */
! 1012:
! 1013: while(l_element_courant != NULL)
! 1014: {
! 1015: if ((*(*l_element_courant).donnee).type == FCT)
! 1016: {
! 1017: (*s_etat_processus).instruction_courante =
! 1018: (*((struct_fonction *)
! 1019: (*(*l_element_courant).donnee)
! 1020: .objet)).nom_fonction;
! 1021: fonction = (*((struct_fonction *)
! 1022: (*(*l_element_courant).donnee)
! 1023: .objet)).fonction;
! 1024:
! 1025: if (recherche_variable(s_etat_processus,
! 1026: (*s_etat_processus)
! 1027: .instruction_courante) == d_faux)
! 1028: {
! 1029: (*s_etat_processus).erreur_systeme
! 1030: = d_es;
! 1031:
! 1032: /*
! 1033: * Traitement de la pile système par les
! 1034: * différentes instructions.
! 1035: */
! 1036:
! 1037: if (TEST(instruction_if) ||
! 1038: TEST(instruction_iferr) ||
! 1039: TEST(instruction_do) ||
! 1040: TEST(instruction_while) ||
! 1041: TEST(instruction_for) ||
! 1042: TEST(instruction_start) ||
! 1043: TEST(instruction_select) ||
! 1044: TEST(instruction_case) ||
! 1045: TEST(vers_niveau_superieur))
! 1046: {
! 1047: if (TEST(vers_niveau_superieur))
! 1048: {
! 1049: analyse(s_etat_processus,
! 1050: vers_niveau_superieur);
! 1051: }
! 1052: else
! 1053: {
! 1054: empilement_pile_systeme(
! 1055: s_etat_processus);
! 1056:
! 1057: if ((*s_etat_processus)
! 1058: .erreur_systeme != d_es)
! 1059: {
! 1060: if (presence_egalite ==
! 1061: d_vrai)
! 1062: {
! 1063: liberation(
! 1064: s_etat_processus,
! 1065: s_objet_evalue);
! 1066: }
! 1067:
! 1068: (*s_etat_processus)
! 1069: .instruction_courante =
! 1070: instruction_courante;
! 1071: return(d_erreur);
! 1072: }
! 1073: }
! 1074: }
! 1075: else if (TEST(instruction_end) ||
! 1076: TEST(instruction_next) ||
! 1077: TEST(instruction_step) ||
! 1078: TEST(vers_niveau_inferieur))
! 1079: {
! 1080: if (TEST(vers_niveau_inferieur))
! 1081: {
! 1082: analyse(s_etat_processus,
! 1083: vers_niveau_inferieur);
! 1084: }
! 1085: else
! 1086: {
! 1087: depilement_pile_systeme(
! 1088: s_etat_processus);
! 1089:
! 1090: if ((*s_etat_processus)
! 1091: .erreur_systeme != d_es)
! 1092: {
! 1093: if (presence_egalite ==
! 1094: d_vrai)
! 1095: {
! 1096: liberation(
! 1097: s_etat_processus,
! 1098: s_objet_evalue);
! 1099: }
! 1100:
! 1101: (*s_etat_processus)
! 1102: .instruction_courante =
! 1103: instruction_courante;
! 1104: return(d_erreur);
! 1105: }
! 1106: }
! 1107: }
! 1108: }
! 1109: }
! 1110:
! 1111: l_element_courant =
! 1112: (*l_element_courant).suivant;
! 1113: }
! 1114:
! 1115: (*s_etat_processus).mode_execution_programme =
! 1116: registre_mode_execution_programme;
! 1117: (*s_etat_processus).instruction_courante =
! 1118: instruction_courante;
! 1119:
! 1120: (*s_etat_processus).exception = d_ep;
! 1121: (*s_etat_processus).erreur_execution = d_ex;
! 1122:
! 1123: erreur_evaluation = d_erreur;
! 1124:
! 1125: (*s_etat_processus).expression_courante =
! 1126: registre_expression_courante;
! 1127: }
! 1128: else
! 1129: {
! 1130: // On ne détruit pas les variables pour les inclure
! 1131: // dans le fichier rpl-core.
! 1132:
! 1133: (*s_etat_processus).gel_liste_variables = d_vrai;
! 1134:
! 1135: registre_erreur_execution =
! 1136: (*s_etat_processus).erreur_execution;
! 1137: registre_exception =
! 1138: (*s_etat_processus).exception;
! 1139: registre_erreur_systeme =
! 1140: (*s_etat_processus).erreur_systeme;
! 1141:
! 1142: (*s_etat_processus).s_objet_errone = s_objet;
! 1143: (*s_etat_processus).s_objet_erreur =
! 1144: (*l_element_courant).donnee;
! 1145:
! 1146: l_element_courant = (*l_element_courant).suivant;
! 1147:
! 1148: while(l_element_courant != NULL)
! 1149: {
! 1150: if ((*(*l_element_courant).donnee).type == FCT)
! 1151: {
! 1152: (*s_etat_processus).instruction_courante =
! 1153: (*((struct_fonction *)
! 1154: (*(*l_element_courant).donnee)
! 1155: .objet)).nom_fonction;
! 1156: fonction = (*((struct_fonction *)
! 1157: (*(*l_element_courant).donnee)
! 1158: .objet)).fonction;
! 1159:
! 1160: if (recherche_variable(s_etat_processus,
! 1161: (*s_etat_processus)
! 1162: .instruction_courante) == d_faux)
! 1163: {
! 1164: (*s_etat_processus).erreur_systeme
! 1165: = d_es;
! 1166:
! 1167: /*
! 1168: * Traitement de la pile système par les
! 1169: * différentes instructions.
! 1170: */
! 1171:
! 1172: if (TEST(instruction_if) ||
! 1173: TEST(instruction_iferr) ||
! 1174: TEST(instruction_do) ||
! 1175: TEST(instruction_while) ||
! 1176: TEST(instruction_for) ||
! 1177: TEST(instruction_start) ||
! 1178: TEST(instruction_select) ||
! 1179: TEST(instruction_case) ||
! 1180: TEST(vers_niveau_superieur))
! 1181: {
! 1182: if (TEST(vers_niveau_superieur))
! 1183: {
! 1184: analyse(s_etat_processus,
! 1185: vers_niveau_superieur);
! 1186: }
! 1187: else
! 1188: {
! 1189: empilement_pile_systeme(
! 1190: s_etat_processus);
! 1191:
! 1192: if ((*s_etat_processus)
! 1193: .erreur_systeme != d_es)
! 1194: {
! 1195: if (presence_egalite ==
! 1196: d_vrai)
! 1197: {
! 1198: liberation(
! 1199: s_etat_processus,
! 1200: s_objet_evalue);
! 1201: }
! 1202:
! 1203: (*s_etat_processus)
! 1204: .instruction_courante =
! 1205: instruction_courante;
! 1206: return(d_erreur);
! 1207: }
! 1208: }
! 1209: }
! 1210: else if (TEST(instruction_end) ||
! 1211: TEST(instruction_next) ||
! 1212: TEST(instruction_step) ||
! 1213: TEST(vers_niveau_inferieur))
! 1214: {
! 1215: if (TEST(vers_niveau_inferieur))
! 1216: {
! 1217: analyse(s_etat_processus,
! 1218: vers_niveau_inferieur);
! 1219: }
! 1220: else
! 1221: {
! 1222: depilement_pile_systeme(
! 1223: s_etat_processus);
! 1224:
! 1225: if ((*s_etat_processus)
! 1226: .erreur_systeme != d_es)
! 1227: {
! 1228: if (presence_egalite ==
! 1229: d_vrai)
! 1230: {
! 1231: liberation(
! 1232: s_etat_processus,
! 1233: s_objet_evalue);
! 1234: }
! 1235:
! 1236: (*s_etat_processus)
! 1237: .instruction_courante =
! 1238: instruction_courante;
! 1239: return(d_erreur);
! 1240: }
! 1241: }
! 1242: }
! 1243: }
! 1244: }
! 1245:
! 1246: l_element_courant =
! 1247: (*l_element_courant).suivant;
! 1248: }
! 1249:
! 1250: (*s_etat_processus).mode_execution_programme =
! 1251: registre_mode_execution_programme;
! 1252: (*s_etat_processus).instruction_courante =
! 1253: instruction_courante;
! 1254:
! 1255: if (presence_egalite == d_vrai)
! 1256: {
! 1257: liberation(s_etat_processus, s_objet_evalue);
! 1258: }
! 1259:
! 1260: if ((*s_etat_processus)
! 1261: .var_volatile_processus_pere == 0)
! 1262: {
! 1263: kill((*s_etat_processus)
! 1264: .pid_processus_pere, SIGALRM);
! 1265: }
! 1266: else
! 1267: {
! 1268: (*s_etat_processus).var_volatile_alarme = -1;
! 1269: }
! 1270:
! 1271: (*s_etat_processus).erreur_execution =
! 1272: registre_erreur_execution;
! 1273: (*s_etat_processus).erreur_systeme =
! 1274: registre_erreur_systeme;
! 1275: (*s_etat_processus).exception =
! 1276: registre_exception;
! 1277: return(d_erreur);
! 1278: }
! 1279: }
! 1280:
! 1281: if ((*s_etat_processus).instruction_valide == 'Y')
! 1282: {
! 1283: l_element_courant = (*s_etat_processus)
! 1284: .expression_courante;
! 1285: }
! 1286: else
! 1287: {
! 1288: /*
! 1289: * Régénération de la fonction en notation algébrique
! 1290: */
! 1291:
! 1292: if ((s_objet_elementaire = (struct_objet *)
! 1293: allocation(s_etat_processus, ALG)) == NULL)
! 1294: {
! 1295: if (presence_egalite == d_vrai)
! 1296: {
! 1297: liberation(s_etat_processus, s_objet_evalue);
! 1298: }
! 1299:
! 1300: (*s_etat_processus).erreur_systeme =
! 1301: d_es_allocation_memoire;
! 1302: (*s_etat_processus).instruction_courante =
! 1303: instruction_courante;
! 1304: return(d_erreur);
! 1305: }
! 1306:
! 1307: /*
! 1308: * Ouverture de l'expression
! 1309: */
! 1310:
! 1311: if (((*s_objet_elementaire).objet =
! 1312: (struct_liste_chainee *)
! 1313: malloc(sizeof(struct_liste_chainee))) == NULL)
! 1314: {
! 1315: if (presence_egalite == d_vrai)
! 1316: {
! 1317: liberation(s_etat_processus, s_objet_evalue);
! 1318: }
! 1319:
! 1320: (*s_etat_processus).erreur_systeme =
! 1321: d_es_allocation_memoire;
! 1322: (*s_etat_processus).instruction_courante =
! 1323: instruction_courante;
! 1324: return(d_erreur);
! 1325: }
! 1326:
! 1327: l_element_fonction = (*s_objet_elementaire).objet;
! 1328:
! 1329: if (((*l_element_fonction).donnee = (struct_objet *)
! 1330: allocation(s_etat_processus, FCT)) == NULL)
! 1331: {
! 1332: if (presence_egalite == d_vrai)
! 1333: {
! 1334: liberation(s_etat_processus, s_objet_evalue);
! 1335: }
! 1336:
! 1337: (*s_etat_processus).erreur_systeme =
! 1338: d_es_allocation_memoire;
! 1339: (*s_etat_processus).instruction_courante =
! 1340: instruction_courante;
! 1341: return(d_erreur);
! 1342: }
! 1343:
! 1344: (*((struct_fonction *) (*(*l_element_fonction).donnee)
! 1345: .objet)).nombre_arguments = 0;
! 1346: (*((struct_fonction *) (*(*l_element_fonction).donnee)
! 1347: .objet)).fonction =
! 1348: instruction_vers_niveau_superieur;
! 1349:
! 1350: if (((*((struct_fonction *) (*(*l_element_fonction)
! 1351: .donnee).objet)).nom_fonction =
! 1352: (unsigned char *) malloc(3 * sizeof(
! 1353: unsigned char))) == NULL)
! 1354: {
! 1355: if (presence_egalite == d_vrai)
! 1356: {
! 1357: liberation(s_etat_processus, s_objet_evalue);
! 1358: }
! 1359:
! 1360: (*s_etat_processus).erreur_systeme =
! 1361: d_es_allocation_memoire;
! 1362: (*s_etat_processus).instruction_courante =
! 1363: instruction_courante;
! 1364: return(d_erreur);
! 1365: }
! 1366:
! 1367: strcpy((*((struct_fonction *) (*(*l_element_fonction)
! 1368: .donnee).objet)).nom_fonction, "<<");
! 1369:
! 1370: /*
! 1371: * Ajout des arguments
! 1372: */
! 1373:
! 1374: for(k = (*((struct_fonction *)
! 1375: (*(*l_element_courant).donnee).objet))
! 1376: .nombre_arguments; k >= 1; k--)
! 1377: {
! 1378: if (((*l_element_fonction).suivant =
! 1379: (struct_liste_chainee *) malloc(sizeof(
! 1380: struct_liste_chainee))) == NULL)
! 1381: {
! 1382: if (presence_egalite == d_vrai)
! 1383: {
! 1384: liberation(s_etat_processus,
! 1385: s_objet_evalue);
! 1386: }
! 1387:
! 1388: (*s_etat_processus).erreur_systeme =
! 1389: d_es_allocation_memoire;
! 1390: (*s_etat_processus).instruction_courante =
! 1391: instruction_courante;
! 1392: return(d_erreur);
! 1393: }
! 1394:
! 1395: l_element_fonction = (*l_element_fonction).suivant;
! 1396:
! 1397: if (k > 1)
! 1398: {
! 1399: l_liste1 = (*s_etat_processus).l_base_pile;
! 1400:
! 1401: for(l = 2; l < k; l++)
! 1402: {
! 1403: l_liste1 = (*l_liste1).suivant;
! 1404: }
! 1405:
! 1406: l_liste2 = (*l_liste1).suivant;
! 1407: (*l_liste1).suivant = (*l_liste2).suivant;
! 1408: (*l_liste2).suivant = (*s_etat_processus)
! 1409: .l_base_pile;
! 1410: (*s_etat_processus).l_base_pile = l_liste2;
! 1411: }
! 1412:
! 1413: if (depilement(s_etat_processus,
! 1414: &((*s_etat_processus).l_base_pile),
! 1415: &s_sous_objet) == d_erreur)
! 1416: {
! 1417: if (presence_egalite == d_vrai)
! 1418: {
! 1419: liberation(s_etat_processus,
! 1420: s_objet_evalue);
! 1421: }
! 1422:
! 1423: (*s_etat_processus).erreur_execution =
! 1424: d_ex_manque_argument;
! 1425: (*s_etat_processus).instruction_courante =
! 1426: instruction_courante;
! 1427: (*s_etat_processus).mode_execution_programme =
! 1428: registre_mode_execution_programme;
! 1429: return(d_erreur);
! 1430: }
! 1431:
! 1432: (*l_element_fonction).donnee = s_sous_objet;
! 1433: }
! 1434:
! 1435: /*
! 1436: * Ajout de la fonction
! 1437: */
! 1438:
! 1439: if (((*l_element_fonction).suivant =
! 1440: (struct_liste_chainee *) malloc(sizeof(
! 1441: struct_liste_chainee))) == NULL)
! 1442: {
! 1443: if (presence_egalite == d_vrai)
! 1444: {
! 1445: liberation(s_etat_processus, s_objet_evalue);
! 1446: }
! 1447:
! 1448: (*s_etat_processus).erreur_systeme =
! 1449: d_es_allocation_memoire;
! 1450: (*s_etat_processus).instruction_courante =
! 1451: instruction_courante;
! 1452: return(d_erreur);
! 1453: }
! 1454:
! 1455: l_element_fonction = (*l_element_fonction).suivant;
! 1456:
! 1457: if (((*l_element_fonction).donnee =
! 1458: copie_objet(s_etat_processus,
! 1459: (*l_element_courant).donnee, 'P'))
! 1460: == NULL)
! 1461: {
! 1462: if (presence_egalite == d_vrai)
! 1463: {
! 1464: liberation(s_etat_processus, s_objet_evalue);
! 1465: }
! 1466:
! 1467: (*s_etat_processus).erreur_systeme =
! 1468: d_es_allocation_memoire;
! 1469: (*s_etat_processus).instruction_courante =
! 1470: instruction_courante;
! 1471: return(d_erreur);
! 1472: }
! 1473:
! 1474: /*
! 1475: * Clôture de l'expression
! 1476: */
! 1477:
! 1478: if (((*l_element_fonction).suivant =
! 1479: (struct_liste_chainee *) malloc(sizeof(
! 1480: struct_liste_chainee))) == NULL)
! 1481: {
! 1482: if (presence_egalite == d_vrai)
! 1483: {
! 1484: liberation(s_etat_processus, s_objet_evalue);
! 1485: }
! 1486:
! 1487: (*s_etat_processus).erreur_systeme =
! 1488: d_es_allocation_memoire;
! 1489: (*s_etat_processus).instruction_courante =
! 1490: instruction_courante;
! 1491: return(d_erreur);
! 1492: }
! 1493:
! 1494: l_element_fonction = (*l_element_fonction).suivant;
! 1495:
! 1496: if (((*l_element_fonction).donnee =
! 1497: allocation(s_etat_processus, FCT)) == NULL)
! 1498: {
! 1499: if (presence_egalite == d_vrai)
! 1500: {
! 1501: liberation(s_etat_processus, s_objet_evalue);
! 1502: }
! 1503:
! 1504: (*s_etat_processus).erreur_systeme =
! 1505: d_es_allocation_memoire;
! 1506: (*s_etat_processus).instruction_courante =
! 1507: instruction_courante;
! 1508: return(d_erreur);
! 1509: }
! 1510:
! 1511: (*((struct_fonction *) (*(*l_element_fonction).donnee)
! 1512: .objet)).nombre_arguments = 0;
! 1513: (*((struct_fonction *) (*(*l_element_fonction).donnee)
! 1514: .objet)).fonction =
! 1515: instruction_vers_niveau_inferieur;
! 1516:
! 1517: if (((*((struct_fonction *) (*(*l_element_fonction)
! 1518: .donnee).objet)).nom_fonction =
! 1519: (unsigned char *) malloc(3 * sizeof(
! 1520: unsigned char))) == NULL)
! 1521: {
! 1522: if (presence_egalite == d_vrai)
! 1523: {
! 1524: liberation(s_etat_processus, s_objet_evalue);
! 1525: }
! 1526:
! 1527: (*s_etat_processus).erreur_systeme =
! 1528: d_es_allocation_memoire;
! 1529: (*s_etat_processus).instruction_courante =
! 1530: instruction_courante;
! 1531: return(d_erreur);
! 1532: }
! 1533:
! 1534: strcpy((*((struct_fonction *) (*(*l_element_fonction)
! 1535: .donnee).objet)).nom_fonction, ">>");
! 1536:
! 1537: (*l_element_fonction).suivant = NULL;
! 1538:
! 1539: if (empilement(s_etat_processus, &((*s_etat_processus)
! 1540: .l_base_pile), s_objet_elementaire) ==
! 1541: d_erreur)
! 1542: {
! 1543: if (presence_egalite == d_vrai)
! 1544: {
! 1545: liberation(s_etat_processus, s_objet_evalue);
! 1546: }
! 1547:
! 1548: (*s_etat_processus).instruction_courante =
! 1549: instruction_courante;
! 1550: return(d_erreur);
! 1551: }
! 1552: }
! 1553:
! 1554: (*s_etat_processus).expression_courante =
! 1555: registre_expression_courante;
! 1556: }
! 1557: else
! 1558: {
! 1559: if ((s_objet_elementaire =
! 1560: allocation(s_etat_processus, NON)) == NULL)
! 1561: {
! 1562: if (presence_egalite == d_vrai)
! 1563: {
! 1564: liberation(s_etat_processus, s_objet_evalue);
! 1565: }
! 1566:
! 1567: (*s_etat_processus).erreur_systeme =
! 1568: d_es_allocation_memoire;
! 1569: (*s_etat_processus).instruction_courante =
! 1570: instruction_courante;
! 1571: return(d_erreur);
! 1572: }
! 1573:
! 1574: if ((*s_etat_processus).s_liste_variables
! 1575: [(*s_etat_processus).position_variable_courante]
! 1576: .objet == NULL)
! 1577: {
! 1578: if (pthread_mutex_lock(&((*(*s_etat_processus)
! 1579: .s_liste_variables_partagees).mutex)) != 0)
! 1580: {
! 1581: (*s_etat_processus).erreur_systeme =
! 1582: d_es_processus;
! 1583: }
! 1584:
! 1585: if (recherche_variable_partagee(s_etat_processus,
! 1586: ((*s_etat_processus).s_liste_variables
! 1587: [(*s_etat_processus)
! 1588: .position_variable_courante]).nom,
! 1589: ((*s_etat_processus).s_liste_variables
! 1590: [(*s_etat_processus)
! 1591: .position_variable_courante])
! 1592: .variable_partagee, 'E') == d_vrai)
! 1593: {
! 1594: // Une variable partagée existe.
! 1595:
! 1596: presence_variable_partagee = d_vrai;
! 1597:
! 1598: (*s_etat_processus).s_liste_variables
! 1599: [(*s_etat_processus)
! 1600: .position_variable_courante].objet =
! 1601: (*(*s_etat_processus)
! 1602: .s_liste_variables_partagees).table
! 1603: [(*(*s_etat_processus)
! 1604: .s_liste_variables_partagees)
! 1605: .position_variable].objet;
! 1606: }
! 1607: else
! 1608: {
! 1609: presence_variable_partagee = d_faux;
! 1610:
! 1611: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1612: .s_liste_variables_partagees).mutex)) != 0)
! 1613: {
! 1614: (*s_etat_processus).erreur_systeme =
! 1615: d_es_processus;
! 1616: }
! 1617: }
! 1618: }
! 1619: else
! 1620: {
! 1621: presence_variable_partagee = d_faux;
! 1622: }
! 1623:
! 1624: /*
! 1625: * Recherche d'un élément dans un vecteur
! 1626: */
! 1627:
! 1628: if (((*s_etat_processus).s_liste_variables
! 1629: [(*s_etat_processus).position_variable_courante])
! 1630: .objet == NULL)
! 1631: {
! 1632: // La variable partagée n'existe plus.
! 1633:
! 1634: free(s_objet_elementaire);
! 1635:
! 1636: if ((s_objet_elementaire =
! 1637: copie_objet(s_etat_processus,
! 1638: (*l_element_courant).donnee, 'P')) == NULL)
! 1639: {
! 1640: if (presence_variable_partagee == d_vrai)
! 1641: {
! 1642: (*s_etat_processus).s_liste_variables
! 1643: [(*s_etat_processus)
! 1644: .position_variable_courante].objet =
! 1645: NULL;
! 1646:
! 1647: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1648: .s_liste_variables_partagees).mutex))
! 1649: != 0)
! 1650: {
! 1651: (*s_etat_processus).erreur_systeme =
! 1652: d_es_processus;
! 1653: }
! 1654: }
! 1655:
! 1656: (*s_etat_processus).erreur_systeme =
! 1657: d_es_allocation_memoire;
! 1658: return(d_erreur);;
! 1659: }
! 1660: }
! 1661: else if ((((*(((*s_etat_processus).s_liste_variables
! 1662: [(*s_etat_processus).position_variable_courante])
! 1663: .objet)).type == VIN) ||
! 1664: ((*(((*s_etat_processus).s_liste_variables
! 1665: [(*s_etat_processus).position_variable_courante])
! 1666: .objet)).type == VRL) ||
! 1667: ((*(((*s_etat_processus).s_liste_variables
! 1668: [(*s_etat_processus).position_variable_courante])
! 1669: .objet)).type == VCX))
! 1670: && ((*((struct_fonction *) (*(*l_element_courant)
! 1671: .donnee).objet)).nombre_arguments == 1))
! 1672: {
! 1673: if (depilement(s_etat_processus, &((*s_etat_processus)
! 1674: .l_base_pile), &s_objet_indice_i) == d_erreur)
! 1675: {
! 1676: free(s_objet_elementaire);
! 1677:
! 1678: if (presence_variable_partagee == d_vrai)
! 1679: {
! 1680: (*s_etat_processus).s_liste_variables
! 1681: [(*s_etat_processus)
! 1682: .position_variable_courante].objet =
! 1683: NULL;
! 1684:
! 1685: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1686: .s_liste_variables_partagees).mutex))
! 1687: != 0)
! 1688: {
! 1689: (*s_etat_processus).erreur_systeme =
! 1690: d_es_processus;
! 1691: }
! 1692: }
! 1693:
! 1694: if (presence_egalite == d_vrai)
! 1695: {
! 1696: liberation(s_etat_processus, s_objet_evalue);
! 1697: }
! 1698:
! 1699: (*s_etat_processus).erreur_execution =
! 1700: d_ex_manque_argument;
! 1701: (*s_etat_processus).instruction_courante =
! 1702: instruction_courante;
! 1703: (*s_etat_processus).mode_execution_programme =
! 1704: registre_mode_execution_programme;
! 1705: return(d_erreur);
! 1706: }
! 1707:
! 1708: if ((*s_objet_indice_i).type == INT)
! 1709: {
! 1710: liberation(s_etat_processus, s_objet_indice_i);
! 1711: free(s_objet_elementaire);
! 1712:
! 1713: if (presence_variable_partagee == d_vrai)
! 1714: {
! 1715: (*s_etat_processus).s_liste_variables
! 1716: [(*s_etat_processus)
! 1717: .position_variable_courante].objet =
! 1718: NULL;
! 1719:
! 1720: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1721: .s_liste_variables_partagees).mutex))
! 1722: != 0)
! 1723: {
! 1724: (*s_etat_processus).erreur_systeme =
! 1725: d_es_processus;
! 1726: }
! 1727: }
! 1728:
! 1729: if (presence_egalite == d_vrai)
! 1730: {
! 1731: liberation(s_etat_processus, s_objet_evalue);
! 1732: }
! 1733:
! 1734: (*s_etat_processus).erreur_execution =
! 1735: d_ex_erreur_type_argument;
! 1736: (*s_etat_processus).instruction_courante =
! 1737: instruction_courante;
! 1738: (*s_etat_processus).mode_execution_programme =
! 1739: registre_mode_execution_programme;
! 1740: return(d_erreur);
! 1741: }
! 1742:
! 1743: i = (*((integer8 *) (*s_objet_indice_i).objet));
! 1744:
! 1745: liberation(s_etat_processus, s_objet_indice_i);
! 1746:
! 1747: if ((i < 1) || (i > (integer8) (*((struct_vecteur *)
! 1748: (*(((*s_etat_processus)
! 1749: .s_liste_variables[(*s_etat_processus)
! 1750: .position_variable_courante]).objet)).objet))
! 1751: .taille))
! 1752: {
! 1753: free(s_objet_elementaire);
! 1754:
! 1755: if (presence_variable_partagee == d_vrai)
! 1756: {
! 1757: (*s_etat_processus).s_liste_variables
! 1758: [(*s_etat_processus)
! 1759: .position_variable_courante].objet =
! 1760: NULL;
! 1761:
! 1762: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1763: .s_liste_variables_partagees).mutex))
! 1764: != 0)
! 1765: {
! 1766: (*s_etat_processus).erreur_systeme =
! 1767: d_es_processus;
! 1768: }
! 1769: }
! 1770:
! 1771: if (presence_egalite == d_vrai)
! 1772: {
! 1773: liberation(s_etat_processus, s_objet_evalue);
! 1774: }
! 1775:
! 1776: (*s_etat_processus).erreur_execution =
! 1777: d_ex_element_inexistant;
! 1778: (*s_etat_processus).instruction_courante =
! 1779: instruction_courante;
! 1780: (*s_etat_processus).mode_execution_programme =
! 1781: registre_mode_execution_programme;
! 1782: return(d_erreur);
! 1783: }
! 1784:
! 1785: if ((*(((*s_etat_processus).s_liste_variables
! 1786: [(*s_etat_processus)
! 1787: .position_variable_courante]).objet)).type
! 1788: == VIN)
! 1789: {
! 1790: if (((*s_objet_elementaire).objet = malloc(sizeof(
! 1791: integer8))) == NULL)
! 1792: {
! 1793: if (presence_egalite == d_vrai)
! 1794: {
! 1795: liberation(s_etat_processus,
! 1796: s_objet_evalue);
! 1797: }
! 1798:
! 1799: if (presence_variable_partagee == d_vrai)
! 1800: {
! 1801: (*s_etat_processus).s_liste_variables
! 1802: [(*s_etat_processus)
! 1803: .position_variable_courante].objet
! 1804: = NULL;
! 1805:
! 1806: if (pthread_mutex_unlock(
! 1807: &((*(*s_etat_processus)
! 1808: .s_liste_variables_partagees)
! 1809: .mutex)) != 0)
! 1810: {
! 1811: (*s_etat_processus).erreur_systeme =
! 1812: d_es_processus;
! 1813: }
! 1814: }
! 1815:
! 1816: (*s_etat_processus).erreur_systeme =
! 1817: d_es_allocation_memoire;
! 1818: (*s_etat_processus).instruction_courante =
! 1819: instruction_courante;
! 1820: return(d_erreur);
! 1821: }
! 1822:
! 1823: (*s_objet_elementaire).type = INT;
! 1824: (*((integer8 *) (*s_objet_elementaire).objet)) =
! 1825: ((integer8 *) (*((struct_vecteur *)
! 1826: (*(((*s_etat_processus).s_liste_variables
! 1827: [(*s_etat_processus)
! 1828: .position_variable_courante]).objet))
! 1829: .objet)).tableau)[i - 1];
! 1830: }
! 1831: else if ((*(((*s_etat_processus)
! 1832: .s_liste_variables[(*s_etat_processus)
! 1833: .position_variable_courante]).objet)).type
! 1834: == VRL)
! 1835: {
! 1836: if (((*s_objet_elementaire).objet = malloc(sizeof(
! 1837: real8))) == NULL)
! 1838: {
! 1839: if (presence_variable_partagee == d_vrai)
! 1840: {
! 1841: (*s_etat_processus).s_liste_variables
! 1842: [(*s_etat_processus)
! 1843: .position_variable_courante].objet
! 1844: = NULL;
! 1845:
! 1846: if (pthread_mutex_unlock(
! 1847: &((*(*s_etat_processus)
! 1848: .s_liste_variables_partagees)
! 1849: .mutex)) != 0)
! 1850: {
! 1851: (*s_etat_processus).erreur_systeme =
! 1852: d_es_processus;
! 1853: }
! 1854: }
! 1855:
! 1856: if (presence_egalite == d_vrai)
! 1857: {
! 1858: liberation(s_etat_processus,
! 1859: s_objet_evalue);
! 1860: }
! 1861:
! 1862: (*s_etat_processus).erreur_systeme =
! 1863: d_es_allocation_memoire;
! 1864: (*s_etat_processus).instruction_courante =
! 1865: instruction_courante;
! 1866: return(d_erreur);
! 1867: }
! 1868:
! 1869: (*s_objet_elementaire).type = REL;
! 1870: (*((real8 *) (*s_objet_elementaire).objet)) =
! 1871: ((real8 *) (*((struct_vecteur *)
! 1872: (*(((*s_etat_processus).s_liste_variables
! 1873: [(*s_etat_processus)
! 1874: .position_variable_courante]).objet))
! 1875: .objet)).tableau)[i - 1];
! 1876: }
! 1877: else if ((*(((*s_etat_processus)
! 1878: .s_liste_variables[(*s_etat_processus)
! 1879: .position_variable_courante]).objet)).type
! 1880: == VCX)
! 1881: {
! 1882: if (((*s_objet_elementaire).objet = malloc(sizeof(
! 1883: struct_complexe16))) == NULL)
! 1884: {
! 1885: if (presence_variable_partagee == d_vrai)
! 1886: {
! 1887: (*s_etat_processus).s_liste_variables
! 1888: [(*s_etat_processus)
! 1889: .position_variable_courante].objet
! 1890: = NULL;
! 1891:
! 1892: if (pthread_mutex_unlock(
! 1893: &((*(*s_etat_processus)
! 1894: .s_liste_variables_partagees)
! 1895: .mutex)) != 0)
! 1896: {
! 1897: (*s_etat_processus).erreur_systeme =
! 1898: d_es_processus;
! 1899: }
! 1900: }
! 1901:
! 1902: if (presence_egalite == d_vrai)
! 1903: {
! 1904: liberation(s_etat_processus,
! 1905: s_objet_evalue);
! 1906: }
! 1907:
! 1908: (*s_etat_processus).erreur_systeme =
! 1909: d_es_allocation_memoire;
! 1910: (*s_etat_processus).instruction_courante =
! 1911: instruction_courante;
! 1912: return(d_erreur);
! 1913: }
! 1914:
! 1915: (*s_objet_elementaire).type = CPL;
! 1916: (*((struct_complexe16 *) (*s_objet_elementaire)
! 1917: .objet)).partie_reelle =
! 1918: ((struct_complexe16 *) (*((struct_vecteur *)
! 1919: (*(((*s_etat_processus).s_liste_variables
! 1920: [(*s_etat_processus)
! 1921: .position_variable_courante]).objet))
! 1922: .objet)).tableau)[i - 1]
! 1923: .partie_reelle;
! 1924: (*((struct_complexe16 *) (*s_objet_elementaire)
! 1925: .objet)).partie_imaginaire =
! 1926: ((struct_complexe16 *) (*((struct_vecteur *)
! 1927: (*(((*s_etat_processus).s_liste_variables
! 1928: [(*s_etat_processus)
! 1929: .position_variable_courante]).objet))
! 1930: .objet)).tableau)[i - 1]
! 1931: .partie_imaginaire;
! 1932: }
! 1933: }
! 1934:
! 1935: /*
! 1936: * Recherche d'un élément dans une matrice
! 1937: */
! 1938:
! 1939: else if ((((*(((*s_etat_processus).s_liste_variables
! 1940: [(*s_etat_processus).position_variable_courante])
! 1941: .objet)).type == MIN) ||
! 1942: ((*(((*s_etat_processus).s_liste_variables
! 1943: [(*s_etat_processus).position_variable_courante])
! 1944: .objet)).type == MRL) ||
! 1945: ((*(((*s_etat_processus).s_liste_variables
! 1946: [(*s_etat_processus).position_variable_courante])
! 1947: .objet)).type == MCX))
! 1948: && ((*((struct_fonction *) (*(*l_element_courant)
! 1949: .donnee).objet)).nombre_arguments == 2))
! 1950: {
! 1951: if (depilement(s_etat_processus, &((*s_etat_processus)
! 1952: .l_base_pile), &s_objet_indice_j) == d_erreur)
! 1953: {
! 1954: free(s_objet_elementaire);
! 1955:
! 1956: if (presence_variable_partagee == d_vrai)
! 1957: {
! 1958: (*s_etat_processus).s_liste_variables
! 1959: [(*s_etat_processus)
! 1960: .position_variable_courante].objet
! 1961: = NULL;
! 1962:
! 1963: if (pthread_mutex_unlock(
! 1964: &((*(*s_etat_processus)
! 1965: .s_liste_variables_partagees)
! 1966: .mutex)) != 0)
! 1967: {
! 1968: (*s_etat_processus).erreur_systeme =
! 1969: d_es_processus;
! 1970: }
! 1971: }
! 1972:
! 1973: if (presence_egalite == d_vrai)
! 1974: {
! 1975: liberation(s_etat_processus, s_objet_evalue);
! 1976: }
! 1977:
! 1978: (*s_etat_processus).erreur_execution =
! 1979: d_ex_manque_argument;
! 1980: (*s_etat_processus).instruction_courante =
! 1981: instruction_courante;
! 1982: (*s_etat_processus).mode_execution_programme =
! 1983: registre_mode_execution_programme;
! 1984: return(d_erreur);
! 1985: }
! 1986:
! 1987: if (depilement(s_etat_processus, &((*s_etat_processus)
! 1988: .l_base_pile), &s_objet_indice_i) == d_erreur)
! 1989: {
! 1990: liberation(s_etat_processus, s_objet_indice_j);
! 1991: free(s_objet_elementaire);
! 1992:
! 1993: if (presence_variable_partagee == d_vrai)
! 1994: {
! 1995: (*s_etat_processus).s_liste_variables
! 1996: [(*s_etat_processus)
! 1997: .position_variable_courante].objet
! 1998: = NULL;
! 1999:
! 2000: if (pthread_mutex_unlock(
! 2001: &((*(*s_etat_processus)
! 2002: .s_liste_variables_partagees)
! 2003: .mutex)) != 0)
! 2004: {
! 2005: (*s_etat_processus).erreur_systeme =
! 2006: d_es_processus;
! 2007: }
! 2008: }
! 2009:
! 2010: if (presence_egalite == d_vrai)
! 2011: {
! 2012: liberation(s_etat_processus, s_objet_evalue);
! 2013: }
! 2014:
! 2015: (*s_etat_processus).erreur_execution =
! 2016: d_ex_manque_argument;
! 2017: (*s_etat_processus).instruction_courante =
! 2018: instruction_courante;
! 2019: (*s_etat_processus).mode_execution_programme =
! 2020: registre_mode_execution_programme;
! 2021: return(d_erreur);
! 2022: }
! 2023:
! 2024: if (((*s_objet_indice_i).type != INT) ||
! 2025: ((*s_objet_indice_j).type != INT))
! 2026: {
! 2027: liberation(s_etat_processus, s_objet_indice_i);
! 2028: liberation(s_etat_processus, s_objet_indice_j);
! 2029: free(s_objet_elementaire);
! 2030:
! 2031: if (presence_variable_partagee == d_vrai)
! 2032: {
! 2033: (*s_etat_processus).s_liste_variables
! 2034: [(*s_etat_processus)
! 2035: .position_variable_courante].objet
! 2036: = NULL;
! 2037:
! 2038: if (pthread_mutex_unlock(
! 2039: &((*(*s_etat_processus)
! 2040: .s_liste_variables_partagees)
! 2041: .mutex)) != 0)
! 2042: {
! 2043: (*s_etat_processus).erreur_systeme =
! 2044: d_es_processus;
! 2045: }
! 2046: }
! 2047:
! 2048: if (presence_egalite == d_vrai)
! 2049: {
! 2050: liberation(s_etat_processus, s_objet_evalue);
! 2051: }
! 2052:
! 2053: (*s_etat_processus).erreur_execution =
! 2054: d_ex_erreur_type_argument;
! 2055: (*s_etat_processus).instruction_courante =
! 2056: instruction_courante;
! 2057: (*s_etat_processus).mode_execution_programme =
! 2058: registre_mode_execution_programme;
! 2059: return(d_erreur);
! 2060: }
! 2061:
! 2062: i = (*((integer8 *) (*s_objet_indice_i).objet));
! 2063: j = (*((integer8 *) (*s_objet_indice_j).objet));
! 2064:
! 2065: liberation(s_etat_processus, s_objet_indice_i);
! 2066: liberation(s_etat_processus, s_objet_indice_j);
! 2067:
! 2068: if ((i < 1) || (i > (integer8) (*((struct_matrice *)
! 2069: (*(((*s_etat_processus)
! 2070: .s_liste_variables[(*s_etat_processus)
! 2071: .position_variable_courante]).objet)).objet))
! 2072: .nombre_lignes) || (j < 1) || (j > (integer8)
! 2073: (*((struct_matrice *) (*(((*s_etat_processus)
! 2074: .s_liste_variables[(*s_etat_processus)
! 2075: .position_variable_courante]).objet)).objet))
! 2076: .nombre_colonnes))
! 2077: {
! 2078: liberation(s_etat_processus, s_objet_indice_i);
! 2079: liberation(s_etat_processus, s_objet_indice_j);
! 2080: free(s_objet_elementaire);
! 2081:
! 2082: if (presence_variable_partagee == d_vrai)
! 2083: {
! 2084: (*s_etat_processus).s_liste_variables
! 2085: [(*s_etat_processus)
! 2086: .position_variable_courante].objet
! 2087: = NULL;
! 2088:
! 2089: if (pthread_mutex_unlock(
! 2090: &((*(*s_etat_processus)
! 2091: .s_liste_variables_partagees)
! 2092: .mutex)) != 0)
! 2093: {
! 2094: (*s_etat_processus).erreur_systeme =
! 2095: d_es_processus;
! 2096: }
! 2097: }
! 2098:
! 2099: if (presence_egalite == d_vrai)
! 2100: {
! 2101: liberation(s_etat_processus, s_objet_evalue);
! 2102: }
! 2103:
! 2104: (*s_etat_processus).erreur_execution =
! 2105: d_ex_element_inexistant;
! 2106: (*s_etat_processus).instruction_courante =
! 2107: instruction_courante;
! 2108: (*s_etat_processus).mode_execution_programme =
! 2109: registre_mode_execution_programme;
! 2110: return(d_erreur);
! 2111: }
! 2112:
! 2113: if ((*(((*s_etat_processus).s_liste_variables
! 2114: [(*s_etat_processus)
! 2115: .position_variable_courante]).objet)).type
! 2116: == MIN)
! 2117: {
! 2118: if (((*s_objet_elementaire).objet = malloc(sizeof(
! 2119: integer8))) == NULL)
! 2120: {
! 2121: if (presence_variable_partagee == d_vrai)
! 2122: {
! 2123: (*s_etat_processus).s_liste_variables
! 2124: [(*s_etat_processus)
! 2125: .position_variable_courante].objet
! 2126: = NULL;
! 2127:
! 2128: if (pthread_mutex_unlock(
! 2129: &((*(*s_etat_processus)
! 2130: .s_liste_variables_partagees)
! 2131: .mutex)) != 0)
! 2132: {
! 2133: (*s_etat_processus).erreur_systeme =
! 2134: d_es_processus;
! 2135: }
! 2136: }
! 2137:
! 2138: if (presence_egalite == d_vrai)
! 2139: {
! 2140: liberation(s_etat_processus,
! 2141: s_objet_evalue);
! 2142: }
! 2143:
! 2144: (*s_etat_processus).erreur_systeme =
! 2145: d_es_allocation_memoire;
! 2146: (*s_etat_processus).instruction_courante =
! 2147: instruction_courante;
! 2148: return(d_erreur);
! 2149: }
! 2150:
! 2151: (*s_objet_elementaire).type = INT;
! 2152: (*((integer8 *) (*s_objet_elementaire).objet)) =
! 2153: ((integer8 **) (*((struct_matrice *)
! 2154: (*(((*s_etat_processus).s_liste_variables
! 2155: [(*s_etat_processus)
! 2156: .position_variable_courante]).objet))
! 2157: .objet)).tableau)[i - 1][j - 1];
! 2158: }
! 2159: else if ((*(((*s_etat_processus)
! 2160: .s_liste_variables[(*s_etat_processus)
! 2161: .position_variable_courante]).objet)).type
! 2162: == MRL)
! 2163: {
! 2164: if (((*s_objet_elementaire).objet = malloc(sizeof(
! 2165: real8))) == NULL)
! 2166: {
! 2167: if (presence_variable_partagee == d_vrai)
! 2168: {
! 2169: (*s_etat_processus).s_liste_variables
! 2170: [(*s_etat_processus)
! 2171: .position_variable_courante].objet
! 2172: = NULL;
! 2173:
! 2174: if (pthread_mutex_unlock(
! 2175: &((*(*s_etat_processus)
! 2176: .s_liste_variables_partagees)
! 2177: .mutex)) != 0)
! 2178: {
! 2179: (*s_etat_processus).erreur_systeme =
! 2180: d_es_processus;
! 2181: }
! 2182: }
! 2183:
! 2184: if (presence_egalite == d_vrai)
! 2185: {
! 2186: liberation(s_etat_processus,
! 2187: s_objet_evalue);
! 2188: }
! 2189:
! 2190: (*s_etat_processus).erreur_systeme =
! 2191: d_es_allocation_memoire;
! 2192: (*s_etat_processus).instruction_courante =
! 2193: instruction_courante;
! 2194: return(d_erreur);
! 2195: }
! 2196:
! 2197: (*s_objet_elementaire).type = REL;
! 2198: (*((real8 *) (*s_objet_elementaire).objet)) =
! 2199: ((real8 **) (*((struct_matrice *)
! 2200: (*(((*s_etat_processus).s_liste_variables
! 2201: [(*s_etat_processus)
! 2202: .position_variable_courante]).objet))
! 2203: .objet)).tableau)[i - 1][j - 1];
! 2204: }
! 2205: else if ((*(((*s_etat_processus)
! 2206: .s_liste_variables[(*s_etat_processus)
! 2207: .position_variable_courante]).objet)).type
! 2208: == MCX)
! 2209: {
! 2210: if (((*s_objet_elementaire).objet = malloc(sizeof(
! 2211: struct_complexe16))) == NULL)
! 2212: {
! 2213: if (presence_variable_partagee == d_vrai)
! 2214: {
! 2215: (*s_etat_processus).s_liste_variables
! 2216: [(*s_etat_processus)
! 2217: .position_variable_courante].objet
! 2218: = NULL;
! 2219:
! 2220: if (pthread_mutex_unlock(
! 2221: &((*(*s_etat_processus)
! 2222: .s_liste_variables_partagees)
! 2223: .mutex)) != 0)
! 2224: {
! 2225: (*s_etat_processus).erreur_systeme =
! 2226: d_es_processus;
! 2227: }
! 2228: }
! 2229:
! 2230: if (presence_egalite == d_vrai)
! 2231: {
! 2232: liberation(s_etat_processus,
! 2233: s_objet_evalue);
! 2234: }
! 2235:
! 2236: (*s_etat_processus).erreur_systeme =
! 2237: d_es_allocation_memoire;
! 2238: (*s_etat_processus).instruction_courante =
! 2239: instruction_courante;
! 2240: return(d_erreur);
! 2241: }
! 2242:
! 2243: (*s_objet_elementaire).type = CPL;
! 2244: (*((struct_complexe16 *) (*s_objet_elementaire)
! 2245: .objet)).partie_reelle =
! 2246: ((struct_complexe16 **)
! 2247: (*((struct_matrice *)
! 2248: (*(((*s_etat_processus).s_liste_variables
! 2249: [(*s_etat_processus)
! 2250: .position_variable_courante]).objet))
! 2251: .objet)).tableau)[i - 1][j - 1]
! 2252: .partie_reelle;
! 2253: (*((struct_complexe16 *) (*s_objet_elementaire)
! 2254: .objet)).partie_imaginaire =
! 2255: ((struct_complexe16 **)
! 2256: (*((struct_matrice *)
! 2257: (*(((*s_etat_processus).s_liste_variables
! 2258: [(*s_etat_processus)
! 2259: .position_variable_courante]).objet))
! 2260: .objet)).tableau)[i - 1][j - 1]
! 2261: .partie_imaginaire;
! 2262: }
! 2263: }
! 2264:
! 2265: /*
! 2266: * Recherche de l'élément idoine dans la liste
! 2267: */
! 2268:
! 2269: else if (((*(((*s_etat_processus).s_liste_variables
! 2270: [(*s_etat_processus).position_variable_courante])
! 2271: .objet)).type == LST) &&
! 2272: ((*((struct_fonction *) (*(*l_element_courant)
! 2273: .donnee).objet)).nombre_arguments == 1))
! 2274: {
! 2275: if (depilement(s_etat_processus, &((*s_etat_processus)
! 2276: .l_base_pile), &s_objet_indice_i) == d_erreur)
! 2277: {
! 2278: free(s_objet_elementaire);
! 2279:
! 2280: if (presence_variable_partagee == d_vrai)
! 2281: {
! 2282: (*s_etat_processus).s_liste_variables
! 2283: [(*s_etat_processus)
! 2284: .position_variable_courante].objet
! 2285: = NULL;
! 2286:
! 2287: if (pthread_mutex_unlock(
! 2288: &((*(*s_etat_processus)
! 2289: .s_liste_variables_partagees)
! 2290: .mutex)) != 0)
! 2291: {
! 2292: (*s_etat_processus).erreur_systeme =
! 2293: d_es_processus;
! 2294: }
! 2295: }
! 2296:
! 2297: if (presence_egalite == d_vrai)
! 2298: {
! 2299: liberation(s_etat_processus, s_objet_evalue);
! 2300: }
! 2301:
! 2302: (*s_etat_processus).erreur_execution =
! 2303: d_ex_manque_argument;
! 2304: (*s_etat_processus).instruction_courante =
! 2305: instruction_courante;
! 2306: (*s_etat_processus).mode_execution_programme =
! 2307: registre_mode_execution_programme;
! 2308: return(d_erreur);
! 2309: }
! 2310:
! 2311: if ((*s_objet_indice_i).type != INT)
! 2312: {
! 2313: liberation(s_etat_processus, s_objet_indice_i);
! 2314: free(s_objet_elementaire);
! 2315:
! 2316: if (presence_variable_partagee == d_vrai)
! 2317: {
! 2318: (*s_etat_processus).s_liste_variables
! 2319: [(*s_etat_processus)
! 2320: .position_variable_courante].objet
! 2321: = NULL;
! 2322:
! 2323: if (pthread_mutex_unlock(
! 2324: &((*(*s_etat_processus)
! 2325: .s_liste_variables_partagees)
! 2326: .mutex)) != 0)
! 2327: {
! 2328: (*s_etat_processus).erreur_systeme =
! 2329: d_es_processus;
! 2330: }
! 2331: }
! 2332:
! 2333: if (presence_egalite == d_vrai)
! 2334: {
! 2335: liberation(s_etat_processus, s_objet_evalue);
! 2336: }
! 2337:
! 2338: (*s_etat_processus).erreur_execution =
! 2339: d_ex_erreur_type_argument;
! 2340: (*s_etat_processus).instruction_courante =
! 2341: instruction_courante;
! 2342: (*s_etat_processus).mode_execution_programme =
! 2343: registre_mode_execution_programme;
! 2344: return(d_erreur);
! 2345: }
! 2346:
! 2347: i = (*((integer8 *) (*s_objet_indice_i).objet));
! 2348:
! 2349: liberation(s_etat_processus, s_objet_indice_i);
! 2350:
! 2351: l_sous_element_courant = (*(((*s_etat_processus)
! 2352: .s_liste_variables[(*s_etat_processus)
! 2353: .position_variable_courante]).objet)).objet;
! 2354: j = 0;
! 2355:
! 2356: while(l_sous_element_courant != NULL)
! 2357: {
! 2358: if ((++j) == i)
! 2359: {
! 2360: break;
! 2361: }
! 2362:
! 2363: l_sous_element_courant =
! 2364: (*l_sous_element_courant).suivant;
! 2365: }
! 2366:
! 2367: if (j != i)
! 2368: {
! 2369: free(s_objet_elementaire);
! 2370:
! 2371: if (presence_variable_partagee == d_vrai)
! 2372: {
! 2373: (*s_etat_processus).s_liste_variables
! 2374: [(*s_etat_processus)
! 2375: .position_variable_courante].objet
! 2376: = NULL;
! 2377:
! 2378: if (pthread_mutex_unlock(
! 2379: &((*(*s_etat_processus)
! 2380: .s_liste_variables_partagees)
! 2381: .mutex)) != 0)
! 2382: {
! 2383: (*s_etat_processus).erreur_systeme =
! 2384: d_es_processus;
! 2385: }
! 2386: }
! 2387:
! 2388: if (presence_egalite == d_vrai)
! 2389: {
! 2390: liberation(s_etat_processus, s_objet_evalue);
! 2391: }
! 2392:
! 2393: (*s_etat_processus).erreur_execution =
! 2394: d_ex_element_inexistant;
! 2395: (*s_etat_processus).instruction_courante =
! 2396: instruction_courante;
! 2397: (*s_etat_processus).mode_execution_programme =
! 2398: registre_mode_execution_programme;
! 2399: return(d_erreur);
! 2400: }
! 2401:
! 2402: free(s_objet_elementaire);
! 2403:
! 2404: if ((s_objet_elementaire =
! 2405: copie_objet(s_etat_processus,
! 2406: (*l_sous_element_courant).donnee, 'P')) == NULL)
! 2407: {
! 2408: if (presence_variable_partagee == d_vrai)
! 2409: {
! 2410: (*s_etat_processus).s_liste_variables
! 2411: [(*s_etat_processus)
! 2412: .position_variable_courante].objet
! 2413: = NULL;
! 2414:
! 2415: if (pthread_mutex_unlock(
! 2416: &((*(*s_etat_processus)
! 2417: .s_liste_variables_partagees)
! 2418: .mutex)) != 0)
! 2419: {
! 2420: (*s_etat_processus).erreur_systeme =
! 2421: d_es_processus;
! 2422: }
! 2423: }
! 2424:
! 2425: if (presence_egalite == d_vrai)
! 2426: {
! 2427: liberation(s_etat_processus, s_objet_evalue);
! 2428: }
! 2429:
! 2430: (*s_etat_processus).erreur_systeme =
! 2431: d_es_allocation_memoire;
! 2432: (*s_etat_processus).instruction_courante =
! 2433: instruction_courante;
! 2434: return(d_erreur);
! 2435: }
! 2436: }
! 2437:
! 2438: /*
! 2439: * Recherche de l'élément idoine dans la table
! 2440: */
! 2441:
! 2442: else if (((*(((*s_etat_processus).s_liste_variables
! 2443: [(*s_etat_processus).position_variable_courante])
! 2444: .objet)).type == TAB) &&
! 2445: ((*((struct_fonction *) (*(*l_element_courant)
! 2446: .donnee).objet)).nombre_arguments == 1))
! 2447: {
! 2448: if (depilement(s_etat_processus, &((*s_etat_processus)
! 2449: .l_base_pile), &s_objet_indice_i) == d_erreur)
! 2450: {
! 2451: free(s_objet_elementaire);
! 2452:
! 2453: if (presence_variable_partagee == d_vrai)
! 2454: {
! 2455: (*s_etat_processus).s_liste_variables
! 2456: [(*s_etat_processus)
! 2457: .position_variable_courante].objet
! 2458: = NULL;
! 2459:
! 2460: if (pthread_mutex_unlock(
! 2461: &((*(*s_etat_processus)
! 2462: .s_liste_variables_partagees)
! 2463: .mutex)) != 0)
! 2464: {
! 2465: (*s_etat_processus).erreur_systeme =
! 2466: d_es_processus;
! 2467: }
! 2468: }
! 2469:
! 2470: if (presence_egalite == d_vrai)
! 2471: {
! 2472: liberation(s_etat_processus, s_objet_evalue);
! 2473: }
! 2474:
! 2475: (*s_etat_processus).erreur_execution =
! 2476: d_ex_manque_argument;
! 2477: (*s_etat_processus).instruction_courante =
! 2478: instruction_courante;
! 2479: (*s_etat_processus).mode_execution_programme =
! 2480: registre_mode_execution_programme;
! 2481: return(d_erreur);
! 2482: }
! 2483:
! 2484: if ((*s_objet_indice_i).type != INT)
! 2485: {
! 2486: liberation(s_etat_processus, s_objet_indice_i);
! 2487: free(s_objet_elementaire);
! 2488:
! 2489: if (presence_variable_partagee == d_vrai)
! 2490: {
! 2491: (*s_etat_processus).s_liste_variables
! 2492: [(*s_etat_processus)
! 2493: .position_variable_courante].objet
! 2494: = NULL;
! 2495:
! 2496: if (pthread_mutex_unlock(
! 2497: &((*(*s_etat_processus)
! 2498: .s_liste_variables_partagees)
! 2499: .mutex)) != 0)
! 2500: {
! 2501: (*s_etat_processus).erreur_systeme =
! 2502: d_es_processus;
! 2503: }
! 2504: }
! 2505:
! 2506: if (presence_egalite == d_vrai)
! 2507: {
! 2508: liberation(s_etat_processus, s_objet_evalue);
! 2509: }
! 2510:
! 2511: (*s_etat_processus).erreur_execution =
! 2512: d_ex_erreur_type_argument;
! 2513: (*s_etat_processus).instruction_courante =
! 2514: instruction_courante;
! 2515: (*s_etat_processus).mode_execution_programme =
! 2516: registre_mode_execution_programme;
! 2517: return(d_erreur);
! 2518: }
! 2519:
! 2520: i = (*((integer8 *) (*s_objet_indice_i).objet));
! 2521:
! 2522: liberation(s_etat_processus, s_objet_indice_i);
! 2523:
! 2524: if ((i < 1) || (i > (integer8) (*((struct_tableau *)
! 2525: (*((*s_etat_processus).s_liste_variables
! 2526: [(*s_etat_processus)
! 2527: .position_variable_courante]).objet)
! 2528: .objet)).nombre_elements))
! 2529: {
! 2530: free(s_objet_elementaire);
! 2531:
! 2532: if (presence_variable_partagee == d_vrai)
! 2533: {
! 2534: (*s_etat_processus).s_liste_variables
! 2535: [(*s_etat_processus)
! 2536: .position_variable_courante].objet
! 2537: = NULL;
! 2538:
! 2539: if (pthread_mutex_unlock(
! 2540: &((*(*s_etat_processus)
! 2541: .s_liste_variables_partagees)
! 2542: .mutex)) != 0)
! 2543: {
! 2544: (*s_etat_processus).erreur_systeme =
! 2545: d_es_processus;
! 2546: }
! 2547: }
! 2548:
! 2549: if (presence_egalite == d_vrai)
! 2550: {
! 2551: liberation(s_etat_processus, s_objet_evalue);
! 2552: }
! 2553:
! 2554: (*s_etat_processus).erreur_execution =
! 2555: d_ex_element_inexistant;
! 2556: (*s_etat_processus).instruction_courante =
! 2557: instruction_courante;
! 2558: (*s_etat_processus).mode_execution_programme =
! 2559: registre_mode_execution_programme;
! 2560: return(d_erreur);
! 2561: }
! 2562:
! 2563: free(s_objet_elementaire);
! 2564:
! 2565: if ((s_objet_elementaire =
! 2566: copie_objet(s_etat_processus,
! 2567: (*((struct_tableau *) (*((*s_etat_processus)
! 2568: .s_liste_variables[(*s_etat_processus)
! 2569: .position_variable_courante]).objet)
! 2570: .objet)).elements[i - 1], 'P')) == NULL)
! 2571: {
! 2572: if (presence_variable_partagee == d_vrai)
! 2573: {
! 2574: (*s_etat_processus).s_liste_variables
! 2575: [(*s_etat_processus)
! 2576: .position_variable_courante].objet
! 2577: = NULL;
! 2578:
! 2579: if (pthread_mutex_unlock(
! 2580: &((*(*s_etat_processus)
! 2581: .s_liste_variables_partagees)
! 2582: .mutex)) != 0)
! 2583: {
! 2584: (*s_etat_processus).erreur_systeme =
! 2585: d_es_processus;
! 2586: }
! 2587: }
! 2588:
! 2589: if (presence_egalite == d_vrai)
! 2590: {
! 2591: liberation(s_etat_processus, s_objet_evalue);
! 2592: }
! 2593:
! 2594: (*s_etat_processus).erreur_systeme =
! 2595: d_es_allocation_memoire;
! 2596: (*s_etat_processus).instruction_courante =
! 2597: instruction_courante;
! 2598: return(d_erreur);
! 2599: }
! 2600: }
! 2601: else if (((*(((*s_etat_processus).s_liste_variables
! 2602: [(*s_etat_processus).position_variable_courante])
! 2603: .objet)).type == ALG) ||
! 2604: ((*(((*s_etat_processus).s_liste_variables
! 2605: [(*s_etat_processus).position_variable_courante])
! 2606: .objet)).type == RPN))
! 2607: {
! 2608: registre_evaluation_expression_compilee =
! 2609: (*s_etat_processus)
! 2610: .evaluation_expression_compilee;
! 2611:
! 2612: if (((*s_etat_processus).s_liste_variables
! 2613: [(*s_etat_processus)
! 2614: .position_variable_courante].origine == 'E') &&
! 2615: ((*s_etat_processus).s_liste_variables
! 2616: [(*s_etat_processus).position_variable_courante]
! 2617: .niveau == 0))
! 2618: {
! 2619: (*s_etat_processus).evaluation_expression_compilee =
! 2620: 'Y';
! 2621: }
! 2622: else
! 2623: {
! 2624: (*s_etat_processus).evaluation_expression_compilee =
! 2625: 'N';
! 2626: }
! 2627:
! 2628: if (evaluation(s_etat_processus, (*s_etat_processus)
! 2629: .s_liste_variables[(*s_etat_processus)
! 2630: .position_variable_courante].objet,
! 2631: type_evaluation) == d_erreur)
! 2632: {
! 2633: (*s_etat_processus).evaluation_expression_compilee =
! 2634: registre_evaluation_expression_compilee;
! 2635:
! 2636: if (presence_variable_partagee == d_vrai)
! 2637: {
! 2638: (*s_etat_processus).s_liste_variables
! 2639: [(*s_etat_processus)
! 2640: .position_variable_courante].objet
! 2641: = NULL;
! 2642:
! 2643: if (pthread_mutex_unlock(
! 2644: &((*(*s_etat_processus)
! 2645: .s_liste_variables_partagees)
! 2646: .mutex)) != 0)
! 2647: {
! 2648: (*s_etat_processus).erreur_systeme =
! 2649: d_es_processus;
! 2650: }
! 2651: }
! 2652:
! 2653: if (presence_egalite == d_vrai)
! 2654: {
! 2655: liberation(s_etat_processus, s_objet_evalue);
! 2656: }
! 2657:
! 2658: (*s_etat_processus).instruction_courante =
! 2659: instruction_courante;
! 2660: (*s_etat_processus).mode_execution_programme =
! 2661: registre_mode_execution_programme;
! 2662: return(d_erreur);
! 2663: }
! 2664:
! 2665: (*s_etat_processus).evaluation_expression_compilee =
! 2666: registre_evaluation_expression_compilee;
! 2667:
! 2668: free(s_objet_elementaire);
! 2669:
! 2670: if (depilement(s_etat_processus, &((*s_etat_processus)
! 2671: .l_base_pile), &s_objet_elementaire)
! 2672: == d_erreur)
! 2673: {
! 2674: if (presence_variable_partagee == d_vrai)
! 2675: {
! 2676: (*s_etat_processus).s_liste_variables
! 2677: [(*s_etat_processus)
! 2678: .position_variable_courante].objet
! 2679: = NULL;
! 2680:
! 2681: if (pthread_mutex_unlock(
! 2682: &((*(*s_etat_processus)
! 2683: .s_liste_variables_partagees)
! 2684: .mutex)) != 0)
! 2685: {
! 2686: (*s_etat_processus).erreur_systeme =
! 2687: d_es_processus;
! 2688: }
! 2689: }
! 2690:
! 2691: if (presence_egalite == d_vrai)
! 2692: {
! 2693: liberation(s_etat_processus, s_objet_evalue);
! 2694: }
! 2695:
! 2696: (*s_etat_processus).erreur_execution =
! 2697: d_ex_manque_argument;
! 2698: (*s_etat_processus).instruction_courante =
! 2699: instruction_courante;
! 2700: (*s_etat_processus).mode_execution_programme =
! 2701: registre_mode_execution_programme;
! 2702: return(d_erreur);
! 2703: }
! 2704: }
! 2705: else if ((*(((*s_etat_processus).s_liste_variables
! 2706: [(*s_etat_processus).position_variable_courante])
! 2707: .objet)).type == ADR)
! 2708: {
! 2709: autorisation_empilement_programme = (*s_etat_processus)
! 2710: .autorisation_empilement_programme;
! 2711: registre_position_courante = (*s_etat_processus)
! 2712: .position_courante;
! 2713:
! 2714: empilement_pile_systeme(s_etat_processus);
! 2715:
! 2716: if ((*s_etat_processus).erreur_systeme != d_es)
! 2717: {
! 2718: if (presence_variable_partagee == d_vrai)
! 2719: {
! 2720: (*s_etat_processus).s_liste_variables
! 2721: [(*s_etat_processus)
! 2722: .position_variable_courante].objet
! 2723: = NULL;
! 2724:
! 2725: if (pthread_mutex_unlock(
! 2726: &((*(*s_etat_processus)
! 2727: .s_liste_variables_partagees)
! 2728: .mutex)) != 0)
! 2729: {
! 2730: (*s_etat_processus).erreur_systeme =
! 2731: d_es_processus;
! 2732: }
! 2733: }
! 2734:
! 2735: if (presence_egalite == d_vrai)
! 2736: {
! 2737: liberation(s_etat_processus, s_objet_evalue);
! 2738: }
! 2739:
! 2740: (*s_etat_processus).instruction_courante =
! 2741: instruction_courante;
! 2742: return(d_erreur);
! 2743: }
! 2744:
! 2745: (*(*s_etat_processus).l_base_pile_systeme)
! 2746: .retour_definition = 'Y';
! 2747: (*(*s_etat_processus).l_base_pile_systeme)
! 2748: .origine_routine_evaluation = 'Y';
! 2749:
! 2750: (*s_etat_processus).mode_execution_programme = 'Y';
! 2751: (*s_etat_processus).autorisation_empilement_programme
! 2752: = 'N';
! 2753:
! 2754: (*(*s_etat_processus).l_base_pile_systeme)
! 2755: .niveau_courant = (*s_etat_processus)
! 2756: .niveau_courant;
! 2757:
! 2758: (*s_etat_processus).position_courante =
! 2759: (*((unsigned long *)
! 2760: ((*((*s_etat_processus).s_liste_variables
! 2761: [(*s_etat_processus)
! 2762: .position_variable_courante]
! 2763: .objet)).objet)));
! 2764:
! 2765: if ((*s_etat_processus).profilage == d_vrai)
! 2766: {
! 2767: profilage(s_etat_processus,
! 2768: (*s_etat_processus).s_liste_variables
! 2769: [(*s_etat_processus)
! 2770: .position_variable_courante].nom);
! 2771:
! 2772: if ((*s_etat_processus).erreur_systeme != d_es)
! 2773: {
! 2774: if (presence_variable_partagee == d_vrai)
! 2775: {
! 2776: (*s_etat_processus).s_liste_variables
! 2777: [(*s_etat_processus)
! 2778: .position_variable_courante].objet
! 2779: = NULL;
! 2780:
! 2781: if (pthread_mutex_unlock(
! 2782: &((*(*s_etat_processus)
! 2783: .s_liste_variables_partagees)
! 2784: .mutex)) != 0)
! 2785: {
! 2786: (*s_etat_processus).erreur_systeme =
! 2787: d_es_processus;
! 2788: }
! 2789: }
! 2790:
! 2791: return(d_erreur);
! 2792: }
! 2793: }
! 2794:
! 2795: if (sequenceur(s_etat_processus) == d_erreur)
! 2796: {
! 2797: if (presence_variable_partagee == d_vrai)
! 2798: {
! 2799: (*s_etat_processus).s_liste_variables
! 2800: [(*s_etat_processus)
! 2801: .position_variable_courante].objet
! 2802: = NULL;
! 2803:
! 2804: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 2805: .s_liste_variables_partagees)
! 2806: .mutex)) != 0)
! 2807: {
! 2808: (*s_etat_processus).erreur_systeme =
! 2809: d_es_processus;
! 2810: }
! 2811: }
! 2812:
! 2813: if (presence_egalite == d_vrai)
! 2814: {
! 2815: liberation(s_etat_processus, s_objet_evalue);
! 2816: }
! 2817:
! 2818: (*s_etat_processus).instruction_courante =
! 2819: instruction_courante;
! 2820: (*s_etat_processus).mode_execution_programme =
! 2821: registre_mode_execution_programme;
! 2822: return(d_erreur);
! 2823: }
! 2824:
! 2825: (*s_etat_processus).instruction_courante =
! 2826: instruction_courante;
! 2827: (*s_etat_processus).mode_execution_programme = 'N';
! 2828:
! 2829: depilement_pile_systeme(s_etat_processus);
! 2830:
! 2831: if ((*s_etat_processus).erreur_systeme != d_es)
! 2832: {
! 2833: if (presence_variable_partagee == d_vrai)
! 2834: {
! 2835: (*s_etat_processus).s_liste_variables
! 2836: [(*s_etat_processus)
! 2837: .position_variable_courante].objet
! 2838: = NULL;
! 2839:
! 2840: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 2841: .s_liste_variables_partagees)
! 2842: .mutex)) != 0)
! 2843: {
! 2844: (*s_etat_processus).erreur_systeme =
! 2845: d_es_processus;
! 2846: }
! 2847: }
! 2848:
! 2849: if (presence_egalite == d_vrai)
! 2850: {
! 2851: liberation(s_etat_processus, s_objet_evalue);
! 2852: }
! 2853:
! 2854: return(d_erreur);
! 2855: }
! 2856:
! 2857: (*s_etat_processus).retour_routine_evaluation = 'N';
! 2858: (*s_etat_processus).position_courante =
! 2859: registre_position_courante;
! 2860: (*s_etat_processus).autorisation_empilement_programme =
! 2861: autorisation_empilement_programme;
! 2862:
! 2863: free(s_objet_elementaire);
! 2864:
! 2865: if (depilement(s_etat_processus, &((*s_etat_processus)
! 2866: .l_base_pile), &s_objet_elementaire)
! 2867: == d_erreur)
! 2868: {
! 2869: if (presence_variable_partagee == d_vrai)
! 2870: {
! 2871: (*s_etat_processus).s_liste_variables
! 2872: [(*s_etat_processus)
! 2873: .position_variable_courante].objet
! 2874: = NULL;
! 2875:
! 2876: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 2877: .s_liste_variables_partagees).mutex))
! 2878: != 0)
! 2879: {
! 2880: (*s_etat_processus).erreur_systeme =
! 2881: d_es_processus;
! 2882: }
! 2883: }
! 2884:
! 2885: if (presence_egalite == d_vrai)
! 2886: {
! 2887: liberation(s_etat_processus, s_objet_evalue);
! 2888: }
! 2889:
! 2890: (*s_etat_processus).erreur_execution =
! 2891: d_ex_manque_argument;
! 2892: (*s_etat_processus).instruction_courante =
! 2893: instruction_courante;
! 2894: (*s_etat_processus).mode_execution_programme =
! 2895: registre_mode_execution_programme;
! 2896: return(d_erreur);
! 2897: }
! 2898: }
! 2899: else
! 2900: {
! 2901: if (presence_variable_partagee == d_vrai)
! 2902: {
! 2903: (*s_etat_processus).s_liste_variables
! 2904: [(*s_etat_processus)
! 2905: .position_variable_courante].objet
! 2906: = NULL;
! 2907:
! 2908: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 2909: .s_liste_variables_partagees) .mutex)) != 0)
! 2910: {
! 2911: (*s_etat_processus).erreur_systeme =
! 2912: d_es_processus;
! 2913: }
! 2914: }
! 2915:
! 2916: if (presence_egalite == d_vrai)
! 2917: {
! 2918: liberation(s_etat_processus, s_objet_evalue);
! 2919: }
! 2920:
! 2921: (*s_etat_processus).erreur_execution =
! 2922: d_ex_element_inexistant;
! 2923: (*s_etat_processus).instruction_courante =
! 2924: instruction_courante;
! 2925: (*s_etat_processus).mode_execution_programme =
! 2926: registre_mode_execution_programme;
! 2927:
! 2928: return(d_erreur);
! 2929: }
! 2930:
! 2931: if (empilement(s_etat_processus, &((*s_etat_processus)
! 2932: .l_base_pile), s_objet_elementaire) == d_erreur)
! 2933: {
! 2934: if (presence_variable_partagee == d_vrai)
! 2935: {
! 2936: (*s_etat_processus).s_liste_variables
! 2937: [(*s_etat_processus)
! 2938: .position_variable_courante].objet
! 2939: = NULL;
! 2940:
! 2941: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 2942: .s_liste_variables_partagees).mutex)) != 0)
! 2943: {
! 2944: (*s_etat_processus).erreur_systeme =
! 2945: d_es_processus;
! 2946: }
! 2947: }
! 2948:
! 2949: if (presence_egalite == d_vrai)
! 2950: {
! 2951: liberation(s_etat_processus, s_objet_evalue);
! 2952: }
! 2953:
! 2954: (*s_etat_processus).instruction_courante =
! 2955: instruction_courante;
! 2956: return(d_erreur);
! 2957: }
! 2958:
! 2959: if (presence_variable_partagee == d_vrai)
! 2960: {
! 2961: (*s_etat_processus).s_liste_variables
! 2962: [(*s_etat_processus)
! 2963: .position_variable_courante].objet
! 2964: = NULL;
! 2965:
! 2966: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 2967: .s_liste_variables_partagees).mutex)) != 0)
! 2968: {
! 2969: (*s_etat_processus).erreur_systeme =
! 2970: d_es_processus;
! 2971: }
! 2972: }
! 2973: }
! 2974: }
! 2975: else if (((*(*l_element_courant).donnee).type == ALG)
! 2976: || ((*(*l_element_courant).donnee).type == RPN))
! 2977: {
! 2978: if (type_evaluation == 'I')
! 2979: {
! 2980: if ((s_objet_elementaire = copie_objet(s_etat_processus,
! 2981: (*l_element_courant).donnee, 'P')) == NULL)
! 2982: {
! 2983: if (presence_egalite == d_vrai)
! 2984: {
! 2985: liberation(s_etat_processus, s_objet_evalue);
! 2986: }
! 2987:
! 2988: (*s_etat_processus).erreur_systeme =
! 2989: d_es_allocation_memoire;
! 2990: (*s_etat_processus).instruction_courante =
! 2991: instruction_courante;
! 2992: return(d_erreur);
! 2993: }
! 2994:
! 2995: if (empilement(s_etat_processus, &((*s_etat_processus)
! 2996: .l_base_pile), s_objet_elementaire)
! 2997: == d_erreur)
! 2998: {
! 2999: if (presence_egalite == d_vrai)
! 3000: {
! 3001: liberation(s_etat_processus, s_objet_evalue);
! 3002: }
! 3003:
! 3004: (*s_etat_processus).instruction_courante =
! 3005: instruction_courante;
! 3006: return(d_erreur);
! 3007: }
! 3008: }
! 3009: else
! 3010: {
! 3011: if ((*s_etat_processus).autorisation_empilement_programme
! 3012: == 'N')
! 3013: {
! 3014: registre_evaluation_expression_compilee =
! 3015: (*s_etat_processus)
! 3016: .evaluation_expression_compilee;
! 3017:
! 3018: (*s_etat_processus).evaluation_expression_compilee
! 3019: = 'N';
! 3020:
! 3021: if (evaluation(s_etat_processus, (*l_element_courant)
! 3022: .donnee, type_evaluation) == d_erreur)
! 3023: {
! 3024: (*s_etat_processus).evaluation_expression_compilee
! 3025: = registre_evaluation_expression_compilee;
! 3026:
! 3027: if (presence_egalite == d_vrai)
! 3028: {
! 3029: liberation(s_etat_processus, s_objet_evalue);
! 3030: }
! 3031:
! 3032: (*s_etat_processus).instruction_courante =
! 3033: instruction_courante;
! 3034: (*s_etat_processus).mode_execution_programme =
! 3035: registre_mode_execution_programme;
! 3036: return(d_erreur);
! 3037: }
! 3038:
! 3039: (*s_etat_processus).evaluation_expression_compilee
! 3040: = registre_evaluation_expression_compilee;
! 3041: }
! 3042: else
! 3043: {
! 3044: if ((s_objet_elementaire =
! 3045: copie_objet(s_etat_processus,
! 3046: (*l_element_courant).donnee, 'P')) == NULL)
! 3047: {
! 3048: if (presence_egalite == d_vrai)
! 3049: {
! 3050: liberation(s_etat_processus, s_objet_evalue);
! 3051: }
! 3052:
! 3053: (*s_etat_processus).erreur_systeme =
! 3054: d_es_allocation_memoire;
! 3055: (*s_etat_processus).instruction_courante =
! 3056: instruction_courante;
! 3057: return(d_erreur);
! 3058: }
! 3059:
! 3060: if (empilement(s_etat_processus, &((*s_etat_processus)
! 3061: .l_base_pile), s_objet_elementaire)
! 3062: == d_erreur)
! 3063: {
! 3064: if (presence_egalite == d_vrai)
! 3065: {
! 3066: liberation(s_etat_processus, s_objet_evalue);
! 3067: }
! 3068:
! 3069: (*s_etat_processus).instruction_courante =
! 3070: instruction_courante;
! 3071: return(d_erreur);
! 3072: }
! 3073: }
! 3074: }
! 3075: }
! 3076: else if ((*(*l_element_courant).donnee).type == NOM)
! 3077: {
! 3078: registre_instruction_valide = (*s_etat_processus)
! 3079: .instruction_valide;
! 3080: registre_test = (*s_etat_processus).test_instruction;
! 3081: (*s_etat_processus).test_instruction = 'Y';
! 3082: (*s_etat_processus).instruction_courante = (*((struct_nom *)
! 3083: (*(*l_element_courant).donnee).objet)).nom;
! 3084:
! 3085: analyse(s_etat_processus, NULL);
! 3086:
! 3087: (*s_etat_processus).test_instruction = 'N';
! 3088:
! 3089: if ((*s_etat_processus).instruction_valide == 'Y')
! 3090: {
! 3091: registre_test_2 = (*s_etat_processus).test_instruction;
! 3092: (*s_etat_processus).test_instruction = 'N';
! 3093:
! 3094: analyse(s_etat_processus, NULL);
! 3095:
! 3096: (*s_etat_processus).test_instruction = registre_test_2;
! 3097: }
! 3098: else if ((*s_etat_processus).constante_symbolique == 'N')
! 3099: {
! 3100: if ((s_objet_elementaire = copie_objet(s_etat_processus,
! 3101: (*l_element_courant).donnee, 'P')) == NULL)
! 3102: {
! 3103: if (presence_egalite == d_vrai)
! 3104: {
! 3105: liberation(s_etat_processus, s_objet_evalue);
! 3106: }
! 3107:
! 3108: (*s_etat_processus).erreur_systeme =
! 3109: d_es_allocation_memoire;
! 3110: (*s_etat_processus).instruction_courante =
! 3111: instruction_courante;
! 3112: return(d_erreur);
! 3113: }
! 3114:
! 3115: presence_fonction = d_faux;
! 3116: presence_variable_partagee = d_faux;
! 3117:
! 3118: if (recherche_variable(s_etat_processus, (*((struct_nom *)
! 3119: (*s_objet_elementaire).objet)).nom) == d_faux)
! 3120: {
! 3121: (*s_etat_processus).erreur_systeme = d_es;
! 3122: presence_variable = d_faux;
! 3123: }
! 3124: else
! 3125: {
! 3126: if ((*s_etat_processus).traitement_symbolique == 'N')
! 3127: {
! 3128: if ((*s_etat_processus).s_liste_variables
! 3129: [(*s_etat_processus)
! 3130: .position_variable_courante].objet == NULL)
! 3131: {
! 3132: // Variable partagée
! 3133:
! 3134: if (pthread_mutex_lock(&((*(*s_etat_processus)
! 3135: .s_liste_variables_partagees).mutex))
! 3136: != 0)
! 3137: {
! 3138: (*s_etat_processus).erreur_systeme =
! 3139: d_es_processus;
! 3140: return(d_erreur);
! 3141: }
! 3142:
! 3143: presence_variable_partagee = d_faux;
! 3144:
! 3145: if (recherche_variable_partagee(
! 3146: s_etat_processus,
! 3147: ((*s_etat_processus).s_liste_variables
! 3148: [(*s_etat_processus)
! 3149: .position_variable_courante]).nom,
! 3150: ((*s_etat_processus).s_liste_variables
! 3151: [(*s_etat_processus)
! 3152: .position_variable_courante])
! 3153: .variable_partagee, 'E') == d_vrai)
! 3154: {
! 3155: presence_variable = d_vrai;
! 3156: presence_variable_partagee = d_vrai;
! 3157:
! 3158: if ((*((*(*s_etat_processus)
! 3159: .s_liste_variables_partagees).table
! 3160: [(*(*s_etat_processus)
! 3161: .s_liste_variables_partagees)
! 3162: .position_variable].objet)).type
! 3163: == ADR)
! 3164: {
! 3165: presence_fonction = d_vrai;
! 3166: }
! 3167:
! 3168: if ((type_evaluation == 'N') ||
! 3169: ((*((struct_nom *)
! 3170: (*(*l_element_courant).donnee)
! 3171: .objet)).symbole == d_faux))
! 3172: {
! 3173: if ((s_copie_variable_partagee =
! 3174: copie_objet(s_etat_processus,
! 3175: (*(*s_etat_processus)
! 3176: .s_liste_variables_partagees)
! 3177: .table[(*(*s_etat_processus)
! 3178: .s_liste_variables_partagees)
! 3179: .position_variable].objet, 'P'))
! 3180: == NULL)
! 3181: {
! 3182: if (pthread_mutex_unlock(
! 3183: &((*(*s_etat_processus)
! 3184: .s_liste_variables_partagees
! 3185: ).mutex)) != 0)
! 3186: {
! 3187: (*s_etat_processus)
! 3188: .erreur_systeme =
! 3189: d_es_processus;
! 3190: return(d_erreur);
! 3191: }
! 3192: }
! 3193: }
! 3194: else
! 3195: {
! 3196: s_copie_variable_partagee = NULL;
! 3197: }
! 3198:
! 3199: if (pthread_mutex_unlock(
! 3200: &((*(*s_etat_processus)
! 3201: .s_liste_variables_partagees)
! 3202: .mutex)) != 0)
! 3203: {
! 3204: (*s_etat_processus).erreur_systeme =
! 3205: d_es_processus;
! 3206: return(d_erreur);
! 3207: }
! 3208: }
! 3209: else
! 3210: {
! 3211: (*s_etat_processus).erreur_systeme = d_es;
! 3212: presence_variable = d_faux;
! 3213: presence_variable_partagee = d_faux;
! 3214:
! 3215: if (pthread_mutex_unlock(
! 3216: &((*(*s_etat_processus)
! 3217: .s_liste_variables_partagees)
! 3218: .mutex)) != 0)
! 3219: {
! 3220: (*s_etat_processus).erreur_systeme =
! 3221: d_es_processus;
! 3222: return(d_erreur);
! 3223: }
! 3224: }
! 3225: }
! 3226: else
! 3227: {
! 3228: presence_variable = d_vrai;
! 3229:
! 3230: if ((*((*s_etat_processus)
! 3231: .s_liste_variables
! 3232: [(*s_etat_processus)
! 3233: .position_variable_courante]
! 3234: .objet)).type == ADR)
! 3235: {
! 3236: presence_fonction = d_vrai;
! 3237: }
! 3238: }
! 3239: }
! 3240: else
! 3241: {
! 3242: presence_variable = d_faux;
! 3243: }
! 3244: }
! 3245:
! 3246: liberation(s_etat_processus, s_objet_elementaire);
! 3247:
! 3248: if (presence_fonction == d_vrai)
! 3249: {
! 3250: autorisation_empilement_programme = (*s_etat_processus)
! 3251: .autorisation_empilement_programme;
! 3252: registre_position_courante = (*s_etat_processus)
! 3253: .position_courante;
! 3254:
! 3255: empilement_pile_systeme(s_etat_processus);
! 3256:
! 3257: if ((*s_etat_processus).erreur_systeme != d_es)
! 3258: {
! 3259: if (presence_variable_partagee == d_vrai)
! 3260: {
! 3261: liberation(s_etat_processus,
! 3262: s_copie_variable_partagee);
! 3263: }
! 3264:
! 3265: if (presence_egalite == d_vrai)
! 3266: {
! 3267: liberation(s_etat_processus, s_objet_evalue);
! 3268: }
! 3269:
! 3270: (*s_etat_processus).instruction_courante =
! 3271: instruction_courante;
! 3272: return(d_erreur);
! 3273: }
! 3274:
! 3275: (*(*s_etat_processus).l_base_pile_systeme)
! 3276: .retour_definition = 'Y';
! 3277: (*(*s_etat_processus).l_base_pile_systeme)
! 3278: .origine_routine_evaluation = 'Y';
! 3279:
! 3280: (*s_etat_processus).mode_execution_programme = 'Y';
! 3281: (*s_etat_processus).autorisation_empilement_programme
! 3282: = 'N';
! 3283:
! 3284: (*(*s_etat_processus).l_base_pile_systeme)
! 3285: .niveau_courant = (*s_etat_processus)
! 3286: .niveau_courant;
! 3287:
! 3288: if (presence_variable_partagee == d_faux)
! 3289: {
! 3290: (*s_etat_processus).position_courante =
! 3291: (*((unsigned long *)
! 3292: ((*((*s_etat_processus).s_liste_variables
! 3293: [(*s_etat_processus)
! 3294: .position_variable_courante]
! 3295: .objet)).objet)));
! 3296: }
! 3297: else
! 3298: {
! 3299: (*s_etat_processus).position_courante =
! 3300: (*((unsigned long *)
! 3301: (*s_copie_variable_partagee).objet));
! 3302: liberation(s_etat_processus,
! 3303: s_copie_variable_partagee);
! 3304: }
! 3305:
! 3306: if ((*s_etat_processus).profilage == d_vrai)
! 3307: {
! 3308: profilage(s_etat_processus,
! 3309: (*s_etat_processus).s_liste_variables
! 3310: [(*s_etat_processus)
! 3311: .position_variable_courante].nom);
! 3312:
! 3313: if ((*s_etat_processus).erreur_systeme != d_es)
! 3314: {
! 3315: return(d_erreur);
! 3316: }
! 3317: }
! 3318:
! 3319: if (sequenceur(s_etat_processus) == d_erreur)
! 3320: {
! 3321: if (presence_egalite == d_vrai)
! 3322: {
! 3323: liberation(s_etat_processus, s_objet_evalue);
! 3324: }
! 3325:
! 3326: (*s_etat_processus).instruction_courante =
! 3327: instruction_courante;
! 3328: (*s_etat_processus).mode_execution_programme =
! 3329: registre_mode_execution_programme;
! 3330: return(d_erreur);
! 3331: }
! 3332:
! 3333: (*s_etat_processus).instruction_courante =
! 3334: instruction_courante;
! 3335: (*s_etat_processus).mode_execution_programme = 'N';
! 3336:
! 3337: depilement_pile_systeme(s_etat_processus);
! 3338:
! 3339: if ((*s_etat_processus).erreur_systeme != d_es)
! 3340: {
! 3341: if (presence_egalite == d_vrai)
! 3342: {
! 3343: liberation(s_etat_processus, s_objet_evalue);
! 3344: }
! 3345:
! 3346: return(d_erreur);
! 3347: }
! 3348:
! 3349: (*s_etat_processus).retour_routine_evaluation = 'N';
! 3350: (*s_etat_processus).position_courante =
! 3351: registre_position_courante;
! 3352: (*s_etat_processus).autorisation_empilement_programme =
! 3353: autorisation_empilement_programme;
! 3354: }
! 3355: else if (((type_evaluation == 'N') || ((*((struct_nom *)
! 3356: (*(*l_element_courant).donnee).objet)).symbole ==
! 3357: d_faux)) && (presence_variable == d_vrai))
! 3358: {
! 3359: if (type_evaluation == 'I')
! 3360: {
! 3361: if (presence_variable_partagee == d_faux)
! 3362: {
! 3363: if ((s_sous_objet =
! 3364: copie_objet(s_etat_processus,
! 3365: (*s_etat_processus)
! 3366: .s_liste_variables[(*s_etat_processus)
! 3367: .position_variable_courante].objet,
! 3368: 'P')) == NULL)
! 3369: {
! 3370: if (presence_variable_partagee == d_vrai)
! 3371: {
! 3372: liberation(s_etat_processus,
! 3373: s_copie_variable_partagee);
! 3374: }
! 3375:
! 3376: if (presence_egalite == d_vrai)
! 3377: {
! 3378: liberation(s_etat_processus,
! 3379: s_objet_evalue);
! 3380: }
! 3381:
! 3382: (*s_etat_processus).erreur_systeme =
! 3383: d_es_allocation_memoire;
! 3384: (*s_etat_processus).instruction_courante =
! 3385: instruction_courante;
! 3386: return(d_erreur);
! 3387: }
! 3388:
! 3389: if (empilement(s_etat_processus,
! 3390: &((*s_etat_processus).l_base_pile),
! 3391: s_sous_objet) == d_erreur)
! 3392: {
! 3393: if (presence_variable_partagee == d_vrai)
! 3394: {
! 3395: liberation(s_etat_processus,
! 3396: s_copie_variable_partagee);
! 3397: }
! 3398:
! 3399: if (presence_egalite == d_vrai)
! 3400: {
! 3401: liberation(s_etat_processus,
! 3402: s_objet_evalue);
! 3403: }
! 3404:
! 3405: return(d_erreur);
! 3406: }
! 3407: }
! 3408: else
! 3409: {
! 3410: if (empilement(s_etat_processus,
! 3411: &((*s_etat_processus).l_base_pile),
! 3412: s_copie_variable_partagee) == d_erreur)
! 3413: {
! 3414: if (presence_variable_partagee == d_vrai)
! 3415: {
! 3416: liberation(s_etat_processus,
! 3417: s_copie_variable_partagee);
! 3418: }
! 3419:
! 3420: if (presence_egalite == d_vrai)
! 3421: {
! 3422: liberation(s_etat_processus,
! 3423: s_objet_evalue);
! 3424: }
! 3425:
! 3426: return(d_erreur);
! 3427: }
! 3428: }
! 3429: }
! 3430: else
! 3431: {
! 3432: registre_evaluation_expression_compilee =
! 3433: (*s_etat_processus)
! 3434: .evaluation_expression_compilee;
! 3435:
! 3436: if (((*s_etat_processus).s_liste_variables
! 3437: [(*s_etat_processus)
! 3438: .position_variable_courante].origine == 'E')
! 3439: && ((*s_etat_processus).s_liste_variables
! 3440: [(*s_etat_processus)
! 3441: .position_variable_courante].niveau == 0))
! 3442: {
! 3443: (*s_etat_processus)
! 3444: .evaluation_expression_compilee = 'Y';
! 3445: }
! 3446: else
! 3447: {
! 3448: (*s_etat_processus)
! 3449: .evaluation_expression_compilee = 'N';
! 3450: }
! 3451:
! 3452: if (presence_variable_partagee == d_faux)
! 3453: {
! 3454: if ((*s_etat_processus).profilage == d_vrai)
! 3455: {
! 3456: profilage(s_etat_processus,
! 3457: (*s_etat_processus)
! 3458: .s_liste_variables
! 3459: [(*s_etat_processus)
! 3460: .position_variable_courante].nom);
! 3461:
! 3462: if ((*s_etat_processus).erreur_systeme
! 3463: != d_es)
! 3464: {
! 3465: return(d_erreur);
! 3466: }
! 3467: }
! 3468:
! 3469: registre_niveau_courant = (*(*s_etat_processus)
! 3470: .l_base_pile_systeme).niveau_courant;
! 3471: registre_retour_definition =
! 3472: (*(*s_etat_processus)
! 3473: .l_base_pile_systeme).retour_definition;
! 3474:
! 3475: (*(*s_etat_processus).l_base_pile_systeme)
! 3476: .retour_definition = 'Y';
! 3477: (*(*s_etat_processus).l_base_pile_systeme)
! 3478: .niveau_courant = (*s_etat_processus)
! 3479: .niveau_courant;
! 3480: empilement_pile_systeme(s_etat_processus);
! 3481:
! 3482: if (evaluation(s_etat_processus,
! 3483: (*s_etat_processus)
! 3484: .s_liste_variables[(*s_etat_processus)
! 3485: .position_variable_courante].objet,
! 3486: type_evaluation) == d_erreur)
! 3487: {
! 3488: depilement_pile_systeme(s_etat_processus);
! 3489:
! 3490: (*(*s_etat_processus).l_base_pile_systeme)
! 3491: .niveau_courant =
! 3492: (*(*s_etat_processus).l_base_pile_systeme)
! 3493: .retour_definition =
! 3494: registre_retour_definition;
! 3495:
! 3496: if ((*s_etat_processus).profilage == d_vrai)
! 3497: {
! 3498: profilage(s_etat_processus, NULL);
! 3499: }
! 3500:
! 3501: (*s_etat_processus)
! 3502: .evaluation_expression_compilee =
! 3503: registre_evaluation_expression_compilee;
! 3504:
! 3505: if (presence_egalite == d_vrai)
! 3506: {
! 3507: liberation(s_etat_processus,
! 3508: s_objet_evalue);
! 3509: }
! 3510:
! 3511: (*s_etat_processus).instruction_courante =
! 3512: instruction_courante;
! 3513: (*s_etat_processus).mode_execution_programme
! 3514: = registre_mode_execution_programme;
! 3515: return(d_erreur);
! 3516: }
! 3517:
! 3518: depilement_pile_systeme(s_etat_processus);
! 3519:
! 3520: (*(*s_etat_processus).l_base_pile_systeme)
! 3521: .niveau_courant =
! 3522: (*(*s_etat_processus).l_base_pile_systeme)
! 3523: .retour_definition =
! 3524: registre_retour_definition;
! 3525: }
! 3526: else
! 3527: {
! 3528: if ((*s_etat_processus).profilage == d_vrai)
! 3529: {
! 3530: profilage(s_etat_processus,
! 3531: (*s_etat_processus)
! 3532: .s_liste_variables
! 3533: [(*s_etat_processus)
! 3534: .position_variable_courante].nom);
! 3535:
! 3536: if ((*s_etat_processus).erreur_systeme
! 3537: != d_es)
! 3538: {
! 3539: return(d_erreur);
! 3540: }
! 3541: }
! 3542:
! 3543: empilement_pile_systeme(s_etat_processus);
! 3544: (*(*s_etat_processus).l_base_pile_systeme)
! 3545: .retour_definition = 'Y';
! 3546: (*(*s_etat_processus).l_base_pile_systeme)
! 3547: .niveau_courant = (*s_etat_processus)
! 3548: .niveau_courant;
! 3549: empilement_pile_systeme(s_etat_processus);
! 3550:
! 3551: if (evaluation(s_etat_processus,
! 3552: s_copie_variable_partagee,
! 3553: type_evaluation) == d_erreur)
! 3554: {
! 3555: depilement_pile_systeme(s_etat_processus);
! 3556: depilement_pile_systeme(s_etat_processus);
! 3557:
! 3558: liberation(s_etat_processus,
! 3559: s_copie_variable_partagee);
! 3560:
! 3561: if ((*s_etat_processus).profilage == d_vrai)
! 3562: {
! 3563: profilage(s_etat_processus, NULL);
! 3564: }
! 3565:
! 3566: (*s_etat_processus)
! 3567: .evaluation_expression_compilee =
! 3568: registre_evaluation_expression_compilee;
! 3569:
! 3570: if (presence_egalite == d_vrai)
! 3571: {
! 3572: liberation(s_etat_processus,
! 3573: s_objet_evalue);
! 3574: }
! 3575:
! 3576: (*s_etat_processus).instruction_courante =
! 3577: instruction_courante;
! 3578: (*s_etat_processus).mode_execution_programme
! 3579: = registre_mode_execution_programme;
! 3580: return(d_erreur);
! 3581: }
! 3582:
! 3583: depilement_pile_systeme(s_etat_processus);
! 3584: depilement_pile_systeme(s_etat_processus);
! 3585:
! 3586: liberation(s_etat_processus,
! 3587: s_copie_variable_partagee);
! 3588: }
! 3589:
! 3590: if ((*s_etat_processus).profilage == d_vrai)
! 3591: {
! 3592: profilage(s_etat_processus, NULL);
! 3593: }
! 3594:
! 3595: (*s_etat_processus)
! 3596: .evaluation_expression_compilee =
! 3597: registre_evaluation_expression_compilee;
! 3598: }
! 3599: }
! 3600: else
! 3601: {
! 3602: if (presence_variable_partagee == d_vrai)
! 3603: {
! 3604: liberation(s_etat_processus,
! 3605: s_copie_variable_partagee);
! 3606: }
! 3607:
! 3608: if ((s_objet_elementaire =
! 3609: copie_objet(s_etat_processus,
! 3610: (*l_element_courant).donnee, 'P')) == NULL)
! 3611: {
! 3612: if (presence_egalite == d_vrai)
! 3613: {
! 3614: liberation(s_etat_processus, s_objet_evalue);
! 3615: }
! 3616:
! 3617: (*s_etat_processus).erreur_systeme =
! 3618: d_es_allocation_memoire;
! 3619: (*s_etat_processus).instruction_courante =
! 3620: instruction_courante;
! 3621: return(d_erreur);
! 3622: }
! 3623:
! 3624: /*
! 3625: * Vérification du drapeau symbole pour
! 3626: * savoir si l'on met dans la pile le nom
! 3627: * ou le contenu de la variable.
! 3628: */
! 3629:
! 3630: if (((*((struct_nom *) (*s_objet_elementaire).objet))
! 3631: .symbole == d_faux) && ((*s_etat_processus)
! 3632: .traitement_symbolique == 'N'))
! 3633: {
! 3634: if (recherche_variable(s_etat_processus,
! 3635: (*((struct_nom *) (*s_objet_elementaire)
! 3636: .objet)).nom) == d_vrai)
! 3637: {
! 3638: if ((*s_etat_processus).s_liste_variables
! 3639: [(*s_etat_processus)
! 3640: .position_variable_courante].objet
! 3641: == NULL)
! 3642: {
! 3643: // Variable partagée
! 3644:
! 3645: if (pthread_mutex_lock(
! 3646: &((*(*s_etat_processus)
! 3647: .s_liste_variables_partagees)
! 3648: .mutex)) != 0)
! 3649: {
! 3650: (*s_etat_processus).erreur_systeme =
! 3651: d_es_processus;
! 3652: return(d_erreur);
! 3653: }
! 3654:
! 3655: if (recherche_variable_partagee(
! 3656: s_etat_processus,
! 3657: ((*s_etat_processus)
! 3658: .s_liste_variables
! 3659: [(*s_etat_processus)
! 3660: .position_variable_courante]).nom,
! 3661: ((*s_etat_processus)
! 3662: .s_liste_variables
! 3663: [(*s_etat_processus)
! 3664: .position_variable_courante])
! 3665: .variable_partagee, 'E') == d_vrai)
! 3666: {
! 3667: liberation(s_etat_processus,
! 3668: s_objet_elementaire);
! 3669:
! 3670: if ((s_objet_elementaire =
! 3671: copie_objet(s_etat_processus,
! 3672: (*(*s_etat_processus)
! 3673: .s_liste_variables_partagees)
! 3674: .table[(*(*s_etat_processus)
! 3675: .s_liste_variables_partagees)
! 3676: .position_variable].objet,
! 3677: 'P')) == NULL)
! 3678: {
! 3679: if (pthread_mutex_unlock(
! 3680: &((*(*s_etat_processus)
! 3681: .s_liste_variables_partagees
! 3682: ).mutex)) != 0)
! 3683: {
! 3684: (*s_etat_processus)
! 3685: .erreur_systeme =
! 3686: d_es_processus;
! 3687: return(d_erreur);
! 3688: }
! 3689:
! 3690: if (presence_egalite == d_vrai)
! 3691: {
! 3692: liberation(s_etat_processus,
! 3693: s_objet_evalue);
! 3694: }
! 3695:
! 3696: (*s_etat_processus).erreur_systeme =
! 3697: d_es_allocation_memoire;
! 3698: (*s_etat_processus)
! 3699: .instruction_courante =
! 3700: instruction_courante;
! 3701: return(d_erreur);
! 3702: }
! 3703: }
! 3704:
! 3705: if (pthread_mutex_unlock(
! 3706: &((*(*s_etat_processus)
! 3707: .s_liste_variables_partagees)
! 3708: .mutex)) != 0)
! 3709: {
! 3710: (*s_etat_processus).erreur_systeme =
! 3711: d_es_processus;
! 3712: return(d_erreur);
! 3713: }
! 3714: }
! 3715: else
! 3716: {
! 3717: // Variable privée
! 3718:
! 3719: liberation(s_etat_processus,
! 3720: s_objet_elementaire);
! 3721:
! 3722: if ((s_objet_elementaire =
! 3723: copie_objet(s_etat_processus,
! 3724: (*s_etat_processus)
! 3725: .s_liste_variables
! 3726: [(*s_etat_processus)
! 3727: .position_variable_courante].objet,
! 3728: 'P')) == NULL)
! 3729: {
! 3730: if (presence_egalite == d_vrai)
! 3731: {
! 3732: liberation(s_etat_processus,
! 3733: s_objet_evalue);
! 3734: }
! 3735:
! 3736: (*s_etat_processus).erreur_systeme =
! 3737: d_es_allocation_memoire;
! 3738: (*s_etat_processus)
! 3739: .instruction_courante =
! 3740: instruction_courante;
! 3741: return(d_erreur);
! 3742: }
! 3743: }
! 3744: }
! 3745: else
! 3746: {
! 3747: (*s_etat_processus).erreur_systeme = d_es;
! 3748:
! 3749: (*((struct_nom *) (*s_objet_elementaire)
! 3750: .objet)).symbole = d_vrai;
! 3751: }
! 3752: }
! 3753:
! 3754: if (empilement(s_etat_processus, &((*s_etat_processus)
! 3755: .l_base_pile), s_objet_elementaire) == d_erreur)
! 3756: {
! 3757: if (presence_egalite == d_vrai)
! 3758: {
! 3759: liberation(s_etat_processus, s_objet_evalue);
! 3760: }
! 3761:
! 3762: (*s_etat_processus).instruction_courante =
! 3763: instruction_courante;
! 3764: return(d_erreur);
! 3765: }
! 3766:
! 3767: if ((*s_etat_processus).erreur_execution ==
! 3768: d_ex_variable_non_definie)
! 3769: {
! 3770: (*s_etat_processus).erreur_execution = d_ex;
! 3771: }
! 3772: }
! 3773: }
! 3774: else
! 3775: {
! 3776: registre_type_evaluation = (test_cfsf(s_etat_processus, 35)
! 3777: == d_vrai) ? 'E' : 'N';
! 3778:
! 3779: if (type_evaluation == 'N')
! 3780: {
! 3781: cf(s_etat_processus, 35);
! 3782: }
! 3783: else
! 3784: {
! 3785: sf(s_etat_processus, 35);
! 3786: }
! 3787:
! 3788: analyse(s_etat_processus, NULL);
! 3789:
! 3790: if (registre_type_evaluation == 'E')
! 3791: {
! 3792: sf(s_etat_processus, 35);
! 3793: }
! 3794: else
! 3795: {
! 3796: cf(s_etat_processus, 35);
! 3797: }
! 3798:
! 3799: if (((*s_etat_processus).erreur_systeme != d_es) ||
! 3800: ((*s_etat_processus).erreur_execution != d_ex) ||
! 3801: ((*s_etat_processus).exception != d_ep))
! 3802: {
! 3803: if (presence_egalite == d_vrai)
! 3804: {
! 3805: liberation(s_etat_processus, s_objet_evalue);
! 3806: }
! 3807:
! 3808: (*s_etat_processus).instruction_courante =
! 3809: instruction_courante;
! 3810: (*s_etat_processus).mode_execution_programme =
! 3811: registre_mode_execution_programme;
! 3812: return(d_erreur);
! 3813: }
! 3814: }
! 3815:
! 3816: (*s_etat_processus).instruction_courante =
! 3817: instruction_courante;
! 3818: (*s_etat_processus).test_instruction = registre_test;
! 3819: (*s_etat_processus).instruction_valide =
! 3820: registre_instruction_valide;
! 3821: }
! 3822: else
! 3823: {
! 3824: if ((s_objet_tampon = copie_objet(s_etat_processus,
! 3825: (*l_element_courant).donnee, 'P')) == NULL)
! 3826: {
! 3827: (*s_etat_processus).erreur_systeme =
! 3828: d_es_allocation_memoire;
! 3829: (*s_etat_processus).instruction_courante =
! 3830: instruction_courante;
! 3831: return(d_erreur);
! 3832: }
! 3833:
! 3834: if (empilement(s_etat_processus, &((*s_etat_processus)
! 3835: .l_base_pile), s_objet_tampon) == d_erreur)
! 3836: {
! 3837: if (presence_egalite == d_vrai)
! 3838: {
! 3839: liberation(s_etat_processus, s_objet_evalue);
! 3840: }
! 3841:
! 3842: (*s_etat_processus).instruction_courante =
! 3843: instruction_courante;
! 3844: return(d_erreur);
! 3845: }
! 3846: }
! 3847:
! 3848: // Traitement de l'instruction EXIT en mode interactif
! 3849:
! 3850: if (l_element_courant != NULL)
! 3851: {
! 3852: l_element_courant = (*l_element_courant).suivant;
! 3853: }
! 3854: else
! 3855: {
! 3856: (*s_etat_processus).mode_execution_programme = 'Y';
! 3857:
! 3858: if ((*s_etat_processus).niveau_courant == 1)
! 3859: {
! 3860: (*s_etat_processus).debug_programme = d_faux;
! 3861: (*s_etat_processus).execution_pas_suivant = d_vrai;
! 3862: }
! 3863: }
! 3864:
! 3865: if ((*s_etat_processus).traitement_cycle_exit != 'N')
! 3866: {
! 3867: registre_expression_courante =
! 3868: (*s_etat_processus).expression_courante;
! 3869: (*s_etat_processus).expression_courante =
! 3870: l_element_courant;
! 3871:
! 3872: switch((*s_etat_processus).traitement_cycle_exit)
! 3873: {
! 3874: case 'C' :
! 3875: {
! 3876: instruction_cycle(s_etat_processus);
! 3877: break;
! 3878: }
! 3879:
! 3880: case 'E' :
! 3881: {
! 3882: instruction_exit(s_etat_processus);
! 3883: break;
! 3884: }
! 3885: }
! 3886:
! 3887: l_element_courant = (*s_etat_processus).expression_courante;
! 3888: (*s_etat_processus).expression_courante =
! 3889: registre_expression_courante;
! 3890: }
! 3891: }
! 3892:
! 3893: if (niveau_initial < (*s_etat_processus).niveau_courant)
! 3894: {
! 3895: /*
! 3896: * Retrait des variables dans le cas où l'évaluation de
! 3897: * l'expression a été interrompue
! 3898: */
! 3899:
! 3900: (*s_etat_processus).niveau_courant = niveau_initial;
! 3901:
! 3902: for(m = 0, n = 0; n < (*s_etat_processus).nombre_variables; n++)
! 3903: {
! 3904: if ((*s_etat_processus).s_liste_variables[n].niveau
! 3905: > niveau_initial)
! 3906: {
! 3907: m++;
! 3908: }
! 3909: }
! 3910:
! 3911: registre_variables = (*s_etat_processus).s_liste_variables;
! 3912: (*s_etat_processus).nombre_variables -= m;
! 3913:
! 3914: if (((*s_etat_processus).s_liste_variables = malloc(
! 3915: (*s_etat_processus).nombre_variables *
! 3916: sizeof(struct_variable))) == NULL)
! 3917: {
! 3918: if (presence_egalite == d_vrai)
! 3919: {
! 3920: liberation(s_etat_processus, s_objet_evalue);
! 3921: }
! 3922:
! 3923: (*s_etat_processus).instruction_courante = instruction_courante;
! 3924: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3925: return(d_erreur);
! 3926: }
! 3927:
! 3928: for(m = 0, n = 0; n < (*s_etat_processus).nombre_variables; n++)
! 3929: {
! 3930: if (registre_variables[n + m].niveau > niveau_initial)
! 3931: {
! 3932: free(registre_variables[n + m].nom);
! 3933: liberation(s_etat_processus,
! 3934: registre_variables[n + m].objet);
! 3935: m++;
! 3936: n--;
! 3937: }
! 3938: else
! 3939: {
! 3940: (*s_etat_processus).s_liste_variables[n] =
! 3941: registre_variables[n + m];
! 3942: }
! 3943: }
! 3944:
! 3945: free(registre_variables);
! 3946: }
! 3947:
! 3948: /*
! 3949: * Retrait des variables statiques créées dans l'expression
! 3950: */
! 3951:
! 3952: for(n = 0; n < (*s_etat_processus).nombre_variables_statiques; n++)
! 3953: {
! 3954: if ((*s_etat_processus).s_liste_variables_statiques[n]
! 3955: .niveau > (*s_etat_processus).niveau_courant)
! 3956: {
! 3957: if (retrait_variable_statique(s_etat_processus,
! 3958: (*s_etat_processus).s_liste_variables_statiques[n].nom,
! 3959: (*s_etat_processus).s_liste_variables_statiques[n]
! 3960: .variable_statique) == d_erreur)
! 3961: {
! 3962: if (presence_egalite == d_vrai)
! 3963: {
! 3964: liberation(s_etat_processus, s_objet_evalue);
! 3965: }
! 3966:
! 3967: (*s_etat_processus).instruction_courante =
! 3968: instruction_courante;
! 3969: (*s_etat_processus).mode_execution_programme =
! 3970: registre_mode_execution_programme;
! 3971: return(d_erreur);
! 3972: }
! 3973: }
! 3974: }
! 3975:
! 3976: /*
! 3977: * Retrait des variables partagées créées dans l'expression
! 3978: */
! 3979:
! 3980: if (pthread_mutex_lock(&((*(*s_etat_processus)
! 3981: .s_liste_variables_partagees).mutex)) != 0)
! 3982: {
! 3983: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3984: return(d_erreur);
! 3985: }
! 3986:
! 3987: for(n = 0; n < (*(*s_etat_processus).s_liste_variables_partagees)
! 3988: .nombre_variables; n++)
! 3989: {
! 3990: if ((*(*s_etat_processus).s_liste_variables_partagees).table[n]
! 3991: .niveau > (*s_etat_processus).niveau_courant)
! 3992: {
! 3993: if (retrait_variable_partagee(s_etat_processus,
! 3994: (*(*s_etat_processus).s_liste_variables_partagees)
! 3995: .table[n].nom, (*(*s_etat_processus)
! 3996: .s_liste_variables_partagees).table[n]
! 3997: .variable_partagee) == d_erreur)
! 3998: {
! 3999: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 4000: .s_liste_variables_partagees).mutex)) != 0)
! 4001: {
! 4002: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4003: return(d_erreur);
! 4004: }
! 4005:
! 4006: if (presence_egalite == d_vrai)
! 4007: {
! 4008: liberation(s_etat_processus, s_objet_evalue);
! 4009: }
! 4010:
! 4011: (*s_etat_processus).instruction_courante =
! 4012: instruction_courante;
! 4013: (*s_etat_processus).mode_execution_programme =
! 4014: registre_mode_execution_programme;
! 4015: return(d_erreur);
! 4016: }
! 4017: }
! 4018: }
! 4019:
! 4020: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 4021: .s_liste_variables_partagees).mutex)) != 0)
! 4022: {
! 4023: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4024: return(d_erreur);
! 4025: }
! 4026:
! 4027: if ((*s_etat_processus).var_volatile_requete_arret != 0)
! 4028: {
! 4029: // Restauration de la pile système
! 4030:
! 4031: while(pile_systeme_originelle !=
! 4032: (*s_etat_processus).l_base_pile_systeme)
! 4033: {
! 4034: depilement_pile_systeme(s_etat_processus);
! 4035: }
! 4036: }
! 4037:
! 4038: if (presence_egalite == d_vrai)
! 4039: {
! 4040: // Ajout du membre évalué lors de la première passe
! 4041:
! 4042: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 4043: s_objet_evalue) == d_erreur)
! 4044: {
! 4045: (*s_etat_processus).instruction_courante =
! 4046: instruction_courante;
! 4047: return(d_erreur);
! 4048: }
! 4049:
! 4050: instruction_swap(s_etat_processus);
! 4051:
! 4052: if ((*s_etat_processus).erreur_execution != d_ex)
! 4053: {
! 4054: (*s_etat_processus).mode_execution_programme =
! 4055: registre_mode_execution_programme;
! 4056: (*s_etat_processus).autorisation_empilement_programme =
! 4057: autorisation_empilement_programme;
! 4058: (*s_etat_processus).instruction_courante = instruction_courante;
! 4059: (*(*s_etat_processus).l_base_pile_systeme).retour_definition =
! 4060: registre_retour_definition;
! 4061:
! 4062: return(d_erreur);
! 4063: }
! 4064:
! 4065: instruction_egalite(s_etat_processus);
! 4066:
! 4067: if ((*s_etat_processus).erreur_execution != d_ex)
! 4068: {
! 4069: (*s_etat_processus).mode_execution_programme =
! 4070: registre_mode_execution_programme;
! 4071: (*s_etat_processus).autorisation_empilement_programme =
! 4072: autorisation_empilement_programme;
! 4073: (*s_etat_processus).instruction_courante = instruction_courante;
! 4074: (*(*s_etat_processus).l_base_pile_systeme).retour_definition =
! 4075: registre_retour_definition;
! 4076:
! 4077: return(d_erreur);
! 4078: }
! 4079: }
! 4080:
! 4081: (*s_etat_processus).autorisation_empilement_programme =
! 4082: autorisation_empilement_programme;
! 4083: (*s_etat_processus).instruction_courante = instruction_courante;
! 4084: (*(*s_etat_processus).l_base_pile_systeme).retour_definition =
! 4085: registre_retour_definition;
! 4086: }
! 4087: else if ((*s_objet).type == FCT)
! 4088: {
! 4089: (*s_etat_processus).instruction_courante =
! 4090: (*((struct_fonction *) (*s_objet).objet)).nom_fonction;
! 4091:
! 4092: analyse(s_etat_processus, (*((struct_fonction *)
! 4093: (*s_objet).objet)).fonction);
! 4094:
! 4095: (*s_etat_processus).instruction_courante = instruction_courante;
! 4096:
! 4097: if (((*s_etat_processus).erreur_systeme != d_es) ||
! 4098: ((*s_etat_processus).erreur_execution != d_ex) ||
! 4099: ((*s_etat_processus).exception != d_ep))
! 4100: {
! 4101: (*s_etat_processus).instruction_courante = instruction_courante;
! 4102: (*s_etat_processus).mode_execution_programme =
! 4103: registre_mode_execution_programme;
! 4104: return(d_erreur);
! 4105: }
! 4106: }
! 4107: else
! 4108: {
! 4109: if ((s_objet_tampon = copie_objet(s_etat_processus, s_objet, 'P'))
! 4110: == NULL)
! 4111: {
! 4112: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 4113: (*s_etat_processus).instruction_courante = instruction_courante;
! 4114: return(d_erreur);
! 4115: }
! 4116:
! 4117: if (empilement(s_etat_processus, &((*s_etat_processus)
! 4118: .l_base_pile), s_objet_tampon) == d_erreur)
! 4119: {
! 4120: (*s_etat_processus).instruction_courante = instruction_courante;
! 4121: return(d_erreur);
! 4122: }
! 4123: }
! 4124:
! 4125: (*s_etat_processus).mode_execution_programme =
! 4126: registre_mode_execution_programme;
! 4127:
! 4128: return((erreur_evaluation == d_absence_erreur)
! 4129: ? d_absence_erreur : d_erreur);
! 4130: }
! 4131:
! 4132: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>