Annotation of rpl/src/instructions_e1.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 'eval'
! 29: ================================================================================
! 30: Entrées : structure processus
! 31: --------------------------------------------------------------------------------
! 32: Sorties :
! 33: --------------------------------------------------------------------------------
! 34: Effets de bord : néant
! 35: ================================================================================
! 36: */
! 37:
! 38: void
! 39: instruction_eval(struct_processus *s_etat_processus)
! 40: {
! 41: logical1 last_valide;
! 42:
! 43: struct_objet *s_objet;
! 44: struct_objet *s_objet_simplifie;
! 45:
! 46: unsigned char registre_type_evaluation;
! 47:
! 48: (*s_etat_processus).erreur_execution = d_ex;
! 49:
! 50: if ((*s_etat_processus).affichage_arguments == 'Y')
! 51: {
! 52: printf("\n EVAL ");
! 53:
! 54: if ((*s_etat_processus).langue == 'F')
! 55: {
! 56: printf("(évaluation d'un objet)\n\n");
! 57: }
! 58: else
! 59: {
! 60: printf("(object evaluation)\n\n");
! 61: }
! 62:
! 63: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
! 64: " %s, %s, %s, %s, %s,\n"
! 65: " %s, %s, %s, %s, %s,\n"
! 66: " %s\n",
! 67: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
! 68: d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
! 69: printf("-> n: %s, %s, %s, %s, %s, %s,\n"
! 70: " %s, %s, %s, %s, %s,\n"
! 71: " %s, %s, %s, %s, %s,\n"
! 72: " %s\n",
! 73: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
! 74: d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
! 75: printf(" ...\n");
! 76: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
! 77: " %s, %s, %s, %s, %s,\n"
! 78: " %s, %s, %s, %s, %s,\n"
! 79: " %s\n",
! 80: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
! 81: d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
! 82:
! 83: return;
! 84: }
! 85: else if ((*s_etat_processus).test_instruction == 'Y')
! 86: {
! 87: (*s_etat_processus).nombre_arguments = -1;
! 88: return;
! 89: }
! 90:
! 91: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
! 92: {
! 93: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 94: {
! 95: return;
! 96: }
! 97:
! 98: cf(s_etat_processus, 31);
! 99: }
! 100:
! 101: registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai)
! 102: ? 'E' : 'N';
! 103: sf(s_etat_processus, 35);
! 104:
! 105: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 106: &s_objet) == d_erreur)
! 107: {
! 108: if (last_valide == d_vrai)
! 109: {
! 110: sf(s_etat_processus, 31);
! 111: }
! 112:
! 113: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 114: return;
! 115: }
! 116:
! 117: if ((s_objet_simplifie = simplification(s_etat_processus, s_objet)) == NULL)
! 118: {
! 119: if (last_valide == d_vrai)
! 120: {
! 121: sf(s_etat_processus, 31);
! 122: }
! 123:
! 124: return;
! 125: }
! 126:
! 127: liberation(s_etat_processus, s_objet);
! 128: s_objet = s_objet_simplifie;
! 129:
! 130: if ((*s_etat_processus).l_base_pile_systeme == NULL)
! 131: {
! 132: (*s_etat_processus).erreur_systeme = d_es_pile_vide;
! 133: return;
! 134: }
! 135:
! 136: (*(*s_etat_processus).l_base_pile_systeme).evaluation_expression = d_vrai;
! 137:
! 138: if (evaluation(s_etat_processus, s_objet, 'E') == d_erreur)
! 139: {
! 140: (*(*s_etat_processus).l_base_pile_systeme)
! 141: .evaluation_expression = d_faux;
! 142:
! 143: if (last_valide == d_vrai)
! 144: {
! 145: sf(s_etat_processus, 31);
! 146: }
! 147:
! 148: liberation(s_etat_processus, s_objet);
! 149: return;
! 150: }
! 151:
! 152: (*(*s_etat_processus).l_base_pile_systeme).evaluation_expression = d_faux;
! 153: liberation(s_etat_processus, s_objet);
! 154:
! 155: if (registre_type_evaluation == 'E')
! 156: {
! 157: sf(s_etat_processus, 35);
! 158: }
! 159: else
! 160: {
! 161: cf(s_etat_processus, 35);
! 162: }
! 163:
! 164: if (last_valide == d_vrai)
! 165: {
! 166: sf(s_etat_processus, 31);
! 167: }
! 168:
! 169: return;
! 170: }
! 171:
! 172:
! 173: /*
! 174: ================================================================================
! 175: Fonction 'end'
! 176: ================================================================================
! 177: Entrées : structure processus
! 178: --------------------------------------------------------------------------------
! 179: Sorties :
! 180: --------------------------------------------------------------------------------
! 181: Effets de bord : néant
! 182: ================================================================================
! 183: */
! 184:
! 185: void
! 186: instruction_end(struct_processus *s_etat_processus)
! 187: {
! 188: struct_objet *s_objet;
! 189:
! 190: logical1 condition;
! 191:
! 192: (*s_etat_processus).erreur_execution = d_ex;
! 193:
! 194: if ((*s_etat_processus).affichage_arguments == 'Y')
! 195: {
! 196: printf("\n END ");
! 197:
! 198: if ((*s_etat_processus).langue == 'F')
! 199: {
! 200: printf("(structure de contrôle)\n\n");
! 201: printf(" Utilisation :\n\n");
! 202: }
! 203: else
! 204: {
! 205: printf("(control statement)\n\n");
! 206: printf(" Usage:\n\n");
! 207: }
! 208:
! 209: printf(" IF\n");
! 210: printf(" (expression test 1)\n");
! 211: printf(" THEN\n");
! 212: printf(" (expression 1)\n");
! 213: printf(" [ELSEIF\n");
! 214: printf(" (expression test 2)\n");
! 215: printf(" THEN\n");
! 216: printf(" (expression 2)]\n");
! 217: printf(" ...\n");
! 218: printf(" [ELSE\n");
! 219: printf(" (expression n)]\n");
! 220: printf(" END\n\n");
! 221:
! 222: printf(" IFERR\n");
! 223: printf(" (expression test)\n");
! 224: printf(" THEN\n");
! 225: printf(" (expression 1)\n");
! 226: printf(" [ELSE\n");
! 227: printf(" (expression 2)]\n");
! 228: printf(" END\n\n");
! 229:
! 230: printf(" DO\n");
! 231: printf(" (expression)\n");
! 232: printf(" UNTIL\n");
! 233: printf(" (expression test)\n");
! 234: printf(" END\n\n");
! 235:
! 236: printf(" WHILE\n");
! 237: printf(" (expression test)\n");
! 238: printf(" REPEAT\n");
! 239: printf(" (expression)\n");
! 240: printf(" END\n\n");
! 241:
! 242: printf(" SELECT (expression test)\n");
! 243: printf(" CASE (clause 1) THEN (expression 1) END\n");
! 244: printf(" CASE (clause 2) THEN (expression 2) END\n");
! 245: printf(" ...\n");
! 246: printf(" CASE (clause n) THEN (expression n) END\n");
! 247: printf(" DEFAULT\n");
! 248: printf(" (expression)\n");
! 249: printf(" END\n\n");
! 250:
! 251: printf(" SELECT (expression test)\n");
! 252: printf(" CASE (clause 1) THEN (expression 1) END\n");
! 253: printf(" (expression)\n");
! 254: printf(" CASE (clause 2) THEN (expression 2) END\n");
! 255: printf(" END\n");
! 256:
! 257: return;
! 258: }
! 259: else if ((*s_etat_processus).test_instruction == 'Y')
! 260: {
! 261: (*s_etat_processus).nombre_arguments = -1;
! 262: return;
! 263: }
! 264:
! 265: if (((*(*s_etat_processus).l_base_pile_systeme).type_cloture == 'I')
! 266: || ((*(*s_etat_processus).l_base_pile_systeme).type_cloture == 'J'))
! 267: {
! 268: depilement_pile_systeme(s_etat_processus);
! 269:
! 270: if ((*s_etat_processus).erreur_systeme != d_es)
! 271: {
! 272: return;
! 273: }
! 274: }
! 275: else if ((*(*s_etat_processus).l_base_pile_systeme).type_cloture == 'D')
! 276: {
! 277: if ((*(*s_etat_processus).l_base_pile_systeme).clause != 'U')
! 278: {
! 279: (*s_etat_processus).erreur_execution =
! 280: d_ex_erreur_traitement_boucle;
! 281: return;
! 282: }
! 283:
! 284: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 285: &s_objet) == d_erreur)
! 286: {
! 287: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 288: return;
! 289: }
! 290:
! 291: if (((*s_objet).type == INT) ||
! 292: ((*s_objet).type == REL))
! 293: {
! 294: if ((*s_objet).type == INT)
! 295: {
! 296: condition = ((*((integer8 *) (*s_objet).objet)) == 0)
! 297: ? d_faux : d_vrai;
! 298: }
! 299: else
! 300: {
! 301: condition = ((*((real8 *) (*s_objet).objet)) == 0)
! 302: ? d_faux : d_vrai;
! 303: }
! 304:
! 305: if (condition == d_faux)
! 306: {
! 307: if ((*s_etat_processus).mode_execution_programme == 'Y')
! 308: {
! 309: (*s_etat_processus).position_courante =
! 310: (*(*s_etat_processus).l_base_pile_systeme)
! 311: .adresse_retour;
! 312: }
! 313: else
! 314: {
! 315: (*s_etat_processus).expression_courante =
! 316: (*(*s_etat_processus).l_base_pile_systeme)
! 317: .pointeur_objet_retour;
! 318: }
! 319: }
! 320: else
! 321: {
! 322: depilement_pile_systeme(s_etat_processus);
! 323:
! 324: if ((*s_etat_processus).erreur_systeme != d_es)
! 325: {
! 326: return;
! 327: }
! 328: }
! 329: }
! 330: else
! 331: {
! 332: liberation(s_etat_processus, s_objet);
! 333:
! 334: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 335: return;
! 336: }
! 337:
! 338: liberation(s_etat_processus, s_objet);
! 339: }
! 340: else if ((*(*s_etat_processus).l_base_pile_systeme).type_cloture == 'W')
! 341: {
! 342: if ((*(*s_etat_processus).l_base_pile_systeme).clause == 'W')
! 343: {
! 344: if ((*s_etat_processus).mode_execution_programme == 'Y')
! 345: {
! 346: (*s_etat_processus).position_courante =
! 347: (*(*s_etat_processus).l_base_pile_systeme)
! 348: .adresse_retour;
! 349: }
! 350: else
! 351: {
! 352: (*s_etat_processus).expression_courante =
! 353: (*(*s_etat_processus).l_base_pile_systeme)
! 354: .pointeur_objet_retour;
! 355: }
! 356: }
! 357: else
! 358: {
! 359: depilement_pile_systeme(s_etat_processus);
! 360:
! 361: if ((*s_etat_processus).erreur_systeme != d_es)
! 362: {
! 363: return;
! 364: }
! 365: }
! 366: }
! 367: else if ((*(*s_etat_processus).l_base_pile_systeme).type_cloture == 'C')
! 368: {
! 369: if ((*(*s_etat_processus).l_base_pile_systeme).clause != 'Q')
! 370: {
! 371: depilement_pile_systeme(s_etat_processus);
! 372:
! 373: if ((*s_etat_processus).erreur_systeme != d_es)
! 374: {
! 375: return;
! 376: }
! 377: }
! 378: else
! 379: {
! 380: (*(*s_etat_processus).l_base_pile_systeme).clause = 'C';
! 381: }
! 382: }
! 383: else
! 384: {
! 385: (*s_etat_processus).erreur_systeme = d_es_end_incoherent;
! 386: }
! 387:
! 388: return;
! 389: }
! 390:
! 391:
! 392: /*
! 393: ================================================================================
! 394: Fonction 'else'
! 395: ================================================================================
! 396: Entrées : structure processus
! 397: --------------------------------------------------------------------------------
! 398: Sorties :
! 399: --------------------------------------------------------------------------------
! 400: Effets de bord : néant
! 401: ================================================================================
! 402: */
! 403:
! 404: void
! 405: instruction_else(struct_processus *s_etat_processus)
! 406: {
! 407: logical1 drapeau_fin;
! 408: logical1 execution;
! 409:
! 410: struct_liste_chainee *s_registre;
! 411:
! 412: unsigned char *instruction_majuscule;
! 413: unsigned char *tampon;
! 414:
! 415: unsigned long niveau;
! 416:
! 417: void (*fonction)();
! 418:
! 419: (*s_etat_processus).erreur_execution = d_ex;
! 420:
! 421: if ((*s_etat_processus).affichage_arguments == 'Y')
! 422: {
! 423: printf("\n ELSE ");
! 424:
! 425: if ((*s_etat_processus).langue == 'F')
! 426: {
! 427: printf("(structure de contrôle)\n\n");
! 428: printf(" Utilisation :\n\n");
! 429: }
! 430: else
! 431: {
! 432: printf("(control statement)\n\n");
! 433: printf(" Usage:\n\n");
! 434: }
! 435:
! 436: printf(" IF\n");
! 437: printf(" (expression test 1)\n");
! 438: printf(" THEN\n");
! 439: printf(" (expression 1)\n");
! 440: printf(" [ELSEIF\n");
! 441: printf(" (expression test 2)\n");
! 442: printf(" THEN\n");
! 443: printf(" (expression 2)]\n");
! 444: printf(" ...\n");
! 445: printf(" ELSE\n");
! 446: printf(" (expression n)\n");
! 447: printf(" END\n");
! 448:
! 449: return;
! 450: }
! 451: else if ((*s_etat_processus).test_instruction == 'Y')
! 452: {
! 453: (*s_etat_processus).nombre_arguments = -1;
! 454: return;
! 455: }
! 456:
! 457: if ((*(*s_etat_processus).l_base_pile_systeme).clause == 'T')
! 458: {
! 459: niveau = 0;
! 460: drapeau_fin = d_faux;
! 461:
! 462: if ((*s_etat_processus).mode_execution_programme == 'Y')
! 463: {
! 464: tampon = (*s_etat_processus).instruction_courante;
! 465:
! 466: do
! 467: {
! 468: if (recherche_instruction_suivante(s_etat_processus)
! 469: == d_erreur)
! 470: {
! 471: if ((*s_etat_processus).instruction_courante != NULL)
! 472: {
! 473: free((*s_etat_processus).instruction_courante);
! 474: }
! 475:
! 476: (*s_etat_processus).instruction_courante = tampon;
! 477: (*s_etat_processus).erreur_execution =
! 478: d_ex_erreur_traitement_condition;
! 479: return;
! 480: }
! 481:
! 482: if ((instruction_majuscule = conversion_majuscule(
! 483: (*s_etat_processus).instruction_courante)) == NULL)
! 484: {
! 485: free((*s_etat_processus).instruction_courante);
! 486: (*s_etat_processus).instruction_courante = tampon;
! 487: (*s_etat_processus).erreur_systeme =
! 488: d_es_allocation_memoire;
! 489: return;
! 490: }
! 491:
! 492: if (niveau == 0)
! 493: {
! 494: if (strcmp(instruction_majuscule, "END") == 0)
! 495: {
! 496: (*s_etat_processus).position_courante -= (strlen(
! 497: instruction_majuscule) + 1);
! 498: drapeau_fin = d_vrai;
! 499: }
! 500: else
! 501: {
! 502: drapeau_fin = d_faux;
! 503: }
! 504: }
! 505: else
! 506: {
! 507: drapeau_fin = d_faux;
! 508: }
! 509:
! 510: if ((strcmp(instruction_majuscule, "CASE") == 0) ||
! 511: (strcmp(instruction_majuscule, "DO") == 0) ||
! 512: (strcmp(instruction_majuscule, "IF") == 0) ||
! 513: (strcmp(instruction_majuscule, "IFERR") == 0) ||
! 514: (strcmp(instruction_majuscule, "SELECT") == 0) ||
! 515: (strcmp(instruction_majuscule, "WHILE") == 0))
! 516: {
! 517: niveau++;
! 518: }
! 519: else if (strcmp(instruction_majuscule, "END") == 0)
! 520: {
! 521: niveau--;
! 522: }
! 523:
! 524: free(instruction_majuscule);
! 525: free((*s_etat_processus).instruction_courante);
! 526: } while(drapeau_fin == d_faux);
! 527:
! 528: (*s_etat_processus).instruction_courante = tampon;
! 529: }
! 530: else
! 531: {
! 532: /*
! 533: * Vérification du pointeur de prédiction de saut.
! 534: */
! 535:
! 536: if (pthread_mutex_lock(&((*(*(*s_etat_processus)
! 537: .expression_courante).donnee).mutex)) != 0)
! 538: {
! 539: (*s_etat_processus).erreur_systeme = d_es_processus;
! 540: return;
! 541: }
! 542:
! 543: if ((*((struct_fonction *) (*(*(*s_etat_processus)
! 544: .expression_courante).donnee).objet)).prediction_saut
! 545: != NULL)
! 546: {
! 547: s_registre = (*s_etat_processus).expression_courante;
! 548:
! 549: (*s_etat_processus).expression_courante =
! 550: (struct_liste_chainee *)
! 551: (*((struct_fonction *) (*(*(*s_etat_processus)
! 552: .expression_courante).donnee).objet))
! 553: .prediction_saut;
! 554: fonction = (*((struct_fonction *)
! 555: (*(*(*s_etat_processus).expression_courante)
! 556: .donnee).objet)).fonction;
! 557: execution = (*((struct_fonction *)
! 558: (*(*s_registre).donnee).objet)).prediction_execution;
! 559:
! 560: if (pthread_mutex_unlock(&((*(*s_registre).donnee).mutex)) != 0)
! 561: {
! 562: (*s_etat_processus).erreur_systeme = d_es_processus;
! 563: return;
! 564: }
! 565:
! 566: if (execution == d_vrai)
! 567: {
! 568: fonction(s_etat_processus);
! 569: }
! 570: }
! 571: else
! 572: {
! 573: if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
! 574: .expression_courante).donnee).mutex)) != 0)
! 575: {
! 576: (*s_etat_processus).erreur_systeme = d_es_processus;
! 577: return;
! 578: }
! 579:
! 580: s_registre = (*s_etat_processus).expression_courante;
! 581: execution = d_faux;
! 582:
! 583: do
! 584: {
! 585: if (((*s_etat_processus).expression_courante =
! 586: (*(*s_etat_processus).expression_courante).suivant)
! 587: == NULL)
! 588: {
! 589: (*s_etat_processus).erreur_execution =
! 590: d_ex_erreur_traitement_condition;
! 591: return;
! 592: }
! 593:
! 594: if ((*(*(*s_etat_processus).expression_courante)
! 595: .donnee).type == FCT)
! 596: {
! 597: fonction = (*((struct_fonction *)
! 598: (*(*(*s_etat_processus).expression_courante)
! 599: .donnee).objet)).fonction;
! 600:
! 601: if (niveau == 0)
! 602: {
! 603: if (fonction == instruction_end)
! 604: {
! 605: fonction(s_etat_processus);
! 606: execution = d_vrai;
! 607: drapeau_fin = d_vrai;
! 608: }
! 609: else
! 610: {
! 611: drapeau_fin = d_faux;
! 612: }
! 613: }
! 614: else
! 615: {
! 616: drapeau_fin = d_faux;
! 617: }
! 618:
! 619: if ((fonction == instruction_case) ||
! 620: (fonction == instruction_do) ||
! 621: (fonction == instruction_if) ||
! 622: (fonction == instruction_iferr) ||
! 623: (fonction == instruction_select) ||
! 624: (fonction == instruction_while))
! 625: {
! 626: niveau++;
! 627: }
! 628: else if (fonction == instruction_end)
! 629: {
! 630: niveau--;
! 631: }
! 632: }
! 633: } while(drapeau_fin == d_faux);
! 634:
! 635: if (pthread_mutex_lock(&((*(*(*s_etat_processus)
! 636: .expression_courante).donnee).mutex)) != 0)
! 637: {
! 638: (*s_etat_processus).erreur_systeme = d_es_processus;
! 639: return;
! 640: }
! 641:
! 642: (*((struct_fonction *) (*(*s_registre).donnee).objet))
! 643: .prediction_saut = (*s_etat_processus)
! 644: .expression_courante;
! 645: (*((struct_fonction *) (*(*s_registre).donnee).objet))
! 646: .prediction_execution = execution;
! 647:
! 648: if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
! 649: .expression_courante).donnee).mutex)) != 0)
! 650: {
! 651: (*s_etat_processus).erreur_systeme = d_es_processus;
! 652: return;
! 653: }
! 654: }
! 655: }
! 656: }
! 657: else if ((*(*s_etat_processus).l_base_pile_systeme).clause != 'E')
! 658: {
! 659: (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_condition;
! 660: return;
! 661: }
! 662: else
! 663: {
! 664: (*(*s_etat_processus).l_base_pile_systeme).clause = 'Z';
! 665: }
! 666:
! 667: return;
! 668: }
! 669:
! 670:
! 671: /*
! 672: ================================================================================
! 673: Fonction 'elseif'
! 674: ================================================================================
! 675: Entrées : structure processus
! 676: --------------------------------------------------------------------------------
! 677: Sorties :
! 678: --------------------------------------------------------------------------------
! 679: Effets de bord : néant
! 680: ================================================================================
! 681: */
! 682:
! 683: void
! 684: instruction_elseif(struct_processus *s_etat_processus)
! 685: {
! 686: logical1 drapeau_fin;
! 687: logical1 execution;
! 688:
! 689: struct_liste_chainee *s_registre;
! 690:
! 691: unsigned char *instruction_majuscule;
! 692: unsigned char *tampon;
! 693:
! 694: unsigned long niveau;
! 695:
! 696: void (*fonction)();
! 697:
! 698: (*s_etat_processus).erreur_execution = d_ex;
! 699:
! 700: if ((*s_etat_processus).affichage_arguments == 'Y')
! 701: {
! 702: printf("\n ELSEIF ");
! 703:
! 704: if ((*s_etat_processus).langue == 'F')
! 705: {
! 706: printf("(structure de contrôle)\n\n");
! 707: printf(" Utilisation :\n\n");
! 708: }
! 709: else
! 710: {
! 711: printf("(control statement)\n\n");
! 712: printf(" Usage:\n\n");
! 713: }
! 714:
! 715: printf(" IF\n");
! 716: printf(" (expression test 1)\n");
! 717: printf(" THEN\n");
! 718: printf(" (expression 1)\n");
! 719: printf(" ELSEIF\n");
! 720: printf(" (expression test 2)\n");
! 721: printf(" THEN\n");
! 722: printf(" (expression 2)\n");
! 723: printf(" ...\n");
! 724: printf(" [ELSE\n");
! 725: printf(" (expression n)]\n");
! 726: printf(" END\n\n");
! 727:
! 728: return;
! 729: }
! 730: else if ((*s_etat_processus).test_instruction == 'Y')
! 731: {
! 732: (*s_etat_processus).nombre_arguments = -1;
! 733: return;
! 734: }
! 735:
! 736: if ((*(*s_etat_processus).l_base_pile_systeme).type_cloture != 'I')
! 737: {
! 738: (*s_etat_processus).erreur_execution =
! 739: d_ex_erreur_traitement_condition;
! 740: return;
! 741: }
! 742:
! 743: if ((*(*s_etat_processus).l_base_pile_systeme).clause == 'T')
! 744: {
! 745: /*
! 746: * On saute au END car le test précédent était vrai.
! 747: */
! 748:
! 749: niveau = 0;
! 750: drapeau_fin = d_faux;
! 751:
! 752: if ((*s_etat_processus).mode_execution_programme == 'Y')
! 753: {
! 754: tampon = (*s_etat_processus).instruction_courante;
! 755:
! 756: do
! 757: {
! 758: if (recherche_instruction_suivante(s_etat_processus)
! 759: == d_erreur)
! 760: {
! 761: if ((*s_etat_processus).instruction_courante != NULL)
! 762: {
! 763: free((*s_etat_processus).instruction_courante);
! 764: }
! 765:
! 766: (*s_etat_processus).instruction_courante = tampon;
! 767: (*s_etat_processus).erreur_execution =
! 768: d_ex_erreur_traitement_condition;
! 769: return;
! 770: }
! 771:
! 772: if ((instruction_majuscule = conversion_majuscule(
! 773: (*s_etat_processus).instruction_courante)) == NULL)
! 774: {
! 775: free((*s_etat_processus).instruction_courante);
! 776: (*s_etat_processus).instruction_courante = tampon;
! 777: (*s_etat_processus).erreur_systeme =
! 778: d_es_allocation_memoire;
! 779: return;
! 780: }
! 781:
! 782: if (niveau == 0)
! 783: {
! 784: if (strcmp(instruction_majuscule, "END") == 0)
! 785: {
! 786: (*s_etat_processus).position_courante -= (strlen(
! 787: instruction_majuscule) + 1);
! 788: drapeau_fin = d_vrai;
! 789: }
! 790: else
! 791: {
! 792: drapeau_fin = d_faux;
! 793: }
! 794: }
! 795: else
! 796: {
! 797: drapeau_fin = d_faux;
! 798: }
! 799:
! 800: if ((strcmp(instruction_majuscule, "CASE") == 0) ||
! 801: (strcmp(instruction_majuscule, "DO") == 0) ||
! 802: (strcmp(instruction_majuscule, "IF") == 0) ||
! 803: (strcmp(instruction_majuscule, "IFERR") == 0) ||
! 804: (strcmp(instruction_majuscule, "SELECT") == 0) ||
! 805: (strcmp(instruction_majuscule, "WHILE") == 0))
! 806: {
! 807: niveau++;
! 808: }
! 809: else if (strcmp(instruction_majuscule, "END") == 0)
! 810: {
! 811: niveau--;
! 812: }
! 813:
! 814: free(instruction_majuscule);
! 815: free((*s_etat_processus).instruction_courante);
! 816: } while(drapeau_fin == d_faux);
! 817:
! 818: (*s_etat_processus).instruction_courante = tampon;
! 819: }
! 820: else
! 821: {
! 822: /*
! 823: * Vérification du pointeur de prédiction de saut
! 824: */
! 825:
! 826: if (pthread_mutex_lock(&((*(*(*s_etat_processus)
! 827: .expression_courante).donnee).mutex)) != 0)
! 828: {
! 829: (*s_etat_processus).erreur_systeme = d_es_processus;
! 830: return;
! 831: }
! 832:
! 833: if ((*((struct_fonction *) (*(*(*s_etat_processus)
! 834: .expression_courante).donnee).objet)).prediction_saut
! 835: != NULL)
! 836: {
! 837: s_registre = (*s_etat_processus).expression_courante;
! 838:
! 839: (*s_etat_processus).expression_courante =
! 840: (struct_liste_chainee *)
! 841: (*((struct_fonction *) (*(*(*s_etat_processus)
! 842: .expression_courante).donnee).objet))
! 843: .prediction_saut;
! 844: fonction = (*((struct_fonction *)
! 845: (*(*(*s_etat_processus).expression_courante)
! 846: .donnee).objet)).fonction;
! 847: execution = (*((struct_fonction *)
! 848: (*(*s_registre).donnee).objet)).prediction_execution;
! 849:
! 850: if (pthread_mutex_unlock(&((*(*s_registre).donnee).mutex)) != 0)
! 851: {
! 852: (*s_etat_processus).erreur_systeme = d_es_processus;
! 853: return;
! 854: }
! 855:
! 856: if (execution == d_vrai)
! 857: {
! 858: fonction(s_etat_processus);
! 859: }
! 860: }
! 861: else
! 862: {
! 863: if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
! 864: .expression_courante).donnee).mutex)) != 0)
! 865: {
! 866: (*s_etat_processus).erreur_systeme = d_es_processus;
! 867: return;
! 868: }
! 869:
! 870: s_registre = (*s_etat_processus).expression_courante;
! 871: execution = d_faux;
! 872:
! 873: do
! 874: {
! 875: if (((*s_etat_processus).expression_courante =
! 876: (*(*s_etat_processus).expression_courante).suivant)
! 877: == NULL)
! 878: {
! 879: (*s_etat_processus).erreur_execution =
! 880: d_ex_erreur_traitement_condition;
! 881: return;
! 882: }
! 883:
! 884: if ((*(*(*s_etat_processus).expression_courante)
! 885: .donnee).type == FCT)
! 886: {
! 887: fonction = (*((struct_fonction *)
! 888: (*(*(*s_etat_processus).expression_courante)
! 889: .donnee).objet)).fonction;
! 890:
! 891: if (niveau == 0)
! 892: {
! 893: if (fonction == instruction_end)
! 894: {
! 895: instruction_end(s_etat_processus);
! 896: execution = d_vrai;
! 897: drapeau_fin = d_vrai;
! 898: }
! 899: else
! 900: {
! 901: drapeau_fin = d_faux;
! 902: }
! 903: }
! 904: else
! 905: {
! 906: drapeau_fin = d_faux;
! 907: }
! 908:
! 909: if ((fonction == instruction_case) ||
! 910: (fonction == instruction_do) ||
! 911: (fonction == instruction_if) ||
! 912: (fonction == instruction_iferr) ||
! 913: (fonction == instruction_select) ||
! 914: (fonction == instruction_while))
! 915: {
! 916: niveau++;
! 917: }
! 918: else if (fonction == instruction_end)
! 919: {
! 920: niveau--;
! 921: }
! 922: }
! 923: } while(drapeau_fin == d_faux);
! 924:
! 925: if (pthread_mutex_lock(&((*(*(*s_etat_processus)
! 926: .expression_courante).donnee).mutex)) != 0)
! 927: {
! 928: (*s_etat_processus).erreur_systeme = d_es_processus;
! 929: return;
! 930: }
! 931:
! 932: (*((struct_fonction *) (*(*s_registre).donnee).objet))
! 933: .prediction_saut = (*s_etat_processus)
! 934: .expression_courante;
! 935: (*((struct_fonction *) (*(*s_registre).donnee).objet))
! 936: .prediction_execution = execution;
! 937:
! 938: if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
! 939: .expression_courante).donnee).mutex)) != 0)
! 940: {
! 941: (*s_etat_processus).erreur_systeme = d_es_processus;
! 942: return;
! 943: }
! 944: }
! 945: }
! 946: }
! 947: else
! 948: {
! 949: /*
! 950: * On teste à nouveau...
! 951: */
! 952:
! 953: (*(*s_etat_processus).l_base_pile_systeme).clause = 'I';
! 954: }
! 955:
! 956: return;
! 957: }
! 958:
! 959:
! 960: /*
! 961: ================================================================================
! 962: Fonction 'e'
! 963: ================================================================================
! 964: Entrées : structure processus
! 965: --------------------------------------------------------------------------------
! 966: Sorties :
! 967: --------------------------------------------------------------------------------
! 968: Effets de bord : néant
! 969: ================================================================================
! 970: */
! 971:
! 972: void
! 973: instruction_sensible_e(struct_processus *s_etat_processus)
! 974: {
! 975: if (strcmp((*s_etat_processus).instruction_courante, "e") == 0)
! 976: {
! 977: instruction_e(s_etat_processus);
! 978: }
! 979: else
! 980: {
! 981: (*s_etat_processus).instruction_valide = 'N';
! 982: }
! 983:
! 984: return;
! 985: }
! 986:
! 987: void
! 988: instruction_e(struct_processus *s_etat_processus)
! 989: {
! 990: struct_objet *s_objet;
! 991:
! 992: (*s_etat_processus).erreur_execution = d_ex;
! 993:
! 994: if ((*s_etat_processus).affichage_arguments == 'Y')
! 995: {
! 996: printf("\n e ");
! 997:
! 998: if ((*s_etat_processus).langue == 'F')
! 999: {
! 1000: printf("(base de logarithmes népériens)\n\n");
! 1001: }
! 1002: else
! 1003: {
! 1004: printf("(base of natural logarithm)\n\n");
! 1005: }
! 1006:
! 1007: printf("-> 1: %s\n", d_REL);
! 1008:
! 1009: return;
! 1010: }
! 1011: else if ((*s_etat_processus).test_instruction == 'Y')
! 1012: {
! 1013: (*s_etat_processus).constante_symbolique = 'Y';
! 1014: (*s_etat_processus).nombre_arguments = -1;
! 1015: return;
! 1016: }
! 1017:
! 1018: /* Indicateur 35 armé => évaluation symbolique */
! 1019: if (test_cfsf(s_etat_processus, 35) == d_vrai)
! 1020: {
! 1021: if ((s_objet = allocation(s_etat_processus, NOM)) == NULL)
! 1022: {
! 1023: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1024: return;
! 1025: }
! 1026:
! 1027: if (((*((struct_nom *) (*s_objet).objet)).nom =
! 1028: malloc(2 * sizeof(unsigned char))) == NULL)
! 1029: {
! 1030: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1031: return;
! 1032: }
! 1033:
! 1034: strcpy((*((struct_nom *) (*s_objet).objet)).nom, "e");
! 1035: (*((struct_nom *) (*s_objet).objet)).symbole = d_faux;
! 1036: }
! 1037: else
! 1038: {
! 1039: if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
! 1040: {
! 1041: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1042: return;
! 1043: }
! 1044:
! 1045: (*((real8 *) (*s_objet).objet)) = exp((real8) 1);
! 1046: }
! 1047:
! 1048: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1049: s_objet) == d_erreur)
! 1050: {
! 1051: return;
! 1052: }
! 1053:
! 1054: return;
! 1055: }
! 1056:
! 1057:
! 1058: /*
! 1059: ================================================================================
! 1060: Fonction 'eng'
! 1061: ================================================================================
! 1062: Entrées : pointeur sur une struct_processus
! 1063: --------------------------------------------------------------------------------
! 1064: Sorties :
! 1065: --------------------------------------------------------------------------------
! 1066: Effets de bord : néant
! 1067: ================================================================================
! 1068: */
! 1069:
! 1070: void
! 1071: instruction_eng(struct_processus *s_etat_processus)
! 1072: {
! 1073: struct_objet *s_objet_argument;
! 1074: struct_objet *s_objet;
! 1075:
! 1076: logical1 i43;
! 1077: logical1 i44;
! 1078:
! 1079: unsigned char *valeur_binaire;
! 1080:
! 1081: unsigned long i;
! 1082: unsigned long j;
! 1083:
! 1084: (*s_etat_processus).erreur_execution = d_ex;
! 1085:
! 1086: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1087: {
! 1088: printf("\n ENG ");
! 1089:
! 1090: if ((*s_etat_processus).langue == 'F')
! 1091: {
! 1092: printf("(notation ingénieur)\n\n");
! 1093: printf(" Aucun argument\n");
! 1094: }
! 1095: else
! 1096: {
! 1097: printf("(engineer notation)\n\n");
! 1098: printf(" No argument\n");
! 1099: }
! 1100:
! 1101: return;
! 1102: }
! 1103: else if ((*s_etat_processus).test_instruction == 'Y')
! 1104: {
! 1105: (*s_etat_processus).nombre_arguments = -1;
! 1106: return;
! 1107: }
! 1108:
! 1109: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1110: {
! 1111: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 1112: {
! 1113: return;
! 1114: }
! 1115: }
! 1116:
! 1117: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1118: &s_objet_argument) == d_erreur)
! 1119: {
! 1120: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1121: return;
! 1122: }
! 1123:
! 1124: if ((*s_objet_argument).type == INT)
! 1125: {
! 1126: if (((*((integer8 *) (*s_objet_argument).objet)) >= 0) &&
! 1127: ((*((integer8 *) (*s_objet_argument).objet)) <= 15))
! 1128: {
! 1129: if ((s_objet = allocation(s_etat_processus, BIN)) == NULL)
! 1130: {
! 1131: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1132: return;
! 1133: }
! 1134:
! 1135: (*((logical8 *) (*s_objet).objet)) =
! 1136: (*((integer8 *) (*s_objet_argument).objet));
! 1137:
! 1138: i43 = test_cfsf(s_etat_processus, 43);
! 1139: i44 = test_cfsf(s_etat_processus, 44);
! 1140:
! 1141: sf(s_etat_processus, 44);
! 1142: cf(s_etat_processus, 43);
! 1143:
! 1144: if ((valeur_binaire = formateur(s_etat_processus, 0, s_objet))
! 1145: == NULL)
! 1146: {
! 1147: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1148: return;
! 1149: }
! 1150:
! 1151: if (i43 == d_vrai)
! 1152: {
! 1153: sf(s_etat_processus, 43);
! 1154: }
! 1155: else
! 1156: {
! 1157: cf(s_etat_processus, 43);
! 1158: }
! 1159:
! 1160: if (i44 == d_vrai)
! 1161: {
! 1162: sf(s_etat_processus, 44);
! 1163: }
! 1164: else
! 1165: {
! 1166: cf(s_etat_processus, 44);
! 1167: }
! 1168:
! 1169: for(j = 53, i = strlen(valeur_binaire) - 2; i >= 2; i--)
! 1170: {
! 1171: if (valeur_binaire[i] == '0')
! 1172: {
! 1173: cf(s_etat_processus, j++);
! 1174: }
! 1175: else
! 1176: {
! 1177: sf(s_etat_processus, j++);
! 1178: }
! 1179: }
! 1180:
! 1181: for(; j <= 56; cf(s_etat_processus, j++));
! 1182:
! 1183: sf(s_etat_processus, 49);
! 1184: sf(s_etat_processus, 50);
! 1185:
! 1186: free(valeur_binaire);
! 1187: liberation(s_etat_processus, s_objet);
! 1188: }
! 1189: else
! 1190: {
! 1191: liberation(s_etat_processus, s_objet_argument);
! 1192:
! 1193: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 1194: return;
! 1195: }
! 1196: }
! 1197: else
! 1198: {
! 1199: liberation(s_etat_processus, s_objet_argument);
! 1200:
! 1201: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1202: return;
! 1203: }
! 1204:
! 1205: liberation(s_etat_processus, s_objet_argument);
! 1206:
! 1207: return;
! 1208: }
! 1209:
! 1210:
! 1211: /*
! 1212: ================================================================================
! 1213: Fonction 'exp'
! 1214: ================================================================================
! 1215: Entrées : pointeur sur une struct_processus
! 1216: --------------------------------------------------------------------------------
! 1217: Sorties :
! 1218: --------------------------------------------------------------------------------
! 1219: Effets de bord : néant
! 1220: ================================================================================
! 1221: */
! 1222:
! 1223: void
! 1224: instruction_exp(struct_processus *s_etat_processus)
! 1225: {
! 1226: struct_liste_chainee *l_element_courant;
! 1227: struct_liste_chainee *l_element_precedent;
! 1228:
! 1229: struct_objet *s_copie_argument;
! 1230: struct_objet *s_objet_argument;
! 1231: struct_objet *s_objet_resultat;
! 1232:
! 1233: (*s_etat_processus).erreur_execution = d_ex;
! 1234:
! 1235: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1236: {
! 1237: printf("\n EXP ");
! 1238:
! 1239: if ((*s_etat_processus).langue == 'F')
! 1240: {
! 1241: printf("(exponentielle)\n\n");
! 1242: }
! 1243: else
! 1244: {
! 1245: printf("(exponential)\n\n");
! 1246: }
! 1247:
! 1248: printf(" 1: %s, %s\n", d_INT, d_REL);
! 1249: printf("-> 1: %s\n\n", d_REL);
! 1250:
! 1251: printf(" 1: %s\n", d_CPL);
! 1252: printf("-> 1: %s\n\n", d_CPL);
! 1253:
! 1254: printf(" 1: %s, %s\n", d_NOM, d_ALG);
! 1255: printf("-> 1: %s\n\n", d_ALG);
! 1256:
! 1257: printf(" 1: %s\n", d_RPN);
! 1258: printf("-> 1: %s\n", d_RPN);
! 1259:
! 1260: return;
! 1261: }
! 1262: else if ((*s_etat_processus).test_instruction == 'Y')
! 1263: {
! 1264: (*s_etat_processus).nombre_arguments = 1;
! 1265: return;
! 1266: }
! 1267:
! 1268: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1269: {
! 1270: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 1271: {
! 1272: return;
! 1273: }
! 1274: }
! 1275:
! 1276: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1277: &s_objet_argument) == d_erreur)
! 1278: {
! 1279: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1280: return;
! 1281: }
! 1282:
! 1283: /*
! 1284: --------------------------------------------------------------------------------
! 1285: Exponentielle d'un entier
! 1286: --------------------------------------------------------------------------------
! 1287: */
! 1288:
! 1289: if ((*s_objet_argument).type == INT)
! 1290: {
! 1291: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
! 1292: {
! 1293: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1294: return;
! 1295: }
! 1296:
! 1297: (*((real8 *) (*s_objet_resultat).objet)) =
! 1298: exp((real8) (*((integer8 *) (*s_objet_argument).objet)));
! 1299: }
! 1300:
! 1301: /*
! 1302: --------------------------------------------------------------------------------
! 1303: Exponentielle d'un réel
! 1304: --------------------------------------------------------------------------------
! 1305: */
! 1306:
! 1307: else if ((*s_objet_argument).type == REL)
! 1308: {
! 1309: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
! 1310: {
! 1311: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1312: return;
! 1313: }
! 1314:
! 1315: (*((real8 *) (*s_objet_resultat).objet)) =
! 1316: exp(((*((real8 *) (*s_objet_argument).objet))));
! 1317: }
! 1318:
! 1319: /*
! 1320: --------------------------------------------------------------------------------
! 1321: Exponentielle d'un complexe
! 1322: --------------------------------------------------------------------------------
! 1323: */
! 1324:
! 1325: else if ((*s_objet_argument).type == CPL)
! 1326: {
! 1327: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
! 1328: {
! 1329: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1330: return;
! 1331: }
! 1332:
! 1333: f77expc_((struct_complexe16 *) (*s_objet_argument).objet,
! 1334: (struct_complexe16 *) (*s_objet_resultat).objet);
! 1335: }
! 1336:
! 1337: /*
! 1338: --------------------------------------------------------------------------------
! 1339: Exponentielle d'un nom
! 1340: --------------------------------------------------------------------------------
! 1341: */
! 1342:
! 1343: else if ((*s_objet_argument).type == NOM)
! 1344: {
! 1345: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
! 1346: {
! 1347: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1348: return;
! 1349: }
! 1350:
! 1351: if (((*s_objet_resultat).objet =
! 1352: allocation_maillon(s_etat_processus)) == NULL)
! 1353: {
! 1354: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1355: return;
! 1356: }
! 1357:
! 1358: l_element_courant = (*s_objet_resultat).objet;
! 1359:
! 1360: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1361: == NULL)
! 1362: {
! 1363: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1364: return;
! 1365: }
! 1366:
! 1367: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1368: .nombre_arguments = 0;
! 1369: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1370: .fonction = instruction_vers_niveau_superieur;
! 1371:
! 1372: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1373: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 1374: {
! 1375: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1376: return;
! 1377: }
! 1378:
! 1379: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1380: .nom_fonction, "<<");
! 1381:
! 1382: if (((*l_element_courant).suivant =
! 1383: allocation_maillon(s_etat_processus)) == NULL)
! 1384: {
! 1385: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1386: return;
! 1387: }
! 1388:
! 1389: l_element_courant = (*l_element_courant).suivant;
! 1390: (*l_element_courant).donnee = s_objet_argument;
! 1391:
! 1392: if (((*l_element_courant).suivant =
! 1393: allocation_maillon(s_etat_processus)) == NULL)
! 1394: {
! 1395: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1396: return;
! 1397: }
! 1398:
! 1399: l_element_courant = (*l_element_courant).suivant;
! 1400:
! 1401: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1402: == NULL)
! 1403: {
! 1404: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1405: return;
! 1406: }
! 1407:
! 1408: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1409: .nombre_arguments = 1;
! 1410: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1411: .fonction = instruction_exp;
! 1412:
! 1413: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1414: .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
! 1415: {
! 1416: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1417: return;
! 1418: }
! 1419:
! 1420: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1421: .nom_fonction, "EXP");
! 1422:
! 1423: if (((*l_element_courant).suivant =
! 1424: allocation_maillon(s_etat_processus)) == NULL)
! 1425: {
! 1426: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1427: return;
! 1428: }
! 1429:
! 1430: l_element_courant = (*l_element_courant).suivant;
! 1431:
! 1432: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1433: == NULL)
! 1434: {
! 1435: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1436: return;
! 1437: }
! 1438:
! 1439: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1440: .nombre_arguments = 0;
! 1441: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1442: .fonction = instruction_vers_niveau_inferieur;
! 1443:
! 1444: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1445: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 1446: {
! 1447: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1448: return;
! 1449: }
! 1450:
! 1451: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1452: .nom_fonction, ">>");
! 1453:
! 1454: (*l_element_courant).suivant = NULL;
! 1455: s_objet_argument = NULL;
! 1456: }
! 1457:
! 1458: /*
! 1459: --------------------------------------------------------------------------------
! 1460: Exponentielle d'une expression
! 1461: --------------------------------------------------------------------------------
! 1462: */
! 1463:
! 1464: else if (((*s_objet_argument).type == ALG) ||
! 1465: ((*s_objet_argument).type == RPN))
! 1466: {
! 1467: if ((s_copie_argument = copie_objet(s_etat_processus,
! 1468: s_objet_argument, 'N')) == NULL)
! 1469: {
! 1470: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1471: return;
! 1472: }
! 1473:
! 1474: l_element_courant = (struct_liste_chainee *)
! 1475: (*s_copie_argument).objet;
! 1476: l_element_precedent = l_element_courant;
! 1477:
! 1478: while((*l_element_courant).suivant != NULL)
! 1479: {
! 1480: l_element_precedent = l_element_courant;
! 1481: l_element_courant = (*l_element_courant).suivant;
! 1482: }
! 1483:
! 1484: if (((*l_element_precedent).suivant =
! 1485: allocation_maillon(s_etat_processus)) == NULL)
! 1486: {
! 1487: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1488: return;
! 1489: }
! 1490:
! 1491: if (((*(*l_element_precedent).suivant).donnee =
! 1492: allocation(s_etat_processus, FCT)) == NULL)
! 1493: {
! 1494: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1495: return;
! 1496: }
! 1497:
! 1498: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
! 1499: .donnee).objet)).nombre_arguments = 1;
! 1500: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
! 1501: .donnee).objet)).fonction = instruction_exp;
! 1502:
! 1503: if (((*((struct_fonction *) (*(*(*l_element_precedent)
! 1504: .suivant).donnee).objet)).nom_fonction =
! 1505: malloc(4 * sizeof(unsigned char))) == NULL)
! 1506: {
! 1507: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1508: return;
! 1509: }
! 1510:
! 1511: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
! 1512: .suivant).donnee).objet)).nom_fonction, "EXP");
! 1513:
! 1514: (*(*l_element_precedent).suivant).suivant = l_element_courant;
! 1515:
! 1516: s_objet_resultat = s_copie_argument;
! 1517: }
! 1518:
! 1519: /*
! 1520: --------------------------------------------------------------------------------
! 1521: Fonction exponentielle impossible à réaliser
! 1522: --------------------------------------------------------------------------------
! 1523: */
! 1524:
! 1525: else
! 1526: {
! 1527: liberation(s_etat_processus, s_objet_argument);
! 1528:
! 1529: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1530: return;
! 1531: }
! 1532:
! 1533: liberation(s_etat_processus, s_objet_argument);
! 1534:
! 1535: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1536: s_objet_resultat) == d_erreur)
! 1537: {
! 1538: return;
! 1539: }
! 1540:
! 1541: return;
! 1542: }
! 1543:
! 1544:
! 1545: /*
! 1546: ================================================================================
! 1547: Fonction 'exp' (-1)
! 1548: ================================================================================
! 1549: Entrées : pointeur sur une struct_processus
! 1550: --------------------------------------------------------------------------------
! 1551: Sorties :
! 1552: --------------------------------------------------------------------------------
! 1553: Effets de bord : néant
! 1554: ================================================================================
! 1555: */
! 1556:
! 1557: void
! 1558: instruction_expm(struct_processus *s_etat_processus)
! 1559: {
! 1560: struct_liste_chainee *l_element_courant;
! 1561: struct_liste_chainee *l_element_precedent;
! 1562:
! 1563: struct_objet *s_copie_argument;
! 1564: struct_objet *s_objet_argument;
! 1565: struct_objet *s_objet_resultat;
! 1566:
! 1567: (*s_etat_processus).erreur_execution = d_ex;
! 1568:
! 1569: if ((*s_etat_processus).affichage_arguments == 'Y')
! 1570: {
! 1571: printf("\n EXPM ");
! 1572:
! 1573: if ((*s_etat_processus).langue == 'F')
! 1574: {
! 1575: printf("(exponentielle moins un)\n\n");
! 1576: }
! 1577: else
! 1578: {
! 1579: printf("(exp - 1)\n\n");
! 1580: }
! 1581:
! 1582: printf(" 1: %s, %s\n", d_INT, d_REL);
! 1583: printf("-> 1: %s\n\n", d_REL);
! 1584:
! 1585: printf(" 1: %s\n", d_CPL);
! 1586: printf("-> 1: %s\n\n", d_CPL);
! 1587:
! 1588: printf(" 1: %s, %s\n", d_NOM, d_ALG);
! 1589: printf("-> 1: %s\n\n", d_ALG);
! 1590:
! 1591: printf(" 1: %s\n", d_RPN);
! 1592: printf("-> 1: %s\n", d_RPN);
! 1593:
! 1594: return;
! 1595: }
! 1596: else if ((*s_etat_processus).test_instruction == 'Y')
! 1597: {
! 1598: (*s_etat_processus).nombre_arguments = 1;
! 1599: return;
! 1600: }
! 1601:
! 1602: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 1603: {
! 1604: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 1605: {
! 1606: return;
! 1607: }
! 1608: }
! 1609:
! 1610: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1611: &s_objet_argument) == d_erreur)
! 1612: {
! 1613: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 1614: return;
! 1615: }
! 1616:
! 1617: /*
! 1618: --------------------------------------------------------------------------------
! 1619: Exponentielle (-1) d'un entier
! 1620: --------------------------------------------------------------------------------
! 1621: */
! 1622:
! 1623: if ((*s_objet_argument).type == INT)
! 1624: {
! 1625: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
! 1626: {
! 1627: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1628: return;
! 1629: }
! 1630:
! 1631: (*((real8 *) (*s_objet_resultat).objet)) =
! 1632: expm1((real8) (*((integer8 *) (*s_objet_argument).objet)));
! 1633: }
! 1634:
! 1635: /*
! 1636: --------------------------------------------------------------------------------
! 1637: Exponentielle (-1) d'un réel
! 1638: --------------------------------------------------------------------------------
! 1639: */
! 1640:
! 1641: else if ((*s_objet_argument).type == REL)
! 1642: {
! 1643: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
! 1644: {
! 1645: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1646: return;
! 1647: }
! 1648:
! 1649: (*((real8 *) (*s_objet_resultat).objet)) =
! 1650: expm1(((*((real8 *) (*s_objet_argument).objet))));
! 1651: }
! 1652:
! 1653: /*
! 1654: --------------------------------------------------------------------------------
! 1655: Exponentielle (-1) d'un nom
! 1656: --------------------------------------------------------------------------------
! 1657: */
! 1658:
! 1659: else if ((*s_objet_argument).type == NOM)
! 1660: {
! 1661: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
! 1662: {
! 1663: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1664: return;
! 1665: }
! 1666:
! 1667: if (((*s_objet_resultat).objet =
! 1668: allocation_maillon(s_etat_processus)) == NULL)
! 1669: {
! 1670: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1671: return;
! 1672: }
! 1673:
! 1674: l_element_courant = (*s_objet_resultat).objet;
! 1675:
! 1676: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1677: == NULL)
! 1678: {
! 1679: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1680: return;
! 1681: }
! 1682:
! 1683: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1684: .nombre_arguments = 0;
! 1685: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1686: .fonction = instruction_vers_niveau_superieur;
! 1687:
! 1688: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1689: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 1690: {
! 1691: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1692: return;
! 1693: }
! 1694:
! 1695: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1696: .nom_fonction, "<<");
! 1697:
! 1698: if (((*l_element_courant).suivant =
! 1699: allocation_maillon(s_etat_processus)) == NULL)
! 1700: {
! 1701: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1702: return;
! 1703: }
! 1704:
! 1705: l_element_courant = (*l_element_courant).suivant;
! 1706: (*l_element_courant).donnee = s_objet_argument;
! 1707:
! 1708: if (((*l_element_courant).suivant =
! 1709: allocation_maillon(s_etat_processus)) == NULL)
! 1710: {
! 1711: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1712: return;
! 1713: }
! 1714:
! 1715: l_element_courant = (*l_element_courant).suivant;
! 1716:
! 1717: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1718: == NULL)
! 1719: {
! 1720: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1721: return;
! 1722: }
! 1723:
! 1724: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1725: .nombre_arguments = 1;
! 1726: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1727: .fonction = instruction_expm;
! 1728:
! 1729: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1730: .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
! 1731: {
! 1732: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1733: return;
! 1734: }
! 1735:
! 1736: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1737: .nom_fonction, "EXPM");
! 1738:
! 1739: if (((*l_element_courant).suivant =
! 1740: allocation_maillon(s_etat_processus)) == NULL)
! 1741: {
! 1742: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1743: return;
! 1744: }
! 1745:
! 1746: l_element_courant = (*l_element_courant).suivant;
! 1747:
! 1748: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 1749: == NULL)
! 1750: {
! 1751: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1752: return;
! 1753: }
! 1754:
! 1755: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1756: .nombre_arguments = 0;
! 1757: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1758: .fonction = instruction_vers_niveau_inferieur;
! 1759:
! 1760: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1761: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 1762: {
! 1763: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1764: return;
! 1765: }
! 1766:
! 1767: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1768: .nom_fonction, ">>");
! 1769:
! 1770: (*l_element_courant).suivant = NULL;
! 1771: s_objet_argument = NULL;
! 1772: }
! 1773:
! 1774: /*
! 1775: --------------------------------------------------------------------------------
! 1776: Exponentielle (-1) d'une expression
! 1777: --------------------------------------------------------------------------------
! 1778: */
! 1779:
! 1780: else if (((*s_objet_argument).type == ALG) ||
! 1781: ((*s_objet_argument).type == RPN))
! 1782: {
! 1783: if ((s_copie_argument = copie_objet(s_etat_processus,
! 1784: s_objet_argument, 'N')) == NULL)
! 1785: {
! 1786: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1787: return;
! 1788: }
! 1789:
! 1790: l_element_courant = (struct_liste_chainee *)
! 1791: (*s_copie_argument).objet;
! 1792: l_element_precedent = l_element_courant;
! 1793:
! 1794: while((*l_element_courant).suivant != NULL)
! 1795: {
! 1796: l_element_precedent = l_element_courant;
! 1797: l_element_courant = (*l_element_courant).suivant;
! 1798: }
! 1799:
! 1800: if (((*l_element_precedent).suivant =
! 1801: allocation_maillon(s_etat_processus)) == NULL)
! 1802: {
! 1803: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1804: return;
! 1805: }
! 1806:
! 1807: if (((*(*l_element_precedent).suivant).donnee =
! 1808: allocation(s_etat_processus, FCT)) == NULL)
! 1809: {
! 1810: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1811: return;
! 1812: }
! 1813:
! 1814: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
! 1815: .donnee).objet)).nombre_arguments = 1;
! 1816: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
! 1817: .donnee).objet)).fonction = instruction_expm;
! 1818:
! 1819: if (((*((struct_fonction *) (*(*(*l_element_precedent)
! 1820: .suivant).donnee).objet)).nom_fonction =
! 1821: malloc(5 * sizeof(unsigned char))) == NULL)
! 1822: {
! 1823: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 1824: return;
! 1825: }
! 1826:
! 1827: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
! 1828: .suivant).donnee).objet)).nom_fonction, "EXPM");
! 1829:
! 1830: (*(*l_element_precedent).suivant).suivant = l_element_courant;
! 1831:
! 1832: s_objet_resultat = s_copie_argument;
! 1833: }
! 1834:
! 1835: /*
! 1836: --------------------------------------------------------------------------------
! 1837: Fonction exponentielle (-1) impossible à réaliser
! 1838: --------------------------------------------------------------------------------
! 1839: */
! 1840:
! 1841: else
! 1842: {
! 1843: liberation(s_etat_processus, s_objet_argument);
! 1844:
! 1845: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 1846: return;
! 1847: }
! 1848:
! 1849: liberation(s_etat_processus, s_objet_argument);
! 1850:
! 1851: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 1852: s_objet_resultat) == d_erreur)
! 1853: {
! 1854: return;
! 1855: }
! 1856:
! 1857: return;
! 1858: }
! 1859:
! 1860: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>