Annotation of rpl/src/instructions_d3.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:
! 26: /*
! 27: ================================================================================
! 28: Fonction 'draw'
! 29: ================================================================================
! 30: Entrées : pointeur sur une structure struct_processus
! 31: --------------------------------------------------------------------------------
! 32: Sorties :
! 33: --------------------------------------------------------------------------------
! 34: Effets de bord : néant
! 35: ================================================================================
! 36: */
! 37:
! 38: void
! 39: instruction_draw(struct_processus *s_etat_processus)
! 40: {
! 41: file *entree_standard;
! 42: file *fichier;
! 43:
! 44: int dimensions;
! 45:
! 46: logical1 last_valide;
! 47: logical1 premiere_iteration;
! 48: logical1 presence_variable;
! 49: logical1 retour_suite_erreur;
! 50:
! 51: long hauteur_pile;
! 52: long i;
! 53:
! 54: real8 borne_maximale_x;
! 55: real8 borne_maximale_y;
! 56: real8 borne_minimale_x;
! 57: real8 borne_minimale_y;
! 58: real8 dernier_point_valide[3];
! 59: real8 r;
! 60: real8 t;
! 61: real8 x;
! 62: real8 y;
! 63:
! 64: struct_fichier_graphique *l_fichier_courant;
! 65: struct_fichier_graphique *l_fichier_precedent;
! 66:
! 67: struct_liste_chainee *l_element_courant;
! 68:
! 69: struct_liste_pile_systeme *l_position_normale;
! 70:
! 71: struct_objet *s_objet;
! 72: struct_objet *s_objet_evalue;
! 73:
! 74: struct_variable s_variable_x;
! 75: struct_variable s_variable_y;
! 76:
! 77: unsigned char mode_evaluation_expression;
! 78: unsigned char *nom_fichier;
! 79: unsigned char *nom_fichier_converti;
! 80: unsigned char *nom_x;
! 81: unsigned char *nom_y;
! 82:
! 83: unsigned long niveau_courant;
! 84:
! 85: (*s_etat_processus).erreur_execution = d_ex;
! 86:
! 87: if ((*s_etat_processus).affichage_arguments == 'Y')
! 88: {
! 89: printf("\n DRAW ");
! 90:
! 91: if ((*s_etat_processus).langue == 'F')
! 92: {
! 93: printf("(trace un graphe)\n\n");
! 94: printf(" Aucun argument\n");
! 95: }
! 96: else
! 97: {
! 98: printf("(plot a graphic)\n\n");
! 99: printf(" No argument\n");
! 100: }
! 101:
! 102: return;
! 103: }
! 104: else if ((*s_etat_processus).test_instruction == 'Y')
! 105: {
! 106: (*s_etat_processus).nombre_arguments = -1;
! 107: return;
! 108: }
! 109:
! 110: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
! 111: {
! 112: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 113: {
! 114: return;
! 115: }
! 116:
! 117: cf(s_etat_processus, 31);
! 118: }
! 119:
! 120: /*
! 121: * Tracé y=f(x)
! 122: * Les bornes de variation de X sont données dans l'ordre
! 123: * - soit sous la forme "{ X X_min X_max } INDEP" ;
! 124: * - soit par les parties réelles de PMIN et PMAX.
! 125: * INDEP et DEPND testent leurs arguments pour que les pointeurs
! 126: * indep et depend désignent des objets de type NOM ou LST à
! 127: * trois éléments.
! 128: */
! 129:
! 130: if ((strcmp((*s_etat_processus).type_trace_eq, "FONCTION") == 0) ||
! 131: (strcmp((*s_etat_processus).type_trace_eq, "ECHANTILLONS") == 0))
! 132: {
! 133: dimensions = 2;
! 134:
! 135: /*
! 136: * Vérification de la présence de la variable globale EQ
! 137: */
! 138:
! 139: if (recherche_variable(s_etat_processus, "EQ") == d_faux)
! 140: {
! 141: /*
! 142: * Aucune variable "EQ" n'existe.
! 143: */
! 144:
! 145: (*s_etat_processus).erreur_execution = d_ex_absence_equation;
! 146: (*s_etat_processus).erreur_systeme = d_es;
! 147:
! 148: if (last_valide == d_vrai)
! 149: {
! 150: sf(s_etat_processus, 31);
! 151: }
! 152:
! 153: return;
! 154: }
! 155:
! 156: /*
! 157: * Recherche de la variable globale "EQ"
! 158: */
! 159:
! 160: i = (*s_etat_processus).position_variable_courante;
! 161: presence_variable = d_faux;
! 162:
! 163: while(i >= 0)
! 164: {
! 165: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 166: "EQ") == 0) && ((*s_etat_processus)
! 167: .s_liste_variables[i].niveau == 1))
! 168: {
! 169: presence_variable = d_vrai;
! 170: break;
! 171: }
! 172:
! 173: i--;
! 174: }
! 175:
! 176: if (presence_variable == d_faux)
! 177: {
! 178: (*s_etat_processus).erreur_execution = d_ex_absence_equation;
! 179:
! 180: if (last_valide == d_vrai)
! 181: {
! 182: sf(s_etat_processus, 31);
! 183: }
! 184:
! 185: return;
! 186: }
! 187:
! 188: if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
! 189: {
! 190: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
! 191: return;
! 192: }
! 193:
! 194: /*
! 195: * Création du fichier graphique temporaire
! 196: */
! 197:
! 198: if ((nom_fichier = creation_nom_fichier(s_etat_processus,
! 199: (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
! 200: {
! 201: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 202: return;
! 203: }
! 204:
! 205: if ((fichier = fopen(nom_fichier, "w+")) == NULL)
! 206: {
! 207: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 208: return;
! 209: }
! 210:
! 211: /*
! 212: * Récupération du domaine de variation de x
! 213: */
! 214:
! 215: if ((*(*s_etat_processus).indep).type == LST)
! 216: {
! 217: l_element_courant = (*(*s_etat_processus).indep).objet;
! 218:
! 219: if ((s_variable_x.nom = malloc((strlen((*((struct_nom *)
! 220: (*(*l_element_courant).donnee).objet)).nom) + 1) *
! 221: sizeof(unsigned char))) == NULL)
! 222: {
! 223: if (fclose(fichier) != 0)
! 224: {
! 225: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 226: return;
! 227: }
! 228:
! 229: if (destruction_fichier(nom_fichier) == d_erreur)
! 230: {
! 231: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 232: return;
! 233: }
! 234:
! 235: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 236: return;
! 237: }
! 238:
! 239: strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant)
! 240: .donnee).objet)).nom);
! 241:
! 242: if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
! 243: sizeof(unsigned char))) == NULL)
! 244: {
! 245: if (fclose(fichier) != 0)
! 246: {
! 247: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 248: return;
! 249: }
! 250:
! 251: if (destruction_fichier(nom_fichier) == d_erreur)
! 252: {
! 253: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 254: return;
! 255: }
! 256:
! 257: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 258: return;
! 259: }
! 260:
! 261: strcpy(nom_x, s_variable_x.nom);
! 262:
! 263: l_element_courant = (*l_element_courant).suivant;
! 264:
! 265: if ((*(*l_element_courant).donnee).type == INT)
! 266: {
! 267: borne_minimale_x = (real8) (*((integer8 *)
! 268: (*(*l_element_courant).donnee).objet));
! 269: }
! 270: else if ((*(*l_element_courant).donnee).type == REL)
! 271: {
! 272: borne_minimale_x = (*((real8 *) (*(*l_element_courant)
! 273: .donnee).objet));
! 274: }
! 275: else
! 276: {
! 277: if (evaluation(s_etat_processus, (*l_element_courant).donnee,
! 278: 'N') == d_erreur)
! 279: {
! 280: free(s_variable_x.nom);
! 281: free(nom_x);
! 282:
! 283: if (fclose(fichier) != 0)
! 284: {
! 285: (*s_etat_processus).erreur_systeme =
! 286: d_es_erreur_fichier;
! 287: return;
! 288: }
! 289:
! 290: if (destruction_fichier(nom_fichier) == d_erreur)
! 291: {
! 292: (*s_etat_processus).erreur_systeme =
! 293: d_es_erreur_fichier;
! 294: return;
! 295: }
! 296:
! 297: if (last_valide == d_vrai)
! 298: {
! 299: sf(s_etat_processus, 31);
! 300: }
! 301:
! 302: free(nom_fichier);
! 303: return;
! 304: }
! 305:
! 306: if (depilement(s_etat_processus, &((*s_etat_processus)
! 307: .l_base_pile), &s_objet_evalue) == d_erreur)
! 308: {
! 309: free(s_variable_x.nom);
! 310: free(nom_x);
! 311:
! 312: if (fclose(fichier) != 0)
! 313: {
! 314: (*s_etat_processus).erreur_systeme =
! 315: d_es_erreur_fichier;
! 316: return;
! 317: }
! 318:
! 319: if (destruction_fichier(nom_fichier) == d_erreur)
! 320: {
! 321: (*s_etat_processus).erreur_systeme =
! 322: d_es_erreur_fichier;
! 323: return;
! 324: }
! 325:
! 326: (*s_etat_processus).erreur_execution =
! 327: d_ex_manque_argument;
! 328:
! 329: if (last_valide == d_vrai)
! 330: {
! 331: sf(s_etat_processus, 31);
! 332: }
! 333:
! 334: free(nom_fichier);
! 335: return;
! 336: }
! 337:
! 338: if ((*s_objet_evalue).type == INT)
! 339: {
! 340: borne_minimale_x = (real8) (*((integer8 *)
! 341: (*s_objet_evalue).objet));
! 342: }
! 343: else if ((*s_objet_evalue).type == REL)
! 344: {
! 345: borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet));
! 346: }
! 347: else
! 348: {
! 349: if (fclose(fichier) != 0)
! 350: {
! 351: (*s_etat_processus).erreur_systeme =
! 352: d_es_erreur_fichier;
! 353: return;
! 354: }
! 355:
! 356: if (destruction_fichier(nom_fichier) == d_erreur)
! 357: {
! 358: (*s_etat_processus).erreur_systeme =
! 359: d_es_erreur_fichier;
! 360: return;
! 361: }
! 362:
! 363: free(s_variable_x.nom);
! 364: free(nom_x);
! 365: free(nom_fichier);
! 366: liberation(s_etat_processus, s_objet_evalue);
! 367:
! 368: if (last_valide == d_vrai)
! 369: {
! 370: sf(s_etat_processus, 31);
! 371: }
! 372:
! 373: (*s_etat_processus).erreur_execution =
! 374: d_ex_erreur_type_argument;
! 375: return;
! 376: }
! 377:
! 378: liberation(s_etat_processus, s_objet_evalue);
! 379: }
! 380:
! 381: l_element_courant = (*l_element_courant).suivant;
! 382:
! 383: if ((*(*l_element_courant).donnee).type == INT)
! 384: {
! 385: borne_maximale_x = (real8) (*((integer8 *)
! 386: (*(*l_element_courant).donnee).objet));
! 387: }
! 388: else if ((*(*l_element_courant).donnee).type == REL)
! 389: {
! 390: borne_maximale_x = (*((real8 *) (*(*l_element_courant)
! 391: .donnee).objet));
! 392: }
! 393: else
! 394: {
! 395: if (evaluation(s_etat_processus, (*l_element_courant).donnee,
! 396: 'N') == d_erreur)
! 397: {
! 398: free(s_variable_x.nom);
! 399: free(nom_x);
! 400:
! 401: if (fclose(fichier) != 0)
! 402: {
! 403: (*s_etat_processus).erreur_systeme =
! 404: d_es_erreur_fichier;
! 405: return;
! 406: }
! 407:
! 408: if (destruction_fichier(nom_fichier) == d_erreur)
! 409: {
! 410: (*s_etat_processus).erreur_systeme =
! 411: d_es_erreur_fichier;
! 412: return;
! 413: }
! 414:
! 415: if (last_valide == d_vrai)
! 416: {
! 417: sf(s_etat_processus, 31);
! 418: }
! 419:
! 420: free(nom_fichier);
! 421: return;
! 422: }
! 423:
! 424: if (depilement(s_etat_processus, &((*s_etat_processus)
! 425: .l_base_pile), &s_objet_evalue) == d_erreur)
! 426: {
! 427: free(s_variable_x.nom);
! 428: free(nom_x);
! 429:
! 430: if (fclose(fichier) != 0)
! 431: {
! 432: (*s_etat_processus).erreur_systeme =
! 433: d_es_erreur_fichier;
! 434: return;
! 435: }
! 436:
! 437: if (destruction_fichier(nom_fichier) == d_erreur)
! 438: {
! 439: (*s_etat_processus).erreur_systeme =
! 440: d_es_erreur_fichier;
! 441: return;
! 442: }
! 443:
! 444: (*s_etat_processus).erreur_execution =
! 445: d_ex_manque_argument;
! 446:
! 447: if (last_valide == d_vrai)
! 448: {
! 449: sf(s_etat_processus, 31);
! 450: }
! 451:
! 452: free(nom_fichier);
! 453: return;
! 454: }
! 455:
! 456: if ((*s_objet_evalue).type == INT)
! 457: {
! 458: borne_maximale_x = (real8) (*((integer8 *)
! 459: (*s_objet_evalue).objet));
! 460: }
! 461: else if ((*s_objet_evalue).type == REL)
! 462: {
! 463: borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet));
! 464: }
! 465: else
! 466: {
! 467: free(s_variable_x.nom);
! 468: free(nom_x);
! 469:
! 470: if (fclose(fichier) != 0)
! 471: {
! 472: (*s_etat_processus).erreur_systeme =
! 473: d_es_erreur_fichier;
! 474: return;
! 475: }
! 476:
! 477: if (destruction_fichier(nom_fichier) == d_erreur)
! 478: {
! 479: (*s_etat_processus).erreur_systeme =
! 480: d_es_erreur_fichier;
! 481: return;
! 482: }
! 483:
! 484: liberation(s_etat_processus, s_objet_evalue);
! 485:
! 486: (*s_etat_processus).erreur_execution =
! 487: d_ex_erreur_type_argument;
! 488:
! 489: if (last_valide == d_vrai)
! 490: {
! 491: sf(s_etat_processus, 31);
! 492: }
! 493:
! 494: free(nom_fichier);
! 495: return;
! 496: }
! 497:
! 498: liberation(s_etat_processus, s_objet_evalue);
! 499: }
! 500: }
! 501: else
! 502: {
! 503: if ((s_variable_x.nom =
! 504: malloc((strlen((*((struct_nom *) (*(*s_etat_processus)
! 505: .indep).objet)).nom) + 1) * sizeof(unsigned char))) == NULL)
! 506: {
! 507: if (fclose(fichier) != 0)
! 508: {
! 509: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 510: return;
! 511: }
! 512:
! 513: if (destruction_fichier(nom_fichier) == d_erreur)
! 514: {
! 515: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 516: return;
! 517: }
! 518:
! 519: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 520: return;
! 521: }
! 522:
! 523: strcpy(s_variable_x.nom, (*((struct_nom *) (*(*s_etat_processus)
! 524: .indep).objet)).nom);
! 525:
! 526: if ((nom_x = malloc((strlen(s_variable_x.nom) + 1)
! 527: * sizeof(unsigned char))) == NULL)
! 528: {
! 529: if (fclose(fichier) != 0)
! 530: {
! 531: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 532: return;
! 533: }
! 534:
! 535: if (destruction_fichier(nom_fichier) == d_erreur)
! 536: {
! 537: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 538: return;
! 539: }
! 540:
! 541: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 542: return;
! 543: }
! 544:
! 545: strcpy(nom_x, s_variable_x.nom);
! 546:
! 547: if ((*s_etat_processus).systeme_axes == 0)
! 548: {
! 549: borne_minimale_x = (*s_etat_processus).x_min;
! 550: borne_maximale_x = (*s_etat_processus).x_max;
! 551: }
! 552: else
! 553: {
! 554: borne_minimale_x = (*s_etat_processus).x2_min;
! 555: borne_maximale_x = (*s_etat_processus).x2_max;
! 556: }
! 557: }
! 558:
! 559: /*
! 560: * Création d'une variable locale du nom pointé par INDEP
! 561: */
! 562:
! 563: (*s_etat_processus).niveau_courant++;
! 564: s_variable_x.niveau = (*s_etat_processus).niveau_courant;
! 565:
! 566: if ((s_variable_x.objet = allocation(s_etat_processus, REL))
! 567: == NULL)
! 568: {
! 569: if (fclose(fichier) != 0)
! 570: {
! 571: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 572: return;
! 573: }
! 574:
! 575: if (destruction_fichier(nom_fichier) == d_erreur)
! 576: {
! 577: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 578: return;
! 579: }
! 580:
! 581: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 582: return;
! 583: }
! 584:
! 585: if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P')
! 586: == d_erreur)
! 587: {
! 588: if (fclose(fichier) != 0)
! 589: {
! 590: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 591: return;
! 592: }
! 593:
! 594: if (destruction_fichier(nom_fichier) == d_erreur)
! 595: {
! 596: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 597: return;
! 598: }
! 599:
! 600: /*
! 601: * L'erreur retournée ne peut être qu'une erreur système
! 602: */
! 603:
! 604: free(nom_fichier);
! 605: return;
! 606: }
! 607:
! 608: /*
! 609: * Boucle de calcul des points de la fonction
! 610: */
! 611:
! 612: if (borne_maximale_x < borne_minimale_x)
! 613: {
! 614: x = borne_maximale_x;
! 615: borne_maximale_x = borne_minimale_x;
! 616: borne_minimale_x = x;
! 617: }
! 618:
! 619: for(x = borne_minimale_x; x <= borne_maximale_x;
! 620: x += (*s_etat_processus).resolution)
! 621: {
! 622: if (recherche_variable(s_etat_processus, nom_x)
! 623: == d_vrai)
! 624: {
! 625: // La variable étant créée localement, elle n'est jamais
! 626: // ni verrouillée ni partagée.
! 627:
! 628: BUG((*s_etat_processus).s_liste_variables
! 629: [(*s_etat_processus).position_variable_courante]
! 630: .objet == NULL);
! 631:
! 632: if ((*((*s_etat_processus).s_liste_variables
! 633: [(*s_etat_processus).position_variable_courante])
! 634: .objet).type != REL)
! 635: {
! 636: liberation(s_etat_processus,
! 637: ((*s_etat_processus).s_liste_variables
! 638: [(*s_etat_processus).position_variable_courante])
! 639: .objet);
! 640:
! 641: if ((((*s_etat_processus).s_liste_variables
! 642: [(*s_etat_processus).position_variable_courante])
! 643: .objet = allocation(s_etat_processus, REL))
! 644: == NULL)
! 645: {
! 646: (*s_etat_processus).erreur_systeme =
! 647: d_es_allocation_memoire;
! 648: return;
! 649: }
! 650: }
! 651:
! 652: (*((real8 *) (*((*s_etat_processus).s_liste_variables
! 653: [(*s_etat_processus).position_variable_courante])
! 654: .objet).objet)) = x;
! 655: }
! 656: else
! 657: {
! 658: /*
! 659: * La variable créée étant locale, l'utilisateur ne peut
! 660: * pas l'effacer. On ne doit donc jamais passer par ici. Si
! 661: * c'est néanmoins le cas, une erreur système est générée
! 662: * provoquant l'arrêt du programme même dans une
! 663: * structure IFERR.
! 664: */
! 665:
! 666: if (fclose(fichier) != 0)
! 667: {
! 668: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 669: return;
! 670: }
! 671:
! 672: if (destruction_fichier(nom_fichier) == d_erreur)
! 673: {
! 674: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 675: return;
! 676: }
! 677:
! 678: if (last_valide == d_vrai)
! 679: {
! 680: sf(s_etat_processus, 31);
! 681: }
! 682:
! 683: free(nom_fichier);
! 684: return;
! 685: }
! 686:
! 687: if (recherche_variable(s_etat_processus, "EQ")
! 688: == d_faux)
! 689: {
! 690: /*
! 691: * Aucune variable "EQ" n'existe.
! 692: */
! 693:
! 694: (*s_etat_processus).erreur_execution =
! 695: d_ex_variable_non_definie;
! 696:
! 697: /*
! 698: * Retrait de la variable INDEP
! 699: */
! 700:
! 701: (*s_etat_processus).niveau_courant--;
! 702:
! 703: if (fclose(fichier) != 0)
! 704: {
! 705: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 706: return;
! 707: }
! 708:
! 709: if (destruction_fichier(nom_fichier) == d_erreur)
! 710: {
! 711: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 712: return;
! 713: }
! 714:
! 715: if (retrait_variable(s_etat_processus, nom_x, 'L')
! 716: == d_erreur)
! 717: {
! 718: if ((*s_etat_processus).erreur_systeme != d_es)
! 719: {
! 720: if ((*s_etat_processus).erreur_systeme ==
! 721: d_es_variable_introuvable)
! 722: {
! 723: (*s_etat_processus).erreur_systeme = d_es;
! 724: }
! 725: else
! 726: {
! 727:
! 728: /*
! 729: * Erreur système
! 730: */
! 731:
! 732: free(nom_fichier);
! 733: return;
! 734: }
! 735: }
! 736:
! 737: free(nom_x);
! 738: free(nom_fichier);
! 739:
! 740: if (last_valide == d_vrai)
! 741: {
! 742: sf(s_etat_processus, 31);
! 743: }
! 744:
! 745: (*s_etat_processus).erreur_execution =
! 746: d_ex_variable_non_definie;
! 747: return;
! 748: }
! 749:
! 750: if (last_valide == d_vrai)
! 751: {
! 752: sf(s_etat_processus, 31);
! 753: }
! 754:
! 755: free(nom_x);
! 756: free(nom_fichier);
! 757: return;
! 758: }
! 759:
! 760: /*
! 761: * Recherche de la variable globale "EQ"
! 762: */
! 763:
! 764: i = (*s_etat_processus).position_variable_courante;
! 765: presence_variable = d_faux;
! 766:
! 767: while(i >= 0)
! 768: {
! 769: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 770: "EQ") == 0) && ((*s_etat_processus)
! 771: .s_liste_variables[i].niveau == 1))
! 772: {
! 773: presence_variable = d_vrai;
! 774: break;
! 775: }
! 776:
! 777: i--;
! 778: }
! 779:
! 780: (*s_etat_processus).position_variable_courante = i;
! 781:
! 782: BUG((*s_etat_processus).s_liste_variables[i].objet == NULL);
! 783:
! 784: if (presence_variable == d_faux)
! 785: {
! 786: /*
! 787: * Retrait de la variable INDEP
! 788: */
! 789:
! 790: (*s_etat_processus).niveau_courant--;
! 791:
! 792: if (fclose(fichier) != 0)
! 793: {
! 794: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 795: return;
! 796: }
! 797:
! 798: if (destruction_fichier(nom_fichier) == d_erreur)
! 799: {
! 800: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 801: return;
! 802: }
! 803:
! 804: if (retrait_variable(s_etat_processus, nom_x, 'L')
! 805: == d_erreur)
! 806: {
! 807: if ((*s_etat_processus).erreur_systeme != d_es)
! 808: {
! 809: if ((*s_etat_processus).erreur_systeme ==
! 810: d_es_variable_introuvable)
! 811: {
! 812: (*s_etat_processus).erreur_systeme = d_es;
! 813: }
! 814: else
! 815: {
! 816:
! 817: /*
! 818: * Erreur système
! 819: */
! 820:
! 821: free(nom_fichier);
! 822: return;
! 823: }
! 824: }
! 825:
! 826: free(nom_x);
! 827: free(nom_fichier);
! 828:
! 829: if (last_valide == d_vrai)
! 830: {
! 831: sf(s_etat_processus, 31);
! 832: }
! 833:
! 834: (*s_etat_processus).erreur_execution =
! 835: d_ex_variable_non_definie;
! 836: return;
! 837: }
! 838:
! 839: free(nom_x);
! 840: free(nom_fichier);
! 841:
! 842: if (last_valide == d_vrai)
! 843: {
! 844: sf(s_etat_processus, 31);
! 845: }
! 846:
! 847: (*s_etat_processus).erreur_execution =
! 848: d_ex_variable_non_definie;
! 849: return;
! 850: }
! 851:
! 852: /*
! 853: * Evaluation de la fonction
! 854: */
! 855:
! 856: hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle;
! 857: l_position_normale = (*s_etat_processus).l_base_pile_systeme;
! 858: niveau_courant = (*s_etat_processus).niveau_courant;
! 859: mode_evaluation_expression = (*s_etat_processus)
! 860: .mode_evaluation_expression;
! 861: (*s_etat_processus).mode_evaluation_expression = 'Y';
! 862:
! 863: (*s_etat_processus).erreur_execution = d_ex;
! 864: (*s_etat_processus).exception = d_ep;
! 865:
! 866: if (evaluation(s_etat_processus, (*s_etat_processus)
! 867: .s_liste_variables[(*s_etat_processus)
! 868: .position_variable_courante].objet, 'N') == d_erreur)
! 869: {
! 870: (*s_etat_processus).mode_evaluation_expression =
! 871: mode_evaluation_expression;
! 872:
! 873: if ((*s_etat_processus).erreur_systeme != d_es)
! 874: {
! 875: /*
! 876: * Erreur système
! 877: */
! 878:
! 879: free(nom_fichier);
! 880: return;
! 881: }
! 882: else
! 883: {
! 884: retour_suite_erreur = d_faux;
! 885: (*s_etat_processus).niveau_courant = niveau_courant;
! 886:
! 887: /*
! 888: * Restauration de la pile initiale
! 889: */
! 890:
! 891: while((*s_etat_processus).hauteur_pile_operationnelle >
! 892: (unsigned long) hauteur_pile)
! 893: {
! 894: if (depilement(s_etat_processus, &((*s_etat_processus)
! 895: .l_base_pile), &s_objet) == d_erreur)
! 896: {
! 897: (*s_etat_processus).erreur_execution =
! 898: d_ex_manque_argument;
! 899: retour_suite_erreur = d_vrai;
! 900: break;
! 901: }
! 902:
! 903: liberation(s_etat_processus, s_objet);
! 904: }
! 905:
! 906: /*
! 907: * Restauration de la pile système
! 908: */
! 909:
! 910: while((*s_etat_processus).l_base_pile_systeme !=
! 911: l_position_normale)
! 912: {
! 913: depilement_pile_systeme(s_etat_processus);
! 914:
! 915: if ((*s_etat_processus).erreur_systeme != d_es)
! 916: {
! 917: /*
! 918: * Une pile vide provoque une erreur système
! 919: */
! 920:
! 921: free(nom_fichier);
! 922: return;
! 923: }
! 924: }
! 925:
! 926: if (retour_suite_erreur == d_vrai)
! 927: {
! 928: /*
! 929: * Retrait de la variable INDEP et retour
! 930: */
! 931:
! 932: (*s_etat_processus).niveau_courant--;
! 933:
! 934: if (fclose(fichier) != 0)
! 935: {
! 936: (*s_etat_processus).erreur_systeme =
! 937: d_es_erreur_fichier;
! 938: return;
! 939: }
! 940:
! 941: if (destruction_fichier(nom_fichier) == d_erreur)
! 942: {
! 943: (*s_etat_processus).erreur_systeme =
! 944: d_es_erreur_fichier;
! 945: return;
! 946: }
! 947:
! 948: if (retrait_variable(s_etat_processus,
! 949: nom_x, 'L') == d_erreur)
! 950: {
! 951: if ((*s_etat_processus).erreur_systeme != d_es)
! 952: {
! 953: if ((*s_etat_processus).erreur_systeme ==
! 954: d_es_variable_introuvable)
! 955: {
! 956: (*s_etat_processus).erreur_systeme =
! 957: d_es;
! 958: }
! 959: else
! 960: {
! 961:
! 962: /*
! 963: * Erreur système
! 964: */
! 965:
! 966: free(nom_fichier);
! 967: return;
! 968: }
! 969: }
! 970:
! 971: (*s_etat_processus).erreur_execution =
! 972: d_ex_variable_non_definie;
! 973: }
! 974:
! 975: free(nom_x);
! 976: free(nom_fichier);
! 977:
! 978: if (last_valide == d_vrai)
! 979: {
! 980: sf(s_etat_processus, 31);
! 981: }
! 982:
! 983: return;
! 984: }
! 985: }
! 986:
! 987: (*s_etat_processus).erreur_execution = d_ex;
! 988: (*s_etat_processus).exception = d_ep;
! 989: }
! 990: else
! 991: {
! 992: (*s_etat_processus).mode_evaluation_expression =
! 993: mode_evaluation_expression;
! 994:
! 995: /*
! 996: * Donnée valide à écrire dans le fichier
! 997: */
! 998:
! 999: if (depilement(s_etat_processus, &((*s_etat_processus)
! 1000: .l_base_pile), &s_objet) == d_erreur)
! 1001: {
! 1002:
! 1003: /*
! 1004: * Retrait de la variable INDEP et retour
! 1005: */
! 1006:
! 1007: (*s_etat_processus).niveau_courant--;
! 1008:
! 1009: if (fclose(fichier) != 0)
! 1010: {
! 1011: (*s_etat_processus).erreur_systeme =
! 1012: d_es_erreur_fichier;
! 1013: return;
! 1014: }
! 1015:
! 1016: if (destruction_fichier(nom_fichier) == d_erreur)
! 1017: {
! 1018: (*s_etat_processus).erreur_systeme =
! 1019: d_es_erreur_fichier;
! 1020: return;
! 1021: }
! 1022:
! 1023: if (retrait_variable(s_etat_processus, nom_x,
! 1024: 'L') == d_erreur)
! 1025: {
! 1026: if ((*s_etat_processus).erreur_systeme != d_es)
! 1027: {
! 1028: if ((*s_etat_processus).erreur_systeme ==
! 1029: d_es_variable_introuvable)
! 1030: {
! 1031: (*s_etat_processus).erreur_systeme = d_es;
! 1032: }
! 1033: else
! 1034: {
! 1035:
! 1036: /*
! 1037: * Erreur système
! 1038: */
! 1039:
! 1040: free(nom_fichier);
! 1041: return;
! 1042: }
! 1043: }
! 1044:
! 1045: free(nom_x);
! 1046: free(nom_fichier);
! 1047:
! 1048: if (last_valide == d_vrai)
! 1049: {
! 1050: sf(s_etat_processus, 31);
! 1051: }
! 1052:
! 1053: (*s_etat_processus).erreur_execution =
! 1054: d_ex_variable_non_definie;
! 1055: return;
! 1056: }
! 1057:
! 1058: free(nom_x);
! 1059: free(nom_fichier);
! 1060:
! 1061: if (last_valide == d_vrai)
! 1062: {
! 1063: sf(s_etat_processus, 31);
! 1064: }
! 1065:
! 1066: (*s_etat_processus).erreur_execution =
! 1067: d_ex_manque_argument;
! 1068: return;
! 1069: }
! 1070:
! 1071: if ((*s_objet).type == INT)
! 1072: {
! 1073: if (fprintf(fichier, "%f %f\n", x,
! 1074: (double) (*((integer8 *)
! 1075: (*s_objet).objet))) < 0)
! 1076: {
! 1077: (*s_etat_processus).erreur_systeme =
! 1078: d_es_erreur_fichier;
! 1079: return;
! 1080: }
! 1081: }
! 1082: else if ((*s_objet).type == REL)
! 1083: {
! 1084: if (fprintf(fichier, "%f %f\n", x, (*((real8 *)
! 1085: (*s_objet).objet))) < 0)
! 1086: {
! 1087: (*s_etat_processus).erreur_systeme =
! 1088: d_es_erreur_fichier;
! 1089: return;
! 1090: }
! 1091: }
! 1092:
! 1093: liberation(s_etat_processus, s_objet);
! 1094: }
! 1095: }
! 1096:
! 1097: /*
! 1098: * Retrait de la variable locale
! 1099: */
! 1100:
! 1101: (*s_etat_processus).niveau_courant--;
! 1102:
! 1103: if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
! 1104: {
! 1105: if ((*s_etat_processus).erreur_systeme != d_es)
! 1106: {
! 1107: if ((*s_etat_processus).erreur_systeme ==
! 1108: d_es_variable_introuvable)
! 1109: {
! 1110: (*s_etat_processus).erreur_systeme = d_es;
! 1111: }
! 1112: else
! 1113: {
! 1114: /*
! 1115: * Erreur système
! 1116: */
! 1117:
! 1118: free(nom_fichier);
! 1119: return;
! 1120: }
! 1121: }
! 1122:
! 1123: free(nom_x);
! 1124: free(nom_fichier);
! 1125:
! 1126: if (last_valide == d_vrai)
! 1127: {
! 1128: sf(s_etat_processus, 31);
! 1129: }
! 1130:
! 1131: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 1132: return;
! 1133: }
! 1134:
! 1135: free(nom_x);
! 1136: }
! 1137:
! 1138: /*
! 1139: * Tracé r=f(t)
! 1140: * Les bornes de variation de T sont données par une
! 1141: * liste "{ T T_min T_max } INDEP".
! 1142: * INDEP et DEPND testent leurs arguments pour que les pointeurs
! 1143: * indep et depend désignent des objets de type NOM ou LST à
! 1144: * trois éléments.
! 1145: */
! 1146:
! 1147: else if (strcmp((*s_etat_processus).type_trace_eq, "POLAIRE") == 0)
! 1148: {
! 1149: dimensions = 2;
! 1150:
! 1151: /*
! 1152: * Vérification de la présence de la variable globale EQ
! 1153: */
! 1154:
! 1155: if (recherche_variable(s_etat_processus, "EQ") == d_faux)
! 1156: {
! 1157: /*
! 1158: * Aucune variable "EQ" n'existe.
! 1159: */
! 1160:
! 1161: if (last_valide == d_vrai)
! 1162: {
! 1163: sf(s_etat_processus, 31);
! 1164: }
! 1165:
! 1166: (*s_etat_processus).erreur_execution = d_ex_absence_equation;
! 1167: (*s_etat_processus).erreur_systeme = d_es;
! 1168:
! 1169: return;
! 1170: }
! 1171:
! 1172: /*
! 1173: * Recherche de la variable globale "EQ"
! 1174: */
! 1175:
! 1176: i = (*s_etat_processus).position_variable_courante;
! 1177: presence_variable = d_faux;
! 1178:
! 1179: while(i >= 0)
! 1180: {
! 1181: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 1182: "EQ") == 0) && ((*s_etat_processus)
! 1183: .s_liste_variables[i].niveau == 1))
! 1184: {
! 1185: presence_variable = d_vrai;
! 1186: break;
! 1187: }
! 1188:
! 1189: i--;
! 1190: }
! 1191:
! 1192: if (presence_variable == d_faux)
! 1193: {
! 1194: if (last_valide == d_vrai)
! 1195: {
! 1196: sf(s_etat_processus, 31);
! 1197: }
! 1198:
! 1199: (*s_etat_processus).erreur_execution = d_ex_absence_equation;
! 1200: return;
! 1201: }
! 1202:
! 1203: if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
! 1204: {
! 1205: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
! 1206: return;
! 1207: }
! 1208:
! 1209: /*
! 1210: * Création du fichier graphique temporaire
! 1211: */
! 1212:
! 1213: if ((nom_fichier = creation_nom_fichier(s_etat_processus,
! 1214: (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
! 1215: {
! 1216: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1217: return;
! 1218: }
! 1219:
! 1220: if ((fichier = fopen(nom_fichier, "w+")) == NULL)
! 1221: {
! 1222: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1223: return;
! 1224: }
! 1225:
! 1226: /*
! 1227: * Récupération du domaine de variation de x
! 1228: */
! 1229:
! 1230: if ((*(*s_etat_processus).indep).type == LST)
! 1231: {
! 1232: l_element_courant = (*(*s_etat_processus).indep).objet;
! 1233:
! 1234: if ((s_variable_x.nom = malloc((strlen((*((struct_nom *)
! 1235: (*(*l_element_courant).donnee).objet)).nom) + 1) *
! 1236: sizeof(unsigned char))) == NULL)
! 1237: {
! 1238: if (fclose(fichier) != 0)
! 1239: {
! 1240: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1241: return;
! 1242: }
! 1243:
! 1244: if (destruction_fichier(nom_fichier) == d_erreur)
! 1245: {
! 1246: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1247: return;
! 1248: }
! 1249:
! 1250: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1251: return;
! 1252: }
! 1253:
! 1254: strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant)
! 1255: .donnee).objet)).nom);
! 1256:
! 1257: if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
! 1258: sizeof(unsigned char))) == NULL)
! 1259: {
! 1260: if (fclose(fichier) != 0)
! 1261: {
! 1262: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1263: return;
! 1264: }
! 1265:
! 1266: if (destruction_fichier(nom_fichier) == d_erreur)
! 1267: {
! 1268: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1269: return;
! 1270: }
! 1271:
! 1272: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1273: return;
! 1274: }
! 1275:
! 1276: strcpy(nom_x, s_variable_x.nom);
! 1277:
! 1278: l_element_courant = (*l_element_courant).suivant;
! 1279:
! 1280: if ((*(*l_element_courant).donnee).type == INT)
! 1281: {
! 1282: borne_minimale_x = (real8) (*((integer8 *)
! 1283: (*(*l_element_courant).donnee).objet));
! 1284: }
! 1285: else if ((*(*l_element_courant).donnee).type == REL)
! 1286: {
! 1287: borne_minimale_x = (*((real8 *) (*(*l_element_courant)
! 1288: .donnee).objet));
! 1289: }
! 1290: else
! 1291: {
! 1292: if (evaluation(s_etat_processus, (*l_element_courant).donnee,
! 1293: 'N') == d_erreur)
! 1294: {
! 1295: free(s_variable_x.nom);
! 1296: free(nom_x);
! 1297:
! 1298: if (fclose(fichier) != 0)
! 1299: {
! 1300: (*s_etat_processus).erreur_systeme =
! 1301: d_es_erreur_fichier;
! 1302: return;
! 1303: }
! 1304:
! 1305: if (destruction_fichier(nom_fichier) == d_erreur)
! 1306: {
! 1307: (*s_etat_processus).erreur_systeme =
! 1308: d_es_erreur_fichier;
! 1309: return;
! 1310: }
! 1311:
! 1312: if (last_valide == d_vrai)
! 1313: {
! 1314: sf(s_etat_processus, 31);
! 1315: }
! 1316:
! 1317: free(nom_fichier);
! 1318: return;
! 1319: }
! 1320:
! 1321: if (depilement(s_etat_processus, &((*s_etat_processus)
! 1322: .l_base_pile), &s_objet_evalue) == d_erreur)
! 1323: {
! 1324: free(s_variable_x.nom);
! 1325: free(nom_x);
! 1326:
! 1327: if (fclose(fichier) != 0)
! 1328: {
! 1329: (*s_etat_processus).erreur_systeme =
! 1330: d_es_erreur_fichier;
! 1331: return;
! 1332: }
! 1333:
! 1334: if (destruction_fichier(nom_fichier) == d_erreur)
! 1335: {
! 1336: (*s_etat_processus).erreur_systeme =
! 1337: d_es_erreur_fichier;
! 1338: return;
! 1339: }
! 1340:
! 1341: (*s_etat_processus).erreur_execution =
! 1342: d_ex_manque_argument;
! 1343:
! 1344: if (last_valide == d_vrai)
! 1345: {
! 1346: sf(s_etat_processus, 31);
! 1347: }
! 1348:
! 1349: free(nom_fichier);
! 1350: return;
! 1351: }
! 1352:
! 1353: if ((*s_objet_evalue).type == INT)
! 1354: {
! 1355: borne_minimale_x = (real8) (*((integer8 *)
! 1356: (*s_objet_evalue).objet));
! 1357: }
! 1358: else if ((*s_objet_evalue).type == REL)
! 1359: {
! 1360: borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet));
! 1361: }
! 1362: else
! 1363: {
! 1364: if (fclose(fichier) != 0)
! 1365: {
! 1366: (*s_etat_processus).erreur_systeme =
! 1367: d_es_erreur_fichier;
! 1368: return;
! 1369: }
! 1370:
! 1371: if (destruction_fichier(nom_fichier) == d_erreur)
! 1372: {
! 1373: (*s_etat_processus).erreur_systeme =
! 1374: d_es_erreur_fichier;
! 1375: return;
! 1376: }
! 1377:
! 1378: free(s_variable_x.nom);
! 1379: free(nom_x);
! 1380: liberation(s_etat_processus, s_objet_evalue);
! 1381:
! 1382: (*s_etat_processus).erreur_execution =
! 1383: d_ex_erreur_type_argument;
! 1384:
! 1385: if (last_valide == d_vrai)
! 1386: {
! 1387: sf(s_etat_processus, 31);
! 1388: }
! 1389:
! 1390: free(nom_fichier);
! 1391: return;
! 1392: }
! 1393:
! 1394: liberation(s_etat_processus, s_objet_evalue);
! 1395: }
! 1396:
! 1397: l_element_courant = (*l_element_courant).suivant;
! 1398:
! 1399: if ((*(*l_element_courant).donnee).type == INT)
! 1400: {
! 1401: borne_maximale_x = (real8) (*((integer8 *)
! 1402: (*(*l_element_courant).donnee).objet));
! 1403: }
! 1404: else if ((*(*l_element_courant).donnee).type == REL)
! 1405: {
! 1406: borne_maximale_x = (*((real8 *) (*(*l_element_courant)
! 1407: .donnee).objet));
! 1408: }
! 1409: else
! 1410: {
! 1411: if (evaluation(s_etat_processus, (*l_element_courant).donnee,
! 1412: 'N') == d_erreur)
! 1413: {
! 1414: free(s_variable_x.nom);
! 1415: free(nom_x);
! 1416:
! 1417: if (fclose(fichier) != 0)
! 1418: {
! 1419: (*s_etat_processus).erreur_systeme =
! 1420: d_es_erreur_fichier;
! 1421: return;
! 1422: }
! 1423:
! 1424: if (destruction_fichier(nom_fichier) == d_erreur)
! 1425: {
! 1426: (*s_etat_processus).erreur_systeme =
! 1427: d_es_erreur_fichier;
! 1428: return;
! 1429: }
! 1430:
! 1431: if (last_valide == d_vrai)
! 1432: {
! 1433: sf(s_etat_processus, 31);
! 1434: }
! 1435:
! 1436: free(nom_fichier);
! 1437: return;
! 1438: }
! 1439:
! 1440: if (depilement(s_etat_processus, &((*s_etat_processus)
! 1441: .l_base_pile), &s_objet_evalue) == d_erreur)
! 1442: {
! 1443: free(s_variable_x.nom);
! 1444: free(nom_x);
! 1445:
! 1446: if (fclose(fichier) != 0)
! 1447: {
! 1448: (*s_etat_processus).erreur_systeme =
! 1449: d_es_erreur_fichier;
! 1450: return;
! 1451: }
! 1452:
! 1453: if (destruction_fichier(nom_fichier) == d_erreur)
! 1454: {
! 1455: (*s_etat_processus).erreur_systeme =
! 1456: d_es_erreur_fichier;
! 1457: return;
! 1458: }
! 1459:
! 1460: (*s_etat_processus).erreur_execution =
! 1461: d_ex_manque_argument;
! 1462:
! 1463: if (last_valide == d_vrai)
! 1464: {
! 1465: sf(s_etat_processus, 31);
! 1466: }
! 1467:
! 1468: free(nom_fichier);
! 1469: return;
! 1470: }
! 1471:
! 1472: if ((*s_objet_evalue).type == INT)
! 1473: {
! 1474: borne_maximale_x = (real8) (*((integer8 *)
! 1475: (*s_objet_evalue).objet));
! 1476: }
! 1477: else if ((*s_objet_evalue).type == REL)
! 1478: {
! 1479: borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet));
! 1480: }
! 1481: else
! 1482: {
! 1483: free(s_variable_x.nom);
! 1484: free(nom_x);
! 1485:
! 1486: if (fclose(fichier) != 0)
! 1487: {
! 1488: (*s_etat_processus).erreur_systeme =
! 1489: d_es_erreur_fichier;
! 1490: return;
! 1491: }
! 1492:
! 1493: if (destruction_fichier(nom_fichier) == d_erreur)
! 1494: {
! 1495: (*s_etat_processus).erreur_systeme =
! 1496: d_es_erreur_fichier;
! 1497: return;
! 1498: }
! 1499:
! 1500: liberation(s_etat_processus, s_objet_evalue);
! 1501:
! 1502: (*s_etat_processus).erreur_execution =
! 1503: d_ex_erreur_type_argument;
! 1504:
! 1505: if (last_valide == d_vrai)
! 1506: {
! 1507: sf(s_etat_processus, 31);
! 1508: }
! 1509:
! 1510: free(nom_fichier);
! 1511: return;
! 1512: }
! 1513:
! 1514: liberation(s_etat_processus, s_objet_evalue);
! 1515: }
! 1516: }
! 1517: else
! 1518: {
! 1519: if (fclose(fichier) != 0)
! 1520: {
! 1521: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1522: return;
! 1523: }
! 1524:
! 1525: if (destruction_fichier(nom_fichier) == d_erreur)
! 1526: {
! 1527: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1528: return;
! 1529: }
! 1530:
! 1531: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1532:
! 1533: if (last_valide == d_vrai)
! 1534: {
! 1535: sf(s_etat_processus, 31);
! 1536: }
! 1537:
! 1538: free(nom_fichier);
! 1539: return;
! 1540: }
! 1541:
! 1542: /*
! 1543: * Création d'une variable locale du nom pointé par INDEP
! 1544: */
! 1545:
! 1546: (*s_etat_processus).niveau_courant++;
! 1547: s_variable_x.niveau = (*s_etat_processus).niveau_courant;
! 1548:
! 1549: if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL)
! 1550: {
! 1551: if (fclose(fichier) != 0)
! 1552: {
! 1553: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1554: return;
! 1555: }
! 1556:
! 1557: if (destruction_fichier(nom_fichier) == d_erreur)
! 1558: {
! 1559: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1560: return;
! 1561: }
! 1562:
! 1563: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1564: return;
! 1565: }
! 1566:
! 1567: if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P')
! 1568: == d_erreur)
! 1569: {
! 1570: if (fclose(fichier) != 0)
! 1571: {
! 1572: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1573: return;
! 1574: }
! 1575:
! 1576: if (destruction_fichier(nom_fichier) == d_erreur)
! 1577: {
! 1578: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1579: return;
! 1580: }
! 1581:
! 1582: /*
! 1583: * L'erreur retournée ne peut être qu'une erreur système
! 1584: */
! 1585:
! 1586: free(nom_fichier);
! 1587: return;
! 1588: }
! 1589:
! 1590: /*
! 1591: * Boucle de calcul des points de la fonction
! 1592: */
! 1593:
! 1594: if (borne_maximale_x < borne_minimale_x)
! 1595: {
! 1596: t = borne_maximale_x;
! 1597: borne_maximale_x = borne_minimale_x;
! 1598: borne_minimale_x = t;
! 1599: }
! 1600:
! 1601: for(t = borne_minimale_x; t <= borne_maximale_x;
! 1602: t += (*s_etat_processus).resolution)
! 1603: {
! 1604: if (recherche_variable(s_etat_processus, nom_x) == d_vrai)
! 1605: {
! 1606: // La variable étant créée localement, elle n'est jamais
! 1607: // ni verrouillée ni partagée.
! 1608:
! 1609: BUG((*s_etat_processus).s_liste_variables
! 1610: [(*s_etat_processus).position_variable_courante]
! 1611: .objet == NULL);
! 1612:
! 1613: if ((*((*s_etat_processus).s_liste_variables
! 1614: [(*s_etat_processus).position_variable_courante])
! 1615: .objet).type != REL)
! 1616: {
! 1617: liberation(s_etat_processus,
! 1618: ((*s_etat_processus).s_liste_variables
! 1619: [(*s_etat_processus).position_variable_courante])
! 1620: .objet);
! 1621:
! 1622: if ((((*s_etat_processus).s_liste_variables
! 1623: [(*s_etat_processus).position_variable_courante])
! 1624: .objet = allocation(s_etat_processus, REL))
! 1625: == NULL)
! 1626: {
! 1627: (*s_etat_processus).erreur_systeme =
! 1628: d_es_allocation_memoire;
! 1629: return;
! 1630: }
! 1631: }
! 1632:
! 1633: (*((real8 *) (*((*s_etat_processus).s_liste_variables
! 1634: [(*s_etat_processus).position_variable_courante])
! 1635: .objet).objet)) = t;
! 1636: }
! 1637: else
! 1638: {
! 1639: /*
! 1640: * La variable créée étant locale, l'utilisateur ne peut
! 1641: * pas l'effacer. On ne doit donc jamais passer par ici. Si
! 1642: * c'est néanmoins le cas, une erreur système est générée
! 1643: * provoquant l'arrêt du programme même dans une
! 1644: * structure IFERR.
! 1645: */
! 1646:
! 1647: if (fclose(fichier) != 0)
! 1648: {
! 1649: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1650: return;
! 1651: }
! 1652:
! 1653: if (destruction_fichier(nom_fichier) == d_erreur)
! 1654: {
! 1655: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1656: return;
! 1657: }
! 1658:
! 1659: if (last_valide == d_vrai)
! 1660: {
! 1661: sf(s_etat_processus, 31);
! 1662: }
! 1663:
! 1664: free(nom_fichier);
! 1665: return;
! 1666: }
! 1667:
! 1668: if (recherche_variable(s_etat_processus, "EQ")
! 1669: == d_faux)
! 1670: {
! 1671: /*
! 1672: * Aucune variable "EQ" n'existe.
! 1673: */
! 1674:
! 1675: (*s_etat_processus).erreur_execution =
! 1676: d_ex_variable_non_definie;
! 1677:
! 1678: /*
! 1679: * Retrait de la variable INDEP
! 1680: */
! 1681:
! 1682: (*s_etat_processus).niveau_courant--;
! 1683:
! 1684: if (fclose(fichier) != 0)
! 1685: {
! 1686: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1687: return;
! 1688: }
! 1689:
! 1690: if (destruction_fichier(nom_fichier) == d_erreur)
! 1691: {
! 1692: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1693: return;
! 1694: }
! 1695:
! 1696: if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
! 1697: {
! 1698: if ((*s_etat_processus).erreur_systeme != d_es)
! 1699: {
! 1700: if ((*s_etat_processus).erreur_systeme ==
! 1701: d_es_variable_introuvable)
! 1702: {
! 1703: (*s_etat_processus).erreur_systeme = d_es;
! 1704: }
! 1705: else
! 1706: {
! 1707:
! 1708: /*
! 1709: * Erreur système
! 1710: */
! 1711:
! 1712: free(nom_fichier);
! 1713: return;
! 1714: }
! 1715: }
! 1716:
! 1717: free(nom_x);
! 1718: free(nom_fichier);
! 1719:
! 1720: if (last_valide == d_vrai)
! 1721: {
! 1722: sf(s_etat_processus, 31);
! 1723: }
! 1724:
! 1725: (*s_etat_processus).erreur_execution =
! 1726: d_ex_variable_non_definie;
! 1727: return;
! 1728: }
! 1729:
! 1730: if (last_valide == d_vrai)
! 1731: {
! 1732: sf(s_etat_processus, 31);
! 1733: }
! 1734:
! 1735: free(nom_x);
! 1736: free(nom_fichier);
! 1737: return;
! 1738: }
! 1739:
! 1740: /*
! 1741: * Recherche de la variable globale "EQ"
! 1742: */
! 1743:
! 1744: i = (*s_etat_processus).position_variable_courante;
! 1745: presence_variable = d_faux;
! 1746:
! 1747: while(i >= 0)
! 1748: {
! 1749: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 1750: "EQ") == 0) && ((*s_etat_processus)
! 1751: .s_liste_variables[i].niveau == 1))
! 1752: {
! 1753: presence_variable = d_vrai;
! 1754: break;
! 1755: }
! 1756:
! 1757: i--;
! 1758: }
! 1759:
! 1760: (*s_etat_processus).position_variable_courante = i;
! 1761:
! 1762: BUG((*s_etat_processus).s_liste_variables[i].objet == NULL);
! 1763:
! 1764: if (presence_variable == d_faux)
! 1765: {
! 1766: /*
! 1767: * Retrait de la variable INDEP
! 1768: */
! 1769:
! 1770: (*s_etat_processus).niveau_courant--;
! 1771:
! 1772: if (fclose(fichier) != 0)
! 1773: {
! 1774: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1775: return;
! 1776: }
! 1777:
! 1778: if (destruction_fichier(nom_fichier) == d_erreur)
! 1779: {
! 1780: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 1781: return;
! 1782: }
! 1783:
! 1784: if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
! 1785: {
! 1786: if ((*s_etat_processus).erreur_systeme != d_es)
! 1787: {
! 1788: if ((*s_etat_processus).erreur_systeme ==
! 1789: d_es_variable_introuvable)
! 1790: {
! 1791: (*s_etat_processus).erreur_systeme = d_es;
! 1792: }
! 1793: else
! 1794: {
! 1795:
! 1796: /*
! 1797: * Erreur système
! 1798: */
! 1799:
! 1800: free(nom_fichier);
! 1801: return;
! 1802: }
! 1803: }
! 1804:
! 1805: free(nom_x);
! 1806: free(nom_fichier);
! 1807:
! 1808: if (last_valide == d_vrai)
! 1809: {
! 1810: sf(s_etat_processus, 31);
! 1811: }
! 1812:
! 1813: (*s_etat_processus).erreur_execution =
! 1814: d_ex_variable_non_definie;
! 1815: return;
! 1816: }
! 1817:
! 1818: (*s_etat_processus).erreur_execution =
! 1819: d_ex_variable_non_definie;
! 1820:
! 1821: if (last_valide == d_vrai)
! 1822: {
! 1823: sf(s_etat_processus, 31);
! 1824: }
! 1825:
! 1826: free(nom_fichier);
! 1827: return;
! 1828: }
! 1829:
! 1830: /*
! 1831: * Evaluation de la fonction
! 1832: */
! 1833:
! 1834: hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle;
! 1835: l_position_normale = (*s_etat_processus).l_base_pile_systeme;
! 1836: niveau_courant = (*s_etat_processus).niveau_courant;
! 1837:
! 1838: (*s_etat_processus).erreur_execution = d_ex;
! 1839: (*s_etat_processus).exception = d_ep;
! 1840:
! 1841: if (evaluation(s_etat_processus, (*s_etat_processus)
! 1842: .s_liste_variables[(*s_etat_processus)
! 1843: .position_variable_courante].objet, 'N') == d_erreur)
! 1844: {
! 1845: if ((*s_etat_processus).erreur_systeme != d_es)
! 1846: {
! 1847: /*
! 1848: * Erreur système
! 1849: */
! 1850:
! 1851: free(nom_fichier);
! 1852: return;
! 1853: }
! 1854: else
! 1855: {
! 1856: retour_suite_erreur = d_faux;
! 1857: (*s_etat_processus).niveau_courant = niveau_courant;
! 1858:
! 1859: /*
! 1860: * Restauration de la pile initiale
! 1861: */
! 1862:
! 1863: while((*s_etat_processus).hauteur_pile_operationnelle >
! 1864: (unsigned long) hauteur_pile)
! 1865: {
! 1866: if (depilement(s_etat_processus, &((*s_etat_processus)
! 1867: .l_base_pile), &s_objet) == d_erreur)
! 1868: {
! 1869: (*s_etat_processus).erreur_execution =
! 1870: d_ex_manque_argument;
! 1871: retour_suite_erreur = d_vrai;
! 1872: break;
! 1873: }
! 1874:
! 1875: liberation(s_etat_processus, s_objet);
! 1876: }
! 1877:
! 1878: /*
! 1879: * Restauration de la pile système
! 1880: */
! 1881:
! 1882: while((*s_etat_processus).l_base_pile_systeme !=
! 1883: l_position_normale)
! 1884: {
! 1885: depilement_pile_systeme(s_etat_processus);
! 1886:
! 1887: if ((*s_etat_processus).erreur_systeme != d_es)
! 1888: {
! 1889: /*
! 1890: * Une pile vide provoque une erreur système
! 1891: */
! 1892:
! 1893: free(nom_fichier);
! 1894: return;
! 1895: }
! 1896: }
! 1897:
! 1898: if (retour_suite_erreur == d_vrai)
! 1899: {
! 1900: /*
! 1901: * Retrait de la variable INDEP et retour
! 1902: */
! 1903:
! 1904: (*s_etat_processus).niveau_courant--;
! 1905:
! 1906: if (fclose(fichier) != 0)
! 1907: {
! 1908: (*s_etat_processus).erreur_systeme =
! 1909: d_es_erreur_fichier;
! 1910: return;
! 1911: }
! 1912:
! 1913: if (destruction_fichier(nom_fichier) == d_erreur)
! 1914: {
! 1915: (*s_etat_processus).erreur_systeme =
! 1916: d_es_erreur_fichier;
! 1917: return;
! 1918: }
! 1919:
! 1920: if (retrait_variable(s_etat_processus,
! 1921: nom_x, 'L') == d_erreur)
! 1922: {
! 1923: if ((*s_etat_processus).erreur_systeme != d_es)
! 1924: {
! 1925: if ((*s_etat_processus).erreur_systeme ==
! 1926: d_es_variable_introuvable)
! 1927: {
! 1928: (*s_etat_processus).erreur_systeme =
! 1929: d_es;
! 1930: }
! 1931: else
! 1932: {
! 1933:
! 1934: /*
! 1935: * Erreur système
! 1936: */
! 1937:
! 1938: free(nom_fichier);
! 1939: return;
! 1940: }
! 1941: }
! 1942:
! 1943: (*s_etat_processus).erreur_execution =
! 1944: d_ex_variable_non_definie;
! 1945: }
! 1946:
! 1947: if (last_valide == d_vrai)
! 1948: {
! 1949: sf(s_etat_processus, 31);
! 1950: }
! 1951:
! 1952: free(nom_x);
! 1953: free(nom_fichier);
! 1954:
! 1955: return;
! 1956: }
! 1957: }
! 1958:
! 1959: (*s_etat_processus).erreur_execution = d_ex;
! 1960: (*s_etat_processus).exception = d_ep;
! 1961: }
! 1962: else
! 1963: {
! 1964: /*
! 1965: * Donnée valide à écrire dans le fichier
! 1966: */
! 1967:
! 1968: if (depilement(s_etat_processus, &((*s_etat_processus)
! 1969: .l_base_pile), &s_objet) == d_erreur)
! 1970: {
! 1971:
! 1972: /*
! 1973: * Retrait de la variable INDEP et retour
! 1974: */
! 1975:
! 1976: (*s_etat_processus).niveau_courant--;
! 1977:
! 1978: if (fclose(fichier) != 0)
! 1979: {
! 1980: (*s_etat_processus).erreur_systeme =
! 1981: d_es_erreur_fichier;
! 1982: return;
! 1983: }
! 1984:
! 1985: if (destruction_fichier(nom_fichier) == d_erreur)
! 1986: {
! 1987: (*s_etat_processus).erreur_systeme =
! 1988: d_es_erreur_fichier;
! 1989: return;
! 1990: }
! 1991:
! 1992: if (retrait_variable(s_etat_processus, nom_x,
! 1993: 'L') == d_erreur)
! 1994: {
! 1995: if ((*s_etat_processus).erreur_systeme != d_es)
! 1996: {
! 1997: if ((*s_etat_processus).erreur_systeme ==
! 1998: d_es_variable_introuvable)
! 1999: {
! 2000: (*s_etat_processus).erreur_systeme = d_es;
! 2001: }
! 2002: else
! 2003: {
! 2004:
! 2005: /*
! 2006: * Erreur système
! 2007: */
! 2008:
! 2009: free(nom_fichier);
! 2010: return;
! 2011: }
! 2012: }
! 2013:
! 2014: free(nom_x);
! 2015: free(nom_fichier);
! 2016:
! 2017: if (last_valide == d_vrai)
! 2018: {
! 2019: sf(s_etat_processus, 31);
! 2020: }
! 2021:
! 2022: (*s_etat_processus).erreur_execution =
! 2023: d_ex_variable_non_definie;
! 2024: return;
! 2025: }
! 2026:
! 2027: free(nom_x);
! 2028: free(nom_fichier);
! 2029:
! 2030: if (last_valide == d_vrai)
! 2031: {
! 2032: sf(s_etat_processus, 31);
! 2033: }
! 2034:
! 2035: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 2036: return;
! 2037: }
! 2038:
! 2039: if ((*s_objet).type == INT)
! 2040: {
! 2041: r = (double) (*((integer8 *) (*s_objet).objet));
! 2042:
! 2043: if (fprintf(fichier, "%f %f\n", r * cos(t), r * sin(t)) < 0)
! 2044: {
! 2045: (*s_etat_processus).erreur_systeme =
! 2046: d_es_erreur_fichier;
! 2047: return;
! 2048: }
! 2049: }
! 2050: else if ((*s_objet).type == REL)
! 2051: {
! 2052: r = (double) (*((real8 *) (*s_objet).objet));
! 2053:
! 2054: if (fprintf(fichier, "%f %f\n", r * cos(t), r * sin(t)) < 0)
! 2055: {
! 2056: (*s_etat_processus).erreur_systeme =
! 2057: d_es_erreur_fichier;
! 2058: return;
! 2059: }
! 2060: }
! 2061:
! 2062: liberation(s_etat_processus, s_objet);
! 2063: }
! 2064: }
! 2065:
! 2066: /*
! 2067: * Retrait de la variable locale
! 2068: */
! 2069:
! 2070: (*s_etat_processus).niveau_courant--;
! 2071:
! 2072: if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
! 2073: {
! 2074: if ((*s_etat_processus).erreur_systeme != d_es)
! 2075: {
! 2076: if ((*s_etat_processus).erreur_systeme ==
! 2077: d_es_variable_introuvable)
! 2078: {
! 2079: (*s_etat_processus).erreur_systeme = d_es;
! 2080: }
! 2081: else
! 2082: {
! 2083: /*
! 2084: * Erreur système
! 2085: */
! 2086:
! 2087: free(nom_fichier);
! 2088: return;
! 2089: }
! 2090: }
! 2091:
! 2092: free(nom_x);
! 2093: free(nom_fichier);
! 2094:
! 2095: if (last_valide == d_vrai)
! 2096: {
! 2097: sf(s_etat_processus, 31);
! 2098: }
! 2099:
! 2100: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 2101: return;
! 2102: }
! 2103:
! 2104: free(nom_x);
! 2105: }
! 2106:
! 2107: /*
! 2108: * Tracé { x=RE(f(t)), y=IM(f(t)) }
! 2109: * Les bornes de variation de T sont données par une
! 2110: * liste "{ T T_min T_max } INDEP".
! 2111: * INDEP et DEPND testent leurs arguments pour que les pointeurs
! 2112: * indep et depend désignent des objets de type NOM ou LST à
! 2113: * trois éléments.
! 2114: */
! 2115:
! 2116: else if (strcmp((*s_etat_processus).type_trace_eq, "PARAMETRIQUE") == 0)
! 2117: {
! 2118: dimensions = 2;
! 2119:
! 2120: /*
! 2121: * Vérification de la présence de la variable globale EQ
! 2122: */
! 2123:
! 2124: if (recherche_variable(s_etat_processus, "EQ") == d_faux)
! 2125: {
! 2126: /*
! 2127: * Aucune variable "EQ" n'existe.
! 2128: */
! 2129:
! 2130: (*s_etat_processus).erreur_execution = d_ex_absence_equation;
! 2131: (*s_etat_processus).erreur_systeme = d_es;
! 2132:
! 2133: if (last_valide == d_vrai)
! 2134: {
! 2135: sf(s_etat_processus, 31);
! 2136: }
! 2137:
! 2138: return;
! 2139: }
! 2140:
! 2141: /*
! 2142: * Recherche de la variable globale "EQ"
! 2143: */
! 2144:
! 2145: i = (*s_etat_processus).position_variable_courante;
! 2146: presence_variable = d_faux;
! 2147:
! 2148: while(i >= 0)
! 2149: {
! 2150: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 2151: "EQ") == 0) && ((*s_etat_processus)
! 2152: .s_liste_variables[i].niveau == 1))
! 2153: {
! 2154: presence_variable = d_vrai;
! 2155: break;
! 2156: }
! 2157:
! 2158: i--;
! 2159: }
! 2160:
! 2161: if (presence_variable == d_faux)
! 2162: {
! 2163: if (last_valide == d_vrai)
! 2164: {
! 2165: sf(s_etat_processus, 31);
! 2166: }
! 2167:
! 2168: (*s_etat_processus).erreur_execution = d_ex_absence_equation;
! 2169: return;
! 2170: }
! 2171:
! 2172: if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
! 2173: {
! 2174: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
! 2175: return;
! 2176: }
! 2177:
! 2178: /*
! 2179: * Création du fichier graphique temporaire
! 2180: */
! 2181:
! 2182: if ((nom_fichier = creation_nom_fichier(s_etat_processus,
! 2183: (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
! 2184: {
! 2185: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2186: return;
! 2187: }
! 2188:
! 2189: if ((fichier = fopen(nom_fichier, "w+")) == NULL)
! 2190: {
! 2191: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2192: return;
! 2193: }
! 2194:
! 2195: /*
! 2196: * Récupération du domaine de variation de x
! 2197: */
! 2198:
! 2199: if ((*(*s_etat_processus).indep).type == LST)
! 2200: {
! 2201: l_element_courant = (*(*s_etat_processus).indep).objet;
! 2202:
! 2203: if ((s_variable_x.nom = malloc((strlen((*((struct_nom *)
! 2204: (*(*l_element_courant).donnee).objet)).nom) + 1) *
! 2205: sizeof(unsigned char))) == NULL)
! 2206: {
! 2207: if (fclose(fichier) != 0)
! 2208: {
! 2209: (*s_etat_processus).erreur_systeme =
! 2210: d_es_erreur_fichier;
! 2211: return;
! 2212: }
! 2213:
! 2214: if (destruction_fichier(nom_fichier) == d_erreur)
! 2215: {
! 2216: (*s_etat_processus).erreur_systeme =
! 2217: d_es_erreur_fichier;
! 2218: return;
! 2219: }
! 2220:
! 2221: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2222: return;
! 2223: }
! 2224:
! 2225: strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant)
! 2226: .donnee).objet)).nom);
! 2227:
! 2228: if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
! 2229: sizeof(unsigned char))) == NULL)
! 2230: {
! 2231: if (fclose(fichier) != 0)
! 2232: {
! 2233: (*s_etat_processus).erreur_systeme =
! 2234: d_es_erreur_fichier;
! 2235: return;
! 2236: }
! 2237:
! 2238: if (destruction_fichier(nom_fichier) == d_erreur)
! 2239: {
! 2240: (*s_etat_processus).erreur_systeme =
! 2241: d_es_erreur_fichier;
! 2242: return;
! 2243: }
! 2244:
! 2245: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2246: return;
! 2247: }
! 2248:
! 2249: strcpy(nom_x, s_variable_x.nom);
! 2250:
! 2251: l_element_courant = (*l_element_courant).suivant;
! 2252:
! 2253: if ((*(*l_element_courant).donnee).type == INT)
! 2254: {
! 2255: borne_minimale_x = (real8) (*((integer8 *)
! 2256: (*(*l_element_courant).donnee).objet));
! 2257: }
! 2258: else if ((*(*l_element_courant).donnee).type == INT)
! 2259: {
! 2260: borne_minimale_x = (*((real8 *) (*(*l_element_courant)
! 2261: .donnee).objet));
! 2262: }
! 2263: else
! 2264: {
! 2265: if (evaluation(s_etat_processus, (*l_element_courant).donnee,
! 2266: 'N') == d_erreur)
! 2267: {
! 2268: free(s_variable_x.nom);
! 2269: free(nom_x);
! 2270:
! 2271: if (fclose(fichier) != 0)
! 2272: {
! 2273: (*s_etat_processus).erreur_systeme =
! 2274: d_es_erreur_fichier;
! 2275: return;
! 2276: }
! 2277:
! 2278: if (destruction_fichier(nom_fichier) == d_erreur)
! 2279: {
! 2280: (*s_etat_processus).erreur_systeme =
! 2281: d_es_erreur_fichier;
! 2282: return;
! 2283: }
! 2284:
! 2285: if (last_valide == d_vrai)
! 2286: {
! 2287: sf(s_etat_processus, 31);
! 2288: }
! 2289:
! 2290: free(nom_fichier);
! 2291: return;
! 2292: }
! 2293:
! 2294: if (depilement(s_etat_processus, &((*s_etat_processus)
! 2295: .l_base_pile), &s_objet_evalue) == d_erreur)
! 2296: {
! 2297: free(s_variable_x.nom);
! 2298: free(nom_x);
! 2299:
! 2300: if (fclose(fichier) != 0)
! 2301: {
! 2302: (*s_etat_processus).erreur_systeme =
! 2303: d_es_erreur_fichier;
! 2304: return;
! 2305: }
! 2306:
! 2307: if (destruction_fichier(nom_fichier) == d_erreur)
! 2308: {
! 2309: (*s_etat_processus).erreur_systeme =
! 2310: d_es_erreur_fichier;
! 2311: return;
! 2312: }
! 2313:
! 2314: (*s_etat_processus).erreur_execution =
! 2315: d_ex_manque_argument;
! 2316:
! 2317: if (last_valide == d_vrai)
! 2318: {
! 2319: sf(s_etat_processus, 31);
! 2320: }
! 2321:
! 2322: free(nom_fichier);
! 2323: return;
! 2324: }
! 2325:
! 2326: if ((*s_objet_evalue).type == INT)
! 2327: {
! 2328: borne_minimale_x = (real8) (*((integer8 *)
! 2329: (*s_objet_evalue).objet));
! 2330: }
! 2331: else if ((*s_objet_evalue).type == REL)
! 2332: {
! 2333: borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet));
! 2334: }
! 2335: else
! 2336: {
! 2337: if (fclose(fichier) != 0)
! 2338: {
! 2339: (*s_etat_processus).erreur_systeme =
! 2340: d_es_erreur_fichier;
! 2341: return;
! 2342: }
! 2343:
! 2344: if (destruction_fichier(nom_fichier) == d_erreur)
! 2345: {
! 2346: (*s_etat_processus).erreur_systeme =
! 2347: d_es_erreur_fichier;
! 2348: return;
! 2349: }
! 2350:
! 2351: free(s_variable_x.nom);
! 2352: free(nom_x);
! 2353: liberation(s_etat_processus, s_objet_evalue);
! 2354:
! 2355: (*s_etat_processus).erreur_execution =
! 2356: d_ex_erreur_type_argument;
! 2357:
! 2358: if (last_valide == d_vrai)
! 2359: {
! 2360: sf(s_etat_processus, 31);
! 2361: }
! 2362:
! 2363: free(nom_fichier);
! 2364: return;
! 2365: }
! 2366:
! 2367: liberation(s_etat_processus, s_objet_evalue);
! 2368: }
! 2369:
! 2370: l_element_courant = (*l_element_courant).suivant;
! 2371:
! 2372: if ((*(*l_element_courant).donnee).type == INT)
! 2373: {
! 2374: borne_maximale_x = (real8) (*((integer8 *)
! 2375: (*(*l_element_courant).donnee).objet));
! 2376: }
! 2377: else if ((*(*l_element_courant).donnee).type == REL)
! 2378: {
! 2379: borne_maximale_x = (*((real8 *) (*(*l_element_courant)
! 2380: .donnee).objet));
! 2381: }
! 2382: else
! 2383: {
! 2384: if (evaluation(s_etat_processus, (*l_element_courant).donnee,
! 2385: 'N') == d_erreur)
! 2386: {
! 2387: free(s_variable_x.nom);
! 2388: free(nom_x);
! 2389:
! 2390: if (fclose(fichier) != 0)
! 2391: {
! 2392: (*s_etat_processus).erreur_systeme =
! 2393: d_es_erreur_fichier;
! 2394: return;
! 2395: }
! 2396:
! 2397: if (destruction_fichier(nom_fichier) == d_erreur)
! 2398: {
! 2399: (*s_etat_processus).erreur_systeme =
! 2400: d_es_erreur_fichier;
! 2401: return;
! 2402: }
! 2403:
! 2404: if (last_valide == d_vrai)
! 2405: {
! 2406: sf(s_etat_processus, 31);
! 2407: }
! 2408:
! 2409: free(nom_fichier);
! 2410: return;
! 2411: }
! 2412:
! 2413: if (depilement(s_etat_processus, &((*s_etat_processus)
! 2414: .l_base_pile), &s_objet_evalue) == d_erreur)
! 2415: {
! 2416: free(s_variable_x.nom);
! 2417: free(nom_x);
! 2418:
! 2419: if (fclose(fichier) != 0)
! 2420: {
! 2421: (*s_etat_processus).erreur_systeme =
! 2422: d_es_erreur_fichier;
! 2423: return;
! 2424: }
! 2425:
! 2426: if (destruction_fichier(nom_fichier) == d_erreur)
! 2427: {
! 2428: (*s_etat_processus).erreur_systeme =
! 2429: d_es_erreur_fichier;
! 2430: return;
! 2431: }
! 2432:
! 2433: (*s_etat_processus).erreur_execution =
! 2434: d_ex_manque_argument;
! 2435:
! 2436: if (last_valide == d_vrai)
! 2437: {
! 2438: sf(s_etat_processus, 31);
! 2439: }
! 2440:
! 2441: free(nom_fichier);
! 2442: return;
! 2443: }
! 2444:
! 2445: if ((*s_objet_evalue).type == INT)
! 2446: {
! 2447: borne_maximale_x = (real8) (*((integer8 *)
! 2448: (*s_objet_evalue).objet));
! 2449: }
! 2450: else if ((*s_objet_evalue).type == REL)
! 2451: {
! 2452: borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet));
! 2453: }
! 2454: else
! 2455: {
! 2456: free(s_variable_x.nom);
! 2457: free(nom_x);
! 2458:
! 2459: if (fclose(fichier) != 0)
! 2460: {
! 2461: (*s_etat_processus).erreur_systeme =
! 2462: d_es_erreur_fichier;
! 2463: return;
! 2464: }
! 2465:
! 2466: if (destruction_fichier(nom_fichier) == d_erreur)
! 2467: {
! 2468: (*s_etat_processus).erreur_systeme =
! 2469: d_es_erreur_fichier;
! 2470: return;
! 2471: }
! 2472:
! 2473: liberation(s_etat_processus, s_objet_evalue);
! 2474:
! 2475: (*s_etat_processus).erreur_execution =
! 2476: d_ex_erreur_type_argument;
! 2477:
! 2478: if (last_valide == d_vrai)
! 2479: {
! 2480: sf(s_etat_processus, 31);
! 2481: }
! 2482:
! 2483: free(nom_fichier);
! 2484: return;
! 2485: }
! 2486:
! 2487: liberation(s_etat_processus, s_objet_evalue);
! 2488: }
! 2489: }
! 2490: else
! 2491: {
! 2492: if (fclose(fichier) != 0)
! 2493: {
! 2494: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2495: return;
! 2496: }
! 2497:
! 2498: if (destruction_fichier(nom_fichier) == d_erreur)
! 2499: {
! 2500: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2501: return;
! 2502: }
! 2503:
! 2504: if (last_valide == d_vrai)
! 2505: {
! 2506: sf(s_etat_processus, 31);
! 2507: }
! 2508:
! 2509: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 2510:
! 2511: free(nom_fichier);
! 2512: return;
! 2513: }
! 2514:
! 2515: /*
! 2516: * Création d'une variable locale du nom pointé par INDEP
! 2517: */
! 2518:
! 2519: (*s_etat_processus).niveau_courant++;
! 2520: s_variable_x.niveau = (*s_etat_processus).niveau_courant;
! 2521:
! 2522: if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL)
! 2523: {
! 2524: if (fclose(fichier) != 0)
! 2525: {
! 2526: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2527: return;
! 2528: }
! 2529:
! 2530: if (destruction_fichier(nom_fichier) == d_erreur)
! 2531: {
! 2532: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2533: return;
! 2534: }
! 2535:
! 2536: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2537: return;
! 2538: }
! 2539:
! 2540: if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P')
! 2541: == d_erreur)
! 2542: {
! 2543: if (fclose(fichier) != 0)
! 2544: {
! 2545: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2546: return;
! 2547: }
! 2548:
! 2549: if (destruction_fichier(nom_fichier) == d_erreur)
! 2550: {
! 2551: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2552: return;
! 2553: }
! 2554:
! 2555: /*
! 2556: * L'erreur retournée ne peut être qu'une erreur système
! 2557: */
! 2558:
! 2559: free(nom_fichier);
! 2560: return;
! 2561: }
! 2562:
! 2563: /*
! 2564: * Boucle de calcul des points de la fonction
! 2565: */
! 2566:
! 2567: if (borne_maximale_x < borne_minimale_x)
! 2568: {
! 2569: t = borne_maximale_x;
! 2570: borne_maximale_x = borne_minimale_x;
! 2571: borne_minimale_x = t;
! 2572: }
! 2573:
! 2574: for(t = borne_minimale_x; t <= borne_maximale_x;
! 2575: t += (*s_etat_processus).resolution)
! 2576: {
! 2577: if (recherche_variable(s_etat_processus, nom_x) == d_vrai)
! 2578: {
! 2579: // La variable étant créée localement, elle n'est jamais
! 2580: // ni verrouillée ni partagée.
! 2581:
! 2582: BUG(((*s_etat_processus).s_liste_variables
! 2583: [(*s_etat_processus).position_variable_courante])
! 2584: .objet == NULL);
! 2585:
! 2586: if ((*((*s_etat_processus).s_liste_variables
! 2587: [(*s_etat_processus).position_variable_courante])
! 2588: .objet).type != REL)
! 2589: {
! 2590: liberation(s_etat_processus,
! 2591: ((*s_etat_processus).s_liste_variables
! 2592: [(*s_etat_processus).position_variable_courante])
! 2593: .objet);
! 2594:
! 2595: if ((((*s_etat_processus).s_liste_variables
! 2596: [(*s_etat_processus).position_variable_courante])
! 2597: .objet = allocation(s_etat_processus, REL))
! 2598: == NULL)
! 2599: {
! 2600: (*s_etat_processus).erreur_systeme =
! 2601: d_es_allocation_memoire;
! 2602: return;
! 2603: }
! 2604: }
! 2605:
! 2606: (*((real8 *) (*((*s_etat_processus).s_liste_variables
! 2607: [(*s_etat_processus).position_variable_courante])
! 2608: .objet).objet)) = t;
! 2609: }
! 2610: else
! 2611: {
! 2612: /*
! 2613: * La variable créée étant locale, l'utilisateur ne peut
! 2614: * pas l'effacer. On ne doit donc jamais passer par ici. Si
! 2615: * c'est néanmoins le cas, une erreur système est générée
! 2616: * provoquant l'arrêt du programme même dans une
! 2617: * structure IFERR.
! 2618: */
! 2619:
! 2620: if (fclose(fichier) != 0)
! 2621: {
! 2622: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2623: return;
! 2624: }
! 2625:
! 2626: if (destruction_fichier(nom_fichier) == d_erreur)
! 2627: {
! 2628: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2629: return;
! 2630: }
! 2631:
! 2632: if (last_valide == d_vrai)
! 2633: {
! 2634: sf(s_etat_processus, 31);
! 2635: }
! 2636:
! 2637: free(nom_fichier);
! 2638: return;
! 2639: }
! 2640:
! 2641: if (recherche_variable(s_etat_processus, "EQ")
! 2642: == d_faux)
! 2643: {
! 2644: /*
! 2645: * Aucune variable "EQ" n'existe.
! 2646: */
! 2647:
! 2648: (*s_etat_processus).erreur_execution =
! 2649: d_ex_variable_non_definie;
! 2650:
! 2651: /*
! 2652: * Retrait de la variable INDEP
! 2653: */
! 2654:
! 2655: (*s_etat_processus).niveau_courant--;
! 2656:
! 2657: if (fclose(fichier) != 0)
! 2658: {
! 2659: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2660: return;
! 2661: }
! 2662:
! 2663: if (destruction_fichier(nom_fichier) == d_erreur)
! 2664: {
! 2665: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2666: return;
! 2667: }
! 2668:
! 2669: if (retrait_variable(s_etat_processus, nom_x, 'L')
! 2670: == d_erreur)
! 2671: {
! 2672: if ((*s_etat_processus).erreur_systeme != d_es)
! 2673: {
! 2674: if ((*s_etat_processus).erreur_systeme ==
! 2675: d_es_variable_introuvable)
! 2676: {
! 2677: (*s_etat_processus).erreur_systeme = d_es;
! 2678: }
! 2679: else
! 2680: {
! 2681:
! 2682: /*
! 2683: * Erreur système
! 2684: */
! 2685:
! 2686: free(nom_fichier);
! 2687: return;
! 2688: }
! 2689: }
! 2690:
! 2691: free(nom_x);
! 2692: free(nom_fichier);
! 2693:
! 2694: if (last_valide == d_vrai)
! 2695: {
! 2696: sf(s_etat_processus, 31);
! 2697: }
! 2698:
! 2699: (*s_etat_processus).erreur_execution =
! 2700: d_ex_variable_non_definie;
! 2701: return;
! 2702: }
! 2703:
! 2704: if (last_valide == d_vrai)
! 2705: {
! 2706: sf(s_etat_processus, 31);
! 2707: }
! 2708:
! 2709: free(nom_x);
! 2710: free(nom_fichier);
! 2711: return;
! 2712: }
! 2713:
! 2714: /*
! 2715: * Recherche de la variable globale "EQ"
! 2716: */
! 2717:
! 2718: i = (*s_etat_processus).position_variable_courante;
! 2719: presence_variable = d_faux;
! 2720:
! 2721: while(i >= 0)
! 2722: {
! 2723: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 2724: "EQ") == 0) && ((*s_etat_processus)
! 2725: .s_liste_variables[i].niveau == 1))
! 2726: {
! 2727: presence_variable = d_vrai;
! 2728: break;
! 2729: }
! 2730:
! 2731: i--;
! 2732: }
! 2733:
! 2734: (*s_etat_processus).position_variable_courante = i;
! 2735:
! 2736: BUG((*s_etat_processus).s_liste_variables[i].objet == NULL);
! 2737:
! 2738: if (presence_variable == d_faux)
! 2739: {
! 2740: /*
! 2741: * Retrait de la variable INDEP
! 2742: */
! 2743:
! 2744: (*s_etat_processus).niveau_courant--;
! 2745:
! 2746: if (fclose(fichier) != 0)
! 2747: {
! 2748: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2749: return;
! 2750: }
! 2751:
! 2752: if (destruction_fichier(nom_fichier) == d_erreur)
! 2753: {
! 2754: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 2755: return;
! 2756: }
! 2757:
! 2758: if (retrait_variable(s_etat_processus, nom_x, 'L')
! 2759: == d_erreur)
! 2760: {
! 2761: if ((*s_etat_processus).erreur_systeme != d_es)
! 2762: {
! 2763: if ((*s_etat_processus).erreur_systeme ==
! 2764: d_es_variable_introuvable)
! 2765: {
! 2766: (*s_etat_processus).erreur_systeme = d_es;
! 2767: }
! 2768: else
! 2769: {
! 2770:
! 2771: /*
! 2772: * Erreur système
! 2773: */
! 2774:
! 2775: free(nom_fichier);
! 2776: return;
! 2777: }
! 2778: }
! 2779:
! 2780: free(nom_x);
! 2781: free(nom_fichier);
! 2782:
! 2783: if (last_valide == d_vrai)
! 2784: {
! 2785: sf(s_etat_processus, 31);
! 2786: }
! 2787:
! 2788: (*s_etat_processus).erreur_execution =
! 2789: d_ex_variable_non_definie;
! 2790: return;
! 2791: }
! 2792:
! 2793: free(nom_x);
! 2794: free(nom_fichier);
! 2795:
! 2796: if (last_valide == d_vrai)
! 2797: {
! 2798: sf(s_etat_processus, 31);
! 2799: }
! 2800:
! 2801: (*s_etat_processus).erreur_execution =
! 2802: d_ex_variable_non_definie;
! 2803: return;
! 2804: }
! 2805:
! 2806: /*
! 2807: * Evaluation de la fonction
! 2808: */
! 2809:
! 2810: hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle;
! 2811: l_position_normale = (*s_etat_processus).l_base_pile_systeme;
! 2812: niveau_courant = (*s_etat_processus).niveau_courant;
! 2813:
! 2814: (*s_etat_processus).erreur_execution = d_ex;
! 2815: (*s_etat_processus).exception = d_ep;
! 2816:
! 2817: if (evaluation(s_etat_processus, (*s_etat_processus)
! 2818: .s_liste_variables[(*s_etat_processus)
! 2819: .position_variable_courante].objet, 'N') == d_erreur)
! 2820: {
! 2821: if ((*s_etat_processus).erreur_systeme != d_es)
! 2822: {
! 2823: /*
! 2824: * Erreur système
! 2825: */
! 2826:
! 2827: free(nom_fichier);
! 2828: return;
! 2829: }
! 2830: else
! 2831: {
! 2832: retour_suite_erreur = d_faux;
! 2833: (*s_etat_processus).niveau_courant = niveau_courant;
! 2834:
! 2835: /*
! 2836: * Restauration de la pile initiale
! 2837: */
! 2838:
! 2839: while((*s_etat_processus).hauteur_pile_operationnelle >
! 2840: (unsigned long) hauteur_pile)
! 2841: {
! 2842: if (depilement(s_etat_processus, &((*s_etat_processus)
! 2843: .l_base_pile), &s_objet) == d_erreur)
! 2844: {
! 2845: (*s_etat_processus).erreur_execution =
! 2846: d_ex_manque_argument;
! 2847: retour_suite_erreur = d_vrai;
! 2848: break;
! 2849: }
! 2850:
! 2851: liberation(s_etat_processus, s_objet);
! 2852: }
! 2853:
! 2854: /*
! 2855: * Restauration de la pile système
! 2856: */
! 2857:
! 2858: while((*s_etat_processus).l_base_pile_systeme !=
! 2859: l_position_normale)
! 2860: {
! 2861: depilement_pile_systeme(s_etat_processus);
! 2862:
! 2863: if ((*s_etat_processus).erreur_systeme != d_es)
! 2864: {
! 2865: /*
! 2866: * Une pile vide provoque une erreur système
! 2867: */
! 2868:
! 2869: free(nom_fichier);
! 2870: return;
! 2871: }
! 2872: }
! 2873:
! 2874: if (retour_suite_erreur == d_vrai)
! 2875: {
! 2876: /*
! 2877: * Retrait de la variable INDEP et retour
! 2878: */
! 2879:
! 2880: (*s_etat_processus).niveau_courant--;
! 2881:
! 2882: if (fclose(fichier) != 0)
! 2883: {
! 2884: (*s_etat_processus).erreur_systeme =
! 2885: d_es_erreur_fichier;
! 2886: return;
! 2887: }
! 2888:
! 2889: if (destruction_fichier(nom_fichier) == d_erreur)
! 2890: {
! 2891: (*s_etat_processus).erreur_systeme =
! 2892: d_es_erreur_fichier;
! 2893: return;
! 2894: }
! 2895:
! 2896: if (retrait_variable(s_etat_processus,
! 2897: nom_x, 'L') == d_erreur)
! 2898: {
! 2899: if ((*s_etat_processus).erreur_systeme != d_es)
! 2900: {
! 2901: if ((*s_etat_processus).erreur_systeme ==
! 2902: d_es_variable_introuvable)
! 2903: {
! 2904: (*s_etat_processus).erreur_systeme =
! 2905: d_es;
! 2906: }
! 2907: else
! 2908: {
! 2909:
! 2910: /*
! 2911: * Erreur système
! 2912: */
! 2913:
! 2914: free(nom_fichier);
! 2915: return;
! 2916: }
! 2917: }
! 2918:
! 2919: (*s_etat_processus).erreur_execution =
! 2920: d_ex_variable_non_definie;
! 2921: }
! 2922:
! 2923: if (last_valide == d_vrai)
! 2924: {
! 2925: sf(s_etat_processus, 31);
! 2926: }
! 2927:
! 2928: free(nom_x);
! 2929: free(nom_fichier);
! 2930: return;
! 2931: }
! 2932: }
! 2933:
! 2934: (*s_etat_processus).erreur_execution = d_ex;
! 2935: (*s_etat_processus).exception = d_ep;
! 2936: }
! 2937: else
! 2938: {
! 2939: /*
! 2940: * Donnée valide à écrire dans le fichier
! 2941: */
! 2942:
! 2943: if (depilement(s_etat_processus, &((*s_etat_processus)
! 2944: .l_base_pile), &s_objet) == d_erreur)
! 2945: {
! 2946:
! 2947: /*
! 2948: * Retrait de la variable INDEP et retour
! 2949: */
! 2950:
! 2951: (*s_etat_processus).niveau_courant--;
! 2952:
! 2953: if (fclose(fichier) != 0)
! 2954: {
! 2955: (*s_etat_processus).erreur_systeme =
! 2956: d_es_erreur_fichier;
! 2957: return;
! 2958: }
! 2959:
! 2960: if (destruction_fichier(nom_fichier) == d_erreur)
! 2961: {
! 2962: (*s_etat_processus).erreur_systeme =
! 2963: d_es_erreur_fichier;
! 2964: return;
! 2965: }
! 2966:
! 2967: if (retrait_variable(s_etat_processus, nom_x,
! 2968: 'L') == d_erreur)
! 2969: {
! 2970: if ((*s_etat_processus).erreur_systeme != d_es)
! 2971: {
! 2972: if ((*s_etat_processus).erreur_systeme ==
! 2973: d_es_variable_introuvable)
! 2974: {
! 2975: (*s_etat_processus).erreur_systeme = d_es;
! 2976: }
! 2977: else
! 2978: {
! 2979:
! 2980: /*
! 2981: * Erreur système
! 2982: */
! 2983:
! 2984: free(nom_fichier);
! 2985: return;
! 2986: }
! 2987: }
! 2988:
! 2989: free(nom_x);
! 2990: free(nom_fichier);
! 2991:
! 2992: if (last_valide == d_vrai)
! 2993: {
! 2994: sf(s_etat_processus, 31);
! 2995: }
! 2996:
! 2997: (*s_etat_processus).erreur_execution =
! 2998: d_ex_variable_non_definie;
! 2999: return;
! 3000: }
! 3001:
! 3002: free(nom_x);
! 3003: free(nom_fichier);
! 3004:
! 3005: if (last_valide == d_vrai)
! 3006: {
! 3007: sf(s_etat_processus, 31);
! 3008: }
! 3009:
! 3010: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 3011: return;
! 3012: }
! 3013:
! 3014: if ((*s_objet).type == INT)
! 3015: {
! 3016: x = (double) (*((integer8 *) (*s_objet).objet));
! 3017: y = 0;
! 3018:
! 3019: if (fprintf(fichier, "%f %f\n", x, y) < 0)
! 3020: {
! 3021: (*s_etat_processus).erreur_systeme =
! 3022: d_es_erreur_fichier;
! 3023: return;
! 3024: }
! 3025: }
! 3026: else if ((*s_objet).type == REL)
! 3027: {
! 3028: x = (double) (*((real8 *) (*s_objet).objet));
! 3029: y = 0;
! 3030:
! 3031: if (fprintf(fichier, "%f %f\n", x, y) < 0)
! 3032: {
! 3033: (*s_etat_processus).erreur_systeme =
! 3034: d_es_erreur_fichier;
! 3035: return;
! 3036: }
! 3037: }
! 3038: else if ((*s_objet).type == CPL)
! 3039: {
! 3040: x = (*((complex16 *) (*s_objet).objet)).partie_reelle;
! 3041: y = (*((complex16 *) (*s_objet).objet)).partie_imaginaire;
! 3042:
! 3043: if (fprintf(fichier, "%f %f\n", x, y) < 0)
! 3044: {
! 3045: (*s_etat_processus).erreur_systeme =
! 3046: d_es_erreur_fichier;
! 3047: return;
! 3048: }
! 3049: }
! 3050:
! 3051: liberation(s_etat_processus, s_objet);
! 3052: }
! 3053: }
! 3054:
! 3055: /*
! 3056: * Retrait de la variable locale
! 3057: */
! 3058:
! 3059: (*s_etat_processus).niveau_courant--;
! 3060:
! 3061: if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
! 3062: {
! 3063: if ((*s_etat_processus).erreur_systeme != d_es)
! 3064: {
! 3065: if ((*s_etat_processus).erreur_systeme ==
! 3066: d_es_variable_introuvable)
! 3067: {
! 3068: (*s_etat_processus).erreur_systeme = d_es;
! 3069: }
! 3070: else
! 3071: {
! 3072: /*
! 3073: * Erreur système
! 3074: */
! 3075:
! 3076: free(nom_fichier);
! 3077: return;
! 3078: }
! 3079: }
! 3080:
! 3081: free(nom_x);
! 3082: free(nom_fichier);
! 3083:
! 3084: if (last_valide == d_vrai)
! 3085: {
! 3086: sf(s_etat_processus, 31);
! 3087: }
! 3088:
! 3089: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 3090: return;
! 3091: }
! 3092:
! 3093: free(nom_x);
! 3094: }
! 3095:
! 3096: /*
! 3097: * Tracé z=f(x,y)
! 3098: * Les bornes de variation de X sont données dans l'ordre
! 3099: * - soit sous la forme "{ X X_min X_max } INDEP" ;
! 3100: * - soit par les parties réelles de PMIN et PMAX.
! 3101: * Les bornes de variation de Y sont données dans l'ordre
! 3102: * - soit sous la forme "{ Y Y_min Y_max } DEPND" ;
! 3103: * - soit par les parties imaginaires de PMIN et PMAX.
! 3104: * INDEP et DEPND testent leurs arguments pour que les pointeurs
! 3105: * indep et depend désignent des objets de type NOM ou LST à
! 3106: * trois éléments.
! 3107: */
! 3108:
! 3109: else if ((strcmp((*s_etat_processus).type_trace_eq, "GRILLE 3D") == 0) ||
! 3110: (strcmp((*s_etat_processus).type_trace_eq, "COURBES DE NIVEAU")
! 3111: == 0))
! 3112: {
! 3113: premiere_iteration = d_vrai;
! 3114:
! 3115: /*
! 3116: * Vérification de la présence de la variable globale EQ
! 3117: */
! 3118:
! 3119: if (recherche_variable(s_etat_processus, "EQ") == d_faux)
! 3120: {
! 3121: /*
! 3122: * Aucune variable "EQ" n'existe.
! 3123: */
! 3124:
! 3125: (*s_etat_processus).erreur_execution = d_ex_absence_equation;
! 3126: (*s_etat_processus).erreur_systeme = d_es;
! 3127:
! 3128: return;
! 3129: }
! 3130:
! 3131: /*
! 3132: * Recherche de la variable globale "EQ"
! 3133: */
! 3134:
! 3135: i = (*s_etat_processus).position_variable_courante;
! 3136: presence_variable = d_faux;
! 3137:
! 3138: while(i >= 0)
! 3139: {
! 3140: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 3141: "EQ") == 0) && ((*s_etat_processus)
! 3142: .s_liste_variables[i].niveau == 1))
! 3143: {
! 3144: presence_variable = d_vrai;
! 3145: break;
! 3146: }
! 3147:
! 3148: i--;
! 3149: }
! 3150:
! 3151: if (presence_variable == d_faux)
! 3152: {
! 3153: if (last_valide == d_vrai)
! 3154: {
! 3155: sf(s_etat_processus, 31);
! 3156: }
! 3157:
! 3158: (*s_etat_processus).erreur_execution = d_ex_absence_equation;
! 3159: return;
! 3160: }
! 3161:
! 3162: if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
! 3163: {
! 3164: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
! 3165: return;
! 3166: }
! 3167:
! 3168: /*
! 3169: * Création du fichier graphique temporaire
! 3170: */
! 3171:
! 3172: if ((nom_fichier = creation_nom_fichier(s_etat_processus,
! 3173: (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
! 3174: {
! 3175: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3176: return;
! 3177: }
! 3178:
! 3179: if ((fichier = fopen(nom_fichier, "w+")) == NULL)
! 3180: {
! 3181: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3182: return;
! 3183: }
! 3184:
! 3185: /*
! 3186: * Récupération du domaine de variation de x
! 3187: */
! 3188:
! 3189: if ((*(*s_etat_processus).indep).type == LST)
! 3190: {
! 3191: l_element_courant = (*(*s_etat_processus).indep).objet;
! 3192:
! 3193: if ((s_variable_x.nom = malloc((strlen((*((struct_nom *)
! 3194: (*(*l_element_courant).donnee).objet)).nom) + 1) *
! 3195: sizeof(unsigned char))) == NULL)
! 3196: {
! 3197: if (fclose(fichier) != 0)
! 3198: {
! 3199: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3200: return;
! 3201: }
! 3202:
! 3203: if (destruction_fichier(nom_fichier) == d_erreur)
! 3204: {
! 3205: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3206: return;
! 3207: }
! 3208:
! 3209: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3210: return;
! 3211: }
! 3212:
! 3213: strcpy(s_variable_x.nom, (*((struct_nom *) (*(*l_element_courant)
! 3214: .donnee).objet)).nom);
! 3215:
! 3216: if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
! 3217: sizeof(unsigned char))) == NULL)
! 3218: {
! 3219: if (fclose(fichier) != 0)
! 3220: {
! 3221: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3222: return;
! 3223: }
! 3224:
! 3225: if (destruction_fichier(nom_fichier) == d_erreur)
! 3226: {
! 3227: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3228: return;
! 3229: }
! 3230:
! 3231: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3232: return;
! 3233: }
! 3234:
! 3235: strcpy(nom_x, s_variable_x.nom);
! 3236:
! 3237: l_element_courant = (*l_element_courant).suivant;
! 3238:
! 3239: if ((*(*l_element_courant).donnee).type == INT)
! 3240: {
! 3241: borne_minimale_x = (real8) (*((integer8 *)
! 3242: (*(*l_element_courant).donnee).objet));
! 3243: }
! 3244: else if ((*(*l_element_courant).donnee).type == REL)
! 3245: {
! 3246: borne_minimale_x = (*((real8 *) (*(*l_element_courant)
! 3247: .donnee).objet));
! 3248: }
! 3249: else
! 3250: {
! 3251: if (evaluation(s_etat_processus, (*l_element_courant).donnee,
! 3252: 'N') == d_erreur)
! 3253: {
! 3254: free(s_variable_x.nom);
! 3255: free(nom_x);
! 3256:
! 3257: if (fclose(fichier) != 0)
! 3258: {
! 3259: (*s_etat_processus).erreur_systeme =
! 3260: d_es_erreur_fichier;
! 3261: return;
! 3262: }
! 3263:
! 3264: if (destruction_fichier(nom_fichier) == d_erreur)
! 3265: {
! 3266: (*s_etat_processus).erreur_systeme =
! 3267: d_es_erreur_fichier;
! 3268: return;
! 3269: }
! 3270:
! 3271: if (last_valide == d_vrai)
! 3272: {
! 3273: sf(s_etat_processus, 31);
! 3274: }
! 3275:
! 3276: free(nom_fichier);
! 3277: return;
! 3278: }
! 3279:
! 3280: if (depilement(s_etat_processus, &((*s_etat_processus)
! 3281: .l_base_pile), &s_objet_evalue) == d_erreur)
! 3282: {
! 3283: free(s_variable_x.nom);
! 3284: free(nom_x);
! 3285:
! 3286: if (fclose(fichier) != 0)
! 3287: {
! 3288: (*s_etat_processus).erreur_systeme =
! 3289: d_es_erreur_fichier;
! 3290: return;
! 3291: }
! 3292:
! 3293: if (destruction_fichier(nom_fichier) == d_erreur)
! 3294: {
! 3295: (*s_etat_processus).erreur_systeme =
! 3296: d_es_erreur_fichier;
! 3297: return;
! 3298: }
! 3299:
! 3300: (*s_etat_processus).erreur_execution =
! 3301: d_ex_manque_argument;
! 3302:
! 3303: if (last_valide == d_vrai)
! 3304: {
! 3305: sf(s_etat_processus, 31);
! 3306: }
! 3307:
! 3308: free(nom_fichier);
! 3309: return;
! 3310: }
! 3311:
! 3312: if ((*s_objet_evalue).type == INT)
! 3313: {
! 3314: borne_minimale_x = (real8) (*((integer8 *)
! 3315: (*s_objet_evalue).objet));
! 3316: }
! 3317: else if ((*s_objet_evalue).type == REL)
! 3318: {
! 3319: borne_minimale_x = (*((real8 *) (*s_objet_evalue).objet));
! 3320: }
! 3321: else
! 3322: {
! 3323: if (fclose(fichier) != 0)
! 3324: {
! 3325: (*s_etat_processus).erreur_systeme =
! 3326: d_es_erreur_fichier;
! 3327: return;
! 3328: }
! 3329:
! 3330: if (destruction_fichier(nom_fichier) == d_erreur)
! 3331: {
! 3332: (*s_etat_processus).erreur_systeme =
! 3333: d_es_erreur_fichier;
! 3334: return;
! 3335: }
! 3336:
! 3337: free(s_variable_x.nom);
! 3338: free(nom_x);
! 3339: free(nom_fichier);
! 3340: liberation(s_etat_processus, s_objet_evalue);
! 3341:
! 3342: if (last_valide == d_vrai)
! 3343: {
! 3344: sf(s_etat_processus, 31);
! 3345: }
! 3346:
! 3347: (*s_etat_processus).erreur_execution =
! 3348: d_ex_erreur_type_argument;
! 3349: return;
! 3350: }
! 3351:
! 3352: liberation(s_etat_processus, s_objet_evalue);
! 3353: }
! 3354:
! 3355: l_element_courant = (*l_element_courant).suivant;
! 3356:
! 3357: if ((*(*l_element_courant).donnee).type == INT)
! 3358: {
! 3359: borne_maximale_x = (real8) (*((integer8 *)
! 3360: (*(*l_element_courant).donnee).objet));
! 3361: }
! 3362: else if ((*(*l_element_courant).donnee).type == REL)
! 3363: {
! 3364: borne_maximale_x = (*((real8 *) (*(*l_element_courant)
! 3365: .donnee).objet));
! 3366: }
! 3367: else
! 3368: {
! 3369: if (evaluation(s_etat_processus, (*l_element_courant).donnee,
! 3370: 'N') == d_erreur)
! 3371: {
! 3372: free(s_variable_x.nom);
! 3373: free(nom_x);
! 3374:
! 3375: if (fclose(fichier) != 0)
! 3376: {
! 3377: (*s_etat_processus).erreur_systeme =
! 3378: d_es_erreur_fichier;
! 3379: return;
! 3380: }
! 3381:
! 3382: if (destruction_fichier(nom_fichier) == d_erreur)
! 3383: {
! 3384: (*s_etat_processus).erreur_systeme =
! 3385: d_es_erreur_fichier;
! 3386: return;
! 3387: }
! 3388:
! 3389: if (last_valide == d_vrai)
! 3390: {
! 3391: sf(s_etat_processus, 31);
! 3392: }
! 3393:
! 3394: free(nom_fichier);
! 3395: return;
! 3396: }
! 3397:
! 3398: if (depilement(s_etat_processus, &((*s_etat_processus)
! 3399: .l_base_pile), &s_objet_evalue) == d_erreur)
! 3400: {
! 3401: free(s_variable_x.nom);
! 3402: free(nom_x);
! 3403:
! 3404: if (fclose(fichier) != 0)
! 3405: {
! 3406: (*s_etat_processus).erreur_systeme =
! 3407: d_es_erreur_fichier;
! 3408: return;
! 3409: }
! 3410:
! 3411: if (destruction_fichier(nom_fichier) == d_erreur)
! 3412: {
! 3413: (*s_etat_processus).erreur_systeme =
! 3414: d_es_erreur_fichier;
! 3415: return;
! 3416: }
! 3417:
! 3418: (*s_etat_processus).erreur_execution =
! 3419: d_ex_manque_argument;
! 3420:
! 3421: if (last_valide == d_vrai)
! 3422: {
! 3423: sf(s_etat_processus, 31);
! 3424: }
! 3425:
! 3426: free(nom_fichier);
! 3427: return;
! 3428: }
! 3429:
! 3430: if ((*s_objet_evalue).type == INT)
! 3431: {
! 3432: borne_maximale_x = (real8) (*((integer8 *)
! 3433: (*s_objet_evalue).objet));
! 3434: }
! 3435: else if ((*s_objet_evalue).type == REL)
! 3436: {
! 3437: borne_maximale_x = (*((real8 *) (*s_objet_evalue).objet));
! 3438: }
! 3439: else
! 3440: {
! 3441: free(s_variable_x.nom);
! 3442: free(nom_x);
! 3443:
! 3444: if (fclose(fichier) != 0)
! 3445: {
! 3446: (*s_etat_processus).erreur_systeme =
! 3447: d_es_erreur_fichier;
! 3448: return;
! 3449: }
! 3450:
! 3451: if (destruction_fichier(nom_fichier) == d_erreur)
! 3452: {
! 3453: (*s_etat_processus).erreur_systeme =
! 3454: d_es_erreur_fichier;
! 3455: return;
! 3456: }
! 3457:
! 3458: liberation(s_etat_processus, s_objet_evalue);
! 3459:
! 3460: (*s_etat_processus).erreur_execution =
! 3461: d_ex_erreur_type_argument;
! 3462:
! 3463: if (last_valide == d_vrai)
! 3464: {
! 3465: sf(s_etat_processus, 31);
! 3466: }
! 3467:
! 3468: free(nom_fichier);
! 3469: return;
! 3470: }
! 3471:
! 3472: liberation(s_etat_processus, s_objet_evalue);
! 3473: }
! 3474: }
! 3475: else
! 3476: {
! 3477: if ((s_variable_x.nom =
! 3478: malloc((strlen((*((struct_nom *) (*(*s_etat_processus)
! 3479: .indep).objet)).nom) + 1) * sizeof(unsigned char))) == NULL)
! 3480: {
! 3481: if (fclose(fichier) != 0)
! 3482: {
! 3483: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3484: return;
! 3485: }
! 3486:
! 3487: if (destruction_fichier(nom_fichier) == d_erreur)
! 3488: {
! 3489: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3490: return;
! 3491: }
! 3492:
! 3493: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3494: return;
! 3495: }
! 3496:
! 3497: strcpy(s_variable_x.nom, (*((struct_nom *) (*(*s_etat_processus)
! 3498: .indep).objet)).nom);
! 3499:
! 3500: if ((nom_x = malloc((strlen(s_variable_x.nom) + 1) *
! 3501: sizeof(unsigned char))) == NULL)
! 3502: {
! 3503: if (fclose(fichier) != 0)
! 3504: {
! 3505: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3506: return;
! 3507: }
! 3508:
! 3509: if (destruction_fichier(nom_fichier) == d_erreur)
! 3510: {
! 3511: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3512: return;
! 3513: }
! 3514:
! 3515: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3516: return;
! 3517: }
! 3518:
! 3519: strcpy(nom_x, s_variable_x.nom);
! 3520:
! 3521: if ((*s_etat_processus).systeme_axes == 0)
! 3522: {
! 3523: borne_minimale_x = (*s_etat_processus).x_min;
! 3524: borne_maximale_x = (*s_etat_processus).x_max;
! 3525: }
! 3526: else
! 3527: {
! 3528: borne_minimale_x = (*s_etat_processus).x2_min;
! 3529: borne_maximale_x = (*s_etat_processus).x2_max;
! 3530: }
! 3531: }
! 3532:
! 3533: /*
! 3534: * Création d'une variable locale du nom pointé par INDEP
! 3535: */
! 3536:
! 3537: (*s_etat_processus).niveau_courant++;
! 3538: s_variable_x.niveau = (*s_etat_processus).niveau_courant;
! 3539:
! 3540: if ((s_variable_x.objet = allocation(s_etat_processus, REL)) == NULL)
! 3541: {
! 3542: if (fclose(fichier) != 0)
! 3543: {
! 3544: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3545: return;
! 3546: }
! 3547:
! 3548: if (destruction_fichier(nom_fichier) == d_erreur)
! 3549: {
! 3550: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3551: return;
! 3552: }
! 3553:
! 3554: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3555: return;
! 3556: }
! 3557:
! 3558: if (creation_variable(s_etat_processus, &s_variable_x, 'V', 'P')
! 3559: == d_erreur)
! 3560: {
! 3561: if (fclose(fichier) != 0)
! 3562: {
! 3563: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3564: return;
! 3565: }
! 3566:
! 3567: if (destruction_fichier(nom_fichier) == d_erreur)
! 3568: {
! 3569: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3570: return;
! 3571: }
! 3572:
! 3573: /*
! 3574: * L'erreur retournée ne peut être qu'une erreur système
! 3575: */
! 3576:
! 3577: free(nom_fichier);
! 3578: return;
! 3579: }
! 3580:
! 3581: /*
! 3582: * Boucle de calcul des points de la fonction
! 3583: */
! 3584:
! 3585: if (borne_maximale_x < borne_minimale_x)
! 3586: {
! 3587: x = borne_maximale_x;
! 3588: borne_maximale_x = borne_minimale_x;
! 3589: borne_minimale_x = x;
! 3590: }
! 3591:
! 3592: dernier_point_valide[0] = 0;
! 3593: dernier_point_valide[1] = 0;
! 3594: dernier_point_valide[2] = 0;
! 3595:
! 3596: for(x = borne_minimale_x; x <= borne_maximale_x;
! 3597: x += (*s_etat_processus).resolution)
! 3598: {
! 3599: /*
! 3600: * Récupération du domaine de variation de y, celui-ci peut dépendre
! 3601: * du domaine de variation de x.
! 3602: */
! 3603:
! 3604: if ((*(*s_etat_processus).depend).type == LST)
! 3605: {
! 3606: l_element_courant = (*(*s_etat_processus).depend).objet;
! 3607:
! 3608: if ((s_variable_y.nom = malloc((strlen((*((struct_nom *)
! 3609: (*(*l_element_courant).donnee).objet)).nom) + 1) *
! 3610: sizeof(unsigned char))) == NULL)
! 3611: {
! 3612: if (fclose(fichier) != 0)
! 3613: {
! 3614: (*s_etat_processus).erreur_systeme =
! 3615: d_es_erreur_fichier;
! 3616: return;
! 3617: }
! 3618:
! 3619: if (destruction_fichier(nom_fichier) == d_erreur)
! 3620: {
! 3621: (*s_etat_processus).erreur_systeme =
! 3622: d_es_erreur_fichier;
! 3623: return;
! 3624: }
! 3625:
! 3626: (*s_etat_processus).erreur_systeme =
! 3627: d_es_allocation_memoire;
! 3628: return;
! 3629: }
! 3630:
! 3631: strcpy(s_variable_y.nom, (*((struct_nom *)
! 3632: (*(*l_element_courant).donnee).objet)).nom);
! 3633:
! 3634: if ((nom_y = malloc((strlen(s_variable_y.nom) + 1) *
! 3635: sizeof(unsigned char))) == NULL)
! 3636: {
! 3637: if (fclose(fichier) != 0)
! 3638: {
! 3639: (*s_etat_processus).erreur_systeme =
! 3640: d_es_erreur_fichier;
! 3641: return;
! 3642: }
! 3643:
! 3644: if (destruction_fichier(nom_fichier) == d_erreur)
! 3645: {
! 3646: (*s_etat_processus).erreur_systeme =
! 3647: d_es_erreur_fichier;
! 3648: return;
! 3649: }
! 3650:
! 3651: (*s_etat_processus).erreur_systeme =
! 3652: d_es_allocation_memoire;
! 3653: return;
! 3654: }
! 3655:
! 3656: strcpy(nom_y, s_variable_y.nom);
! 3657:
! 3658: l_element_courant = (*l_element_courant).suivant;
! 3659:
! 3660: if ((*(*l_element_courant).donnee).type == INT)
! 3661: {
! 3662: borne_minimale_y = (real8) (*((integer8 *)
! 3663: (*(*l_element_courant).donnee).objet));
! 3664: }
! 3665: else if ((*(*l_element_courant).donnee).type == REL)
! 3666: {
! 3667: borne_minimale_y = (*((real8 *) (*(*l_element_courant)
! 3668: .donnee).objet));
! 3669: }
! 3670: else
! 3671: {
! 3672: if (evaluation(s_etat_processus,
! 3673: (*l_element_courant).donnee, 'N') == d_erreur)
! 3674: {
! 3675: free(s_variable_y.nom);
! 3676: free(nom_y);
! 3677:
! 3678: free(s_variable_x.nom);
! 3679: free(nom_x);
! 3680:
! 3681: if (fclose(fichier) != 0)
! 3682: {
! 3683: (*s_etat_processus).erreur_systeme =
! 3684: d_es_erreur_fichier;
! 3685: return;
! 3686: }
! 3687:
! 3688: if (destruction_fichier(nom_fichier) == d_erreur)
! 3689: {
! 3690: (*s_etat_processus).erreur_systeme =
! 3691: d_es_erreur_fichier;
! 3692: return;
! 3693: }
! 3694:
! 3695: if (last_valide == d_vrai)
! 3696: {
! 3697: sf(s_etat_processus, 31);
! 3698: }
! 3699:
! 3700: free(nom_fichier);
! 3701: return;
! 3702: }
! 3703:
! 3704: if (depilement(s_etat_processus, &((*s_etat_processus)
! 3705: .l_base_pile), &s_objet_evalue) == d_erreur)
! 3706: {
! 3707: free(s_variable_y.nom);
! 3708: free(nom_y);
! 3709:
! 3710: free(s_variable_x.nom);
! 3711: free(nom_x);
! 3712:
! 3713: if (fclose(fichier) != 0)
! 3714: {
! 3715: (*s_etat_processus).erreur_systeme =
! 3716: d_es_erreur_fichier;
! 3717: return;
! 3718: }
! 3719:
! 3720: if (destruction_fichier(nom_fichier) == d_erreur)
! 3721: {
! 3722: (*s_etat_processus).erreur_systeme =
! 3723: d_es_erreur_fichier;
! 3724: return;
! 3725: }
! 3726:
! 3727: (*s_etat_processus).erreur_execution =
! 3728: d_ex_manque_argument;
! 3729:
! 3730: if (last_valide == d_vrai)
! 3731: {
! 3732: sf(s_etat_processus, 31);
! 3733: }
! 3734:
! 3735: free(nom_fichier);
! 3736: return;
! 3737: }
! 3738:
! 3739: if ((*s_objet_evalue).type == INT)
! 3740: {
! 3741: borne_minimale_y = (real8) (*((integer8 *)
! 3742: (*s_objet_evalue).objet));
! 3743: }
! 3744: else if ((*s_objet_evalue).type == REL)
! 3745: {
! 3746: borne_minimale_y = (*((real8 *)
! 3747: (*s_objet_evalue).objet));
! 3748: }
! 3749: else
! 3750: {
! 3751: if (fclose(fichier) != 0)
! 3752: {
! 3753: (*s_etat_processus).erreur_systeme =
! 3754: d_es_erreur_fichier;
! 3755: return;
! 3756: }
! 3757:
! 3758: if (destruction_fichier(nom_fichier) == d_erreur)
! 3759: {
! 3760: (*s_etat_processus).erreur_systeme =
! 3761: d_es_erreur_fichier;
! 3762: return;
! 3763: }
! 3764:
! 3765: free(s_variable_y.nom);
! 3766: free(nom_y);
! 3767: free(s_variable_x.nom);
! 3768: free(nom_x);
! 3769: free(nom_fichier);
! 3770: liberation(s_etat_processus, s_objet_evalue);
! 3771:
! 3772: if (last_valide == d_vrai)
! 3773: {
! 3774: sf(s_etat_processus, 31);
! 3775: }
! 3776:
! 3777: (*s_etat_processus).erreur_execution =
! 3778: d_ex_erreur_type_argument;
! 3779: return;
! 3780: }
! 3781:
! 3782: liberation(s_etat_processus, s_objet_evalue);
! 3783: }
! 3784:
! 3785: l_element_courant = (*l_element_courant).suivant;
! 3786:
! 3787: if ((*(*l_element_courant).donnee).type == INT)
! 3788: {
! 3789: borne_maximale_y = (real8) (*((integer8 *)
! 3790: (*(*l_element_courant).donnee).objet));
! 3791: }
! 3792: else if ((*(*l_element_courant).donnee).type == REL)
! 3793: {
! 3794: borne_maximale_y = (*((real8 *) (*(*l_element_courant)
! 3795: .donnee).objet));
! 3796: }
! 3797: else
! 3798: {
! 3799: if (evaluation(s_etat_processus,
! 3800: (*l_element_courant).donnee, 'N') == d_erreur)
! 3801: {
! 3802: free(s_variable_y.nom);
! 3803: free(nom_y);
! 3804: free(s_variable_x.nom);
! 3805: free(nom_x);
! 3806:
! 3807: if (fclose(fichier) != 0)
! 3808: {
! 3809: (*s_etat_processus).erreur_systeme =
! 3810: d_es_erreur_fichier;
! 3811: return;
! 3812: }
! 3813:
! 3814: if (destruction_fichier(nom_fichier) == d_erreur)
! 3815: {
! 3816: (*s_etat_processus).erreur_systeme =
! 3817: d_es_erreur_fichier;
! 3818: return;
! 3819: }
! 3820:
! 3821: if (last_valide == d_vrai)
! 3822: {
! 3823: sf(s_etat_processus, 31);
! 3824: }
! 3825:
! 3826: free(nom_fichier);
! 3827: return;
! 3828: }
! 3829:
! 3830: if (depilement(s_etat_processus, &((*s_etat_processus)
! 3831: .l_base_pile), &s_objet_evalue) == d_erreur)
! 3832: {
! 3833: free(s_variable_y.nom);
! 3834: free(nom_y);
! 3835: free(s_variable_x.nom);
! 3836: free(nom_x);
! 3837:
! 3838: if (fclose(fichier) != 0)
! 3839: {
! 3840: (*s_etat_processus).erreur_systeme =
! 3841: d_es_erreur_fichier;
! 3842: return;
! 3843: }
! 3844:
! 3845: if (destruction_fichier(nom_fichier) == d_erreur)
! 3846: {
! 3847: (*s_etat_processus).erreur_systeme =
! 3848: d_es_erreur_fichier;
! 3849: return;
! 3850: }
! 3851:
! 3852: (*s_etat_processus).erreur_execution =
! 3853: d_ex_manque_argument;
! 3854:
! 3855: if (last_valide == d_vrai)
! 3856: {
! 3857: sf(s_etat_processus, 31);
! 3858: }
! 3859:
! 3860: free(nom_fichier);
! 3861: return;
! 3862: }
! 3863:
! 3864: if ((*s_objet_evalue).type == INT)
! 3865: {
! 3866: borne_maximale_y = (real8) (*((integer8 *)
! 3867: (*s_objet_evalue).objet));
! 3868: }
! 3869: else if ((*s_objet_evalue).type == REL)
! 3870: {
! 3871: borne_maximale_y = (*((real8 *)
! 3872: (*s_objet_evalue).objet));
! 3873: }
! 3874: else
! 3875: {
! 3876: free(s_variable_y.nom);
! 3877: free(nom_y);
! 3878: free(s_variable_x.nom);
! 3879: free(nom_x);
! 3880:
! 3881: if (fclose(fichier) != 0)
! 3882: {
! 3883: (*s_etat_processus).erreur_systeme =
! 3884: d_es_erreur_fichier;
! 3885: return;
! 3886: }
! 3887:
! 3888: if (destruction_fichier(nom_fichier) == d_erreur)
! 3889: {
! 3890: (*s_etat_processus).erreur_systeme =
! 3891: d_es_erreur_fichier;
! 3892: return;
! 3893: }
! 3894:
! 3895: liberation(s_etat_processus, s_objet_evalue);
! 3896:
! 3897: (*s_etat_processus).erreur_execution =
! 3898: d_ex_erreur_type_argument;
! 3899:
! 3900: if (last_valide == d_vrai)
! 3901: {
! 3902: sf(s_etat_processus, 31);
! 3903: }
! 3904:
! 3905: free(nom_fichier);
! 3906: return;
! 3907: }
! 3908:
! 3909: liberation(s_etat_processus, s_objet_evalue);
! 3910: }
! 3911: }
! 3912: else
! 3913: {
! 3914: if ((s_variable_y.nom =
! 3915: malloc((strlen((*((struct_nom *) (*(*s_etat_processus)
! 3916: .depend).objet)).nom) + 1) * sizeof(unsigned char)))
! 3917: == NULL)
! 3918: {
! 3919: if (fclose(fichier) != 0)
! 3920: {
! 3921: (*s_etat_processus).erreur_systeme =
! 3922: d_es_erreur_fichier;
! 3923: return;
! 3924: }
! 3925:
! 3926: if (destruction_fichier(nom_fichier) == d_erreur)
! 3927: {
! 3928: (*s_etat_processus).erreur_systeme =
! 3929: d_es_erreur_fichier;
! 3930: return;
! 3931: }
! 3932:
! 3933: (*s_etat_processus).erreur_systeme =
! 3934: d_es_allocation_memoire;
! 3935: return;
! 3936: }
! 3937:
! 3938: strcpy(s_variable_y.nom, (*((struct_nom *) (*(*s_etat_processus)
! 3939: .depend).objet)).nom);
! 3940:
! 3941: if ((nom_y = malloc((strlen(s_variable_y.nom) + 1) *
! 3942: sizeof(unsigned char))) == NULL)
! 3943: {
! 3944: if (fclose(fichier) != 0)
! 3945: {
! 3946: (*s_etat_processus).erreur_systeme =
! 3947: d_es_erreur_fichier;
! 3948: return;
! 3949: }
! 3950:
! 3951: if (destruction_fichier(nom_fichier) == d_erreur)
! 3952: {
! 3953: (*s_etat_processus).erreur_systeme =
! 3954: d_es_erreur_fichier;
! 3955: return;
! 3956: }
! 3957:
! 3958: (*s_etat_processus).erreur_systeme =
! 3959: d_es_allocation_memoire;
! 3960: return;
! 3961: }
! 3962:
! 3963: strcpy(nom_y, s_variable_y.nom);
! 3964:
! 3965: if ((*s_etat_processus).systeme_axes == 0)
! 3966: {
! 3967: borne_minimale_y = (*s_etat_processus).y_min;
! 3968: borne_maximale_y = (*s_etat_processus).y_max;
! 3969: }
! 3970: else
! 3971: {
! 3972: borne_minimale_y = (*s_etat_processus).y2_min;
! 3973: borne_maximale_y = (*s_etat_processus).y2_max;
! 3974: }
! 3975: }
! 3976:
! 3977: /*
! 3978: * Création d'une variable locale du nom pointé par DEPEND
! 3979: */
! 3980:
! 3981: s_variable_y.niveau = (*s_etat_processus).niveau_courant;
! 3982:
! 3983: if ((s_variable_y.objet = allocation(s_etat_processus, REL))
! 3984: == NULL)
! 3985: {
! 3986: if (fclose(fichier) != 0)
! 3987: {
! 3988: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3989: return;
! 3990: }
! 3991:
! 3992: if (destruction_fichier(nom_fichier) == d_erreur)
! 3993: {
! 3994: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 3995: return;
! 3996: }
! 3997:
! 3998: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3999: return;
! 4000: }
! 4001:
! 4002: if (creation_variable(s_etat_processus, &s_variable_y, 'V', 'P')
! 4003: == d_erreur)
! 4004: {
! 4005: if (fclose(fichier) != 0)
! 4006: {
! 4007: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 4008: return;
! 4009: }
! 4010:
! 4011: if (destruction_fichier(nom_fichier) == d_erreur)
! 4012: {
! 4013: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 4014: return;
! 4015: }
! 4016:
! 4017: /*
! 4018: * L'erreur retournée ne peut être qu'une erreur système
! 4019: */
! 4020:
! 4021: free(nom_fichier);
! 4022: return;
! 4023: }
! 4024:
! 4025: if (borne_maximale_y < borne_minimale_y)
! 4026: {
! 4027: y = borne_maximale_y;
! 4028: borne_maximale_y = borne_minimale_y;
! 4029: borne_minimale_y = y;
! 4030: }
! 4031:
! 4032: if (premiere_iteration == d_vrai)
! 4033: {
! 4034: dernier_point_valide[0] = borne_minimale_x;
! 4035: dernier_point_valide[1] = borne_minimale_y;
! 4036: dernier_point_valide[2] = 0;
! 4037:
! 4038: premiere_iteration = d_faux;
! 4039: }
! 4040:
! 4041: for(y = borne_minimale_y; y <= borne_maximale_y;
! 4042: y += (*s_etat_processus).resolution)
! 4043: {
! 4044: if (recherche_variable(s_etat_processus, nom_x) == d_vrai)
! 4045: {
! 4046: // La variable étant créée localement, elle n'est jamais
! 4047: // ni verrouillée ni partagee.
! 4048:
! 4049: BUG((*s_etat_processus).s_liste_variables
! 4050: [(*s_etat_processus).position_variable_courante]
! 4051: .objet == NULL);
! 4052:
! 4053: if ((*((*s_etat_processus).s_liste_variables
! 4054: [(*s_etat_processus).position_variable_courante])
! 4055: .objet).type != REL)
! 4056: {
! 4057: liberation(s_etat_processus,
! 4058: ((*s_etat_processus).s_liste_variables
! 4059: [(*s_etat_processus)
! 4060: .position_variable_courante]).objet);
! 4061:
! 4062: if ((((*s_etat_processus).s_liste_variables
! 4063: [(*s_etat_processus)
! 4064: .position_variable_courante]).objet =
! 4065: allocation(s_etat_processus, REL)) == NULL)
! 4066: {
! 4067: (*s_etat_processus).erreur_systeme =
! 4068: d_es_allocation_memoire;
! 4069: return;
! 4070: }
! 4071: }
! 4072:
! 4073: (*((real8 *) (*((*s_etat_processus).s_liste_variables
! 4074: [(*s_etat_processus).position_variable_courante])
! 4075: .objet).objet)) = x;
! 4076: }
! 4077: else
! 4078: {
! 4079: /*
! 4080: * La variable créée étant locale, l'utilisateur ne peut
! 4081: * pas l'effacer. On ne doit donc jamais passer par ici. Si
! 4082: * c'est néanmoins le cas, une erreur système est générée
! 4083: * provoquant l'arrêt du programme même dans une
! 4084: * structure IFERR.
! 4085: */
! 4086:
! 4087: if (fclose(fichier) != 0)
! 4088: {
! 4089: (*s_etat_processus).erreur_systeme =
! 4090: d_es_erreur_fichier;
! 4091: return;
! 4092: }
! 4093:
! 4094: if (destruction_fichier(nom_fichier) == d_erreur)
! 4095: {
! 4096: (*s_etat_processus).erreur_systeme =
! 4097: d_es_erreur_fichier;
! 4098: return;
! 4099: }
! 4100:
! 4101: if (last_valide == d_vrai)
! 4102: {
! 4103: sf(s_etat_processus, 31);
! 4104: }
! 4105:
! 4106: free(nom_fichier);
! 4107: return;
! 4108: }
! 4109:
! 4110: if (recherche_variable(s_etat_processus, nom_y) == d_vrai)
! 4111: {
! 4112: // La variable étant créée localement, elle n'est jamais
! 4113: // ni verrouillée ni partagée.
! 4114:
! 4115: BUG((*s_etat_processus).s_liste_variables
! 4116: [(*s_etat_processus).position_variable_courante]
! 4117: .objet == NULL);
! 4118:
! 4119: if ((*((*s_etat_processus).s_liste_variables
! 4120: [(*s_etat_processus).position_variable_courante])
! 4121: .objet).type != REL)
! 4122: {
! 4123: liberation(s_etat_processus,
! 4124: ((*s_etat_processus).s_liste_variables
! 4125: [(*s_etat_processus)
! 4126: .position_variable_courante]).objet);
! 4127:
! 4128: if ((((*s_etat_processus).s_liste_variables
! 4129: [(*s_etat_processus)
! 4130: .position_variable_courante]).objet =
! 4131: allocation(s_etat_processus, REL)) == NULL)
! 4132: {
! 4133: (*s_etat_processus).erreur_systeme =
! 4134: d_es_allocation_memoire;
! 4135: return;
! 4136: }
! 4137: }
! 4138:
! 4139: (*((real8 *) (*((*s_etat_processus).s_liste_variables
! 4140: [(*s_etat_processus).position_variable_courante])
! 4141: .objet).objet)) = y;
! 4142: }
! 4143: else
! 4144: {
! 4145: /*
! 4146: * La variable créée étant locale, l'utilisateur ne peut
! 4147: * pas l'effacer. On ne doit donc jamais passer par ici. Si
! 4148: * c'est néanmoins le cas, une erreur système est générée
! 4149: * provoquant l'arrêt du programme même dans une
! 4150: * structure IFERR.
! 4151: */
! 4152:
! 4153: if (fclose(fichier) != 0)
! 4154: {
! 4155: (*s_etat_processus).erreur_systeme =
! 4156: d_es_erreur_fichier;
! 4157: return;
! 4158: }
! 4159:
! 4160: if (destruction_fichier(nom_fichier) == d_erreur)
! 4161: {
! 4162: (*s_etat_processus).erreur_systeme =
! 4163: d_es_erreur_fichier;
! 4164: return;
! 4165: }
! 4166:
! 4167: if (last_valide == d_vrai)
! 4168: {
! 4169: sf(s_etat_processus, 31);
! 4170: }
! 4171:
! 4172: free(nom_fichier);
! 4173: return;
! 4174: }
! 4175:
! 4176: if (recherche_variable(s_etat_processus, "EQ")
! 4177: == d_faux)
! 4178: {
! 4179: /*
! 4180: * Aucune variable "EQ" n'existe.
! 4181: */
! 4182:
! 4183: (*s_etat_processus).erreur_execution =
! 4184: d_ex_variable_non_definie;
! 4185:
! 4186: /*
! 4187: * Retrait des variables INDEP et DEPND
! 4188: */
! 4189:
! 4190: (*s_etat_processus).niveau_courant--;
! 4191:
! 4192: if (fclose(fichier) != 0)
! 4193: {
! 4194: (*s_etat_processus).erreur_systeme =
! 4195: d_es_erreur_fichier;
! 4196: return;
! 4197: }
! 4198:
! 4199: if (destruction_fichier(nom_fichier) == d_erreur)
! 4200: {
! 4201: (*s_etat_processus).erreur_systeme =
! 4202: d_es_erreur_fichier;
! 4203: return;
! 4204: }
! 4205:
! 4206: if (retrait_variable(s_etat_processus, nom_x, 'L')
! 4207: == d_erreur)
! 4208: {
! 4209: if ((*s_etat_processus).erreur_systeme != d_es)
! 4210: {
! 4211: if ((*s_etat_processus).erreur_systeme ==
! 4212: d_es_variable_introuvable)
! 4213: {
! 4214: (*s_etat_processus).erreur_systeme = d_es;
! 4215: }
! 4216: else
! 4217: {
! 4218:
! 4219: /*
! 4220: * Erreur système
! 4221: */
! 4222:
! 4223: free(nom_fichier);
! 4224: return;
! 4225: }
! 4226: }
! 4227:
! 4228: free(nom_x);
! 4229: free(nom_y);
! 4230: free(nom_fichier);
! 4231:
! 4232: if (last_valide == d_vrai)
! 4233: {
! 4234: sf(s_etat_processus, 31);
! 4235: }
! 4236:
! 4237: (*s_etat_processus).erreur_execution =
! 4238: d_ex_variable_non_definie;
! 4239: return;
! 4240: }
! 4241:
! 4242: if (retrait_variable(s_etat_processus, nom_y, 'L')
! 4243: == d_erreur)
! 4244: {
! 4245: if ((*s_etat_processus).erreur_systeme != d_es)
! 4246: {
! 4247: if ((*s_etat_processus).erreur_systeme ==
! 4248: d_es_variable_introuvable)
! 4249: {
! 4250: (*s_etat_processus).erreur_systeme = d_es;
! 4251: }
! 4252: else
! 4253: {
! 4254:
! 4255: /*
! 4256: * Erreur système
! 4257: */
! 4258:
! 4259: free(nom_fichier);
! 4260: return;
! 4261: }
! 4262: }
! 4263:
! 4264: free(nom_x);
! 4265: free(nom_y);
! 4266: free(nom_fichier);
! 4267:
! 4268: if (last_valide == d_vrai)
! 4269: {
! 4270: sf(s_etat_processus, 31);
! 4271: }
! 4272:
! 4273: (*s_etat_processus).erreur_execution =
! 4274: d_ex_variable_non_definie;
! 4275: return;
! 4276: }
! 4277:
! 4278: if (last_valide == d_vrai)
! 4279: {
! 4280: sf(s_etat_processus, 31);
! 4281: }
! 4282:
! 4283: free(nom_x);
! 4284: free(nom_y);
! 4285: free(nom_fichier);
! 4286: return;
! 4287: }
! 4288:
! 4289: /*
! 4290: * Recherche de la variable globale "EQ"
! 4291: */
! 4292:
! 4293: i = (*s_etat_processus).position_variable_courante;
! 4294: presence_variable = d_faux;
! 4295:
! 4296: while(i >= 0)
! 4297: {
! 4298: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
! 4299: "EQ") == 0) && ((*s_etat_processus)
! 4300: .s_liste_variables[i].niveau == 1))
! 4301: {
! 4302: presence_variable = d_vrai;
! 4303: break;
! 4304: }
! 4305:
! 4306: i--;
! 4307: }
! 4308:
! 4309: (*s_etat_processus).position_variable_courante = i;
! 4310:
! 4311: BUG((*s_etat_processus).s_liste_variables[i].objet == NULL);
! 4312:
! 4313: if (presence_variable == d_faux)
! 4314: {
! 4315: /*
! 4316: * Retrait des variables INDEP et DEPND
! 4317: */
! 4318:
! 4319: (*s_etat_processus).niveau_courant--;
! 4320:
! 4321: if (fclose(fichier) != 0)
! 4322: {
! 4323: (*s_etat_processus).erreur_systeme =
! 4324: d_es_erreur_fichier;
! 4325: return;
! 4326: }
! 4327:
! 4328: if (destruction_fichier(nom_fichier) == d_erreur)
! 4329: {
! 4330: (*s_etat_processus).erreur_systeme =
! 4331: d_es_erreur_fichier;
! 4332: return;
! 4333: }
! 4334:
! 4335: if (retrait_variable(s_etat_processus, nom_x, 'L')
! 4336: == d_erreur)
! 4337: {
! 4338: if ((*s_etat_processus).erreur_systeme != d_es)
! 4339: {
! 4340: if ((*s_etat_processus).erreur_systeme ==
! 4341: d_es_variable_introuvable)
! 4342: {
! 4343: (*s_etat_processus).erreur_systeme = d_es;
! 4344: }
! 4345: else
! 4346: {
! 4347:
! 4348: /*
! 4349: * Erreur système
! 4350: */
! 4351:
! 4352: free(nom_fichier);
! 4353: return;
! 4354: }
! 4355: }
! 4356:
! 4357: free(nom_x);
! 4358: free(nom_y);
! 4359: free(nom_fichier);
! 4360:
! 4361: if (last_valide == d_vrai)
! 4362: {
! 4363: sf(s_etat_processus, 31);
! 4364: }
! 4365:
! 4366: (*s_etat_processus).erreur_execution =
! 4367: d_ex_variable_non_definie;
! 4368: return;
! 4369: }
! 4370:
! 4371: if (retrait_variable(s_etat_processus, nom_y, 'L')
! 4372: == d_erreur)
! 4373: {
! 4374: if ((*s_etat_processus).erreur_systeme != d_es)
! 4375: {
! 4376: if ((*s_etat_processus).erreur_systeme ==
! 4377: d_es_variable_introuvable)
! 4378: {
! 4379: (*s_etat_processus).erreur_systeme = d_es;
! 4380: }
! 4381: else
! 4382: {
! 4383:
! 4384: /*
! 4385: * Erreur système
! 4386: */
! 4387:
! 4388: free(nom_fichier);
! 4389: return;
! 4390: }
! 4391: }
! 4392:
! 4393: free(nom_x);
! 4394: free(nom_y);
! 4395: free(nom_fichier);
! 4396:
! 4397: if (last_valide == d_vrai)
! 4398: {
! 4399: sf(s_etat_processus, 31);
! 4400: }
! 4401:
! 4402: (*s_etat_processus).erreur_execution =
! 4403: d_ex_variable_non_definie;
! 4404: return;
! 4405: }
! 4406:
! 4407: free(nom_x);
! 4408: free(nom_y);
! 4409: free(nom_fichier);
! 4410:
! 4411: if (last_valide == d_vrai)
! 4412: {
! 4413: sf(s_etat_processus, 31);
! 4414: }
! 4415:
! 4416: (*s_etat_processus).erreur_execution =
! 4417: d_ex_variable_non_definie;
! 4418: return;
! 4419: }
! 4420:
! 4421: /*
! 4422: * Evaluation de la fonction
! 4423: */
! 4424:
! 4425: hauteur_pile = (*s_etat_processus).hauteur_pile_operationnelle;
! 4426: l_position_normale = (*s_etat_processus).l_base_pile_systeme;
! 4427: niveau_courant = (*s_etat_processus).niveau_courant;
! 4428:
! 4429: (*s_etat_processus).erreur_execution = d_ex;
! 4430: (*s_etat_processus).exception = d_ep;
! 4431:
! 4432: if (evaluation(s_etat_processus, (*s_etat_processus)
! 4433: .s_liste_variables[(*s_etat_processus)
! 4434: .position_variable_courante].objet, 'N') == d_erreur)
! 4435: {
! 4436: if ((*s_etat_processus).erreur_systeme != d_es)
! 4437: {
! 4438: /*
! 4439: * Erreur système
! 4440: */
! 4441:
! 4442: free(nom_fichier);
! 4443: return;
! 4444: }
! 4445: else
! 4446: {
! 4447: retour_suite_erreur = d_faux;
! 4448: (*s_etat_processus).niveau_courant = niveau_courant;
! 4449:
! 4450: /*
! 4451: * Restauration de la pile initiale
! 4452: */
! 4453:
! 4454: while((*s_etat_processus).hauteur_pile_operationnelle >
! 4455: (unsigned long) hauteur_pile)
! 4456: {
! 4457: if (depilement(s_etat_processus,
! 4458: &((*s_etat_processus)
! 4459: .l_base_pile), &s_objet) == d_erreur)
! 4460: {
! 4461: (*s_etat_processus).erreur_execution =
! 4462: d_ex_manque_argument;
! 4463: retour_suite_erreur = d_vrai;
! 4464: break;
! 4465: }
! 4466:
! 4467: liberation(s_etat_processus, s_objet);
! 4468: }
! 4469:
! 4470: /*
! 4471: * Restauration de la pile système
! 4472: */
! 4473:
! 4474: while((*s_etat_processus).l_base_pile_systeme !=
! 4475: l_position_normale)
! 4476: {
! 4477: depilement_pile_systeme(s_etat_processus);
! 4478:
! 4479: if ((*s_etat_processus).erreur_systeme != d_es)
! 4480: {
! 4481: /*
! 4482: * Une pile vide provoque une erreur système
! 4483: */
! 4484:
! 4485: free(nom_fichier);
! 4486: return;
! 4487: }
! 4488: }
! 4489:
! 4490: if (retour_suite_erreur == d_vrai)
! 4491: {
! 4492: /*
! 4493: * Retrait des variables INDEP, DEPND et retour
! 4494: */
! 4495:
! 4496: (*s_etat_processus).niveau_courant--;
! 4497:
! 4498: if (fclose(fichier) != 0)
! 4499: {
! 4500: (*s_etat_processus).erreur_systeme =
! 4501: d_es_erreur_fichier;
! 4502: return;
! 4503: }
! 4504:
! 4505: if (destruction_fichier(nom_fichier) == d_erreur)
! 4506: {
! 4507: (*s_etat_processus).erreur_systeme =
! 4508: d_es_erreur_fichier;
! 4509: return;
! 4510: }
! 4511:
! 4512: if (retrait_variable(s_etat_processus,
! 4513: nom_x, 'L') == d_erreur)
! 4514: {
! 4515: if ((*s_etat_processus).erreur_systeme != d_es)
! 4516: {
! 4517: if ((*s_etat_processus).erreur_systeme ==
! 4518: d_es_variable_introuvable)
! 4519: {
! 4520: (*s_etat_processus).erreur_systeme =
! 4521: d_es;
! 4522: }
! 4523: else
! 4524: {
! 4525:
! 4526: /*
! 4527: * Erreur système
! 4528: */
! 4529:
! 4530: free(nom_fichier);
! 4531: return;
! 4532: }
! 4533: }
! 4534:
! 4535: (*s_etat_processus).erreur_execution =
! 4536: d_ex_variable_non_definie;
! 4537: }
! 4538:
! 4539: if (retrait_variable(s_etat_processus,
! 4540: nom_y, 'L') == d_erreur)
! 4541: {
! 4542: if ((*s_etat_processus).erreur_systeme != d_es)
! 4543: {
! 4544: if ((*s_etat_processus).erreur_systeme ==
! 4545: d_es_variable_introuvable)
! 4546: {
! 4547: (*s_etat_processus).erreur_systeme =
! 4548: d_es;
! 4549: }
! 4550: else
! 4551: {
! 4552:
! 4553: /*
! 4554: * Erreur système
! 4555: */
! 4556:
! 4557: free(nom_fichier);
! 4558: return;
! 4559: }
! 4560: }
! 4561:
! 4562: (*s_etat_processus).erreur_execution =
! 4563: d_ex_variable_non_definie;
! 4564: }
! 4565:
! 4566: free(nom_x);
! 4567: free(nom_y);
! 4568: free(nom_fichier);
! 4569:
! 4570: if (last_valide == d_vrai)
! 4571: {
! 4572: sf(s_etat_processus, 31);
! 4573: }
! 4574:
! 4575: return;
! 4576: }
! 4577: }
! 4578:
! 4579: (*s_etat_processus).erreur_execution = d_ex;
! 4580: (*s_etat_processus).exception = d_ep;
! 4581:
! 4582: if (fprintf(fichier, "%f %f %f\n",
! 4583: dernier_point_valide[0],
! 4584: dernier_point_valide[1],
! 4585: dernier_point_valide[2]) < 0)
! 4586: {
! 4587: (*s_etat_processus).erreur_systeme =
! 4588: d_es_erreur_fichier;
! 4589: return;
! 4590: }
! 4591: }
! 4592: else
! 4593: {
! 4594: /*
! 4595: * Donnée valide à écrire dans le fichier
! 4596: */
! 4597:
! 4598: if (depilement(s_etat_processus, &((*s_etat_processus)
! 4599: .l_base_pile), &s_objet) == d_erreur)
! 4600: {
! 4601:
! 4602: /*
! 4603: * Retrait des variables INDEP et DEPND et retour
! 4604: */
! 4605:
! 4606: (*s_etat_processus).niveau_courant--;
! 4607:
! 4608: if (fclose(fichier) != 0)
! 4609: {
! 4610: (*s_etat_processus).erreur_systeme =
! 4611: d_es_erreur_fichier;
! 4612: return;
! 4613: }
! 4614:
! 4615: if (destruction_fichier(nom_fichier) == d_erreur)
! 4616: {
! 4617: (*s_etat_processus).erreur_systeme =
! 4618: d_es_erreur_fichier;
! 4619: return;
! 4620: }
! 4621:
! 4622: if (retrait_variable(s_etat_processus, nom_x,
! 4623: 'L') == d_erreur)
! 4624: {
! 4625: if ((*s_etat_processus).erreur_systeme != d_es)
! 4626: {
! 4627: if ((*s_etat_processus).erreur_systeme ==
! 4628: d_es_variable_introuvable)
! 4629: {
! 4630: (*s_etat_processus).erreur_systeme = d_es;
! 4631: }
! 4632: else
! 4633: {
! 4634:
! 4635: /*
! 4636: * Erreur système
! 4637: */
! 4638:
! 4639: free(nom_fichier);
! 4640: return;
! 4641: }
! 4642: }
! 4643:
! 4644: free(nom_x);
! 4645: free(nom_y);
! 4646: free(nom_fichier);
! 4647:
! 4648: if (last_valide == d_vrai)
! 4649: {
! 4650: sf(s_etat_processus, 31);
! 4651: }
! 4652:
! 4653: (*s_etat_processus).erreur_execution =
! 4654: d_ex_variable_non_definie;
! 4655: return;
! 4656: }
! 4657:
! 4658: if (retrait_variable(s_etat_processus, nom_y,
! 4659: 'L') == d_erreur)
! 4660: {
! 4661: if ((*s_etat_processus).erreur_systeme != d_es)
! 4662: {
! 4663: if ((*s_etat_processus).erreur_systeme ==
! 4664: d_es_variable_introuvable)
! 4665: {
! 4666: (*s_etat_processus).erreur_systeme = d_es;
! 4667: }
! 4668: else
! 4669: {
! 4670:
! 4671: /*
! 4672: * Erreur système
! 4673: */
! 4674:
! 4675: free(nom_fichier);
! 4676: return;
! 4677: }
! 4678: }
! 4679:
! 4680: free(nom_x);
! 4681: free(nom_y);
! 4682: free(nom_fichier);
! 4683:
! 4684: if (last_valide == d_vrai)
! 4685: {
! 4686: sf(s_etat_processus, 31);
! 4687: }
! 4688:
! 4689: (*s_etat_processus).erreur_execution =
! 4690: d_ex_variable_non_definie;
! 4691: return;
! 4692: }
! 4693:
! 4694: free(nom_x);
! 4695: free(nom_y);
! 4696: free(nom_fichier);
! 4697:
! 4698: if (last_valide == d_vrai)
! 4699: {
! 4700: sf(s_etat_processus, 31);
! 4701: }
! 4702:
! 4703: (*s_etat_processus).erreur_execution =
! 4704: d_ex_manque_argument;
! 4705: return;
! 4706: }
! 4707:
! 4708: if ((*s_objet).type == INT)
! 4709: {
! 4710: dernier_point_valide[0] = x;
! 4711: dernier_point_valide[1] = y;
! 4712: dernier_point_valide[2] = (real8) (*((integer8 *)
! 4713: (*s_objet).objet));
! 4714:
! 4715: if (fprintf(fichier, "%f %f %f\n", x, y,
! 4716: (double) (*((integer8 *)
! 4717: (*s_objet).objet))) < 0)
! 4718: {
! 4719: (*s_etat_processus).erreur_systeme =
! 4720: d_es_erreur_fichier;
! 4721: return;
! 4722: }
! 4723: }
! 4724: else if ((*s_objet).type == REL)
! 4725: {
! 4726: dernier_point_valide[0] = x;
! 4727: dernier_point_valide[1] = y;
! 4728: dernier_point_valide[2] = (*((real8 *)
! 4729: (*s_objet).objet));
! 4730:
! 4731: if (fprintf(fichier, "%f %f %f\n", x, y,
! 4732: (*((real8 *) (*s_objet).objet))) < 0)
! 4733: {
! 4734: (*s_etat_processus).erreur_systeme =
! 4735: d_es_erreur_fichier;
! 4736: return;
! 4737: }
! 4738: }
! 4739:
! 4740: liberation(s_etat_processus, s_objet);
! 4741: }
! 4742: }
! 4743:
! 4744: /*
! 4745: * Retrait de la variable locale DEPND
! 4746: */
! 4747:
! 4748: if (retrait_variable(s_etat_processus, nom_y, 'L') == d_erreur)
! 4749: {
! 4750: if ((*s_etat_processus).erreur_systeme != d_es)
! 4751: {
! 4752: if ((*s_etat_processus).erreur_systeme ==
! 4753: d_es_variable_introuvable)
! 4754: {
! 4755: (*s_etat_processus).erreur_systeme = d_es;
! 4756: }
! 4757: else
! 4758: {
! 4759: /*
! 4760: * Erreur système
! 4761: */
! 4762:
! 4763: free(nom_fichier);
! 4764: return;
! 4765: }
! 4766: }
! 4767:
! 4768: free(nom_x);
! 4769: free(nom_y);
! 4770: free(nom_fichier);
! 4771:
! 4772: if (last_valide == d_vrai)
! 4773: {
! 4774: sf(s_etat_processus, 31);
! 4775: }
! 4776:
! 4777: (*s_etat_processus).erreur_execution =
! 4778: d_ex_variable_non_definie;
! 4779: return;
! 4780: }
! 4781:
! 4782: free(nom_y);
! 4783:
! 4784: /*
! 4785: * Saut de ligne dans le fichier pour commencer une nouvelle
! 4786: * trace.
! 4787: */
! 4788:
! 4789: if (fprintf(fichier, "\n") < 0)
! 4790: {
! 4791: (*s_etat_processus).erreur_systeme =
! 4792: d_es_erreur_fichier;
! 4793: return;
! 4794: }
! 4795: }
! 4796:
! 4797: /*
! 4798: * Retrait de la variable locale INDEP
! 4799: */
! 4800:
! 4801: (*s_etat_processus).niveau_courant--;
! 4802:
! 4803: if (retrait_variable(s_etat_processus, nom_x, 'L') == d_erreur)
! 4804: {
! 4805: if ((*s_etat_processus).erreur_systeme != d_es)
! 4806: {
! 4807: if ((*s_etat_processus).erreur_systeme ==
! 4808: d_es_variable_introuvable)
! 4809: {
! 4810: (*s_etat_processus).erreur_systeme = d_es;
! 4811: }
! 4812: else
! 4813: {
! 4814: /*
! 4815: * Erreur système
! 4816: */
! 4817:
! 4818: free(nom_fichier);
! 4819: return;
! 4820: }
! 4821: }
! 4822:
! 4823: free(nom_x);
! 4824: free(nom_fichier);
! 4825:
! 4826: if (last_valide == d_vrai)
! 4827: {
! 4828: sf(s_etat_processus, 31);
! 4829: }
! 4830:
! 4831: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 4832: return;
! 4833: }
! 4834:
! 4835: free(nom_x);
! 4836:
! 4837: if (strcmp((*s_etat_processus).type_trace_eq, "COURBES DE NIVEAU") == 0)
! 4838: {
! 4839: // Conversion du graphe
! 4840: dimensions = 2;
! 4841:
! 4842: if (fclose(fichier) != 0)
! 4843: {
! 4844: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 4845: return;
! 4846: }
! 4847:
! 4848: if ((entree_standard = popen("gnuplot", "w")) == NULL)
! 4849: {
! 4850: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 4851: return;
! 4852: }
! 4853:
! 4854: if (fprintf(entree_standard, "set nosurface\n") < 0)
! 4855: {
! 4856: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4857: return;
! 4858: }
! 4859:
! 4860: if (fprintf(entree_standard, "set contour\n") < 0)
! 4861: {
! 4862: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4863: return;
! 4864: }
! 4865:
! 4866: if (fprintf(entree_standard, "set cntrparam level ") < 0)
! 4867: {
! 4868: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4869: return;
! 4870: }
! 4871:
! 4872: l_element_courant = (struct_liste_chainee *) (*(*s_etat_processus)
! 4873: .parametres_courbes_de_niveau).objet;
! 4874:
! 4875: if (l_element_courant != NULL)
! 4876: {
! 4877: if ((*(*l_element_courant).donnee).type == CHN)
! 4878: {
! 4879: if (strcmp((unsigned char *) (*(*l_element_courant).donnee)
! 4880: .objet, "AUTOMATIC") == 0)
! 4881: {
! 4882: if (fprintf(entree_standard, "auto") < 0)
! 4883: {
! 4884: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4885: return;
! 4886: }
! 4887: }
! 4888: else if (strcmp((unsigned char *) (*(*l_element_courant)
! 4889: .donnee).objet, "DISCRETE") == 0)
! 4890: {
! 4891: if (fprintf(entree_standard, "discrete") < 0)
! 4892: {
! 4893: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4894: return;
! 4895: }
! 4896: }
! 4897: else
! 4898: {
! 4899: if (fprintf(entree_standard, "incremental") < 0)
! 4900: {
! 4901: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4902: return;
! 4903: }
! 4904: }
! 4905: }
! 4906:
! 4907: l_element_courant = (*l_element_courant).suivant;
! 4908:
! 4909: if (l_element_courant != NULL)
! 4910: {
! 4911: if (fprintf(entree_standard, " ") < 0)
! 4912: {
! 4913: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4914: return;
! 4915: }
! 4916: }
! 4917:
! 4918: while(l_element_courant != NULL)
! 4919: {
! 4920: if ((*(*l_element_courant).donnee).type == INT)
! 4921: {
! 4922: if (fprintf(entree_standard, "%f", (double)
! 4923: (*((integer8 *) (*(*l_element_courant).donnee)
! 4924: .objet))) < 0)
! 4925: {
! 4926: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4927: return;
! 4928: }
! 4929: }
! 4930: else
! 4931: {
! 4932: if (fprintf(entree_standard, "%f", (double)
! 4933: (*((real8 *) (*(*l_element_courant).donnee)
! 4934: .objet))) < 0)
! 4935: {
! 4936: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4937: return;
! 4938: }
! 4939: }
! 4940:
! 4941: l_element_courant = (*l_element_courant).suivant;
! 4942:
! 4943: if (l_element_courant != NULL)
! 4944: {
! 4945: if (fprintf(entree_standard, ",") < 0)
! 4946: {
! 4947: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4948: return;
! 4949: }
! 4950: }
! 4951: }
! 4952:
! 4953: if (fprintf(entree_standard, "\n") < 0)
! 4954: {
! 4955: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4956: return;
! 4957: }
! 4958: }
! 4959:
! 4960: if (fprintf(entree_standard, "set terminal table\n") < 0)
! 4961: {
! 4962: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4963: return;
! 4964: }
! 4965:
! 4966: if ((nom_fichier_converti = creation_nom_fichier(
! 4967: s_etat_processus, (*s_etat_processus)
! 4968: .chemin_fichiers_temporaires)) == NULL)
! 4969: {
! 4970: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 4971: return;
! 4972: }
! 4973:
! 4974: if (fprintf(entree_standard, "set output '%s'\n",
! 4975: nom_fichier_converti) < 0)
! 4976: {
! 4977: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4978: return;
! 4979: }
! 4980:
! 4981: if (fprintf(entree_standard, "splot '%s'\n", nom_fichier) < 0)
! 4982: {
! 4983: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4984: return;
! 4985: }
! 4986:
! 4987: if (fprintf(entree_standard, "set output\n") < 0)
! 4988: {
! 4989: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4990: return;
! 4991: }
! 4992:
! 4993: if (fprintf(entree_standard, "quit\n") < 0)
! 4994: {
! 4995: (*s_etat_processus).erreur_systeme = d_es_processus;
! 4996: return;
! 4997: }
! 4998:
! 4999: if (pclose(entree_standard) != 0)
! 5000: {
! 5001: (*s_etat_processus).erreur_systeme = d_es_processus;
! 5002: return;
! 5003: }
! 5004:
! 5005: if (destruction_fichier(nom_fichier) == d_erreur)
! 5006: {
! 5007: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 5008: return;
! 5009: }
! 5010:
! 5011: if ((fichier = fopen(nom_fichier_converti, "r")) == NULL)
! 5012: {
! 5013: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 5014: return;
! 5015: }
! 5016:
! 5017: free(nom_fichier);
! 5018: nom_fichier = nom_fichier_converti;
! 5019: }
! 5020: else
! 5021: {
! 5022: dimensions = 3;
! 5023: }
! 5024:
! 5025: }
! 5026:
! 5027: /*
! 5028: * Type de tracé invalide
! 5029: */
! 5030:
! 5031: else
! 5032: {
! 5033: if (last_valide == d_vrai)
! 5034: {
! 5035: sf(s_etat_processus, 31);
! 5036: }
! 5037:
! 5038: (*s_etat_processus).erreur_execution = d_ex_type_trace_invalide;
! 5039: return;
! 5040: }
! 5041:
! 5042: /*
! 5043: * Fermeture du fichier graphique
! 5044: */
! 5045:
! 5046: if (fclose(fichier) != 0)
! 5047: {
! 5048: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 5049: return;
! 5050: }
! 5051:
! 5052: /*
! 5053: * Chaînage du fichier temporaire à la liste des fichiers graphiques
! 5054: */
! 5055:
! 5056: l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
! 5057:
! 5058: if (l_fichier_courant == NULL)
! 5059: {
! 5060: if (((*s_etat_processus).fichiers_graphiques = malloc(
! 5061: sizeof(struct_fichier_graphique))) == NULL)
! 5062: {
! 5063: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 5064: return;
! 5065: }
! 5066:
! 5067: (*(*s_etat_processus).fichiers_graphiques).suivant = NULL;
! 5068: (*(*s_etat_processus).fichiers_graphiques).nom = nom_fichier;
! 5069: (*(*s_etat_processus).fichiers_graphiques).legende = NULL;
! 5070: (*(*s_etat_processus).fichiers_graphiques).dimensions = dimensions;
! 5071: (*(*s_etat_processus).fichiers_graphiques).presence_axes = d_faux;
! 5072: (*(*s_etat_processus).fichiers_graphiques).systeme_axes =
! 5073: (*s_etat_processus).systeme_axes;
! 5074: strcpy((*(*s_etat_processus).fichiers_graphiques).type,
! 5075: (*s_etat_processus).type_trace_eq);
! 5076: }
! 5077: else
! 5078: {
! 5079: while(l_fichier_courant != NULL)
! 5080: {
! 5081: if ((*l_fichier_courant).dimensions != dimensions)
! 5082: {
! 5083: if (last_valide == d_vrai)
! 5084: {
! 5085: sf(s_etat_processus, 31);
! 5086: }
! 5087:
! 5088: (*s_etat_processus).erreur_execution =
! 5089: d_ex_dimensions_differentes;
! 5090: return;
! 5091: }
! 5092:
! 5093: l_fichier_precedent = l_fichier_courant;
! 5094: l_fichier_courant = (*l_fichier_courant).suivant;
! 5095: }
! 5096:
! 5097: l_fichier_courant = l_fichier_precedent;
! 5098:
! 5099: if (((*l_fichier_courant).suivant = malloc(
! 5100: sizeof(struct_fichier_graphique))) == NULL)
! 5101: {
! 5102: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 5103: return;
! 5104: }
! 5105:
! 5106: l_fichier_courant = (*l_fichier_courant).suivant;
! 5107:
! 5108: (*l_fichier_courant).suivant = NULL;
! 5109: (*l_fichier_courant).nom = nom_fichier;
! 5110: (*l_fichier_courant).legende = NULL;
! 5111: (*l_fichier_courant).dimensions = dimensions;
! 5112: (*l_fichier_courant).presence_axes = d_faux;
! 5113: (*l_fichier_courant).systeme_axes = (*s_etat_processus).systeme_axes;
! 5114: strcpy((*l_fichier_courant).type, (*s_etat_processus).type_trace_eq);
! 5115: }
! 5116:
! 5117: /*
! 5118: * Affichage du graphique
! 5119: */
! 5120:
! 5121: appel_gnuplot(s_etat_processus, 'N');
! 5122: (*s_etat_processus).erreur_execution = d_ex;
! 5123: (*s_etat_processus).exception = d_ep;
! 5124:
! 5125: if (last_valide == d_vrai)
! 5126: {
! 5127: sf(s_etat_processus, 31);
! 5128: }
! 5129:
! 5130: return;
! 5131: }
! 5132:
! 5133:
! 5134: /*
! 5135: ================================================================================
! 5136: Fonction 'drax'
! 5137: ================================================================================
! 5138: Entrées : pointeur sur une structure struct_processus
! 5139: --------------------------------------------------------------------------------
! 5140: Sorties :
! 5141: --------------------------------------------------------------------------------
! 5142: Effets de bord : néant
! 5143: ================================================================================
! 5144: */
! 5145:
! 5146: void
! 5147: instruction_drax(struct_processus *s_etat_processus)
! 5148: {
! 5149: struct_fichier_graphique *l_fichier_courant;
! 5150:
! 5151: (*s_etat_processus).erreur_execution = d_ex;
! 5152:
! 5153: if ((*s_etat_processus).affichage_arguments == 'Y')
! 5154: {
! 5155: printf("\n DRAX ");
! 5156:
! 5157: if ((*s_etat_processus).langue == 'F')
! 5158: {
! 5159: printf("(trace les axes)\n\n");
! 5160: printf(" Aucun argument\n");
! 5161: }
! 5162: else
! 5163: {
! 5164: printf("(plot axes)\n\n");
! 5165: printf(" No argument\n");
! 5166: }
! 5167:
! 5168: return;
! 5169: }
! 5170: else if ((*s_etat_processus).test_instruction == 'Y')
! 5171: {
! 5172: (*s_etat_processus).nombre_arguments = -1;
! 5173: return;
! 5174: }
! 5175:
! 5176: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 5177: {
! 5178: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
! 5179: {
! 5180: return;
! 5181: }
! 5182: }
! 5183:
! 5184: if ((*s_etat_processus).fichiers_graphiques != NULL)
! 5185: {
! 5186: l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
! 5187:
! 5188: if (l_fichier_courant != NULL)
! 5189: {
! 5190: while((*l_fichier_courant).suivant != NULL)
! 5191: {
! 5192: l_fichier_courant = (*l_fichier_courant).suivant;
! 5193: }
! 5194:
! 5195: (*l_fichier_courant).presence_axes = d_vrai;
! 5196: }
! 5197: }
! 5198:
! 5199: if (test_cfsf(s_etat_processus, 52) == d_faux)
! 5200: {
! 5201: if ((*s_etat_processus).fichiers_graphiques != NULL)
! 5202: {
! 5203: appel_gnuplot(s_etat_processus, 'N');
! 5204: }
! 5205: }
! 5206:
! 5207: return;
! 5208: }
! 5209:
! 5210:
! 5211: /*
! 5212: ================================================================================
! 5213: Fonction 'depnd'
! 5214: ================================================================================
! 5215: Entrées : pointeur sur une structure struct_processus
! 5216: --------------------------------------------------------------------------------
! 5217: Sorties :
! 5218: --------------------------------------------------------------------------------
! 5219: Effets de bord : néant
! 5220: ================================================================================
! 5221: */
! 5222:
! 5223: void
! 5224: instruction_depnd(struct_processus *s_etat_processus)
! 5225: {
! 5226: struct_liste_chainee *l_element_courant;
! 5227:
! 5228: struct_objet *s_objet;
! 5229:
! 5230: (*s_etat_processus).erreur_execution = d_ex;
! 5231:
! 5232: if ((*s_etat_processus).affichage_arguments == 'Y')
! 5233: {
! 5234: printf("\n DEPND ");
! 5235:
! 5236: if ((*s_etat_processus).langue == 'F')
! 5237: {
! 5238: printf("(indication de la variable dépendante)\n\n");
! 5239: }
! 5240: else
! 5241: {
! 5242: printf("(set dependant variable)\n\n");
! 5243: }
! 5244:
! 5245: printf(" 1: %s, %s\n", d_NOM, d_LST);
! 5246:
! 5247: return;
! 5248: }
! 5249: else if ((*s_etat_processus).test_instruction == 'Y')
! 5250: {
! 5251: (*s_etat_processus).nombre_arguments = -1;
! 5252: return;
! 5253: }
! 5254:
! 5255: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 5256: {
! 5257: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 5258: {
! 5259: return;
! 5260: }
! 5261: }
! 5262:
! 5263: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 5264: &s_objet) == d_erreur)
! 5265: {
! 5266: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 5267: return;
! 5268: }
! 5269:
! 5270: if ((*s_objet).type == NOM)
! 5271: {
! 5272: liberation(s_etat_processus, (*s_etat_processus).depend);
! 5273: (*s_etat_processus).depend = s_objet;
! 5274: }
! 5275: else if ((*s_objet).type == LST)
! 5276: {
! 5277: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
! 5278:
! 5279: if ((*(*l_element_courant).donnee).type != NOM)
! 5280: {
! 5281: liberation(s_etat_processus, s_objet);
! 5282:
! 5283: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 5284: return;
! 5285: }
! 5286:
! 5287: (*((struct_nom *) (*(*l_element_courant).donnee).objet)).symbole =
! 5288: d_vrai;
! 5289:
! 5290: l_element_courant = (*l_element_courant).suivant;
! 5291:
! 5292: if (!(((*(*l_element_courant).donnee).type == INT) ||
! 5293: ((*(*l_element_courant).donnee).type == REL) ||
! 5294: ((*(*l_element_courant).donnee).type == NOM) ||
! 5295: ((*(*l_element_courant).donnee).type == ALG) ||
! 5296: ((*(*l_element_courant).donnee).type == RPN)))
! 5297: {
! 5298: liberation(s_etat_processus, s_objet);
! 5299:
! 5300: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 5301: return;
! 5302: }
! 5303:
! 5304: l_element_courant = (*l_element_courant).suivant;
! 5305:
! 5306: if (!(((*(*l_element_courant).donnee).type == INT) ||
! 5307: ((*(*l_element_courant).donnee).type == REL) ||
! 5308: ((*(*l_element_courant).donnee).type == NOM) ||
! 5309: ((*(*l_element_courant).donnee).type == ALG) ||
! 5310: ((*(*l_element_courant).donnee).type == RPN)))
! 5311: {
! 5312: liberation(s_etat_processus, s_objet);
! 5313:
! 5314: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 5315: return;
! 5316: }
! 5317:
! 5318: l_element_courant = (*l_element_courant).suivant;
! 5319:
! 5320: if (l_element_courant != NULL)
! 5321: {
! 5322: liberation(s_etat_processus, s_objet);
! 5323:
! 5324: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 5325: return;
! 5326: }
! 5327:
! 5328: liberation(s_etat_processus, (*s_etat_processus).depend);
! 5329: (*s_etat_processus).depend = s_objet;
! 5330: }
! 5331: else
! 5332: {
! 5333: liberation(s_etat_processus, s_objet);
! 5334:
! 5335: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 5336: return;
! 5337: }
! 5338:
! 5339: return;
! 5340: }
! 5341:
! 5342: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>