File:  [local] / rpl / src / instructions_e4.c
Revision 1.67: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:45 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 'exsub'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_exsub(struct_processus *s_etat_processus)
   40: {
   41:     integer8                        position;
   42: 
   43:     struct_liste_chainee            *l_element_courant;
   44:     struct_liste_chainee            *ptr_1;
   45:     struct_liste_chainee            *ptr_2;
   46:     struct_liste_chainee            *ptr_3;
   47: 
   48:     struct_objet                    *s_copie_argument_1;
   49:     struct_objet                    *s_copie_argument_4;
   50:     struct_objet                    *s_objet_argument_1;
   51:     struct_objet                    *s_objet_argument_2;
   52:     struct_objet                    *s_objet_argument_3;
   53:     struct_objet                    *s_objet_argument_4;
   54: 
   55:     unsigned char                   *registre_definitions_chainees;
   56:     unsigned char                   *registre_instruction_courante;
   57: 
   58:     integer8                        position_courante;
   59: 
   60:     (*s_etat_processus).erreur_execution = d_ex;
   61: 
   62:     if ((*s_etat_processus).affichage_arguments == 'Y')
   63:     {
   64:         printf("\n  EXSUB ");
   65: 
   66:         if ((*s_etat_processus).langue == 'F')
   67:         {
   68:             printf("(substitution d'expression)\n\n");
   69:         }
   70:         else
   71:         {
   72:             printf("(expression substitution)\n\n");
   73:         }
   74: 
   75:         printf("    4: %s\n", d_RPN);
   76:         printf("    3: %s\n", d_INT);
   77:         printf("    2: %s\n", d_INT);
   78:         printf("    1: %s\n", d_LST);
   79:         printf("->  1: %s\n", d_RPN);
   80: 
   81:         return;
   82:     }
   83:     else if ((*s_etat_processus).test_instruction == 'Y')
   84:     {
   85:         (*s_etat_processus).nombre_arguments = -1;
   86:         return;
   87:     }
   88: 
   89:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   90:     {
   91:         if (empilement_pile_last(s_etat_processus, 4) == d_erreur)
   92:         {
   93:             return;
   94:         }
   95:     }
   96: 
   97:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
   98:             &s_objet_argument_1) == d_erreur)
   99:     {
  100:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  101:         return;
  102:     }
  103: 
  104:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  105:             &s_objet_argument_2) == d_erreur)
  106:     {
  107:         liberation(s_etat_processus, s_objet_argument_1);
  108: 
  109:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  110:         return;
  111:     }
  112: 
  113:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  114:             &s_objet_argument_3) == d_erreur)
  115:     {
  116:         liberation(s_etat_processus, s_objet_argument_1);
  117:         liberation(s_etat_processus, s_objet_argument_2);
  118: 
  119:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  120:         return;
  121:     }
  122: 
  123:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  124:             &s_objet_argument_4) == d_erreur)
  125:     {
  126:         liberation(s_etat_processus, s_objet_argument_1);
  127:         liberation(s_etat_processus, s_objet_argument_2);
  128:         liberation(s_etat_processus, s_objet_argument_3);
  129: 
  130:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  131:         return;
  132:     }
  133: 
  134:     if (((*s_objet_argument_1).type == LST) &&
  135:             ((*s_objet_argument_2).type == INT) &&
  136:             ((*s_objet_argument_3).type == INT) &&
  137:             ((*s_objet_argument_4).type == RPN))
  138:     {
  139:         if ((*((integer8 *) (*s_objet_argument_3).objet)) <= 0)
  140:         {
  141:             liberation(s_etat_processus, s_objet_argument_1);
  142:             liberation(s_etat_processus, s_objet_argument_2);
  143:             liberation(s_etat_processus, s_objet_argument_3);
  144:             liberation(s_etat_processus, s_objet_argument_4);
  145: 
  146:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
  147:             return;
  148:         }
  149: 
  150:         if ((*((integer8 *) (*s_objet_argument_3).objet)) >
  151:                 (*((integer8 *) (*s_objet_argument_2).objet)))
  152:         {
  153:             liberation(s_etat_processus, s_objet_argument_1);
  154:             liberation(s_etat_processus, s_objet_argument_2);
  155:             liberation(s_etat_processus, s_objet_argument_3);
  156:             liberation(s_etat_processus, s_objet_argument_4);
  157: 
  158:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
  159:             return;
  160:         }
  161: 
  162:         if ((s_copie_argument_1 = copie_objet(s_etat_processus,
  163:                 s_objet_argument_1, 'N')) == NULL)
  164:         {
  165:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  166:             return;
  167:         }
  168: 
  169:         liberation(s_etat_processus, s_objet_argument_1);
  170:         s_objet_argument_1 = s_copie_argument_1;
  171: 
  172:         if ((s_copie_argument_4 = copie_objet(s_etat_processus,
  173:                 s_objet_argument_4, 'N')) == NULL)
  174:         {
  175:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  176:             return;
  177:         }
  178: 
  179:         liberation(s_etat_processus, s_objet_argument_4);
  180:         s_objet_argument_4 = s_copie_argument_4;
  181: 
  182:         l_element_courant = (*s_objet_argument_4).objet;
  183:         position = 1;
  184: 
  185:         /*
  186:          * ptr_1 : premier élément à substituer
  187:          * ptr_2 : dernier élément à substituer
  188:          */
  189: 
  190:         ptr_1 = NULL;
  191:         ptr_2 = NULL;
  192: 
  193:         while(l_element_courant != NULL)
  194:         {
  195:             if (position == (*((integer8 *) (*s_objet_argument_3).objet)))
  196:             {
  197:                 ptr_1 = l_element_courant;
  198:             }
  199: 
  200:             if (position == (*((integer8 *) (*s_objet_argument_2).objet)))
  201:             {
  202:                 ptr_2 = (*l_element_courant).suivant;
  203:                 (*l_element_courant).suivant = NULL;
  204:                 break;
  205:             }
  206: 
  207:             position++;
  208:             l_element_courant = (*l_element_courant).suivant;
  209:         }
  210: 
  211:         if (l_element_courant != NULL)
  212:         {   
  213:             /*
  214:              * Substitution
  215:              */
  216: 
  217:             /*
  218:              * ptr_3 : objet de substitution
  219:              * ptr_1 : contient maintenant l'objet allant être substitué
  220:              * et terminé par un NULL donc libérable par liberation().
  221:              */
  222: 
  223:             ptr_3 = (*s_objet_argument_1).objet;
  224:             (*s_objet_argument_1).objet = ptr_1;
  225: 
  226:             l_element_courant = (*s_objet_argument_4).objet;
  227: 
  228:             if (l_element_courant == NULL)
  229:             {
  230:                 (*s_objet_argument_4).objet = ptr_3;
  231: 
  232:                 if ((*s_objet_argument_4).objet == NULL)
  233:                 {
  234:                     (*s_objet_argument_4).objet = ptr_2;
  235:                 }
  236:                 else
  237:                 {
  238:                     l_element_courant = (*s_objet_argument_4).objet;
  239: 
  240:                     while((*l_element_courant).suivant != NULL)
  241:                     {
  242:                         l_element_courant = (*l_element_courant).suivant;
  243:                     }
  244: 
  245:                     (*l_element_courant).suivant = ptr_2;
  246:                 }
  247:             }
  248:             else
  249:             {
  250:                 if ((*((integer8 *) (*s_objet_argument_3).objet)) == 1)
  251:                 {
  252:                     (*s_objet_argument_4).objet = ptr_3;
  253:                     l_element_courant = (*s_objet_argument_4).objet;
  254:                 }
  255:                 else
  256:                 {
  257:                     position = 1;
  258: 
  259:                     while((*l_element_courant).suivant != NULL)
  260:                     {
  261:                         position++;
  262: 
  263:                         if (position == (*((integer8 *) (*s_objet_argument_3)
  264:                                 .objet)))
  265:                         {
  266:                             break;
  267:                         }
  268: 
  269:                         l_element_courant = (*l_element_courant).suivant;
  270:                     }
  271: 
  272:                     (*l_element_courant).suivant = ptr_3;
  273:                 }
  274: 
  275:                 if ((*l_element_courant).suivant == NULL)
  276:                 {
  277:                     (*l_element_courant).suivant = ptr_2;
  278:                 }
  279:                 else
  280:                 {
  281:                     while((*l_element_courant).suivant != NULL)
  282:                     {
  283:                         l_element_courant = (*l_element_courant).suivant;
  284:                     }
  285: 
  286:                     (*l_element_courant).suivant = ptr_2;
  287:                 }
  288:             }
  289: 
  290:             /*
  291:              * Analyse de l'objet résultant de la substitution
  292:              */
  293: 
  294:             // Recherche de la présence d'un '<<' initial
  295: 
  296:             l_element_courant = (*s_objet_argument_4).objet;
  297: 
  298:             while(l_element_courant != NULL)
  299:             {
  300:                 if ((*(*l_element_courant).donnee).type == FCT)
  301:                 {
  302:                     if (strcmp((*((struct_fonction *) (*(*l_element_courant)
  303:                             .donnee).objet)).nom_fonction, "<<") == 0)
  304:                     {
  305:                         break;
  306:                     }
  307:                 }
  308: 
  309:                 l_element_courant = (*l_element_courant).suivant;
  310:             }
  311: 
  312:             if (l_element_courant != (*s_objet_argument_4).objet)
  313:             {
  314:                 liberation(s_etat_processus, s_objet_argument_1);
  315:                 liberation(s_etat_processus, s_objet_argument_2);
  316:                 liberation(s_etat_processus, s_objet_argument_3);
  317:                 liberation(s_etat_processus, s_objet_argument_4);
  318: 
  319:                 (*s_etat_processus).erreur_execution =
  320:                         d_ex_argument_invalide;
  321:                 return;
  322:             }
  323: 
  324:             // Analyse syntaxique
  325: 
  326:             position_courante = (*s_etat_processus).position_courante;
  327:             registre_definitions_chainees = (*s_etat_processus)
  328:                     .definitions_chainees;
  329:             registre_instruction_courante = (*s_etat_processus)
  330:                     .instruction_courante;
  331: 
  332:             if (((*s_etat_processus).definitions_chainees =
  333:                     formateur(s_etat_processus, 0, s_objet_argument_4))
  334:                     == NULL)
  335:             {
  336:                 (*s_etat_processus).erreur_systeme =
  337:                         d_es_allocation_memoire;
  338:                 return;
  339:             }
  340: 
  341:             if (analyse_syntaxique(s_etat_processus) == d_erreur)
  342:             {
  343:                 free((*s_etat_processus).definitions_chainees);
  344: 
  345:                 (*s_etat_processus).definitions_chainees =
  346:                         registre_definitions_chainees;
  347:                 (*s_etat_processus).instruction_courante =
  348:                         registre_instruction_courante;
  349:                 (*s_etat_processus).position_courante =
  350:                         position_courante;
  351: 
  352:                 liberation(s_etat_processus, s_objet_argument_1);
  353:                 liberation(s_etat_processus, s_objet_argument_2);
  354:                 liberation(s_etat_processus, s_objet_argument_3);
  355:                 liberation(s_etat_processus, s_objet_argument_4);
  356: 
  357:                 (*s_etat_processus).erreur_execution =
  358:                         d_ex_argument_invalide;
  359:                 return;
  360:             }
  361: 
  362:             free((*s_etat_processus).definitions_chainees);
  363: 
  364:             (*s_etat_processus).definitions_chainees =
  365:                     registre_definitions_chainees;
  366:             (*s_etat_processus).instruction_courante =
  367:                     registre_instruction_courante;
  368:             (*s_etat_processus).position_courante =
  369:                     position_courante;
  370:         }
  371:         else
  372:         {
  373:             liberation(s_etat_processus, s_objet_argument_1);
  374:             liberation(s_etat_processus, s_objet_argument_2);
  375:             liberation(s_etat_processus, s_objet_argument_3);
  376:             liberation(s_etat_processus, s_objet_argument_4);
  377: 
  378:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
  379:             return;
  380:         }
  381:     }
  382:     else
  383:     {
  384:         liberation(s_etat_processus, s_objet_argument_1);
  385:         liberation(s_etat_processus, s_objet_argument_2);
  386:         liberation(s_etat_processus, s_objet_argument_3);
  387:         liberation(s_etat_processus, s_objet_argument_4);
  388: 
  389:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  390:         return;
  391:     }
  392: 
  393:     liberation(s_etat_processus, s_objet_argument_1);
  394:     liberation(s_etat_processus, s_objet_argument_2);
  395:     liberation(s_etat_processus, s_objet_argument_3);
  396: 
  397:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  398:             s_objet_argument_4) == d_erreur)
  399:     {
  400:         return;
  401:     }
  402: 
  403:     return;
  404: }
  405: 
  406: 
  407: /*
  408: ================================================================================
  409:   Fonction 'exget'
  410: ================================================================================
  411:   Entrées :
  412: --------------------------------------------------------------------------------
  413:   Sorties :
  414: --------------------------------------------------------------------------------
  415:   Effets de bord : néant
  416: ================================================================================
  417: */
  418: 
  419: void
  420: instruction_exget(struct_processus *s_etat_processus)
  421: {
  422:     struct_liste_chainee            *l_element_courant;
  423:     struct_liste_chainee            *l_element_suivant;
  424: 
  425:     struct_objet                    *s_copie_argument_3;
  426:     struct_objet                    *s_objet_argument_1;
  427:     struct_objet                    *s_objet_argument_2;
  428:     struct_objet                    *s_objet_argument_3;
  429: 
  430:     signed long                     position;
  431: 
  432:     (*s_etat_processus).erreur_execution = d_ex;
  433: 
  434:     if ((*s_etat_processus).affichage_arguments == 'Y')
  435:     {
  436:         printf("\n  EXGET ");
  437: 
  438:         if ((*s_etat_processus).langue == 'F')
  439:         {
  440:             printf("(extraction d'une expression)\n\n");
  441:         }
  442:         else
  443:         {
  444:             printf("(get expression)\n\n");
  445:         }
  446: 
  447:         printf("    3: %s\n", d_RPN);
  448:         printf("    2: %s\n", d_INT);
  449:         printf("    1: %s\n", d_INT);
  450:         printf("->  1: %s\n", d_LST);
  451: 
  452:         return;
  453:     }
  454:     else if ((*s_etat_processus).test_instruction == 'Y')
  455:     {
  456:         (*s_etat_processus).nombre_arguments = -1;
  457:         return;
  458:     }
  459: 
  460:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  461:     {
  462:         if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
  463:         {
  464:             return;
  465:         }
  466:     }
  467: 
  468:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  469:             &s_objet_argument_1) == d_erreur)
  470:     {
  471:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  472:         return;
  473:     }
  474: 
  475:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  476:             &s_objet_argument_2) == d_erreur)
  477:     {
  478:         liberation(s_etat_processus, s_objet_argument_1);
  479: 
  480:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  481:         return;
  482:     }
  483: 
  484:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  485:             &s_objet_argument_3) == d_erreur)
  486:     {
  487:         liberation(s_etat_processus, s_objet_argument_1);
  488:         liberation(s_etat_processus, s_objet_argument_2);
  489: 
  490:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  491:         return;
  492:     }
  493: 
  494:     if (((*s_objet_argument_1).type == INT) &&
  495:             ((*s_objet_argument_2).type == INT) &&
  496:             ((*s_objet_argument_3).type == RPN))
  497:     {
  498:         if ((s_copie_argument_3 = copie_objet(s_etat_processus,
  499:                 s_objet_argument_3, 'N')) == NULL)
  500:         {
  501:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  502:             return;
  503:         }
  504: 
  505:         liberation(s_etat_processus, s_objet_argument_3);
  506:         s_objet_argument_3 = s_copie_argument_3;
  507: 
  508:         if ((*((integer8 *) (*s_objet_argument_2).objet)) <= 0)
  509:         {
  510:             liberation(s_etat_processus, s_objet_argument_1);
  511:             liberation(s_etat_processus, s_objet_argument_2);
  512:             liberation(s_etat_processus, s_objet_argument_3);
  513: 
  514:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
  515:             return;
  516:         }
  517: 
  518:         if ((*((integer8 *) (*s_objet_argument_2).objet)) >
  519:                 (*((integer8 *) (*s_objet_argument_1).objet)))
  520:         {
  521:             liberation(s_etat_processus, s_objet_argument_1);
  522:             liberation(s_etat_processus, s_objet_argument_2);
  523:             liberation(s_etat_processus, s_objet_argument_3);
  524: 
  525:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
  526:             return;
  527:         }
  528: 
  529:         (*s_objet_argument_3).type = LST;
  530:         l_element_courant = (*s_objet_argument_3).objet;
  531:         position = 1;
  532: 
  533:         while(l_element_courant != NULL)
  534:         {
  535:             if (position == (*((integer8 *) (*s_objet_argument_2).objet)))
  536:             {
  537:                 (*s_objet_argument_3).objet = l_element_courant;
  538:                 break;
  539:             }
  540: 
  541:             l_element_suivant = (*l_element_courant).suivant;
  542:             liberation(s_etat_processus, (*l_element_courant).donnee);
  543:             free(l_element_courant);
  544:             l_element_courant = l_element_suivant;
  545: 
  546:             position++;
  547:         }
  548: 
  549:         if (position != (*((integer8 *) (*s_objet_argument_2).objet)))
  550:         {
  551:             liberation(s_etat_processus, s_objet_argument_1);
  552:             liberation(s_etat_processus, s_objet_argument_2);
  553:             liberation(s_etat_processus, s_objet_argument_3);
  554: 
  555:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
  556:             return;
  557:         }
  558: 
  559:         while(l_element_courant != NULL)
  560:         {
  561:             l_element_suivant = (*l_element_courant).suivant;
  562: 
  563:             if (position == (*((integer8 *) (*s_objet_argument_1).objet)))
  564:             {
  565:                 (*l_element_courant).suivant = NULL;
  566:                 l_element_courant = l_element_suivant;
  567: 
  568:                 while(l_element_courant != NULL)
  569:                 {
  570:                     l_element_suivant = (*l_element_courant).suivant;
  571:                     liberation(s_etat_processus, (*l_element_courant).donnee);
  572:                     free(l_element_courant);
  573:                     l_element_courant = l_element_suivant;
  574:                 }
  575: 
  576:                 break;
  577:             }
  578: 
  579:             l_element_courant = l_element_suivant;
  580:             position++;
  581:         }
  582: 
  583:         if (position != (*((integer8 *) (*s_objet_argument_1).objet)))
  584:         {
  585:             liberation(s_etat_processus, s_objet_argument_1);
  586:             liberation(s_etat_processus, s_objet_argument_2);
  587:             liberation(s_etat_processus, s_objet_argument_3);
  588: 
  589:             (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
  590:             return;
  591:         }
  592: 
  593:         /*
  594:          * Vérification de la cohérence de l'expression. Nous ne devons avoir
  595:          * ni '<<' ni '>>.
  596:          */
  597: 
  598:         l_element_courant = (*s_objet_argument_3).objet;
  599: 
  600:         while(l_element_courant != NULL)
  601:         {
  602:             if ((*(*l_element_courant).donnee).type == FCT)
  603:             {
  604:                 if ((strcmp((*((struct_fonction *) (*(*l_element_courant)
  605:                         .donnee).objet)).nom_fonction, "<<") == 0) ||
  606:                         (strcmp((*((struct_fonction *) (*(*l_element_courant)
  607:                         .donnee).objet)).nom_fonction, ">>") == 0))
  608:                 {
  609:                     liberation(s_etat_processus, s_objet_argument_1);
  610:                     liberation(s_etat_processus, s_objet_argument_2);
  611:                     liberation(s_etat_processus, s_objet_argument_3);
  612: 
  613:                     (*s_etat_processus).erreur_execution =
  614:                             d_ex_argument_invalide;
  615:                     return;
  616:                 }
  617:             }
  618: 
  619:             l_element_courant = (*l_element_courant).suivant;
  620:         }
  621:     }
  622:     else
  623:     {
  624:         liberation(s_etat_processus, s_objet_argument_1);
  625:         liberation(s_etat_processus, s_objet_argument_2);
  626:         liberation(s_etat_processus, s_objet_argument_3);
  627: 
  628:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  629:         return;
  630:     }
  631: 
  632:     liberation(s_etat_processus, s_objet_argument_1);
  633:     liberation(s_etat_processus, s_objet_argument_2);
  634: 
  635:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  636:             s_objet_argument_3) == d_erreur)
  637:     {
  638:         return;
  639:     }
  640: 
  641:     return;
  642: }
  643: 
  644: 
  645: /*
  646: ================================================================================
  647:   Fonction 'eqv'
  648: ================================================================================
  649:   Entrées : pointeur sur une structure struct_processus
  650: --------------------------------------------------------------------------------
  651:   Sorties :
  652: --------------------------------------------------------------------------------
  653:   Effets de bord : néant
  654: ================================================================================
  655: */
  656: 
  657: void
  658: instruction_eqv(struct_processus *s_etat_processus)
  659: {
  660:     struct_liste_chainee        *l_element_courant;
  661:     struct_liste_chainee        *l_element_precedent;
  662: 
  663:     struct_objet                *s_copie_argument_1;
  664:     struct_objet                *s_copie_argument_2;
  665:     struct_objet                *s_objet_argument_1;
  666:     struct_objet                *s_objet_argument_2;
  667:     struct_objet                *s_objet_resultat;
  668: 
  669:     integer8                    nombre_elements;
  670: 
  671:     (*s_etat_processus).erreur_execution = d_ex;
  672: 
  673:     if ((*s_etat_processus).affichage_arguments == 'Y')
  674:     {
  675:         printf("\n  EQV ");
  676: 
  677:         if ((*s_etat_processus).langue == 'F')
  678:         {
  679:             printf("(opérateur equivalence)\n\n");
  680:         }
  681:         else
  682:         {
  683:             printf("(equivalence operator)\n\n");
  684:         }
  685: 
  686:         printf("    2: %s, %s\n", d_INT, d_REL);
  687:         printf("    1: %s, %s\n", d_INT, d_REL);
  688:         printf("->  1: %s\n\n", d_INT);
  689: 
  690:         printf("    2: %s\n", d_BIN);
  691:         printf("    1: %s\n", d_BIN);
  692:         printf("->  1: %s\n\n", d_BIN);
  693: 
  694:         printf("    2: %s\n", d_NOM);
  695:         printf("    1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
  696:         printf("->  1: %s\n\n", d_ALG);
  697: 
  698:         printf("    2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
  699:         printf("    1: %s\n", d_NOM);
  700:         printf("->  1: %s\n\n", d_ALG);
  701: 
  702:         printf("    2: %s\n", d_ALG);
  703:         printf("    1: %s\n", d_ALG);
  704:         printf("->  1: %s\n\n", d_ALG);
  705: 
  706:         printf("    2: %s\n", d_RPN);
  707:         printf("    1: %s\n", d_RPN);
  708:         printf("->  1: %s\n", d_RPN);
  709: 
  710:         return;
  711:     }
  712:     else if ((*s_etat_processus).test_instruction == 'Y')
  713:     {
  714:         (*s_etat_processus).nombre_arguments = 0;
  715:         return;
  716:     }
  717:     
  718:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  719:     {
  720:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  721:         {
  722:             return;
  723:         }
  724:     }
  725: 
  726:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  727:             &s_objet_argument_1) == d_erreur)
  728:     {
  729:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  730:         return;
  731:     }
  732: 
  733:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  734:             &s_objet_argument_2) == d_erreur)
  735:     {
  736:         liberation(s_etat_processus, s_objet_argument_1);
  737: 
  738:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  739:         return;
  740:     }
  741: 
  742: /*
  743: --------------------------------------------------------------------------------
  744:   EQV logique
  745: --------------------------------------------------------------------------------
  746: */
  747: 
  748:     if ((((*s_objet_argument_1).type == INT) ||
  749:             ((*s_objet_argument_1).type == REL)) &&
  750:             (((*s_objet_argument_2).type == INT) ||
  751:             ((*s_objet_argument_2).type == REL)))
  752:     {
  753:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
  754:         {
  755:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  756:             return;
  757:         }
  758: 
  759:         if ((*s_objet_argument_1).type == INT)
  760:         {
  761:             if ((*s_objet_argument_2).type == INT)
  762:             {
  763:                 if ((((*((integer8 *) (*s_objet_argument_1).objet)) == 0) &&
  764:                         ((*((integer8 *) (*s_objet_argument_2).objet)) == 0))
  765:                         || (((*((integer8 *) (*s_objet_argument_1).objet))
  766:                         != 0) && ((*((integer8 *) (*s_objet_argument_2).objet))
  767:                         != 0)))
  768:                 {
  769:                     (*((integer8 *) (*s_objet_resultat).objet)) = -1;
  770:                 }
  771:                 else
  772:                 {
  773:                     (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  774:                 }
  775:             }
  776:             else
  777:             {
  778:                 if ((((*((integer8 *) (*s_objet_argument_1).objet)) == 0) &&
  779:                         ((*((real8 *) (*s_objet_argument_2).objet)) == 0))
  780:                         || (((*((integer8 *) (*s_objet_argument_1).objet))
  781:                         != 0) && ((*((real8 *) (*s_objet_argument_2).objet))
  782:                         != 0)))
  783:                 {
  784:                     (*((integer8 *) (*s_objet_resultat).objet)) = -1;
  785:                 }
  786:                 else
  787:                 {
  788:                     (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  789:                 }
  790:             }
  791:         }
  792:         else
  793:         {
  794:             if ((*s_objet_argument_2).type == INT)
  795:             {
  796:                 if ((((*((real8 *) (*s_objet_argument_1).objet)) == 0) &&
  797:                         ((*((integer8 *) (*s_objet_argument_2).objet)) == 0))
  798:                         || (((*((real8 *) (*s_objet_argument_1).objet))
  799:                         != 0) && ((*((integer8 *) (*s_objet_argument_2).objet))
  800:                         != 0)))
  801:                 {
  802:                     (*((integer8 *) (*s_objet_resultat).objet)) = -1;
  803:                 }
  804:                 else
  805:                 {
  806:                     (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  807:                 }
  808:             }
  809:             else
  810:             {
  811:                 if ((((*((real8 *) (*s_objet_argument_1).objet)) == 0) &&
  812:                         ((*((real8 *) (*s_objet_argument_2).objet)) == 0))
  813:                         || (((*((real8 *) (*s_objet_argument_1).objet))
  814:                         != 0) && ((*((real8 *) (*s_objet_argument_2).objet))
  815:                         != 0)))
  816:                 {
  817:                     (*((integer8 *) (*s_objet_resultat).objet)) = -1;
  818:                 }
  819:                 else
  820:                 {
  821:                     (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  822:                 }
  823:             }
  824:         }
  825:     }
  826: 
  827: /*
  828: --------------------------------------------------------------------------------
  829:   EQV binaire
  830: --------------------------------------------------------------------------------
  831: */
  832: 
  833:     else if (((*s_objet_argument_1).type == BIN) &&
  834:             ((*s_objet_argument_2).type == BIN))
  835:     {
  836:         if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL)
  837:         {
  838:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  839:             return;
  840:         }
  841: 
  842:         (*((logical8 *) (*s_objet_resultat).objet)) = 
  843:                 ~((*((logical8 *) (*s_objet_argument_1).objet)) ^
  844:                 (*((logical8 *) (*s_objet_argument_2).objet)));
  845:     }
  846: 
  847: /*
  848: --------------------------------------------------------------------------------
  849:    EQV entre des arguments complexes
  850: --------------------------------------------------------------------------------
  851: */
  852: 
  853:     /*
  854:      * Nom ou valeur numérique / Nom ou valeur numérique
  855:      */
  856: 
  857:     else if ((((*s_objet_argument_1).type == NOM) &&
  858:             (((*s_objet_argument_2).type == NOM) ||
  859:             ((*s_objet_argument_2).type == INT) ||
  860:             ((*s_objet_argument_2).type == REL))) ||
  861:             (((*s_objet_argument_2).type == NOM) &&
  862:             (((*s_objet_argument_1).type == INT) ||
  863:             ((*s_objet_argument_1).type == REL))))
  864:     {
  865:         if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
  866:         {
  867:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  868:             return;
  869:         }
  870: 
  871:         if (((*s_objet_resultat).objet =
  872:                 allocation_maillon(s_etat_processus)) == NULL)
  873:         {
  874:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  875:             return;
  876:         }
  877: 
  878:         l_element_courant = (*s_objet_resultat).objet;
  879: 
  880:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  881:                 == NULL)
  882:         {
  883:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  884:             return;
  885:         }
  886: 
  887:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  888:                 .nombre_arguments = 0;
  889:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  890:                 .fonction = instruction_vers_niveau_superieur;
  891: 
  892:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  893:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  894:         {
  895:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  896:             return;
  897:         }
  898: 
  899:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  900:                 .nom_fonction, "<<");
  901: 
  902:         if (((*l_element_courant).suivant =
  903:                 allocation_maillon(s_etat_processus)) == NULL)
  904:         {
  905:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  906:             return;
  907:         }
  908: 
  909:         l_element_courant = (*l_element_courant).suivant;
  910:         (*l_element_courant).donnee = s_objet_argument_2;
  911: 
  912:         if (((*l_element_courant).suivant =
  913:                 allocation_maillon(s_etat_processus)) == NULL)
  914:         {
  915:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  916:             return;
  917:         }
  918: 
  919:         l_element_courant = (*l_element_courant).suivant;
  920:         (*l_element_courant).donnee = s_objet_argument_1;
  921: 
  922:         if (((*l_element_courant).suivant =
  923:                 allocation_maillon(s_etat_processus)) == NULL)
  924:         {
  925:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  926:             return;
  927:         }
  928: 
  929:         l_element_courant = (*l_element_courant).suivant;
  930: 
  931:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  932:                 == NULL)
  933:         {
  934:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  935:             return;
  936:         }
  937: 
  938:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  939:                 .nombre_arguments = 0;
  940:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  941:                 .fonction = instruction_xor;
  942: 
  943:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  944:                 .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
  945:         {
  946:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  947:             return;
  948:         }
  949: 
  950:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  951:                 .nom_fonction, "EQV");
  952: 
  953:         if (((*l_element_courant).suivant =
  954:                 allocation_maillon(s_etat_processus)) == NULL)
  955:         {
  956:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  957:             return;
  958:         }
  959: 
  960:         l_element_courant = (*l_element_courant).suivant;
  961: 
  962:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  963:                 == NULL)
  964:         {
  965:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  966:             return;
  967:         }
  968: 
  969:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  970:                 .nombre_arguments = 0;
  971:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  972:                 .fonction = instruction_vers_niveau_inferieur;
  973: 
  974:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  975:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  976:         {
  977:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  978:             return;
  979:         }
  980: 
  981:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  982:                 .nom_fonction, ">>");
  983: 
  984:         (*l_element_courant).suivant = NULL;
  985: 
  986:         s_objet_argument_1 = NULL;
  987:         s_objet_argument_2 = NULL;
  988:     }
  989: 
  990:     /*
  991:      * Nom ou valeur numérique / Expression
  992:      */
  993: 
  994:     else if ((((*s_objet_argument_1).type == ALG) ||
  995:             ((*s_objet_argument_1).type == RPN)) &&
  996:             (((*s_objet_argument_2).type == NOM) ||
  997:             ((*s_objet_argument_2).type == INT) ||
  998:             ((*s_objet_argument_2).type == REL)))
  999:     {
 1000:         nombre_elements = 0;
 1001:         l_element_courant = (struct_liste_chainee *)
 1002:                 (*s_objet_argument_1).objet;
 1003: 
 1004:         while(l_element_courant != NULL)
 1005:         {
 1006:             nombre_elements++;
 1007:             l_element_courant = (*l_element_courant).suivant;
 1008:         }
 1009: 
 1010:         if (nombre_elements == 2)
 1011:         {
 1012:             liberation(s_etat_processus, s_objet_argument_1);
 1013:             liberation(s_etat_processus, s_objet_argument_2);
 1014: 
 1015:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1016:             return;
 1017:         }
 1018: 
 1019:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1020:                 s_objet_argument_1, 'N')) == NULL)
 1021:         {
 1022:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1023:             return;
 1024:         }
 1025: 
 1026:         l_element_courant = (struct_liste_chainee *)
 1027:                 (*s_objet_resultat).objet;
 1028:         l_element_precedent = l_element_courant;
 1029:         l_element_courant = (*l_element_courant).suivant;
 1030: 
 1031:         if (((*l_element_precedent).suivant = (struct_liste_chainee *)
 1032:                 allocation_maillon(s_etat_processus)) == NULL)
 1033:         {
 1034:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1035:             return;
 1036:         }
 1037: 
 1038:         (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
 1039:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1040: 
 1041:         while((*l_element_courant).suivant != NULL)
 1042:         {
 1043:             l_element_precedent = l_element_courant;
 1044:             l_element_courant = (*l_element_courant).suivant;
 1045:         }
 1046: 
 1047:         if (((*l_element_precedent).suivant =
 1048:                 allocation_maillon(s_etat_processus)) == NULL)
 1049:         {
 1050:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1051:             return;
 1052:         }
 1053: 
 1054:         if (((*(*l_element_precedent).suivant).donnee =
 1055:                 allocation(s_etat_processus, FCT)) == NULL)
 1056:         {
 1057:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1058:             return;
 1059:         }
 1060: 
 1061:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1062:                 .donnee).objet)).nombre_arguments = 0;
 1063:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1064:                 .donnee).objet)).fonction = instruction_xor;
 1065: 
 1066:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 1067:                 .suivant).donnee).objet)).nom_fonction =
 1068:                 malloc(4 * sizeof(unsigned char))) == NULL)
 1069:         {
 1070:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1071:             return;
 1072:         }
 1073: 
 1074:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 1075:                 .suivant).donnee).objet)).nom_fonction, "EQV");
 1076: 
 1077:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1078: 
 1079:         s_objet_argument_2 = NULL;
 1080:     }
 1081: 
 1082:     /*
 1083:      * Expression / Nom ou valeur numérique
 1084:      */
 1085: 
 1086:     else if ((((*s_objet_argument_1).type == NOM) ||
 1087:             ((*s_objet_argument_1).type == INT) ||
 1088:             ((*s_objet_argument_1).type == REL)) &&
 1089:             (((*s_objet_argument_2).type == ALG) ||
 1090:             ((*s_objet_argument_2).type == RPN)))
 1091:     {
 1092:         nombre_elements = 0;
 1093:         l_element_courant = (struct_liste_chainee *)
 1094:                 (*s_objet_argument_2).objet;
 1095: 
 1096:         while(l_element_courant != NULL)
 1097:         {
 1098:             nombre_elements++;
 1099:             l_element_courant = (*l_element_courant).suivant;
 1100:         }
 1101: 
 1102:         if (nombre_elements == 2)
 1103:         {
 1104:             liberation(s_etat_processus, s_objet_argument_1);
 1105:             liberation(s_etat_processus, s_objet_argument_2);
 1106: 
 1107:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1108:             return;
 1109:         }
 1110: 
 1111:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1112:                 s_objet_argument_2, 'N')) == NULL)
 1113:         {
 1114:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1115:             return;
 1116:         }
 1117: 
 1118:         l_element_courant = (struct_liste_chainee *)
 1119:                 (*s_objet_resultat).objet;
 1120:         l_element_precedent = l_element_courant;
 1121: 
 1122:         while((*l_element_courant).suivant != NULL)
 1123:         {
 1124:             l_element_precedent = l_element_courant;
 1125:             l_element_courant = (*l_element_courant).suivant;
 1126:         }
 1127: 
 1128:         if (((*l_element_precedent).suivant =
 1129:                 allocation_maillon(s_etat_processus)) == NULL)
 1130:         {
 1131:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1132:             return;
 1133:         }
 1134: 
 1135:         (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
 1136:         l_element_precedent = (*l_element_precedent).suivant;
 1137: 
 1138:         if (((*l_element_precedent).suivant =
 1139:                 allocation_maillon(s_etat_processus)) == NULL)
 1140:         {
 1141:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1142:             return;
 1143:         }
 1144: 
 1145:         if (((*(*l_element_precedent).suivant).donnee =
 1146:                 allocation(s_etat_processus, FCT)) == NULL)
 1147:         {
 1148:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1149:             return;
 1150:         }
 1151: 
 1152:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1153:                 .donnee).objet)).nombre_arguments = 0;
 1154:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1155:                 .donnee).objet)).fonction = instruction_xor;
 1156: 
 1157:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 1158:                 .suivant).donnee).objet)).nom_fonction =
 1159:                 malloc(4 * sizeof(unsigned char))) == NULL)
 1160:         {
 1161:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1162:             return;
 1163:         }
 1164: 
 1165:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 1166:                 .suivant).donnee).objet)).nom_fonction, "EQV");
 1167: 
 1168:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1169: 
 1170:         s_objet_argument_1 = NULL;
 1171:     }
 1172: 
 1173:     /*
 1174:      * Expression / Expression
 1175:      */
 1176: 
 1177:     else if ((((*s_objet_argument_1).type == ALG) &&
 1178:             ((*s_objet_argument_2).type == ALG)) ||
 1179:             (((*s_objet_argument_1).type == RPN) &&
 1180:             ((*s_objet_argument_2).type == RPN)))
 1181:     {
 1182:         nombre_elements = 0;
 1183:         l_element_courant = (struct_liste_chainee *)
 1184:                 (*s_objet_argument_1).objet;
 1185: 
 1186:         while(l_element_courant != NULL)
 1187:         {
 1188:             nombre_elements++;
 1189:             l_element_courant = (*l_element_courant).suivant;
 1190:         }
 1191: 
 1192:         if (nombre_elements == 2)
 1193:         {
 1194:             liberation(s_etat_processus, s_objet_argument_1);
 1195:             liberation(s_etat_processus, s_objet_argument_2);
 1196: 
 1197:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1198:             return;
 1199:         }
 1200: 
 1201:         nombre_elements = 0;
 1202:         l_element_courant = (struct_liste_chainee *)
 1203:                 (*s_objet_argument_2).objet;
 1204: 
 1205:         while(l_element_courant != NULL)
 1206:         {
 1207:             nombre_elements++;
 1208:             l_element_courant = (*l_element_courant).suivant;
 1209:         }
 1210: 
 1211:         if (nombre_elements == 2)
 1212:         {
 1213:             liberation(s_etat_processus, s_objet_argument_1);
 1214:             liberation(s_etat_processus, s_objet_argument_2);
 1215: 
 1216:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1217:             return;
 1218:         }
 1219: 
 1220:         if ((s_copie_argument_1 = copie_objet(s_etat_processus,
 1221:                 s_objet_argument_1, 'N')) == NULL)
 1222:         {
 1223:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1224:             return;
 1225:         }
 1226: 
 1227:         if ((s_copie_argument_2 = copie_objet(s_etat_processus,
 1228:                 s_objet_argument_2, 'N')) == NULL)
 1229:         {
 1230:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1231:             return;
 1232:         }
 1233: 
 1234:         l_element_courant = (struct_liste_chainee *)
 1235:                 (*s_copie_argument_1).objet;
 1236:         (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
 1237:                 (*s_copie_argument_1).objet)).suivant;
 1238: 
 1239:         liberation(s_etat_processus, (*l_element_courant).donnee);
 1240:         free(l_element_courant);
 1241: 
 1242:         l_element_courant = (struct_liste_chainee *)
 1243:                 (*s_copie_argument_2).objet;
 1244:         l_element_precedent = l_element_courant;
 1245:         s_objet_resultat = s_copie_argument_2;
 1246: 
 1247:         while((*l_element_courant).suivant != NULL)
 1248:         {
 1249:             l_element_precedent = l_element_courant;
 1250:             l_element_courant = (*l_element_courant).suivant;
 1251:         }
 1252: 
 1253:         liberation(s_etat_processus, (*l_element_courant).donnee);
 1254:         free(l_element_courant);
 1255: 
 1256:         (*l_element_precedent).suivant = (struct_liste_chainee *)
 1257:                 (*s_copie_argument_1).objet;
 1258:         free(s_copie_argument_1);
 1259: 
 1260:         l_element_courant = (*l_element_precedent).suivant;
 1261:         while((*l_element_courant).suivant != NULL)
 1262:         {
 1263:             l_element_precedent = l_element_courant;
 1264:             l_element_courant = (*l_element_courant).suivant;
 1265:         }
 1266: 
 1267:         if (((*l_element_precedent).suivant =
 1268:                 allocation_maillon(s_etat_processus)) == NULL)
 1269:         {
 1270:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1271:             return;
 1272:         }
 1273: 
 1274:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1275:         l_element_courant = (*l_element_precedent).suivant;
 1276: 
 1277:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1278:                 == NULL)
 1279:         {
 1280:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1281:             return;
 1282:         }
 1283: 
 1284:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1285:                 .nombre_arguments = 0;
 1286:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1287:                 .fonction = instruction_xor;
 1288: 
 1289:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1290:                 .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
 1291:         {
 1292:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1293:             return;
 1294:         }
 1295: 
 1296:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1297:                 .nom_fonction, "EQV");
 1298:     }
 1299: 
 1300: /*
 1301: --------------------------------------------------------------------------------
 1302:   EQV impossible
 1303: --------------------------------------------------------------------------------
 1304: */
 1305: 
 1306:     else
 1307:     {
 1308:         liberation(s_etat_processus, s_objet_argument_1);
 1309:         liberation(s_etat_processus, s_objet_argument_2);
 1310: 
 1311:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1312:         return;
 1313:     }
 1314: 
 1315:     liberation(s_etat_processus, s_objet_argument_1);
 1316:     liberation(s_etat_processus, s_objet_argument_2);
 1317: 
 1318:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1319:             s_objet_resultat) == d_erreur)
 1320:     {
 1321:         return;
 1322:     }
 1323: 
 1324:     return;
 1325: }
 1326: 
 1327: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>