Annotation of rpl/src/calcul_differentiel.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 'derivation'
! 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: derivation(struct_processus *s_etat_processus, struct_objet **s_expression)
! 40: {
! 41: /*
! 42: * Faire le calcul directement sur l'expression RPN. Mettre les
! 43: * pointeurs dans une pile pour pouvoir circuler dans l'autre sens.
! 44: * << 2 X * >> -> << 2 X * X DER >>
! 45: * -> << 2 X DER X * 2 X X DER * + >> -> << 0 X * 2 1 * + >>
! 46: * -> << 2 >>
! 47: *
! 48: * << X 2 * 3 + COS >> -> << X 2 * 3 + COS X DER >>
! 49: * -> << X 2 * 3 + SIN NEG X 2 * 3 + X DER * >>
! 50: *
! 51: * Prévoir la simplification des expressions faite par une évaluation
! 52: * symbolique ('E').
! 53: */
! 54:
! 55: integer8 derivee;
! 56:
! 57: logical1 derivee_fonction_disponible;
! 58: logical1 drapeau;
! 59: logical1 fin_boucle;
! 60:
! 61: static unsigned char *fonctions[] =
! 62: {
! 63: "ABS", "1", NULL,
! 64: "FCT", "SIGN", "1",
! 65: NULL,
! 66:
! 67: "ARG", "1", NULL,
! 68: "FCT", "INV", "1",
! 69: "FCT", "DUP", "1",
! 70: "FCT", "CONJ", "1",
! 71: "FCT", "-", "0",
! 72: "INT", "2", "0",
! 73: "NOM", "i", "0",
! 74: "FCT", "*", "0",
! 75: "FCT", "/", "0",
! 76: NULL,
! 77:
! 78: "ACOS", "1", NULL,
! 79: "INT", "1", "0",
! 80: "FCT", "SWAP", "2",
! 81: "FCT", "SQ", "1",
! 82: "FCT", "-", "0",
! 83: "FCT", "SQRT", "1",
! 84: "FCT", "INV", "1",
! 85: "FCT", "NEG", "1",
! 86: NULL,
! 87:
! 88: "ACOSH", "1", NULL,
! 89: "FCT", "DUP", "1",
! 90: "INT", "1", "0",
! 91: "FCT", "-", "0",
! 92: "FCT", "SQRT", "1",
! 93: "FCT", "SWAP", "1",
! 94: "INT", "1", "0",
! 95: "FCT", "+", "0",
! 96: "FCT", "SQRT", "1",
! 97: "FCT", "*", "0",
! 98: "FCT", "INV", "1",
! 99: NULL,
! 100:
! 101: "ALOG", "1", NULL,
! 102: "FCT", "ALOG", "1",
! 103: "INT", "10", "0",
! 104: "FCT", "LN", "1",
! 105: "FCT", "*", "0",
! 106: NULL,
! 107:
! 108: "ASIN", "1", NULL,
! 109: "INT", "1", "0",
! 110: "FCT", "SWAP", "2",
! 111: "FCT", "SQ", "1",
! 112: "FCT", "-", "0",
! 113: "FCT", "SQRT", "1",
! 114: "FCT", "INV", "1",
! 115: NULL,
! 116:
! 117: "ASINH", "1", NULL,
! 118: "FCT", "SQ", "1",
! 119: "INT", "1", "0",
! 120: "FCT", "SWAP", "2",
! 121: "FCT", "+", "0",
! 122: "FCT", "SQRT", "1",
! 123: "FCT", "INV", "1",
! 124: NULL,
! 125:
! 126: "ATAN", "1", NULL,
! 127: "INT", "1", "0",
! 128: "FCT", "SWAP", "2",
! 129: "FCT", "SQ", "1",
! 130: "FCT", "+", "0",
! 131: "FCT", "INV", "1",
! 132: NULL,
! 133:
! 134: "ATANH", "1", NULL,
! 135: "FCT", "SQ", "1",
! 136: "INT", "1", "0",
! 137: "FCT", "SWAP", "2",
! 138: "FCT", "-", "0",
! 139: "FCT", "INV", "1",
! 140: NULL,
! 141:
! 142: "CONJ", "1", NULL,
! 143: "FCT", "SWAP", "2",
! 144: "FCT", "DROP", "1",
! 145: "DER", "0", "0",
! 146: "FCT", "CONJ", "1",
! 147: "INT", "1", "0",
! 148: NULL,
! 149:
! 150: "COS", "1", NULL,
! 151: "FCT", "SIN", "1",
! 152: "FCT", "NEG", "1",
! 153: NULL,
! 154:
! 155: "COSH", "1", NULL,
! 156: "FCT", "SINH", "1",
! 157: NULL,
! 158:
! 159: "EXP", "1", NULL,
! 160: "FCT", "EXP", "1",
! 161: NULL,
! 162:
! 163: "EXPM", "1", NULL,
! 164: "FCT", "EXP", "1",
! 165: NULL,
! 166:
! 167: "IM", "1", NULL,
! 168: "FCT", "SWAP", "2",
! 169: "FCT", "DROP", "1",
! 170: "DER", "0", "0",
! 171: "FCT", "IM", "1",
! 172: "INT", "1", "0",
! 173: NULL,
! 174:
! 175: "INV", "1", NULL,
! 176: "FCT", "SQ", "1",
! 177: "FCT", "INV", "1",
! 178: "FCT", "NEG", "1",
! 179: NULL,
! 180:
! 181: "LN", "1", NULL,
! 182: "FCT", "INV", "1",
! 183: NULL,
! 184:
! 185: "LNP1", "1", NULL,
! 186: "INT", "1", "0",
! 187: "FCT", "+", "0",
! 188: "FCT", "INV", "1",
! 189: NULL,
! 190:
! 191: "LOG", "1", NULL,
! 192: "INT", "10", "0",
! 193: "FCT", "LN", "1",
! 194: "FCT", "*", "0",
! 195: "FCT", "INV", "1",
! 196: NULL,
! 197:
! 198: "NEG", "1", NULL,
! 199: "FCT", "SWAP", "2",
! 200: "FCT", "DROP", "1",
! 201: "DER", "0", "0",
! 202: "FCT", "NEG", "1",
! 203: "INT", "1", "0",
! 204: NULL,
! 205:
! 206: "RE", "1", NULL,
! 207: "FCT", "SWAP", "2",
! 208: "FCT", "DROP", "1",
! 209: "DER", "0", "0",
! 210: "FCT", "RE", "1",
! 211: "INT", "1", "0",
! 212: NULL,
! 213:
! 214: "RELAX", "1", NULL,
! 215: "FCT", "DROP", "1",
! 216: "INT", "1", "0",
! 217: NULL,
! 218:
! 219: "SIN", "1", NULL,
! 220: "FCT", "COS", "1",
! 221: NULL,
! 222:
! 223: "SINH", "1", NULL,
! 224: "FCT", "COSH", "1",
! 225: NULL,
! 226:
! 227: "SQ", "1", NULL,
! 228: "INT", "2", "0",
! 229: "FCT", "*", "0",
! 230: NULL,
! 231:
! 232: "SQRT", "1", NULL,
! 233: "FCT", "SQRT", "1",
! 234: "INT", "2", "0",
! 235: "FCT", "*", "0",
! 236: "FCT", "INV", "1",
! 237: NULL,
! 238:
! 239: "TAN", "1", NULL,
! 240: "INT", "1", "0",
! 241: "FCT", "SWAP", "2",
! 242: "FCT", "TAN", "1",
! 243: "FCT", "SQ", "1",
! 244: "FCT", "+", "0",
! 245: NULL,
! 246:
! 247: "TANH", "1", NULL,
! 248: "FCT", "COSH", "1",
! 249: "FCT", "SQ", "1",
! 250: "FCT", "INV", "1",
! 251: NULL,
! 252:
! 253: "XROOT", "2", NULL,
! 254: "FCT", "INV", "1",
! 255: "FCT", "**", "0",
! 256: "DER", "0", "0",
! 257: NULL,
! 258:
! 259: "=" , "0", NULL,
! 260: "FCT", "SWAP", "2",
! 261: "FCT", "DROP", "1",
! 262: "FCT", "SWAP", "2",
! 263: "DER", "0", "0",
! 264: "FCT", "SWAP", "2",
! 265: "DER", "0", "0",
! 266: "FCT", "=", "0",
! 267: "INT", "1", "0",
! 268: NULL,
! 269:
! 270: NULL
! 271: };
! 272:
! 273: struct_liste_chainee *l_element_courant;
! 274: struct_liste_chainee *l_element_suivant;
! 275:
! 276: struct_objet *s_copie;
! 277: struct_objet *s_expression_courante;
! 278:
! 279: unsigned char *tampon;
! 280: unsigned char *variable;
! 281:
! 282: unsigned long i;
! 283: unsigned long position_courante;
! 284: unsigned long type_operation;
! 285:
! 286: if ((s_copie = copie_objet(s_etat_processus, *s_expression, 'O')) == NULL)
! 287: {
! 288: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 289: return;
! 290: }
! 291:
! 292: liberation(s_etat_processus, *s_expression);
! 293: *s_expression = s_copie;
! 294: s_expression_courante = *s_expression;
! 295:
! 296: do
! 297: {
! 298: /*
! 299: * Recherche de la première occurrence de la fonction DER
! 300: */
! 301:
! 302: l_element_courant = (struct_liste_chainee *)
! 303: (*s_expression_courante).objet;
! 304: position_courante = 0;
! 305: drapeau = d_faux;
! 306:
! 307: while((l_element_courant != NULL) && (drapeau == d_faux))
! 308: {
! 309: if ((*(*l_element_courant).donnee).type == FCT)
! 310: {
! 311: if (strcmp((*((struct_fonction *) (*(*l_element_courant).donnee)
! 312: .objet)).nom_fonction, "DER") == 0)
! 313: {
! 314: drapeau = d_vrai;
! 315: }
! 316: }
! 317:
! 318: l_element_courant = (*l_element_courant).suivant;
! 319:
! 320: if (drapeau == d_faux)
! 321: {
! 322: position_courante++;
! 323: }
! 324: }
! 325:
! 326: l_element_courant = (struct_liste_chainee *)
! 327: (*s_expression_courante).objet;
! 328:
! 329: for(i = 0; i < (position_courante - 2);
! 330: i++, l_element_courant = (*l_element_courant).suivant);
! 331:
! 332: variable = (*((struct_nom *) (*(*(*l_element_courant).suivant)
! 333: .donnee).objet)).nom;
! 334:
! 335: /*
! 336: * Recherche du type d'objet à dériver
! 337: */
! 338:
! 339: if (((*(*l_element_courant).donnee).type == INT) ||
! 340: ((*(*l_element_courant).donnee).type == REL) ||
! 341: ((*(*l_element_courant).donnee).type == CPL))
! 342: {
! 343: l_element_suivant = (*(*(*l_element_courant).suivant)
! 344: .suivant).suivant;
! 345:
! 346: liberation(s_etat_processus, (*l_element_courant).donnee);
! 347: liberation(s_etat_processus,
! 348: (*(*l_element_courant).suivant).donnee);
! 349: liberation(s_etat_processus,
! 350: (*(*(*l_element_courant).suivant).suivant).donnee);
! 351:
! 352: free((*(*l_element_courant).suivant).suivant);
! 353: free((*l_element_courant).suivant);
! 354:
! 355: (*l_element_courant).suivant = l_element_suivant;
! 356:
! 357: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 358: INT)) == NULL)
! 359: {
! 360: (*s_expression) = s_expression_courante;
! 361: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 362: return;
! 363: }
! 364:
! 365: (*((integer8 *) (*(*l_element_courant).donnee).objet)) = 0;
! 366: }
! 367: else if ((*(*l_element_courant).donnee).type == NOM)
! 368: {
! 369: l_element_suivant = (*(*(*l_element_courant).suivant)
! 370: .suivant).suivant;
! 371:
! 372: if (strcmp((*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 373: .nom, variable) == 0)
! 374: {
! 375: derivee = 1;
! 376: }
! 377: else
! 378: {
! 379: derivee = 0;
! 380: }
! 381:
! 382: liberation(s_etat_processus, (*l_element_courant).donnee);
! 383: liberation(s_etat_processus,
! 384: (*(*l_element_courant).suivant).donnee);
! 385: liberation(s_etat_processus,
! 386: (*(*(*l_element_courant).suivant).suivant).donnee);
! 387:
! 388: free((*(*l_element_courant).suivant).suivant);
! 389: free((*l_element_courant).suivant);
! 390:
! 391: (*l_element_courant).suivant = l_element_suivant;
! 392:
! 393: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 394: INT)) == NULL)
! 395: {
! 396: (*s_expression) = s_expression_courante;
! 397: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 398: return;
! 399: }
! 400:
! 401: (*((integer8 *) (*(*l_element_courant).donnee).objet)) = derivee;
! 402: }
! 403: else if ((*(*l_element_courant).donnee).type == FCT)
! 404: {
! 405: if ((strcmp((*((struct_fonction *) (*(*l_element_courant).donnee)
! 406: .objet)).nom_fonction, "+") == 0) ||
! 407: (strcmp((*((struct_fonction *) (*(*l_element_courant)
! 408: .donnee).objet)).nom_fonction, "-") == 0))
! 409: {
! 410: if (strcmp((*((struct_fonction *) (*(*l_element_courant).donnee)
! 411: .objet)).nom_fonction, "+") == 0)
! 412: {
! 413: // Opération à dériver : '+'
! 414: type_operation = 0;
! 415: }
! 416: else
! 417: {
! 418: // Opération à dériver : '-'
! 419: type_operation = 1;
! 420: }
! 421:
! 422: /*
! 423: * Transormer << + X DER >> en << SWAP X DER SWAP X DER + >>
! 424: * ou << - X DER >> en << SWAP X DER SWAP X DER - >>
! 425: */
! 426:
! 427: // Transformation du '+' en SWAP
! 428:
! 429: l_element_suivant = (*l_element_courant).suivant;
! 430:
! 431: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 432: .objet)).nom_fonction);
! 433:
! 434: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 435: .objet)).nom_fonction = malloc(5 *
! 436: sizeof(unsigned char))) == NULL)
! 437: {
! 438: (*s_expression) = s_expression_courante;
! 439: (*s_etat_processus).erreur_systeme =
! 440: d_es_allocation_memoire;
! 441: return;
! 442: }
! 443:
! 444: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 445: .objet)).nom_fonction, "SWAP");
! 446: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 447: .objet)).nombre_arguments = -1;
! 448: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 449: .objet)).fonction = instruction_swap;
! 450:
! 451: // Ajout de la variable de dérivation
! 452:
! 453: if (((*l_element_courant).suivant = malloc(
! 454: sizeof(struct_liste_chainee))) == NULL)
! 455: {
! 456: (*s_expression) = s_expression_courante;
! 457: (*s_etat_processus).erreur_systeme =
! 458: d_es_allocation_memoire;
! 459: return;
! 460: }
! 461:
! 462: l_element_courant = (*l_element_courant).suivant;
! 463:
! 464: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 465: NOM)) == NULL)
! 466: {
! 467: (*s_expression) = s_expression_courante;
! 468: (*s_etat_processus).erreur_systeme =
! 469: d_es_allocation_memoire;
! 470: return;
! 471: }
! 472:
! 473: if (((*((struct_nom *) (*(*l_element_courant).donnee)
! 474: .objet)).nom = malloc((strlen(variable) + 1)
! 475: * sizeof(unsigned char))) == NULL)
! 476: {
! 477: (*s_expression) = s_expression_courante;
! 478: (*s_etat_processus).erreur_systeme =
! 479: d_es_allocation_memoire;
! 480: return;
! 481: }
! 482:
! 483: strcpy((*((struct_nom *) (*(*l_element_courant).donnee)
! 484: .objet)).nom, variable);
! 485: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 486: .symbole = d_vrai;
! 487:
! 488: // Ajout de la fonction DER
! 489:
! 490: if (((*l_element_courant).suivant = malloc(
! 491: sizeof(struct_liste_chainee))) == NULL)
! 492: {
! 493: (*s_expression) = s_expression_courante;
! 494: (*s_etat_processus).erreur_systeme =
! 495: d_es_allocation_memoire;
! 496: return;
! 497: }
! 498:
! 499: l_element_courant = (*l_element_courant).suivant;
! 500:
! 501: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 502: FCT)) == NULL)
! 503: {
! 504: (*s_expression) = s_expression_courante;
! 505: (*s_etat_processus).erreur_systeme =
! 506: d_es_allocation_memoire;
! 507: return;
! 508: }
! 509:
! 510: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 511: .objet)).nom_fonction = malloc(4 *
! 512: sizeof(unsigned char))) == NULL)
! 513: {
! 514: (*s_expression) = s_expression_courante;
! 515: (*s_etat_processus).erreur_systeme =
! 516: d_es_allocation_memoire;
! 517: return;
! 518: }
! 519:
! 520: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 521: .objet)).nom_fonction, "DER");
! 522: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 523: .nombre_arguments = 2;
! 524: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 525: .fonction = instruction_der;
! 526:
! 527: // Ajout de la fonction SWAP
! 528:
! 529: if (((*l_element_courant).suivant = malloc(
! 530: sizeof(struct_liste_chainee))) == NULL)
! 531: {
! 532: (*s_expression) = s_expression_courante;
! 533: (*s_etat_processus).erreur_systeme =
! 534: d_es_allocation_memoire;
! 535: return;
! 536: }
! 537:
! 538: l_element_courant = (*l_element_courant).suivant;
! 539:
! 540: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 541: FCT)) == NULL)
! 542: {
! 543: (*s_expression) = s_expression_courante;
! 544: (*s_etat_processus).erreur_systeme =
! 545: d_es_allocation_memoire;
! 546: return;
! 547: }
! 548:
! 549: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 550: .objet)).nom_fonction = malloc(5 *
! 551: sizeof(unsigned char))) == NULL)
! 552: {
! 553: (*s_expression) = s_expression_courante;
! 554: (*s_etat_processus).erreur_systeme =
! 555: d_es_allocation_memoire;
! 556: return;
! 557: }
! 558:
! 559: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 560: .objet)).nom_fonction, "SWAP");
! 561: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 562: .nombre_arguments = -1;
! 563: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 564: .fonction = instruction_swap;
! 565:
! 566: // Ajout de la variable de dérivation
! 567:
! 568: if (((*l_element_courant).suivant = malloc(
! 569: sizeof(struct_liste_chainee))) == NULL)
! 570: {
! 571: (*s_expression) = s_expression_courante;
! 572: (*s_etat_processus).erreur_systeme =
! 573: d_es_allocation_memoire;
! 574: return;
! 575: }
! 576:
! 577: l_element_courant = (*l_element_courant).suivant;
! 578:
! 579: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 580: NOM)) == NULL)
! 581: {
! 582: (*s_expression) = s_expression_courante;
! 583: (*s_etat_processus).erreur_systeme =
! 584: d_es_allocation_memoire;
! 585: return;
! 586: }
! 587:
! 588: if (((*((struct_nom *) (*(*l_element_courant).donnee)
! 589: .objet)).nom = malloc((strlen(variable) + 1)
! 590: * sizeof(unsigned char))) == NULL)
! 591: {
! 592: (*s_expression) = s_expression_courante;
! 593: (*s_etat_processus).erreur_systeme =
! 594: d_es_allocation_memoire;
! 595: return;
! 596: }
! 597:
! 598: strcpy((*((struct_nom *) (*(*l_element_courant).donnee)
! 599: .objet)).nom, variable);
! 600: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 601: .symbole = d_vrai;
! 602:
! 603: // Ajout de la fonction DER
! 604:
! 605: if (((*l_element_courant).suivant = malloc(
! 606: sizeof(struct_liste_chainee))) == NULL)
! 607: {
! 608: (*s_expression) = s_expression_courante;
! 609: (*s_etat_processus).erreur_systeme =
! 610: d_es_allocation_memoire;
! 611: return;
! 612: }
! 613:
! 614: l_element_courant = (*l_element_courant).suivant;
! 615:
! 616: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 617: FCT)) == NULL)
! 618: {
! 619: (*s_expression) = s_expression_courante;
! 620: (*s_etat_processus).erreur_systeme =
! 621: d_es_allocation_memoire;
! 622: return;
! 623: }
! 624:
! 625: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 626: .objet)).nom_fonction = malloc(4 *
! 627: sizeof(unsigned char))) == NULL)
! 628: {
! 629: (*s_expression) = s_expression_courante;
! 630: (*s_etat_processus).erreur_systeme =
! 631: d_es_allocation_memoire;
! 632: return;
! 633: }
! 634:
! 635: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 636: .objet)).nom_fonction, "DER");
! 637: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 638: .nombre_arguments = 2;
! 639: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 640: .fonction = instruction_der;
! 641:
! 642: (*l_element_courant).suivant = (*l_element_suivant).suivant;
! 643:
! 644: liberation(s_etat_processus, (*l_element_suivant).donnee);
! 645: free(l_element_suivant);
! 646:
! 647: // Ajout de l'opérateur
! 648:
! 649: l_element_courant = (*l_element_courant).suivant;
! 650:
! 651: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 652: .objet)).nom_fonction);
! 653:
! 654: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 655: .objet)).nom_fonction = malloc(2 *
! 656: sizeof(unsigned char))) == NULL)
! 657: {
! 658: (*s_expression) = s_expression_courante;
! 659: (*s_etat_processus).erreur_systeme =
! 660: d_es_allocation_memoire;
! 661: return;
! 662: }
! 663:
! 664: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 665: .objet)).nom_fonction,
! 666: (type_operation == 0) ? "+" : "-");
! 667: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 668: .objet)).nombre_arguments = 0;
! 669: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 670: .objet)).fonction = (type_operation == 0)
! 671: ? instruction_plus : instruction_moins;
! 672: }
! 673: else if (strcmp((*((struct_fonction *)
! 674: (*(*l_element_courant).donnee)
! 675: .objet)).nom_fonction, "*") == 0)
! 676: {
! 677: /*
! 678: * Transormer << * X DER >> en
! 679: * << DUP2 X DER * ROT X DER ROT * + >>
! 680: */
! 681:
! 682: // Transformation du '*' en DUP2
! 683:
! 684: l_element_suivant = (*l_element_courant).suivant;
! 685:
! 686: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 687: .objet)).nom_fonction);
! 688:
! 689: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 690: .objet)).nom_fonction = malloc(5 *
! 691: sizeof(unsigned char))) == NULL)
! 692: {
! 693: (*s_expression) = s_expression_courante;
! 694: (*s_etat_processus).erreur_systeme =
! 695: d_es_allocation_memoire;
! 696: return;
! 697: }
! 698:
! 699: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 700: .objet)).nom_fonction, "DUP2");
! 701: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 702: .objet)).nombre_arguments = -1;
! 703: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 704: .objet)).fonction = instruction_dup2;
! 705:
! 706: // Ajout de la variable de dérivation
! 707:
! 708: if (((*l_element_courant).suivant = malloc(
! 709: sizeof(struct_liste_chainee))) == NULL)
! 710: {
! 711: (*s_expression) = s_expression_courante;
! 712: (*s_etat_processus).erreur_systeme =
! 713: d_es_allocation_memoire;
! 714: return;
! 715: }
! 716:
! 717: l_element_courant = (*l_element_courant).suivant;
! 718:
! 719: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 720: NOM)) == NULL)
! 721: {
! 722: (*s_expression) = s_expression_courante;
! 723: (*s_etat_processus).erreur_systeme =
! 724: d_es_allocation_memoire;
! 725: return;
! 726: }
! 727:
! 728: if (((*((struct_nom *) (*(*l_element_courant).donnee)
! 729: .objet)).nom = malloc((strlen(variable) + 1)
! 730: * sizeof(unsigned char))) == NULL)
! 731: {
! 732: (*s_expression) = s_expression_courante;
! 733: (*s_etat_processus).erreur_systeme =
! 734: d_es_allocation_memoire;
! 735: return;
! 736: }
! 737:
! 738: strcpy((*((struct_nom *) (*(*l_element_courant).donnee)
! 739: .objet)).nom, variable);
! 740: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 741: .symbole = d_vrai;
! 742:
! 743: // Ajout de la fonction DER
! 744:
! 745: if (((*l_element_courant).suivant = malloc(
! 746: sizeof(struct_liste_chainee))) == NULL)
! 747: {
! 748: (*s_expression) = s_expression_courante;
! 749: (*s_etat_processus).erreur_systeme =
! 750: d_es_allocation_memoire;
! 751: return;
! 752: }
! 753:
! 754: l_element_courant = (*l_element_courant).suivant;
! 755:
! 756: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 757: FCT)) == NULL)
! 758: {
! 759: (*s_expression) = s_expression_courante;
! 760: (*s_etat_processus).erreur_systeme =
! 761: d_es_allocation_memoire;
! 762: return;
! 763: }
! 764:
! 765: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 766: .objet)).nom_fonction = malloc(4 *
! 767: sizeof(unsigned char))) == NULL)
! 768: {
! 769: (*s_expression) = s_expression_courante;
! 770: (*s_etat_processus).erreur_systeme =
! 771: d_es_allocation_memoire;
! 772: return;
! 773: }
! 774:
! 775: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 776: .objet)).nom_fonction, "DER");
! 777: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 778: .nombre_arguments = 2;
! 779: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 780: .fonction = instruction_der;
! 781:
! 782: // Ajout de la fonction '*'
! 783:
! 784: if (((*l_element_courant).suivant = malloc(
! 785: sizeof(struct_liste_chainee))) == NULL)
! 786: {
! 787: (*s_expression) = s_expression_courante;
! 788: (*s_etat_processus).erreur_systeme =
! 789: d_es_allocation_memoire;
! 790: return;
! 791: }
! 792:
! 793: l_element_courant = (*l_element_courant).suivant;
! 794:
! 795: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 796: FCT)) == NULL)
! 797: {
! 798: (*s_expression) = s_expression_courante;
! 799: (*s_etat_processus).erreur_systeme =
! 800: d_es_allocation_memoire;
! 801: return;
! 802: }
! 803:
! 804: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 805: .objet)).nom_fonction = malloc(2 *
! 806: sizeof(unsigned char))) == NULL)
! 807: {
! 808: (*s_expression) = s_expression_courante;
! 809: (*s_etat_processus).erreur_systeme =
! 810: d_es_allocation_memoire;
! 811: return;
! 812: }
! 813:
! 814: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 815: .objet)).nom_fonction, "*");
! 816: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 817: .nombre_arguments = 0;
! 818: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 819: .fonction = instruction_multiplication;
! 820:
! 821: // Ajout de la fonction ROT
! 822:
! 823: if (((*l_element_courant).suivant = malloc(
! 824: sizeof(struct_liste_chainee))) == NULL)
! 825: {
! 826: (*s_expression) = s_expression_courante;
! 827: (*s_etat_processus).erreur_systeme =
! 828: d_es_allocation_memoire;
! 829: return;
! 830: }
! 831:
! 832: l_element_courant = (*l_element_courant).suivant;
! 833:
! 834: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 835: FCT)) == NULL)
! 836: {
! 837: (*s_expression) = s_expression_courante;
! 838: (*s_etat_processus).erreur_systeme =
! 839: d_es_allocation_memoire;
! 840: return;
! 841: }
! 842:
! 843: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 844: .objet)).nom_fonction = malloc(4 *
! 845: sizeof(unsigned char))) == NULL)
! 846: {
! 847: (*s_expression) = s_expression_courante;
! 848: (*s_etat_processus).erreur_systeme =
! 849: d_es_allocation_memoire;
! 850: return;
! 851: }
! 852:
! 853: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 854: .objet)).nom_fonction, "ROT");
! 855: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 856: .nombre_arguments = -1;
! 857: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 858: .fonction = instruction_rot;
! 859:
! 860: // Ajout de la variable de dérivation
! 861:
! 862: if (((*l_element_courant).suivant = malloc(
! 863: sizeof(struct_liste_chainee))) == NULL)
! 864: {
! 865: (*s_expression) = s_expression_courante;
! 866: (*s_etat_processus).erreur_systeme =
! 867: d_es_allocation_memoire;
! 868: return;
! 869: }
! 870:
! 871: l_element_courant = (*l_element_courant).suivant;
! 872:
! 873: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 874: NOM)) == NULL)
! 875: {
! 876: (*s_expression) = s_expression_courante;
! 877: (*s_etat_processus).erreur_systeme =
! 878: d_es_allocation_memoire;
! 879: return;
! 880: }
! 881:
! 882: if (((*((struct_nom *) (*(*l_element_courant).donnee)
! 883: .objet)).nom = malloc((strlen(variable) + 1)
! 884: * sizeof(unsigned char))) == NULL)
! 885: {
! 886: (*s_expression) = s_expression_courante;
! 887: (*s_etat_processus).erreur_systeme =
! 888: d_es_allocation_memoire;
! 889: return;
! 890: }
! 891:
! 892: strcpy((*((struct_nom *) (*(*l_element_courant).donnee)
! 893: .objet)).nom, variable);
! 894: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 895: .symbole = d_vrai;
! 896:
! 897: // Ajout de la fonction DER
! 898:
! 899: if (((*l_element_courant).suivant = malloc(
! 900: sizeof(struct_liste_chainee))) == NULL)
! 901: {
! 902: (*s_expression) = s_expression_courante;
! 903: (*s_etat_processus).erreur_systeme =
! 904: d_es_allocation_memoire;
! 905: return;
! 906: }
! 907:
! 908: l_element_courant = (*l_element_courant).suivant;
! 909:
! 910: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 911: FCT)) == NULL)
! 912: {
! 913: (*s_expression) = s_expression_courante;
! 914: (*s_etat_processus).erreur_systeme =
! 915: d_es_allocation_memoire;
! 916: return;
! 917: }
! 918:
! 919: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 920: .objet)).nom_fonction = malloc(4 *
! 921: sizeof(unsigned char))) == NULL)
! 922: {
! 923: (*s_expression) = s_expression_courante;
! 924: (*s_etat_processus).erreur_systeme =
! 925: d_es_allocation_memoire;
! 926: return;
! 927: }
! 928:
! 929: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 930: .objet)).nom_fonction, "DER");
! 931: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 932: .nombre_arguments = 2;
! 933: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 934: .fonction = instruction_der;
! 935:
! 936: // Ajout de la fonction ROT
! 937:
! 938: if (((*l_element_courant).suivant = malloc(
! 939: sizeof(struct_liste_chainee))) == NULL)
! 940: {
! 941: (*s_expression) = s_expression_courante;
! 942: (*s_etat_processus).erreur_systeme =
! 943: d_es_allocation_memoire;
! 944: return;
! 945: }
! 946:
! 947: l_element_courant = (*l_element_courant).suivant;
! 948:
! 949: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 950: FCT)) == NULL)
! 951: {
! 952: (*s_expression) = s_expression_courante;
! 953: (*s_etat_processus).erreur_systeme =
! 954: d_es_allocation_memoire;
! 955: return;
! 956: }
! 957:
! 958: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 959: .objet)).nom_fonction = malloc(4 *
! 960: sizeof(unsigned char))) == NULL)
! 961: {
! 962: (*s_expression) = s_expression_courante;
! 963: (*s_etat_processus).erreur_systeme =
! 964: d_es_allocation_memoire;
! 965: return;
! 966: }
! 967:
! 968: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 969: .objet)).nom_fonction, "ROT");
! 970: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 971: .nombre_arguments = -1;
! 972: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 973: .fonction = instruction_rot;
! 974:
! 975: // Ajout de la fonction '*'
! 976:
! 977: if (((*l_element_courant).suivant = malloc(
! 978: sizeof(struct_liste_chainee))) == NULL)
! 979: {
! 980: (*s_expression) = s_expression_courante;
! 981: (*s_etat_processus).erreur_systeme =
! 982: d_es_allocation_memoire;
! 983: return;
! 984: }
! 985:
! 986: l_element_courant = (*l_element_courant).suivant;
! 987:
! 988: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 989: FCT)) == NULL)
! 990: {
! 991: (*s_expression) = s_expression_courante;
! 992: (*s_etat_processus).erreur_systeme =
! 993: d_es_allocation_memoire;
! 994: return;
! 995: }
! 996:
! 997: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 998: .objet)).nom_fonction = malloc(2 *
! 999: sizeof(unsigned char))) == NULL)
! 1000: {
! 1001: (*s_expression) = s_expression_courante;
! 1002: (*s_etat_processus).erreur_systeme =
! 1003: d_es_allocation_memoire;
! 1004: return;
! 1005: }
! 1006:
! 1007: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1008: .objet)).nom_fonction, "*");
! 1009: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1010: .nombre_arguments = 0;
! 1011: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1012: .fonction = instruction_multiplication;
! 1013:
! 1014: // Ajout de la fonction '+'
! 1015:
! 1016: (*l_element_courant).suivant = (*l_element_suivant).suivant;
! 1017:
! 1018: liberation(s_etat_processus, (*l_element_suivant).donnee);
! 1019: free(l_element_suivant);
! 1020:
! 1021: l_element_courant = (*l_element_courant).suivant;
! 1022:
! 1023: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1024: .objet)).nom_fonction);
! 1025:
! 1026: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1027: .objet)).nom_fonction = malloc(2 *
! 1028: sizeof(unsigned char))) == NULL)
! 1029: {
! 1030: (*s_expression) = s_expression_courante;
! 1031: (*s_etat_processus).erreur_systeme =
! 1032: d_es_allocation_memoire;
! 1033: return;
! 1034: }
! 1035:
! 1036: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1037: .objet)).nom_fonction, "+");
! 1038: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1039: .nombre_arguments = 0;
! 1040: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1041: .fonction = instruction_plus;
! 1042: }
! 1043: else if (strcmp((*((struct_fonction *)
! 1044: (*(*l_element_courant).donnee)
! 1045: .objet)).nom_fonction, "/") == 0)
! 1046: {
! 1047: /*
! 1048: * Transormer << / X DER >> en
! 1049: * << DUP2 DUP SQ ROT ROT X DER * SWAP / ROT X DER ROT /
! 1050: * SWAP - >>
! 1051: */
! 1052:
! 1053: // Transformation du '/' en DUP2
! 1054:
! 1055: l_element_suivant = (*l_element_courant).suivant;
! 1056:
! 1057: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1058: .objet)).nom_fonction);
! 1059:
! 1060: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1061: .objet)).nom_fonction = malloc(5 *
! 1062: sizeof(unsigned char))) == NULL)
! 1063: {
! 1064: (*s_expression) = s_expression_courante;
! 1065: (*s_etat_processus).erreur_systeme =
! 1066: d_es_allocation_memoire;
! 1067: return;
! 1068: }
! 1069:
! 1070: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1071: .objet)).nom_fonction, "DUP2");
! 1072: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1073: .objet)).nombre_arguments = -1;
! 1074: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1075: .objet)).fonction = instruction_dup2;
! 1076:
! 1077: // Ajout de la fonction DUP
! 1078:
! 1079: if (((*l_element_courant).suivant = malloc(
! 1080: sizeof(struct_liste_chainee))) == NULL)
! 1081: {
! 1082: (*s_expression) = s_expression_courante;
! 1083: (*s_etat_processus).erreur_systeme =
! 1084: d_es_allocation_memoire;
! 1085: return;
! 1086: }
! 1087:
! 1088: l_element_courant = (*l_element_courant).suivant;
! 1089:
! 1090: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1091: FCT)) == NULL)
! 1092: {
! 1093: (*s_expression) = s_expression_courante;
! 1094: (*s_etat_processus).erreur_systeme =
! 1095: d_es_allocation_memoire;
! 1096: return;
! 1097: }
! 1098:
! 1099: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1100: .objet)).nom_fonction = malloc(4 *
! 1101: sizeof(unsigned char))) == NULL)
! 1102: {
! 1103: (*s_expression) = s_expression_courante;
! 1104: (*s_etat_processus).erreur_systeme =
! 1105: d_es_allocation_memoire;
! 1106: return;
! 1107: }
! 1108:
! 1109: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1110: .objet)).nom_fonction, "DUP");
! 1111: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1112: .nombre_arguments = -1;
! 1113: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1114: .fonction = instruction_dup;
! 1115:
! 1116: // Ajout de la fonction SQ
! 1117:
! 1118: if (((*l_element_courant).suivant = malloc(
! 1119: sizeof(struct_liste_chainee))) == NULL)
! 1120: {
! 1121: (*s_expression) = s_expression_courante;
! 1122: (*s_etat_processus).erreur_systeme =
! 1123: d_es_allocation_memoire;
! 1124: return;
! 1125: }
! 1126:
! 1127: l_element_courant = (*l_element_courant).suivant;
! 1128:
! 1129: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1130: FCT)) == NULL)
! 1131: {
! 1132: (*s_expression) = s_expression_courante;
! 1133: (*s_etat_processus).erreur_systeme =
! 1134: d_es_allocation_memoire;
! 1135: return;
! 1136: }
! 1137:
! 1138: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1139: .objet)).nom_fonction = malloc(3 *
! 1140: sizeof(unsigned char))) == NULL)
! 1141: {
! 1142: (*s_expression) = s_expression_courante;
! 1143: (*s_etat_processus).erreur_systeme =
! 1144: d_es_allocation_memoire;
! 1145: return;
! 1146: }
! 1147:
! 1148: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1149: .objet)).nom_fonction, "SQ");
! 1150: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1151: .nombre_arguments = 1;
! 1152: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1153: .fonction = instruction_sq;
! 1154:
! 1155: // Ajout de la fonction ROT
! 1156:
! 1157: if (((*l_element_courant).suivant = malloc(
! 1158: sizeof(struct_liste_chainee))) == NULL)
! 1159: {
! 1160: (*s_expression) = s_expression_courante;
! 1161: (*s_etat_processus).erreur_systeme =
! 1162: d_es_allocation_memoire;
! 1163: return;
! 1164: }
! 1165:
! 1166: l_element_courant = (*l_element_courant).suivant;
! 1167:
! 1168: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1169: FCT)) == NULL)
! 1170: {
! 1171: (*s_expression) = s_expression_courante;
! 1172: (*s_etat_processus).erreur_systeme =
! 1173: d_es_allocation_memoire;
! 1174: return;
! 1175: }
! 1176:
! 1177: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1178: .objet)).nom_fonction = malloc(4 *
! 1179: sizeof(unsigned char))) == NULL)
! 1180: {
! 1181: (*s_expression) = s_expression_courante;
! 1182: (*s_etat_processus).erreur_systeme =
! 1183: d_es_allocation_memoire;
! 1184: return;
! 1185: }
! 1186:
! 1187: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1188: .objet)).nom_fonction, "ROT");
! 1189: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1190: .nombre_arguments = -1;
! 1191: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1192: .fonction = instruction_rot;
! 1193:
! 1194: // Ajout de la fonction ROT
! 1195:
! 1196: if (((*l_element_courant).suivant = malloc(
! 1197: sizeof(struct_liste_chainee))) == NULL)
! 1198: {
! 1199: (*s_expression) = s_expression_courante;
! 1200: (*s_etat_processus).erreur_systeme =
! 1201: d_es_allocation_memoire;
! 1202: return;
! 1203: }
! 1204:
! 1205: l_element_courant = (*l_element_courant).suivant;
! 1206:
! 1207: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1208: FCT)) == NULL)
! 1209: {
! 1210: (*s_expression) = s_expression_courante;
! 1211: (*s_etat_processus).erreur_systeme =
! 1212: d_es_allocation_memoire;
! 1213: return;
! 1214: }
! 1215:
! 1216: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1217: .objet)).nom_fonction = malloc(4 *
! 1218: sizeof(unsigned char))) == NULL)
! 1219: {
! 1220: (*s_expression) = s_expression_courante;
! 1221: (*s_etat_processus).erreur_systeme =
! 1222: d_es_allocation_memoire;
! 1223: return;
! 1224: }
! 1225:
! 1226: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1227: .objet)).nom_fonction, "ROT");
! 1228: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1229: .nombre_arguments = -1;
! 1230: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1231: .fonction = instruction_rot;
! 1232:
! 1233: // Ajout de la variable de dérivation
! 1234:
! 1235: if (((*l_element_courant).suivant = malloc(
! 1236: sizeof(struct_liste_chainee))) == NULL)
! 1237: {
! 1238: (*s_expression) = s_expression_courante;
! 1239: (*s_etat_processus).erreur_systeme =
! 1240: d_es_allocation_memoire;
! 1241: return;
! 1242: }
! 1243:
! 1244: l_element_courant = (*l_element_courant).suivant;
! 1245:
! 1246: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1247: NOM)) == NULL)
! 1248: {
! 1249: (*s_expression) = s_expression_courante;
! 1250: (*s_etat_processus).erreur_systeme =
! 1251: d_es_allocation_memoire;
! 1252: return;
! 1253: }
! 1254:
! 1255: if (((*((struct_nom *) (*(*l_element_courant).donnee)
! 1256: .objet)).nom = malloc((strlen(variable) + 1)
! 1257: * sizeof(unsigned char))) == NULL)
! 1258: {
! 1259: (*s_expression) = s_expression_courante;
! 1260: (*s_etat_processus).erreur_systeme =
! 1261: d_es_allocation_memoire;
! 1262: return;
! 1263: }
! 1264:
! 1265: strcpy((*((struct_nom *) (*(*l_element_courant).donnee)
! 1266: .objet)).nom, variable);
! 1267: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 1268: .symbole = d_vrai;
! 1269:
! 1270: // Ajout de la fonction DER
! 1271:
! 1272: if (((*l_element_courant).suivant = malloc(
! 1273: sizeof(struct_liste_chainee))) == NULL)
! 1274: {
! 1275: (*s_expression) = s_expression_courante;
! 1276: (*s_etat_processus).erreur_systeme =
! 1277: d_es_allocation_memoire;
! 1278: return;
! 1279: }
! 1280:
! 1281: l_element_courant = (*l_element_courant).suivant;
! 1282:
! 1283: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1284: FCT)) == NULL)
! 1285: {
! 1286: (*s_expression) = s_expression_courante;
! 1287: (*s_etat_processus).erreur_systeme =
! 1288: d_es_allocation_memoire;
! 1289: return;
! 1290: }
! 1291:
! 1292: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1293: .objet)).nom_fonction = malloc(4 *
! 1294: sizeof(unsigned char))) == NULL)
! 1295: {
! 1296: (*s_expression) = s_expression_courante;
! 1297: (*s_etat_processus).erreur_systeme =
! 1298: d_es_allocation_memoire;
! 1299: return;
! 1300: }
! 1301:
! 1302: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1303: .objet)).nom_fonction, "DER");
! 1304: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1305: .nombre_arguments = 2;
! 1306: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1307: .fonction = instruction_der;
! 1308:
! 1309: // Ajout de la fonction '*'
! 1310:
! 1311: if (((*l_element_courant).suivant = malloc(
! 1312: sizeof(struct_liste_chainee))) == NULL)
! 1313: {
! 1314: (*s_expression) = s_expression_courante;
! 1315: (*s_etat_processus).erreur_systeme =
! 1316: d_es_allocation_memoire;
! 1317: return;
! 1318: }
! 1319:
! 1320: l_element_courant = (*l_element_courant).suivant;
! 1321:
! 1322: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1323: FCT)) == NULL)
! 1324: {
! 1325: (*s_expression) = s_expression_courante;
! 1326: (*s_etat_processus).erreur_systeme =
! 1327: d_es_allocation_memoire;
! 1328: return;
! 1329: }
! 1330:
! 1331: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1332: .objet)).nom_fonction = malloc(2 *
! 1333: sizeof(unsigned char))) == NULL)
! 1334: {
! 1335: (*s_expression) = s_expression_courante;
! 1336: (*s_etat_processus).erreur_systeme =
! 1337: d_es_allocation_memoire;
! 1338: return;
! 1339: }
! 1340:
! 1341: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1342: .objet)).nom_fonction, "*");
! 1343: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1344: .nombre_arguments = 0;
! 1345: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1346: .fonction = instruction_multiplication;
! 1347:
! 1348: // Ajout de la fonction SWAP
! 1349:
! 1350: if (((*l_element_courant).suivant = malloc(
! 1351: sizeof(struct_liste_chainee))) == NULL)
! 1352: {
! 1353: (*s_expression) = s_expression_courante;
! 1354: (*s_etat_processus).erreur_systeme =
! 1355: d_es_allocation_memoire;
! 1356: return;
! 1357: }
! 1358:
! 1359: l_element_courant = (*l_element_courant).suivant;
! 1360:
! 1361: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1362: FCT)) == NULL)
! 1363: {
! 1364: (*s_expression) = s_expression_courante;
! 1365: (*s_etat_processus).erreur_systeme =
! 1366: d_es_allocation_memoire;
! 1367: return;
! 1368: }
! 1369:
! 1370: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1371: .objet)).nom_fonction = malloc(5 *
! 1372: sizeof(unsigned char))) == NULL)
! 1373: {
! 1374: (*s_expression) = s_expression_courante;
! 1375: (*s_etat_processus).erreur_systeme =
! 1376: d_es_allocation_memoire;
! 1377: return;
! 1378: }
! 1379:
! 1380: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1381: .objet)).nom_fonction, "SWAP");
! 1382: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1383: .nombre_arguments = -1;
! 1384: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1385: .fonction = instruction_swap;
! 1386:
! 1387: // Ajout de la fonction '/'
! 1388:
! 1389: if (((*l_element_courant).suivant = malloc(
! 1390: sizeof(struct_liste_chainee))) == NULL)
! 1391: {
! 1392: (*s_expression) = s_expression_courante;
! 1393: (*s_etat_processus).erreur_systeme =
! 1394: d_es_allocation_memoire;
! 1395: return;
! 1396: }
! 1397:
! 1398: l_element_courant = (*l_element_courant).suivant;
! 1399:
! 1400: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1401: FCT)) == NULL)
! 1402: {
! 1403: (*s_expression) = s_expression_courante;
! 1404: (*s_etat_processus).erreur_systeme =
! 1405: d_es_allocation_memoire;
! 1406: return;
! 1407: }
! 1408:
! 1409: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1410: .objet)).nom_fonction = malloc(2 *
! 1411: sizeof(unsigned char))) == NULL)
! 1412: {
! 1413: (*s_expression) = s_expression_courante;
! 1414: (*s_etat_processus).erreur_systeme =
! 1415: d_es_allocation_memoire;
! 1416: return;
! 1417: }
! 1418:
! 1419: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1420: .objet)).nom_fonction, "/");
! 1421: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1422: .nombre_arguments = 0;
! 1423: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1424: .fonction = instruction_division;
! 1425:
! 1426: // Ajout de la fonction ROT
! 1427:
! 1428: if (((*l_element_courant).suivant = malloc(
! 1429: sizeof(struct_liste_chainee))) == NULL)
! 1430: {
! 1431: (*s_expression) = s_expression_courante;
! 1432: (*s_etat_processus).erreur_systeme =
! 1433: d_es_allocation_memoire;
! 1434: return;
! 1435: }
! 1436:
! 1437: l_element_courant = (*l_element_courant).suivant;
! 1438:
! 1439: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1440: FCT)) == NULL)
! 1441: {
! 1442: (*s_expression) = s_expression_courante;
! 1443: (*s_etat_processus).erreur_systeme =
! 1444: d_es_allocation_memoire;
! 1445: return;
! 1446: }
! 1447:
! 1448: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1449: .objet)).nom_fonction = malloc(4 *
! 1450: sizeof(unsigned char))) == NULL)
! 1451: {
! 1452: (*s_expression) = s_expression_courante;
! 1453: (*s_etat_processus).erreur_systeme =
! 1454: d_es_allocation_memoire;
! 1455: return;
! 1456: }
! 1457:
! 1458: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1459: .objet)).nom_fonction, "ROT");
! 1460: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1461: .nombre_arguments = -1;
! 1462: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1463: .fonction = instruction_rot;
! 1464:
! 1465: // Ajout de la variable de dérivation
! 1466:
! 1467: if (((*l_element_courant).suivant = malloc(
! 1468: sizeof(struct_liste_chainee))) == NULL)
! 1469: {
! 1470: (*s_expression) = s_expression_courante;
! 1471: (*s_etat_processus).erreur_systeme =
! 1472: d_es_allocation_memoire;
! 1473: return;
! 1474: }
! 1475:
! 1476: l_element_courant = (*l_element_courant).suivant;
! 1477:
! 1478: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1479: NOM)) == NULL)
! 1480: {
! 1481: (*s_expression) = s_expression_courante;
! 1482: (*s_etat_processus).erreur_systeme =
! 1483: d_es_allocation_memoire;
! 1484: return;
! 1485: }
! 1486:
! 1487: if (((*((struct_nom *) (*(*l_element_courant).donnee)
! 1488: .objet)).nom = malloc((strlen(variable) + 1)
! 1489: * sizeof(unsigned char))) == NULL)
! 1490: {
! 1491: (*s_expression) = s_expression_courante;
! 1492: (*s_etat_processus).erreur_systeme =
! 1493: d_es_allocation_memoire;
! 1494: return;
! 1495: }
! 1496:
! 1497: strcpy((*((struct_nom *) (*(*l_element_courant).donnee)
! 1498: .objet)).nom, variable);
! 1499: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 1500: .symbole = d_vrai;
! 1501:
! 1502: // Ajout de la fonction DER
! 1503:
! 1504: if (((*l_element_courant).suivant = malloc(
! 1505: sizeof(struct_liste_chainee))) == NULL)
! 1506: {
! 1507: (*s_expression) = s_expression_courante;
! 1508: (*s_etat_processus).erreur_systeme =
! 1509: d_es_allocation_memoire;
! 1510: return;
! 1511: }
! 1512:
! 1513: l_element_courant = (*l_element_courant).suivant;
! 1514:
! 1515: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1516: FCT)) == NULL)
! 1517: {
! 1518: (*s_expression) = s_expression_courante;
! 1519: (*s_etat_processus).erreur_systeme =
! 1520: d_es_allocation_memoire;
! 1521: return;
! 1522: }
! 1523:
! 1524: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1525: .objet)).nom_fonction = malloc(4 *
! 1526: sizeof(unsigned char))) == NULL)
! 1527: {
! 1528: (*s_expression) = s_expression_courante;
! 1529: (*s_etat_processus).erreur_systeme =
! 1530: d_es_allocation_memoire;
! 1531: return;
! 1532: }
! 1533:
! 1534: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1535: .objet)).nom_fonction, "DER");
! 1536: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1537: .nombre_arguments = 2;
! 1538: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1539: .fonction = instruction_der;
! 1540:
! 1541: // Ajout de la fonction ROT
! 1542:
! 1543: if (((*l_element_courant).suivant = malloc(
! 1544: sizeof(struct_liste_chainee))) == NULL)
! 1545: {
! 1546: (*s_expression) = s_expression_courante;
! 1547: (*s_etat_processus).erreur_systeme =
! 1548: d_es_allocation_memoire;
! 1549: return;
! 1550: }
! 1551:
! 1552: l_element_courant = (*l_element_courant).suivant;
! 1553:
! 1554: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1555: FCT)) == NULL)
! 1556: {
! 1557: (*s_expression) = s_expression_courante;
! 1558: (*s_etat_processus).erreur_systeme =
! 1559: d_es_allocation_memoire;
! 1560: return;
! 1561: }
! 1562:
! 1563: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1564: .objet)).nom_fonction = malloc(4 *
! 1565: sizeof(unsigned char))) == NULL)
! 1566: {
! 1567: (*s_expression) = s_expression_courante;
! 1568: (*s_etat_processus).erreur_systeme =
! 1569: d_es_allocation_memoire;
! 1570: return;
! 1571: }
! 1572:
! 1573: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1574: .objet)).nom_fonction, "ROT");
! 1575: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1576: .nombre_arguments = -1;
! 1577: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1578: .fonction = instruction_rot;
! 1579:
! 1580: // Ajout de la fonction '/'
! 1581:
! 1582: if (((*l_element_courant).suivant = malloc(
! 1583: sizeof(struct_liste_chainee))) == NULL)
! 1584: {
! 1585: (*s_expression) = s_expression_courante;
! 1586: (*s_etat_processus).erreur_systeme =
! 1587: d_es_allocation_memoire;
! 1588: return;
! 1589: }
! 1590:
! 1591: l_element_courant = (*l_element_courant).suivant;
! 1592:
! 1593: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1594: FCT)) == NULL)
! 1595: {
! 1596: (*s_expression) = s_expression_courante;
! 1597: (*s_etat_processus).erreur_systeme =
! 1598: d_es_allocation_memoire;
! 1599: return;
! 1600: }
! 1601:
! 1602: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1603: .objet)).nom_fonction = malloc(2 *
! 1604: sizeof(unsigned char))) == NULL)
! 1605: {
! 1606: (*s_expression) = s_expression_courante;
! 1607: (*s_etat_processus).erreur_systeme =
! 1608: d_es_allocation_memoire;
! 1609: return;
! 1610: }
! 1611:
! 1612: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1613: .objet)).nom_fonction, "/");
! 1614: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1615: .nombre_arguments = 0;
! 1616: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1617: .fonction = instruction_division;
! 1618:
! 1619: // Ajout de la fonction SWAP
! 1620:
! 1621: if (((*l_element_courant).suivant = malloc(
! 1622: sizeof(struct_liste_chainee))) == NULL)
! 1623: {
! 1624: (*s_expression) = s_expression_courante;
! 1625: (*s_etat_processus).erreur_systeme =
! 1626: d_es_allocation_memoire;
! 1627: return;
! 1628: }
! 1629:
! 1630: l_element_courant = (*l_element_courant).suivant;
! 1631:
! 1632: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1633: FCT)) == NULL)
! 1634: {
! 1635: (*s_expression) = s_expression_courante;
! 1636: (*s_etat_processus).erreur_systeme =
! 1637: d_es_allocation_memoire;
! 1638: return;
! 1639: }
! 1640:
! 1641: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1642: .objet)).nom_fonction = malloc(5 *
! 1643: sizeof(unsigned char))) == NULL)
! 1644: {
! 1645: (*s_expression) = s_expression_courante;
! 1646: (*s_etat_processus).erreur_systeme =
! 1647: d_es_allocation_memoire;
! 1648: return;
! 1649: }
! 1650:
! 1651: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1652: .objet)).nom_fonction, "SWAP");
! 1653: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1654: .nombre_arguments = -1;
! 1655: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1656: .fonction = instruction_swap;
! 1657:
! 1658: // Ajout de la fonction '-'
! 1659:
! 1660: (*l_element_courant).suivant = (*l_element_suivant).suivant;
! 1661:
! 1662: liberation(s_etat_processus, (*l_element_suivant).donnee);
! 1663: free(l_element_suivant);
! 1664:
! 1665: l_element_courant = (*l_element_courant).suivant;
! 1666:
! 1667: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1668: .objet)).nom_fonction);
! 1669:
! 1670: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1671: .objet)).nom_fonction = malloc(2 *
! 1672: sizeof(unsigned char))) == NULL)
! 1673: {
! 1674: (*s_expression) = s_expression_courante;
! 1675: (*s_etat_processus).erreur_systeme =
! 1676: d_es_allocation_memoire;
! 1677: return;
! 1678: }
! 1679:
! 1680: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1681: .objet)).nom_fonction, "-");
! 1682: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1683: .objet)).nombre_arguments = 0;
! 1684: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1685: .objet)).fonction = instruction_moins;
! 1686: }
! 1687: else if ((strcmp((*((struct_fonction *)
! 1688: (*(*l_element_courant).donnee)
! 1689: .objet)).nom_fonction, "^") == 0) ||
! 1690: (strcmp((*((struct_fonction *) (*(*l_element_courant)
! 1691: .donnee).objet)).nom_fonction , "**") == 0))
! 1692: {
! 1693: /*
! 1694: * Transormer << ** X DER >> en
! 1695: * << OVER X DER ROT ROT DUP 1 - ROT SWAP ** * * >>
! 1696: */
! 1697:
! 1698: // Transformation du '**' en OVER
! 1699:
! 1700: l_element_suivant = (*l_element_courant).suivant;
! 1701:
! 1702: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1703: .objet)).nom_fonction);
! 1704:
! 1705: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1706: .objet)).nom_fonction = malloc(5 *
! 1707: sizeof(unsigned char))) == NULL)
! 1708: {
! 1709: (*s_expression) = s_expression_courante;
! 1710: (*s_etat_processus).erreur_systeme =
! 1711: d_es_allocation_memoire;
! 1712: return;
! 1713: }
! 1714:
! 1715: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1716: .objet)).nom_fonction, "OVER");
! 1717: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1718: .objet)).nombre_arguments = -1;
! 1719: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 1720: .objet)).fonction = instruction_over;
! 1721:
! 1722: // Ajout de la variable de dérivation
! 1723:
! 1724: if (((*l_element_courant).suivant = malloc(
! 1725: sizeof(struct_liste_chainee))) == NULL)
! 1726: {
! 1727: (*s_expression) = s_expression_courante;
! 1728: (*s_etat_processus).erreur_systeme =
! 1729: d_es_allocation_memoire;
! 1730: return;
! 1731: }
! 1732:
! 1733: l_element_courant = (*l_element_courant).suivant;
! 1734:
! 1735: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1736: NOM)) == NULL)
! 1737: {
! 1738: (*s_expression) = s_expression_courante;
! 1739: (*s_etat_processus).erreur_systeme =
! 1740: d_es_allocation_memoire;
! 1741: return;
! 1742: }
! 1743:
! 1744: if (((*((struct_nom *) (*(*l_element_courant).donnee)
! 1745: .objet)).nom = malloc((strlen(variable) + 1)
! 1746: * sizeof(unsigned char))) == NULL)
! 1747: {
! 1748: (*s_expression) = s_expression_courante;
! 1749: (*s_etat_processus).erreur_systeme =
! 1750: d_es_allocation_memoire;
! 1751: return;
! 1752: }
! 1753:
! 1754: strcpy((*((struct_nom *) (*(*l_element_courant).donnee)
! 1755: .objet)).nom, variable);
! 1756: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 1757: .symbole = d_vrai;
! 1758:
! 1759: // Ajout de la fonction DER
! 1760:
! 1761: if (((*l_element_courant).suivant = malloc(
! 1762: sizeof(struct_liste_chainee))) == NULL)
! 1763: {
! 1764: (*s_expression) = s_expression_courante;
! 1765: (*s_etat_processus).erreur_systeme =
! 1766: d_es_allocation_memoire;
! 1767: return;
! 1768: }
! 1769:
! 1770: l_element_courant = (*l_element_courant).suivant;
! 1771:
! 1772: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1773: FCT)) == NULL)
! 1774: {
! 1775: (*s_expression) = s_expression_courante;
! 1776: (*s_etat_processus).erreur_systeme =
! 1777: d_es_allocation_memoire;
! 1778: return;
! 1779: }
! 1780:
! 1781: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1782: .objet)).nom_fonction = malloc(4 *
! 1783: sizeof(unsigned char))) == NULL)
! 1784: {
! 1785: (*s_expression) = s_expression_courante;
! 1786: (*s_etat_processus).erreur_systeme =
! 1787: d_es_allocation_memoire;
! 1788: return;
! 1789: }
! 1790:
! 1791: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1792: .objet)).nom_fonction, "DER");
! 1793: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1794: .nombre_arguments = 2;
! 1795: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1796: .fonction = instruction_der;
! 1797:
! 1798: // Ajout de la fonction ROT
! 1799:
! 1800: if (((*l_element_courant).suivant = malloc(
! 1801: sizeof(struct_liste_chainee))) == NULL)
! 1802: {
! 1803: (*s_expression) = s_expression_courante;
! 1804: (*s_etat_processus).erreur_systeme =
! 1805: d_es_allocation_memoire;
! 1806: return;
! 1807: }
! 1808:
! 1809: l_element_courant = (*l_element_courant).suivant;
! 1810:
! 1811: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1812: FCT)) == NULL)
! 1813: {
! 1814: (*s_expression) = s_expression_courante;
! 1815: (*s_etat_processus).erreur_systeme =
! 1816: d_es_allocation_memoire;
! 1817: return;
! 1818: }
! 1819:
! 1820: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1821: .objet)).nom_fonction = malloc(4 *
! 1822: sizeof(unsigned char))) == NULL)
! 1823: {
! 1824: (*s_expression) = s_expression_courante;
! 1825: (*s_etat_processus).erreur_systeme =
! 1826: d_es_allocation_memoire;
! 1827: return;
! 1828: }
! 1829:
! 1830: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1831: .objet)).nom_fonction, "ROT");
! 1832: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1833: .nombre_arguments = -1;
! 1834: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1835: .fonction = instruction_rot;
! 1836:
! 1837: // Ajout de la fonction ROT
! 1838:
! 1839: if (((*l_element_courant).suivant = malloc(
! 1840: sizeof(struct_liste_chainee))) == NULL)
! 1841: {
! 1842: (*s_expression) = s_expression_courante;
! 1843: (*s_etat_processus).erreur_systeme =
! 1844: d_es_allocation_memoire;
! 1845: return;
! 1846: }
! 1847:
! 1848: l_element_courant = (*l_element_courant).suivant;
! 1849:
! 1850: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1851: FCT)) == NULL)
! 1852: {
! 1853: (*s_expression) = s_expression_courante;
! 1854: (*s_etat_processus).erreur_systeme =
! 1855: d_es_allocation_memoire;
! 1856: return;
! 1857: }
! 1858:
! 1859: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1860: .objet)).nom_fonction = malloc(4 *
! 1861: sizeof(unsigned char))) == NULL)
! 1862: {
! 1863: (*s_expression) = s_expression_courante;
! 1864: (*s_etat_processus).erreur_systeme =
! 1865: d_es_allocation_memoire;
! 1866: return;
! 1867: }
! 1868:
! 1869: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1870: .objet)).nom_fonction, "ROT");
! 1871: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1872: .nombre_arguments = -1;
! 1873: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1874: .fonction = instruction_rot;
! 1875:
! 1876: // Ajout de la fonction DUP
! 1877:
! 1878: if (((*l_element_courant).suivant = malloc(
! 1879: sizeof(struct_liste_chainee))) == NULL)
! 1880: {
! 1881: (*s_expression) = s_expression_courante;
! 1882: (*s_etat_processus).erreur_systeme =
! 1883: d_es_allocation_memoire;
! 1884: return;
! 1885: }
! 1886:
! 1887: l_element_courant = (*l_element_courant).suivant;
! 1888:
! 1889: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1890: FCT)) == NULL)
! 1891: {
! 1892: (*s_expression) = s_expression_courante;
! 1893: (*s_etat_processus).erreur_systeme =
! 1894: d_es_allocation_memoire;
! 1895: return;
! 1896: }
! 1897:
! 1898: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1899: .objet)).nom_fonction = malloc(4 *
! 1900: sizeof(unsigned char))) == NULL)
! 1901: {
! 1902: (*s_expression) = s_expression_courante;
! 1903: (*s_etat_processus).erreur_systeme =
! 1904: d_es_allocation_memoire;
! 1905: return;
! 1906: }
! 1907:
! 1908: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1909: .objet)).nom_fonction, "DUP");
! 1910: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1911: .nombre_arguments = -1;
! 1912: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1913: .fonction = instruction_dup;
! 1914:
! 1915: // Ajout de 1 sur la pile
! 1916:
! 1917: if (((*l_element_courant).suivant = malloc(
! 1918: sizeof(struct_liste_chainee))) == NULL)
! 1919: {
! 1920: (*s_expression) = s_expression_courante;
! 1921: (*s_etat_processus).erreur_systeme =
! 1922: d_es_allocation_memoire;
! 1923: return;
! 1924: }
! 1925:
! 1926: l_element_courant = (*l_element_courant).suivant;
! 1927:
! 1928: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1929: INT)) == NULL)
! 1930: {
! 1931: (*s_expression) = s_expression_courante;
! 1932: (*s_etat_processus).erreur_systeme =
! 1933: d_es_allocation_memoire;
! 1934: return;
! 1935: }
! 1936:
! 1937: (*((integer8 *) (*(*l_element_courant).donnee).objet)) = 1;
! 1938:
! 1939: // Ajout de la fonction '-'
! 1940:
! 1941: if (((*l_element_courant).suivant = malloc(
! 1942: sizeof(struct_liste_chainee))) == NULL)
! 1943: {
! 1944: (*s_expression) = s_expression_courante;
! 1945: (*s_etat_processus).erreur_systeme =
! 1946: d_es_allocation_memoire;
! 1947: return;
! 1948: }
! 1949:
! 1950: l_element_courant = (*l_element_courant).suivant;
! 1951:
! 1952: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1953: FCT)) == NULL)
! 1954: {
! 1955: (*s_expression) = s_expression_courante;
! 1956: (*s_etat_processus).erreur_systeme =
! 1957: d_es_allocation_memoire;
! 1958: return;
! 1959: }
! 1960:
! 1961: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1962: .objet)).nom_fonction = malloc(2 *
! 1963: sizeof(unsigned char))) == NULL)
! 1964: {
! 1965: (*s_expression) = s_expression_courante;
! 1966: (*s_etat_processus).erreur_systeme =
! 1967: d_es_allocation_memoire;
! 1968: return;
! 1969: }
! 1970:
! 1971: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 1972: .objet)).nom_fonction, "-");
! 1973: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1974: .nombre_arguments = 0;
! 1975: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 1976: .fonction = instruction_moins;
! 1977:
! 1978: // Ajout de la fonction ROT
! 1979:
! 1980: if (((*l_element_courant).suivant = malloc(
! 1981: sizeof(struct_liste_chainee))) == NULL)
! 1982: {
! 1983: (*s_expression) = s_expression_courante;
! 1984: (*s_etat_processus).erreur_systeme =
! 1985: d_es_allocation_memoire;
! 1986: return;
! 1987: }
! 1988:
! 1989: l_element_courant = (*l_element_courant).suivant;
! 1990:
! 1991: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 1992: FCT)) == NULL)
! 1993: {
! 1994: (*s_expression) = s_expression_courante;
! 1995: (*s_etat_processus).erreur_systeme =
! 1996: d_es_allocation_memoire;
! 1997: return;
! 1998: }
! 1999:
! 2000: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2001: .objet)).nom_fonction = malloc(4 *
! 2002: sizeof(unsigned char))) == NULL)
! 2003: {
! 2004: (*s_expression) = s_expression_courante;
! 2005: (*s_etat_processus).erreur_systeme =
! 2006: d_es_allocation_memoire;
! 2007: return;
! 2008: }
! 2009:
! 2010: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2011: .objet)).nom_fonction, "ROT");
! 2012: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 2013: .nombre_arguments = -1;
! 2014: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 2015: .fonction = instruction_rot;
! 2016:
! 2017: // Ajout de la fonction SWAP
! 2018:
! 2019: if (((*l_element_courant).suivant = malloc(
! 2020: sizeof(struct_liste_chainee))) == NULL)
! 2021: {
! 2022: (*s_expression) = s_expression_courante;
! 2023: (*s_etat_processus).erreur_systeme =
! 2024: d_es_allocation_memoire;
! 2025: return;
! 2026: }
! 2027:
! 2028: l_element_courant = (*l_element_courant).suivant;
! 2029:
! 2030: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 2031: FCT)) == NULL)
! 2032: {
! 2033: (*s_expression) = s_expression_courante;
! 2034: (*s_etat_processus).erreur_systeme =
! 2035: d_es_allocation_memoire;
! 2036: return;
! 2037: }
! 2038:
! 2039: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2040: .objet)).nom_fonction = malloc(5 *
! 2041: sizeof(unsigned char))) == NULL)
! 2042: {
! 2043: (*s_expression) = s_expression_courante;
! 2044: (*s_etat_processus).erreur_systeme =
! 2045: d_es_allocation_memoire;
! 2046: return;
! 2047: }
! 2048:
! 2049: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2050: .objet)).nom_fonction, "SWAP");
! 2051: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 2052: .nombre_arguments = -1;
! 2053: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 2054: .fonction = instruction_swap;
! 2055:
! 2056: // Ajout de la fonction '**'
! 2057:
! 2058: if (((*l_element_courant).suivant = malloc(
! 2059: sizeof(struct_liste_chainee))) == NULL)
! 2060: {
! 2061: (*s_expression) = s_expression_courante;
! 2062: (*s_etat_processus).erreur_systeme =
! 2063: d_es_allocation_memoire;
! 2064: return;
! 2065: }
! 2066:
! 2067: l_element_courant = (*l_element_courant).suivant;
! 2068:
! 2069: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 2070: FCT)) == NULL)
! 2071: {
! 2072: (*s_expression) = s_expression_courante;
! 2073: (*s_etat_processus).erreur_systeme =
! 2074: d_es_allocation_memoire;
! 2075: return;
! 2076: }
! 2077:
! 2078: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2079: .objet)).nom_fonction = malloc(3 *
! 2080: sizeof(unsigned char))) == NULL)
! 2081: {
! 2082: (*s_expression) = s_expression_courante;
! 2083: (*s_etat_processus).erreur_systeme =
! 2084: d_es_allocation_memoire;
! 2085: return;
! 2086: }
! 2087:
! 2088: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2089: .objet)).nom_fonction, "**");
! 2090: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 2091: .nombre_arguments = 0;
! 2092: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 2093: .fonction = instruction_puissance;
! 2094:
! 2095: // Ajout de la fonction '*'
! 2096:
! 2097: if (((*l_element_courant).suivant = malloc(
! 2098: sizeof(struct_liste_chainee))) == NULL)
! 2099: {
! 2100: (*s_expression) = s_expression_courante;
! 2101: (*s_etat_processus).erreur_systeme =
! 2102: d_es_allocation_memoire;
! 2103: return;
! 2104: }
! 2105:
! 2106: l_element_courant = (*l_element_courant).suivant;
! 2107:
! 2108: if (((*l_element_courant).donnee = allocation(s_etat_processus,
! 2109: FCT)) == NULL)
! 2110: {
! 2111: (*s_expression) = s_expression_courante;
! 2112: (*s_etat_processus).erreur_systeme =
! 2113: d_es_allocation_memoire;
! 2114: return;
! 2115: }
! 2116:
! 2117: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2118: .objet)).nom_fonction = malloc(2 *
! 2119: sizeof(unsigned char))) == NULL)
! 2120: {
! 2121: (*s_expression) = s_expression_courante;
! 2122: (*s_etat_processus).erreur_systeme =
! 2123: d_es_allocation_memoire;
! 2124: return;
! 2125: }
! 2126:
! 2127: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2128: .objet)).nom_fonction, "*");
! 2129: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 2130: .nombre_arguments = 0;
! 2131: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 2132: .fonction = instruction_multiplication;
! 2133:
! 2134: // Ajout de la fonction '*'
! 2135:
! 2136: (*l_element_courant).suivant = (*l_element_suivant).suivant;
! 2137:
! 2138: liberation(s_etat_processus, (*l_element_suivant).donnee);
! 2139: free(l_element_suivant);
! 2140:
! 2141: l_element_courant = (*l_element_courant).suivant;
! 2142:
! 2143: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2144: .objet)).nom_fonction);
! 2145:
! 2146: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2147: .objet)).nom_fonction = malloc(2 *
! 2148: sizeof(unsigned char))) == NULL)
! 2149: {
! 2150: (*s_expression) = s_expression_courante;
! 2151: (*s_etat_processus).erreur_systeme =
! 2152: d_es_allocation_memoire;
! 2153: return;
! 2154: }
! 2155:
! 2156: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2157: .objet)).nom_fonction, "*");
! 2158: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2159: .objet)).nombre_arguments = 0;
! 2160: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2161: .objet)).fonction = instruction_multiplication;
! 2162: }
! 2163:
! 2164: /*
! 2165: * Traitement des fonctions
! 2166: */
! 2167:
! 2168: else
! 2169: {
! 2170: derivee_fonction_disponible = d_faux;
! 2171:
! 2172: tampon = (*((struct_fonction *) (*(*l_element_courant)
! 2173: .donnee).objet)).nom_fonction;
! 2174:
! 2175: derivee_fonction_disponible = d_faux;
! 2176: fin_boucle = d_faux;
! 2177:
! 2178: i = 0;
! 2179:
! 2180: do
! 2181: {
! 2182: if (fonctions[i] == NULL)
! 2183: {
! 2184: /*
! 2185: * On saute les expressions dérivées, donc
! 2186: * on cherche le prochain NULL.
! 2187: */
! 2188:
! 2189: while(fonctions[++i] != NULL);
! 2190:
! 2191: if (fonctions[++i] == NULL)
! 2192: {
! 2193: fin_boucle = d_vrai;
! 2194: }
! 2195: }
! 2196: else if (strcmp(fonctions[i], tampon) == 0)
! 2197: {
! 2198: /*
! 2199: * Vérification du nombre d'arguments de la fonction
! 2200: */
! 2201:
! 2202: if ((*((struct_fonction *) (*(*l_element_courant)
! 2203: .donnee).objet)).nombre_arguments ==
! 2204: (unsigned long) atol(fonctions[i + 1]))
! 2205: {
! 2206: i += 2;
! 2207: derivee_fonction_disponible = d_vrai;
! 2208: fin_boucle = d_vrai;
! 2209:
! 2210: while(fonctions[i] != NULL)
! 2211: {
! 2212: i++;
! 2213: }
! 2214: }
! 2215: }
! 2216: else
! 2217: {
! 2218: /*
! 2219: * Saut de la fonction et du nombre d'arguments
! 2220: */
! 2221:
! 2222: i += 2;
! 2223: }
! 2224: } while(fin_boucle == d_faux);
! 2225:
! 2226: if (derivee_fonction_disponible == d_faux)
! 2227: {
! 2228: /*
! 2229: * Remplacement de 'fct' X DER par
! 2230: * 'Derfct(arg, X)'
! 2231: */
! 2232:
! 2233: tampon = (*((struct_fonction *) (*(*l_element_courant)
! 2234: .donnee).objet)).nom_fonction;
! 2235:
! 2236: // Transformation du nom de la fonction
! 2237: // en variable de dérivation
! 2238:
! 2239: l_element_suivant = (*l_element_courant).suivant;
! 2240:
! 2241: free((*(*l_element_courant).donnee).objet);
! 2242:
! 2243: (*(*l_element_courant).donnee).type = NOM;
! 2244:
! 2245: if (((*(*l_element_courant).donnee).objet = malloc(
! 2246: sizeof(struct_nom))) == NULL)
! 2247: {
! 2248: (*s_expression) = s_expression_courante;
! 2249: (*s_etat_processus).erreur_systeme =
! 2250: d_es_allocation_memoire;
! 2251: return;
! 2252: }
! 2253:
! 2254: if (((*((struct_nom *) (*(*l_element_courant).donnee)
! 2255: .objet)).nom = malloc((strlen(variable) + 1)
! 2256: * sizeof(unsigned char))) == NULL)
! 2257: {
! 2258: (*s_expression) = s_expression_courante;
! 2259: (*s_etat_processus).erreur_systeme =
! 2260: d_es_allocation_memoire;
! 2261: return;
! 2262: }
! 2263:
! 2264: strcpy((*((struct_nom *) (*(*l_element_courant).donnee)
! 2265: .objet)).nom, variable);
! 2266: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 2267: .symbole = d_vrai;
! 2268:
! 2269: (*l_element_courant).suivant =
! 2270: (*l_element_suivant).suivant;
! 2271:
! 2272: liberation(s_etat_processus, (*l_element_suivant).donnee);
! 2273: free(l_element_suivant);
! 2274:
! 2275: l_element_courant = (*l_element_courant).suivant;
! 2276:
! 2277: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2278: .objet)).nom_fonction);
! 2279:
! 2280: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2281: .objet)).nom_fonction = malloc((strlen(tampon) + 4)
! 2282: * sizeof(unsigned char))) == NULL)
! 2283: {
! 2284: (*s_expression) = s_expression_courante;
! 2285: (*s_etat_processus).erreur_systeme =
! 2286: d_es_allocation_memoire;
! 2287: return;
! 2288: }
! 2289:
! 2290: strcat(strcpy((*((struct_fonction *) (*(*l_element_courant)
! 2291: .donnee).objet)).nom_fonction, "Der"), tampon);
! 2292:
! 2293: if ((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2294: .objet)).nombre_arguments == 0)
! 2295: {
! 2296: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2297: .objet)).nombre_arguments = 3;
! 2298: }
! 2299: else
! 2300: {
! 2301: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2302: .objet)).nombre_arguments += 1;
! 2303: }
! 2304:
! 2305: free(tampon);
! 2306: }
! 2307: else
! 2308: {
! 2309: /*
! 2310: * Transormer << FCT X DER >> en
! 2311: * << DUP X DER SWAP DerFCT * >>
! 2312: */
! 2313:
! 2314: // Transformation de la fonction à dériver en DUP
! 2315:
! 2316: l_element_suivant = (*l_element_courant).suivant;
! 2317:
! 2318: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2319: .objet)).nom_fonction);
! 2320:
! 2321: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2322: .objet)).nom_fonction = malloc(4 *
! 2323: sizeof(unsigned char))) == NULL)
! 2324: {
! 2325: (*s_expression) = s_expression_courante;
! 2326: (*s_etat_processus).erreur_systeme =
! 2327: d_es_allocation_memoire;
! 2328: return;
! 2329: }
! 2330:
! 2331: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2332: .objet)).nom_fonction, "DUP");
! 2333: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2334: .objet)).nombre_arguments = -1;
! 2335: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2336: .objet)).fonction = instruction_dup;
! 2337:
! 2338: // Ajout de la variable de dérivation
! 2339:
! 2340: if (((*l_element_courant).suivant = malloc(
! 2341: sizeof(struct_liste_chainee))) == NULL)
! 2342: {
! 2343: (*s_expression) = s_expression_courante;
! 2344: (*s_etat_processus).erreur_systeme =
! 2345: d_es_allocation_memoire;
! 2346: return;
! 2347: }
! 2348:
! 2349: l_element_courant = (*l_element_courant).suivant;
! 2350:
! 2351: if (((*l_element_courant).donnee =
! 2352: allocation(s_etat_processus, NOM)) == NULL)
! 2353: {
! 2354: (*s_expression) = s_expression_courante;
! 2355: (*s_etat_processus).erreur_systeme =
! 2356: d_es_allocation_memoire;
! 2357: return;
! 2358: }
! 2359:
! 2360: if (((*((struct_nom *) (*(*l_element_courant).donnee)
! 2361: .objet)).nom = malloc((strlen(variable) + 1)
! 2362: * sizeof(unsigned char))) == NULL)
! 2363: {
! 2364: (*s_expression) = s_expression_courante;
! 2365: (*s_etat_processus).erreur_systeme =
! 2366: d_es_allocation_memoire;
! 2367: return;
! 2368: }
! 2369:
! 2370: strcpy((*((struct_nom *) (*(*l_element_courant).donnee)
! 2371: .objet)).nom, variable);
! 2372: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
! 2373: .symbole = d_vrai;
! 2374:
! 2375: // Ajout de la fonction DER
! 2376:
! 2377: if (((*l_element_courant).suivant = malloc(
! 2378: sizeof(struct_liste_chainee))) == NULL)
! 2379: {
! 2380: (*s_expression) = s_expression_courante;
! 2381: (*s_etat_processus).erreur_systeme =
! 2382: d_es_allocation_memoire;
! 2383: return;
! 2384: }
! 2385:
! 2386: l_element_courant = (*l_element_courant).suivant;
! 2387:
! 2388: if (((*l_element_courant).donnee =
! 2389: allocation(s_etat_processus, FCT)) == NULL)
! 2390: {
! 2391: (*s_expression) = s_expression_courante;
! 2392: (*s_etat_processus).erreur_systeme =
! 2393: d_es_allocation_memoire;
! 2394: return;
! 2395: }
! 2396:
! 2397: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2398: .objet)).nom_fonction = malloc(4 *
! 2399: sizeof(unsigned char))) == NULL)
! 2400: {
! 2401: (*s_expression) = s_expression_courante;
! 2402: (*s_etat_processus).erreur_systeme =
! 2403: d_es_allocation_memoire;
! 2404: return;
! 2405: }
! 2406:
! 2407: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2408: .objet)).nom_fonction, "DER");
! 2409: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2410: .objet)).nombre_arguments = 2;
! 2411: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2412: .objet)).fonction = instruction_der;
! 2413:
! 2414: // Ajout de la fonction SWAP
! 2415:
! 2416: if (((*l_element_courant).suivant = malloc(
! 2417: sizeof(struct_liste_chainee))) == NULL)
! 2418: {
! 2419: (*s_expression) = s_expression_courante;
! 2420: (*s_etat_processus).erreur_systeme =
! 2421: d_es_allocation_memoire;
! 2422: return;
! 2423: }
! 2424:
! 2425: l_element_courant = (*l_element_courant).suivant;
! 2426:
! 2427: if (((*l_element_courant).donnee =
! 2428: allocation(s_etat_processus, FCT)) == NULL)
! 2429: {
! 2430: (*s_expression) = s_expression_courante;
! 2431: (*s_etat_processus).erreur_systeme =
! 2432: d_es_allocation_memoire;
! 2433: return;
! 2434: }
! 2435:
! 2436: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2437: .objet)).nom_fonction = malloc(5 *
! 2438: sizeof(unsigned char))) == NULL)
! 2439: {
! 2440: (*s_expression) = s_expression_courante;
! 2441: (*s_etat_processus).erreur_systeme =
! 2442: d_es_allocation_memoire;
! 2443: return;
! 2444: }
! 2445:
! 2446: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2447: .objet)).nom_fonction, "SWAP");
! 2448: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2449: .objet)).nombre_arguments = -1;
! 2450: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2451: .objet)).fonction = instruction_swap;
! 2452:
! 2453: // Ajout de la fonction dérivée
! 2454:
! 2455: i++;
! 2456:
! 2457: do
! 2458: {
! 2459: if (((*l_element_courant).suivant = malloc(
! 2460: sizeof(struct_liste_chainee))) == NULL)
! 2461: {
! 2462: (*s_expression) = s_expression_courante;
! 2463: (*s_etat_processus).erreur_systeme =
! 2464: d_es_allocation_memoire;
! 2465: return;
! 2466: }
! 2467:
! 2468: l_element_courant = (*l_element_courant).suivant;
! 2469:
! 2470: if (strcmp(fonctions[i], "FCT") == 0)
! 2471: {
! 2472: if (((*l_element_courant).donnee = allocation(
! 2473: s_etat_processus, FCT)) == NULL)
! 2474: {
! 2475: (*s_expression) = s_expression_courante;
! 2476: (*s_etat_processus).erreur_systeme =
! 2477: d_es_allocation_memoire;
! 2478: return;
! 2479: }
! 2480:
! 2481: if (((*((struct_fonction *) (*(*l_element_courant)
! 2482: .donnee).objet)).nom_fonction = malloc(
! 2483: (strlen(fonctions[i + 1]) + 1) *
! 2484: sizeof(unsigned char))) == NULL)
! 2485: {
! 2486: (*s_expression) = s_expression_courante;
! 2487: (*s_etat_processus).erreur_systeme =
! 2488: d_es_allocation_memoire;
! 2489: return;
! 2490: }
! 2491:
! 2492: strcpy((*((struct_fonction *) (*(*l_element_courant)
! 2493: .donnee).objet)).nom_fonction,
! 2494: fonctions[i + 1]);
! 2495: (*((struct_fonction *) (*(*l_element_courant)
! 2496: .donnee).objet)).nombre_arguments =
! 2497: atoi(fonctions[i + 2]);
! 2498: (*((struct_fonction *) (*(*l_element_courant)
! 2499: .donnee).objet)).fonction =
! 2500: analyse_instruction(s_etat_processus,
! 2501: fonctions[i + 1]);
! 2502: }
! 2503: else if (strcmp(fonctions[i], "INT") == 0)
! 2504: {
! 2505: if (((*l_element_courant).donnee = allocation(
! 2506: s_etat_processus, INT)) == NULL)
! 2507: {
! 2508: (*s_expression) = s_expression_courante;
! 2509: (*s_etat_processus).erreur_systeme =
! 2510: d_es_allocation_memoire;
! 2511: return;
! 2512: }
! 2513:
! 2514: (*((integer8 *) (*(*l_element_courant)
! 2515: .donnee).objet)) = atoi(fonctions[i + 1]);
! 2516: }
! 2517: else if (strcmp(fonctions[i], "NOM") == 0)
! 2518: {
! 2519: if (((*l_element_courant).donnee = allocation(
! 2520: s_etat_processus, NOM)) == NULL)
! 2521: {
! 2522: (*s_expression) = s_expression_courante;
! 2523: (*s_etat_processus).erreur_systeme =
! 2524: d_es_allocation_memoire;
! 2525: return;
! 2526: }
! 2527:
! 2528: if (((*((struct_nom *) (*(*l_element_courant)
! 2529: .donnee).objet)).nom = malloc(
! 2530: strlen((fonctions[i + 1]) + 1) *
! 2531: sizeof(unsigned char))) == NULL)
! 2532: {
! 2533: (*s_expression) = s_expression_courante;
! 2534: (*s_etat_processus).erreur_systeme =
! 2535: d_es_allocation_memoire;
! 2536: return;
! 2537: }
! 2538:
! 2539: strcpy((*((struct_nom *) (*(*l_element_courant)
! 2540: .donnee).objet)).nom, fonctions[i + 1]);
! 2541: (*((struct_nom *) (*(*l_element_courant)
! 2542: .donnee).objet)).symbole = d_vrai;
! 2543: }
! 2544: else if (strcmp(fonctions[i], "DER") == 0)
! 2545: {
! 2546: // Ajout de la variable de dérivation
! 2547:
! 2548: if (((*l_element_courant).donnee = allocation(
! 2549: s_etat_processus, NOM)) == NULL)
! 2550: {
! 2551: (*s_expression) = s_expression_courante;
! 2552: (*s_etat_processus).erreur_systeme =
! 2553: d_es_allocation_memoire;
! 2554: return;
! 2555: }
! 2556:
! 2557: if (((*((struct_nom *) (*(*l_element_courant)
! 2558: .donnee).objet)).nom =
! 2559: malloc((strlen(variable) + 1)
! 2560: * sizeof(unsigned char))) == NULL)
! 2561: {
! 2562: (*s_expression) = s_expression_courante;
! 2563: (*s_etat_processus).erreur_systeme =
! 2564: d_es_allocation_memoire;
! 2565: return;
! 2566: }
! 2567:
! 2568: strcpy((*((struct_nom *) (*(*l_element_courant)
! 2569: .donnee).objet)).nom, variable);
! 2570: (*((struct_nom *) (*(*l_element_courant).donnee)
! 2571: .objet)).symbole = d_vrai;
! 2572:
! 2573: // Ajout de la fonction DER
! 2574:
! 2575: if (((*l_element_courant).suivant = malloc(
! 2576: sizeof(struct_liste_chainee))) == NULL)
! 2577: {
! 2578: (*s_expression) = s_expression_courante;
! 2579: (*s_etat_processus).erreur_systeme =
! 2580: d_es_allocation_memoire;
! 2581: return;
! 2582: }
! 2583:
! 2584: l_element_courant = (*l_element_courant).suivant;
! 2585:
! 2586: if (((*l_element_courant).donnee =
! 2587: allocation(s_etat_processus, FCT))
! 2588: == NULL)
! 2589: {
! 2590: (*s_expression) = s_expression_courante;
! 2591: (*s_etat_processus).erreur_systeme =
! 2592: d_es_allocation_memoire;
! 2593: return;
! 2594: }
! 2595:
! 2596: if (((*((struct_fonction *) (*(*l_element_courant)
! 2597: .donnee).objet)).nom_fonction = malloc(4 *
! 2598: sizeof(unsigned char))) == NULL)
! 2599: {
! 2600: (*s_expression) = s_expression_courante;
! 2601: (*s_etat_processus).erreur_systeme =
! 2602: d_es_allocation_memoire;
! 2603: return;
! 2604: }
! 2605:
! 2606: strcpy((*((struct_fonction *)
! 2607: (*(*l_element_courant).donnee)
! 2608: .objet)).nom_fonction, "DER");
! 2609: (*((struct_fonction *) (*(*l_element_courant)
! 2610: .donnee).objet)).nombre_arguments = 2;
! 2611: (*((struct_fonction *) (*(*l_element_courant)
! 2612: .donnee).objet)).fonction =
! 2613: instruction_der;
! 2614: }
! 2615:
! 2616: i += 3;
! 2617: } while(fonctions[i] != NULL);
! 2618:
! 2619: // Ajout de la fonction '*'
! 2620:
! 2621: (*l_element_courant).suivant = (*l_element_suivant).suivant;
! 2622:
! 2623: liberation(s_etat_processus, (*l_element_suivant).donnee);
! 2624: free(l_element_suivant);
! 2625:
! 2626: l_element_courant = (*l_element_courant).suivant;
! 2627:
! 2628: free((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2629: .objet)).nom_fonction);
! 2630:
! 2631: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2632: .objet)).nom_fonction = malloc(2 *
! 2633: sizeof(unsigned char))) == NULL)
! 2634: {
! 2635: (*s_expression) = s_expression_courante;
! 2636: (*s_etat_processus).erreur_systeme =
! 2637: d_es_allocation_memoire;
! 2638: return;
! 2639: }
! 2640:
! 2641: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
! 2642: .objet)).nom_fonction, "*");
! 2643: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2644: .objet)).nombre_arguments = 0;
! 2645: (*((struct_fonction *) (*(*l_element_courant).donnee)
! 2646: .objet)).fonction = instruction_multiplication;
! 2647: }
! 2648: }
! 2649: }
! 2650:
! 2651: (*s_etat_processus).traitement_symbolique = 'Y';
! 2652:
! 2653: if (evaluation(s_etat_processus, s_expression_courante, 'E')
! 2654: == d_erreur)
! 2655: {
! 2656: (*s_expression) = s_expression_courante;
! 2657: (*s_etat_processus).traitement_symbolique = 'N';
! 2658: return;
! 2659: }
! 2660:
! 2661: (*s_etat_processus).traitement_symbolique = 'N';
! 2662: liberation(s_etat_processus, s_expression_courante);
! 2663:
! 2664: if ((*s_etat_processus).var_volatile_requete_arret == 0)
! 2665: {
! 2666: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 2667: &s_expression_courante) == d_erreur)
! 2668: {
! 2669: (*s_expression) = NULL;
! 2670: (*s_etat_processus).erreur_systeme =
! 2671: d_es_pile_operationnelle_vide;
! 2672: return;
! 2673: }
! 2674:
! 2675: /*
! 2676: * Arrêt lorsqu'il n'y a plus de fonction 'DER' dans l'expression
! 2677: * courante.
! 2678: */
! 2679:
! 2680: if (((*s_expression_courante).type == ALG) ||
! 2681: ((*s_expression_courante).type == RPN))
! 2682: {
! 2683: l_element_courant = (struct_liste_chainee *)
! 2684: (*s_expression_courante).objet;
! 2685: drapeau = d_faux;
! 2686:
! 2687: while((l_element_courant != NULL) && (drapeau == d_faux))
! 2688: {
! 2689: if ((*(*l_element_courant).donnee).type == FCT)
! 2690: {
! 2691: if (strcmp((*((struct_fonction *)
! 2692: (*(*l_element_courant).donnee)
! 2693: .objet)).nom_fonction, "DER") == 0)
! 2694: {
! 2695: drapeau = d_vrai;
! 2696: }
! 2697: }
! 2698:
! 2699: l_element_courant = (*l_element_courant).suivant;
! 2700: }
! 2701: }
! 2702: else
! 2703: {
! 2704: drapeau = d_faux;
! 2705: }
! 2706: }
! 2707: else
! 2708: {
! 2709: s_expression_courante = NULL;
! 2710: }
! 2711: } while((drapeau == d_vrai) && ((*s_etat_processus)
! 2712: .var_volatile_requete_arret == 0));
! 2713:
! 2714: (*s_expression) = s_expression_courante;
! 2715:
! 2716: return;
! 2717: }
! 2718:
! 2719: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>