File:  [local] / rpl / src / calcul_differentiel.c
Revision 1.65: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:40 2020 UTC (4 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_32, HEAD
Modification du copyright.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.32
    4:   Copyright (C) 1989-2020 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:                                 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>