File:  [local] / rpl / src / instructions_n1.c
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Wed Jan 27 22:22:14 2010 UTC (14 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_10, HEAD


Changement de version pour la 4.0.10.
Correction d'un dysfonctionnement dans le retour des erreurs des fonctions
RPL/C lorsque le programme est compilé (routine evaluation()).

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.10
    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl.conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'neg'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_neg(struct_processus *s_etat_processus)
   40: {
   41:     logical1                    drapeau;
   42: 
   43:     struct_liste_chainee        *l_element_courant;
   44:     struct_liste_chainee        *l_element_precedent;
   45:     struct_liste_chainee        *l_element_tampon;
   46: 
   47:     struct_objet                *s_copie_argument;
   48:     struct_objet                *s_objet_argument;
   49:     struct_objet                *s_objet_resultat;
   50: 
   51:     unsigned long               i;
   52:     unsigned long               j;
   53: 
   54:     (*s_etat_processus).erreur_execution = d_ex;
   55: 
   56:     if ((*s_etat_processus).affichage_arguments == 'Y')
   57:     {
   58:         printf("\n  NEG ");
   59: 
   60:         if ((*s_etat_processus).langue == 'F')
   61:         {
   62:             printf("(opposition)\n\n");
   63:         }
   64:         else
   65:         {
   66:             printf("(opposition)\n\n");
   67:         }
   68: 
   69:         printf("    1: %s, %s, %s\n", d_INT, d_REL, d_CPL);
   70:         printf("->  1: %s, %s, %s\n\n", d_INT, d_REL, d_CPL);
   71: 
   72:         printf("    1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
   73:         printf("->  1: %s, %s, %s\n\n", d_VIN, d_VRL, d_VCX);
   74: 
   75:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
   76:         printf("->  1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
   77: 
   78:         printf("    1: %s, %s\n", d_NOM, d_ALG);
   79:         printf("->  1: %s\n\n", d_ALG);
   80: 
   81:         printf("    1: %s\n", d_RPN);
   82:         printf("->  1: %s\n", d_RPN);
   83: 
   84:         return;
   85:     }
   86:     else if ((*s_etat_processus).test_instruction == 'Y')
   87:     {
   88:         (*s_etat_processus).nombre_arguments = 1;
   89:         return;
   90:     }
   91:     
   92:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   93:     {
   94:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
   95:         {
   96:             return;
   97:         }
   98:     }
   99: 
  100:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  101:             &s_objet_argument) == d_erreur)
  102:     {
  103:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  104:         return;
  105:     }
  106: 
  107: /*
  108: --------------------------------------------------------------------------------
  109:   Opposition d'un entier
  110: --------------------------------------------------------------------------------
  111: */
  112: 
  113:     if ((*s_objet_argument).type == INT)
  114:     {
  115:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  116:                 s_objet_argument, 'Q')) == NULL)
  117:         {
  118:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  119:             return;
  120:         }
  121: 
  122:         /*
  123:          * Permet d'éviter les résultats du type -0. Valable pour tous
  124:          * les types...
  125:          */
  126: 
  127:         if ((*((integer8 *) (*s_objet_argument).objet)) != 0)
  128:         {
  129:             (*((integer8 *) (*s_objet_resultat).objet)) =
  130:                     -(*((integer8 *) (*s_objet_argument).objet));
  131:         }
  132:     }
  133: 
  134: /*
  135: --------------------------------------------------------------------------------
  136:   Opposition d'un réel
  137: --------------------------------------------------------------------------------
  138: */
  139: 
  140:     else if ((*s_objet_argument).type == REL)
  141:     {
  142:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  143:                 s_objet_argument, 'Q')) == NULL)
  144:         {
  145:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  146:             return;
  147:         }
  148: 
  149:         if ((*((real8 *) (*s_objet_argument).objet)) != 0)
  150:         {
  151:             (*((real8 *) (*s_objet_resultat).objet)) =
  152:                     -(*((real8 *) (*s_objet_argument).objet));
  153:         }
  154:     }
  155: 
  156: /*
  157: --------------------------------------------------------------------------------
  158:   Opposition d'un complexe
  159: --------------------------------------------------------------------------------
  160: */
  161: 
  162:     else if ((*s_objet_argument).type == CPL)
  163:     {
  164:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  165:                 s_objet_argument, 'Q')) == NULL)
  166:         {
  167:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  168:             return;
  169:         }
  170: 
  171:         if ((*((struct_complexe16 *) (*s_objet_argument).objet)).partie_reelle
  172:                 != 0)
  173:         {
  174:             (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle =
  175:                     -(*((struct_complexe16 *) (*s_objet_argument).objet))
  176:                     .partie_reelle;
  177:         }
  178: 
  179:         if ((*((struct_complexe16 *) (*s_objet_argument).objet))
  180:                 .partie_imaginaire != 0)
  181:         {
  182:             (*((struct_complexe16 *) (*s_objet_resultat).objet))
  183:                     .partie_imaginaire =
  184:                     -(*((struct_complexe16 *) (*s_objet_argument).objet))
  185:                     .partie_imaginaire;
  186:         }
  187:     }
  188: 
  189: /*
  190: --------------------------------------------------------------------------------
  191:   Opposition d'un vecteur d'entiers
  192: --------------------------------------------------------------------------------
  193: */
  194: 
  195:     else if ((*s_objet_argument).type == VIN)
  196:     {
  197:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  198:                 s_objet_argument, 'Q')) == NULL)
  199:         {
  200:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  201:             return;
  202:         }
  203: 
  204:         for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument).objet)))
  205:                 .taille; i++)
  206:         {
  207:             if (((integer8 *) (*(((struct_vecteur *)
  208:                     (*s_objet_argument).objet))).tableau)[i] != 0)
  209:             {
  210:                 ((integer8 *) (*(((struct_vecteur *) (*s_objet_resultat)
  211:                         .objet))).tableau)[i] = -((integer8 *)
  212:                         (*(((struct_vecteur *)
  213:                         (*s_objet_argument).objet))).tableau)[i];
  214:             }
  215:         }
  216:     }
  217: 
  218: /*
  219: --------------------------------------------------------------------------------
  220:   Opposition d'un vecteur de réels
  221: --------------------------------------------------------------------------------
  222: */
  223: 
  224:     else if ((*s_objet_argument).type == VRL)
  225:     {
  226:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  227:                 s_objet_argument, 'Q')) == NULL)
  228:         {
  229:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  230:             return;
  231:         }
  232: 
  233:         for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument).objet)))
  234:                 .taille; i++)
  235:         {
  236:             if (((real8 *) (*(((struct_vecteur *) (*s_objet_argument).objet)))
  237:                     .tableau)[i] != 0)
  238:             {
  239:                 ((real8 *) (*(((struct_vecteur *) (*s_objet_resultat)
  240:                         .objet))).tableau)[i] = -((real8 *)
  241:                         (*(((struct_vecteur *)
  242:                         (*s_objet_argument).objet))).tableau)[i];
  243:             }
  244:         }
  245:     }
  246: 
  247: /*
  248: --------------------------------------------------------------------------------
  249:   Opposition d'un vecteur de complexes
  250: --------------------------------------------------------------------------------
  251: */
  252: 
  253:     else if ((*s_objet_argument).type == VCX)
  254:     {
  255:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  256:                 s_objet_argument, 'Q')) == NULL)
  257:         {
  258:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  259:             return;
  260:         }
  261: 
  262:         for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument).objet)))
  263:                 .taille; i++)
  264:         {
  265:             if (((struct_complexe16 *) (*(((struct_vecteur *)
  266:                     (*s_objet_argument).objet))).tableau)[i].partie_reelle != 0)
  267:             {
  268:                 ((struct_complexe16 *) (*(((struct_vecteur *)
  269:                         (*s_objet_resultat)
  270:                         .objet))).tableau)[i].partie_reelle =
  271:                         -((struct_complexe16 *) (*(((struct_vecteur *)
  272:                         (*s_objet_argument).objet))).tableau)[i].partie_reelle;
  273:             }
  274: 
  275:             if (((struct_complexe16 *) (*(((struct_vecteur *)
  276:                     (*s_objet_argument).objet))).tableau)[i].partie_imaginaire
  277:                     != 0)
  278:             {
  279:                 ((struct_complexe16 *) (*(((struct_vecteur *)
  280:                         (*s_objet_resultat).objet))).tableau)[i]
  281:                         .partie_imaginaire = -((struct_complexe16 *)
  282:                         (*(((struct_vecteur *) (*s_objet_argument).objet)))
  283:                         .tableau)[i].partie_imaginaire;
  284:             }
  285:         }
  286:     }
  287: 
  288: /*
  289: --------------------------------------------------------------------------------
  290:   Opposition d'une matrice d'entiers
  291: --------------------------------------------------------------------------------
  292: */
  293: 
  294:     else if ((*s_objet_argument).type == MIN)
  295:     {
  296:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  297:                 s_objet_argument, 'Q')) == NULL)
  298:         {
  299:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  300:             return;
  301:         }
  302: 
  303:         for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument).objet)))
  304:                 .nombre_lignes; i++)
  305:         {
  306:             for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument).objet)))
  307:                     .nombre_colonnes; j++)
  308:             {
  309:                 if (((integer8 **) (*(((struct_matrice *) (*s_objet_argument)
  310:                         .objet))).tableau)[i][j] != 0)
  311:                 {
  312:                     ((integer8 **) (*(((struct_matrice *) (*s_objet_resultat)
  313:                             .objet))).tableau)[i][j] = -((integer8 **)
  314:                             (*(((struct_matrice *)
  315:                             (*s_objet_argument).objet))).tableau)[i][j];
  316:                 }
  317:             }
  318:         }
  319:     }
  320: 
  321: /*
  322: --------------------------------------------------------------------------------
  323:   Opposition d'une matrice de réels
  324: --------------------------------------------------------------------------------
  325: */
  326: 
  327:     else if ((*s_objet_argument).type == MRL)
  328:     {
  329:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  330:                 s_objet_argument, 'Q')) == NULL)
  331:         {
  332:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  333:             return;
  334:         }
  335: 
  336:         for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument).objet)))
  337:                 .nombre_lignes; i++)
  338:         {
  339:             for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument).objet)))
  340:                     .nombre_colonnes; j++)
  341:             {
  342:                 if (((real8 **) (*(((struct_matrice *) (*s_objet_argument)
  343:                         .objet))).tableau)[i][j] != 0)
  344:                 {
  345:                     ((real8 **) (*(((struct_matrice *) (*s_objet_resultat)
  346:                             .objet))).tableau)[i][j] = -((real8 **)
  347:                             (*(((struct_matrice *)
  348:                             (*s_objet_argument).objet))).tableau)[i][j];
  349:                 }
  350:             }
  351:         }
  352:     }
  353: 
  354: /*
  355: --------------------------------------------------------------------------------
  356:   Opposition d'une matrice de complexes
  357: --------------------------------------------------------------------------------
  358: */
  359: 
  360:     else if ((*s_objet_argument).type == MCX)
  361:     {
  362:         if ((s_objet_resultat = copie_objet(s_etat_processus,
  363:                 s_objet_argument, 'Q')) == NULL)
  364:         {
  365:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  366:             return;
  367:         }
  368: 
  369:         for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument).objet)))
  370:                 .nombre_lignes; i++)
  371:         {
  372:             for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument).objet)))
  373:                     .nombre_colonnes; j++)
  374:             {
  375:                 if (((struct_complexe16 **) (*(((struct_matrice *)
  376:                         (*s_objet_argument).objet))).tableau)[i][j]
  377:                         .partie_reelle != 0)
  378:                 {
  379:                     ((struct_complexe16 **) (*(((struct_matrice *)
  380:                             (*s_objet_resultat).objet))).tableau)[i][j]
  381:                             .partie_reelle = -((struct_complexe16 **)
  382:                             (*(((struct_matrice *) (*s_objet_argument).objet)))
  383:                             .tableau)[i][j].partie_reelle;
  384:                 }
  385: 
  386:                 if (((struct_complexe16 **) (*(((struct_matrice *)
  387:                         (*s_objet_argument).objet))).tableau)[i][j]
  388:                         .partie_imaginaire != 0)
  389:                 {
  390:                     ((struct_complexe16 **) (*(((struct_matrice *)
  391:                             (*s_objet_resultat).objet))).tableau)[i][j]
  392:                             .partie_imaginaire = -((struct_complexe16 **)
  393:                             (*(((struct_matrice *) (*s_objet_argument).objet)))
  394:                             .tableau)[i][j].partie_imaginaire;
  395:                 }
  396:             }
  397:         }
  398:     }
  399: 
  400: /*
  401: --------------------------------------------------------------------------------
  402:   Opposition d'un nom
  403: --------------------------------------------------------------------------------
  404: */
  405: 
  406:     else if ((*s_objet_argument).type == NOM)
  407:     {
  408:         if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
  409:         {
  410:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  411:             return;
  412:         }
  413: 
  414:         if (((*s_objet_resultat).objet =
  415:                 allocation_maillon(s_etat_processus)) == NULL)
  416:         {
  417:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  418:             return;
  419:         }
  420: 
  421:         l_element_courant = (*s_objet_resultat).objet;
  422: 
  423:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  424:                 == NULL)
  425:         {
  426:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  427:             return;
  428:         }
  429: 
  430:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  431:                 .nombre_arguments = 0;
  432:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  433:                 .fonction = instruction_vers_niveau_superieur;
  434: 
  435:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  436:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  437:         {
  438:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  439:             return;
  440:         }
  441: 
  442:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  443:                 .nom_fonction, "<<");
  444: 
  445:         if (((*l_element_courant).suivant =
  446:                 allocation_maillon(s_etat_processus)) == NULL)
  447:         {
  448:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  449:             return;
  450:         }
  451: 
  452:         l_element_courant = (*l_element_courant).suivant;
  453:         (*l_element_courant).donnee = s_objet_argument;
  454: 
  455:         if (((*l_element_courant).suivant =
  456:                 allocation_maillon(s_etat_processus)) == NULL)
  457:         {
  458:             (*s_etat_processus).erreur_systeme = 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, FCT))
  465:                 == NULL)
  466:         {
  467:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  468:             return;
  469:         }
  470: 
  471:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  472:                 .nombre_arguments = 1;
  473:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  474:                 .fonction = instruction_neg;
  475: 
  476:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  477:                 .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
  478:         {
  479:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  480:             return;
  481:         }
  482: 
  483:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  484:                 .nom_fonction, "NEG");
  485: 
  486:         if (((*l_element_courant).suivant =
  487:                 allocation_maillon(s_etat_processus)) == NULL)
  488:         {
  489:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  490:             return;
  491:         }
  492: 
  493:         l_element_courant = (*l_element_courant).suivant;
  494: 
  495:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  496:                 == NULL)
  497:         {
  498:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  499:             return;
  500:         }
  501: 
  502:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  503:                 .nombre_arguments = 0;
  504:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  505:                 .fonction = instruction_vers_niveau_inferieur;
  506: 
  507:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  508:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  509:         {
  510:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  511:             return;
  512:         }
  513: 
  514:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  515:                 .nom_fonction, ">>");
  516: 
  517:         (*l_element_courant).suivant = NULL;
  518:         s_objet_argument = NULL;
  519:     }
  520: 
  521: /*
  522: --------------------------------------------------------------------------------
  523:   Opposition d'une expression
  524: --------------------------------------------------------------------------------
  525: */
  526: 
  527:     else if (((*s_objet_argument).type == ALG) ||
  528:             ((*s_objet_argument).type == RPN))
  529:     {
  530:         if ((s_copie_argument = copie_objet(s_etat_processus,
  531:                 s_objet_argument, 'N')) == NULL)
  532:         {
  533:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  534:             return;
  535:         }
  536: 
  537:         liberation(s_etat_processus, s_objet_argument);
  538:         s_objet_argument = s_copie_argument;
  539: 
  540:         l_element_courant = (struct_liste_chainee *)
  541:                 (*s_objet_argument).objet;
  542:         l_element_precedent = l_element_courant;
  543: 
  544:         while((*l_element_courant).suivant != NULL)
  545:         {
  546:             l_element_precedent = l_element_courant;
  547:             l_element_courant = (*l_element_courant).suivant;
  548:         }
  549: 
  550:         drapeau = d_vrai;
  551: 
  552:         if ((*(*l_element_precedent).donnee).type == FCT)
  553:         {
  554:             if (strcmp((*((struct_fonction *) (*(*l_element_precedent).donnee)
  555:                     .objet)).nom_fonction, "NEG") == 0)
  556:             {
  557:                 drapeau = d_faux;
  558: 
  559:                 l_element_courant = (struct_liste_chainee *)
  560:                         (*s_objet_argument).objet;
  561: 
  562:                 while((*l_element_courant).suivant != l_element_precedent)
  563:                 {
  564:                     l_element_courant = (*l_element_courant).suivant;
  565:                 }
  566: 
  567:                 l_element_tampon = (*l_element_courant).suivant;
  568:                 (*l_element_courant).suivant = (*l_element_precedent).suivant;
  569: 
  570:                 liberation(s_etat_processus, (*l_element_tampon).donnee);
  571:                 free(l_element_tampon);
  572:             }
  573:         }
  574: 
  575:         if (drapeau == d_vrai)
  576:         {
  577:             if (((*l_element_precedent).suivant =
  578:                     allocation_maillon(s_etat_processus)) == NULL)
  579:             {
  580:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  581:                 return;
  582:             }
  583: 
  584:             if (((*(*l_element_precedent).suivant).donnee =
  585:                     allocation(s_etat_processus, FCT)) == NULL)
  586:             {
  587:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  588:                 return;
  589:             }
  590: 
  591:             (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
  592:                     .donnee).objet)).nombre_arguments = 1;
  593:             (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
  594:                     .donnee).objet)).fonction = instruction_neg;
  595: 
  596:             if (((*((struct_fonction *) (*(*(*l_element_precedent)
  597:                     .suivant).donnee).objet)).nom_fonction =
  598:                     malloc(4 * sizeof(unsigned char))) == NULL)
  599:             {
  600:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  601:                 return;
  602:             }
  603: 
  604:             strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
  605:                     .suivant).donnee).objet)).nom_fonction, "NEG");
  606: 
  607:             (*(*l_element_precedent).suivant).suivant = l_element_courant;
  608:         }
  609: 
  610:         s_objet_resultat = s_objet_argument;
  611:         s_objet_argument = NULL;
  612:     }
  613: 
  614: /*
  615: --------------------------------------------------------------------------------
  616:   Opposition impossible
  617: --------------------------------------------------------------------------------
  618: */
  619: 
  620:     else
  621:     {
  622:         liberation(s_etat_processus, s_objet_argument);
  623: 
  624:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  625:         return;
  626:     }
  627: 
  628:     liberation(s_etat_processus, s_objet_argument);
  629: 
  630:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  631:             s_objet_resultat) == d_erreur)
  632:     {
  633:         return;
  634:     }
  635: 
  636:     return;
  637: }
  638: 
  639: 
  640: /*
  641: ================================================================================
  642:   Fonction 'not'
  643: ================================================================================
  644:   Entrées : pointeur sur une struct_processus
  645: --------------------------------------------------------------------------------
  646:   Sorties :
  647: --------------------------------------------------------------------------------
  648:   Effets de bord : néant
  649: ================================================================================
  650: */
  651: 
  652: void
  653: instruction_not(struct_processus *s_etat_processus)
  654: {
  655:     struct_liste_chainee            *l_element_courant;
  656:     struct_liste_chainee            *l_element_precedent;
  657: 
  658:     struct_objet                    *s_copie_argument;
  659:     struct_objet                    *s_objet_argument;
  660:     struct_objet                    *s_objet_resultat;
  661: 
  662:     (*s_etat_processus).erreur_execution = d_ex;
  663: 
  664:     if ((*s_etat_processus).affichage_arguments == 'Y')
  665:     {
  666:         printf("\n  NOT ");
  667: 
  668:         if ((*s_etat_processus).langue == 'F')
  669:         {
  670:             printf("(complément)\n\n");
  671:         }
  672:         else
  673:         {
  674:             printf("(complement)\n\n");
  675:         }
  676: 
  677:         printf("    1: %s, %s\n", d_INT, d_REL);
  678:         printf("->  1: %s\n\n", d_INT);
  679: 
  680:         printf("    1: %s\n", d_BIN);
  681:         printf("->  1: %s\n\n", d_BIN);
  682: 
  683:         printf("    1: %s, %s\n", d_NOM, d_ALG);
  684:         printf("->  1: %s\n\n", d_ALG);
  685: 
  686:         printf("    1: %s\n", d_RPN);
  687:         printf("->  1: %s\n", d_RPN);
  688: 
  689:         return;
  690:     }
  691:     else if ((*s_etat_processus).test_instruction == 'Y')
  692:     {
  693:         (*s_etat_processus).nombre_arguments = 1;
  694:         return;
  695:     }
  696:     
  697:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  698:     {
  699:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  700:         {
  701:             return;
  702:         }
  703:     }
  704: 
  705:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  706:             &s_objet_argument) == d_erreur)
  707:     {
  708:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  709:         return;
  710:     }
  711: 
  712: /*
  713: --------------------------------------------------------------------------------
  714:   NOT logique
  715: --------------------------------------------------------------------------------
  716: */
  717: 
  718:     if (((*s_objet_argument).type == INT) ||
  719:             ((*s_objet_argument).type == REL))
  720:     {
  721:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
  722:         {
  723:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  724:             return;
  725:         }
  726: 
  727:         if ((*s_objet_argument).type == INT)
  728:         {
  729:             if ((*((integer8 *) (*s_objet_argument).objet)) == 0)
  730:             {
  731:                 (*((integer8 *) (*s_objet_resultat).objet)) = -1;
  732:             }
  733:             else
  734:             {
  735:                 (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  736:             }
  737:         }
  738:         else
  739:         {
  740:             if ((*((real8 *) (*s_objet_argument).objet)) == 0)
  741:             {
  742:                 (*((integer8 *) (*s_objet_resultat).objet)) = -1;
  743:             }
  744:             else
  745:             {
  746:                 (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  747:             }
  748:         }
  749:     }
  750: 
  751: /*
  752: --------------------------------------------------------------------------------
  753:   NOT binaire
  754: --------------------------------------------------------------------------------
  755: */
  756: 
  757:     else if ((*s_objet_argument).type == BIN)
  758:     {
  759:         (*((logical8 *) (*s_objet_argument).objet)) =
  760:                 ~(*((logical8 *) (*s_objet_argument).objet));
  761: 
  762:         s_objet_resultat = s_objet_argument;
  763:         s_objet_argument = NULL;
  764:     }
  765: 
  766: /*
  767: --------------------------------------------------------------------------------
  768:   NOT d'un nom
  769: --------------------------------------------------------------------------------
  770: */
  771: 
  772:     else if ((*s_objet_argument).type == NOM)
  773:     {
  774:         if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
  775:         {
  776:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  777:             return;
  778:         }
  779: 
  780:         if (((*s_objet_resultat).objet =
  781:                 allocation_maillon(s_etat_processus)) == NULL)
  782:         {
  783:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  784:             return;
  785:         }
  786: 
  787:         l_element_courant = (*s_objet_resultat).objet;
  788: 
  789:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  790:                 == NULL)
  791:         {
  792:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  793:             return;
  794:         }
  795: 
  796:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  797:                 .nombre_arguments = 0;
  798:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  799:                 .fonction = instruction_vers_niveau_superieur;
  800: 
  801:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  802:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  803:         {
  804:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  805:             return;
  806:         }
  807: 
  808:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  809:                 .nom_fonction, "<<");
  810: 
  811:         if (((*l_element_courant).suivant =
  812:                 allocation_maillon(s_etat_processus)) == NULL)
  813:         {
  814:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  815:             return;
  816:         }
  817: 
  818:         l_element_courant = (*l_element_courant).suivant;
  819:         (*l_element_courant).donnee = s_objet_argument;
  820: 
  821:         if (((*l_element_courant).suivant =
  822:                 allocation_maillon(s_etat_processus)) == NULL)
  823:         {
  824:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  825:             return;
  826:         }
  827: 
  828:         l_element_courant = (*l_element_courant).suivant;
  829: 
  830:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  831:                 == NULL)
  832:         {
  833:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  834:             return;
  835:         }
  836: 
  837:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  838:                 .nombre_arguments = 1;
  839:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  840:                 .fonction = instruction_not;
  841: 
  842:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  843:                 .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
  844:         {
  845:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  846:             return;
  847:         }
  848:             
  849:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  850:                 .nom_fonction, "NOT");
  851: 
  852:         if (((*l_element_courant).suivant =
  853:                 allocation_maillon(s_etat_processus)) == NULL)
  854:         {
  855:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  856:             return;
  857:         }
  858: 
  859:         l_element_courant = (*l_element_courant).suivant;
  860: 
  861:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  862:                 == NULL)
  863:         {
  864:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  865:             return;
  866:         }
  867: 
  868:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  869:                 .nombre_arguments = 0;
  870:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  871:                 .fonction = instruction_vers_niveau_inferieur;
  872: 
  873:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  874:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  875:         {
  876:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  877:             return;
  878:         }
  879: 
  880:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  881:                 .nom_fonction, ">>");
  882: 
  883:         (*l_element_courant).suivant = NULL;
  884:         s_objet_argument = NULL;
  885:     }
  886: 
  887: /*
  888: --------------------------------------------------------------------------------
  889:   NOT d'une expression
  890: --------------------------------------------------------------------------------
  891: */
  892: 
  893:     else if (((*s_objet_argument).type == ALG) ||
  894:             ((*s_objet_argument).type == RPN))
  895:     {
  896:         if ((s_copie_argument = copie_objet(s_etat_processus,
  897:                 s_objet_argument, 'N')) == NULL)
  898:         {
  899:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  900:             return;
  901:         }
  902: 
  903:         l_element_courant = (struct_liste_chainee *)
  904:                 (*s_copie_argument).objet;
  905:         l_element_precedent = l_element_courant;
  906: 
  907:         while((*l_element_courant).suivant != NULL)
  908:         {
  909:             l_element_precedent = l_element_courant;
  910:             l_element_courant = (*l_element_courant).suivant;
  911:         }
  912: 
  913:         if (((*l_element_precedent).suivant =
  914:                 allocation_maillon(s_etat_processus)) == NULL)
  915:         {
  916:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  917:             return;
  918:         }
  919: 
  920:         if (((*(*l_element_precedent).suivant).donnee =
  921:                 allocation(s_etat_processus, FCT)) == NULL)
  922:         {
  923:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  924:             return;
  925:         }
  926: 
  927:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
  928:                 .donnee).objet)).nombre_arguments = 1;
  929:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
  930:                 .donnee).objet)).fonction = instruction_not;
  931: 
  932:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
  933:                 .suivant).donnee).objet)).nom_fonction =
  934:                 malloc(4 * sizeof(unsigned char))) == NULL)
  935:         {
  936:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  937:             return;
  938:         }
  939: 
  940:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
  941:                 .suivant).donnee).objet)).nom_fonction, "NOT");
  942: 
  943:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
  944: 
  945:         s_objet_resultat = s_copie_argument;
  946:     }
  947: 
  948: /*
  949: --------------------------------------------------------------------------------
  950:   NOT impossible
  951: --------------------------------------------------------------------------------
  952: */
  953: 
  954:     else
  955:     {
  956:         liberation(s_etat_processus, s_objet_argument);
  957: 
  958:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  959:         return;
  960:     }
  961: 
  962:     liberation(s_etat_processus, s_objet_argument);
  963: 
  964:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  965:             s_objet_resultat) == d_erreur)
  966:     {
  967:         return;
  968:     }
  969: 
  970:     return;
  971: }
  972: 
  973: 
  974: /*
  975: ================================================================================
  976:   Fonction '<>'
  977: ================================================================================
  978:   Entrées :
  979: --------------------------------------------------------------------------------
  980:   Sorties :
  981: --------------------------------------------------------------------------------
  982:   Effets de bord : néant
  983: ================================================================================
  984: */
  985: 
  986: void
  987: instruction_ne(struct_processus *s_etat_processus)
  988: {
  989:     struct_liste_chainee        *l_element_courant;
  990:     struct_liste_chainee        *l_element_courant_1;
  991:     struct_liste_chainee        *l_element_courant_2;
  992:     struct_liste_chainee        *l_element_precedent;
  993: 
  994:     struct_objet                *s_copie_argument_1;
  995:     struct_objet                *s_copie_argument_2;
  996:     struct_objet                *s_objet_argument_1;
  997:     struct_objet                *s_objet_argument_2;
  998:     struct_objet                *s_objet_resultat;
  999:     struct_objet                *s_objet_resultat_intermediaire;
 1000: 
 1001:     logical1                    difference;
 1002: 
 1003:     unsigned long               i;
 1004:     unsigned long               j;
 1005:     unsigned long               nombre_elements;
 1006: 
 1007:     (*s_etat_processus).erreur_execution = d_ex;
 1008: 
 1009:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1010:     {
 1011:         printf("\n  <> ");
 1012: 
 1013:         if ((*s_etat_processus).langue == 'F')
 1014:         {
 1015:             printf("(opérateur différence)\n\n");
 1016:         }
 1017:         else
 1018:         {
 1019:             printf("(different)\n\n");
 1020:         }
 1021: 
 1022:         printf("    2: %s, %s\n", d_INT, d_REL);
 1023:         printf("    1: %s, %s\n", d_INT, d_REL);
 1024:         printf("->  1: %s\n\n", d_INT);
 1025: 
 1026:         printf("    2: %s\n", d_BIN);
 1027:         printf("    1: %s\n", d_BIN);
 1028:         printf("->  1: %s\n\n", d_INT);
 1029: 
 1030:         printf("    2: %s\n", d_CHN);
 1031:         printf("    1: %s\n", d_CHN);
 1032:         printf("->  1: %s\n\n", d_INT);
 1033: 
 1034:         printf("    2: %s\n", d_NOM);
 1035:         printf("    1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
 1036:         printf("->  1: %s\n\n", d_ALG);
 1037: 
 1038:         printf("    2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
 1039:         printf("    1: %s\n", d_NOM);
 1040:         printf("->  1: %s\n\n", d_ALG);
 1041: 
 1042:         printf("    2: %s\n", d_ALG);
 1043:         printf("    1: %s\n", d_ALG);
 1044:         printf("->  1: %s\n\n", d_ALG);
 1045: 
 1046:         printf("    2: %s\n", d_RPN);
 1047:         printf("    1: %s\n", d_RPN);
 1048:         printf("->  1: %s\n", d_RPN);
 1049: 
 1050:         return;
 1051:     }
 1052:     else if ((*s_etat_processus).test_instruction == 'Y')
 1053:     {
 1054:         (*s_etat_processus).nombre_arguments = 0;
 1055:         return;
 1056:     }
 1057:     
 1058:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1059:     {
 1060:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
 1061:         {
 1062:             return;
 1063:         }
 1064:     }
 1065: 
 1066:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1067:             &s_objet_argument_1) == d_erreur)
 1068:     {
 1069:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1070:         return;
 1071:     }
 1072: 
 1073:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1074:             &s_objet_argument_2) == d_erreur)
 1075:     {
 1076:         liberation(s_etat_processus, s_objet_argument_1);
 1077: 
 1078:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1079:         return;
 1080:     }
 1081: 
 1082: /*
 1083: --------------------------------------------------------------------------------
 1084:   SAME NOT sur des valeurs numériques
 1085: --------------------------------------------------------------------------------
 1086: */
 1087: 
 1088:     if ((((*s_objet_argument_1).type == INT) ||
 1089:             ((*s_objet_argument_1).type == REL)) &&
 1090:             (((*s_objet_argument_2).type == INT) ||
 1091:             ((*s_objet_argument_2).type == REL)))
 1092:     {
 1093:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1094:         {
 1095:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1096:             return;
 1097:         }
 1098: 
 1099:         if ((*s_objet_argument_1).type == INT)
 1100:         {
 1101:             if ((*s_objet_argument_2).type == INT)
 1102:             {
 1103:                 (*((integer8 *) (*s_objet_resultat).objet)) =
 1104:                         ((*((integer8 *) (*s_objet_argument_1).objet)) !=
 1105:                         (*((integer8 *) (*s_objet_argument_2).objet)))
 1106:                         ? -1 : 0;
 1107:             }
 1108:             else
 1109:             {
 1110:                 (*((integer8 *) (*s_objet_resultat).objet)) =
 1111:                         ((*((integer8 *) (*s_objet_argument_1).objet)) !=
 1112:                         (*((real8 *) (*s_objet_argument_2).objet)))
 1113:                         ? -1 : 0;
 1114:             }
 1115:         }
 1116:         else
 1117:         {
 1118:             if ((*s_objet_argument_2).type == INT)
 1119:             {
 1120:                 (*((integer8 *) (*s_objet_resultat).objet)) =
 1121:                         ((*((real8 *) (*s_objet_argument_1).objet)) !=
 1122:                         (*((integer8 *) (*s_objet_argument_2).objet)))
 1123:                         ? -1 : 0;
 1124:             }
 1125:             else
 1126:             {
 1127:                 (*((integer8 *) (*s_objet_resultat).objet)) =
 1128:                         ((*((real8 *) (*s_objet_argument_1).objet)) !=
 1129:                         (*((real8 *) (*s_objet_argument_2).objet)))
 1130:                         ? -1 : 0;
 1131:             }
 1132:         }
 1133:     }
 1134: 
 1135: /*
 1136: --------------------------------------------------------------------------------
 1137:   SAME NOT complexe
 1138: --------------------------------------------------------------------------------
 1139: */
 1140: 
 1141:     else if (((*s_objet_argument_1).type == CPL) &&
 1142:             ((*s_objet_argument_2).type == CPL))
 1143:     {
 1144:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1145:         {
 1146:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1147:             return;
 1148:         }
 1149: 
 1150:         (*((integer8 *) (*s_objet_resultat).objet)) =
 1151:                 (((*((struct_complexe16 *) (*s_objet_argument_1).objet))
 1152:                 .partie_reelle != (*((struct_complexe16 *) (*s_objet_argument_2)
 1153:                 .objet)).partie_reelle) || ((*((struct_complexe16 *)
 1154:                 (*s_objet_argument_1).objet)).partie_imaginaire !=
 1155:                 ((*((struct_complexe16 *) (*s_objet_argument_1).objet))
 1156:                 .partie_imaginaire))) ? -1 : 0;
 1157:     }
 1158: 
 1159: /*
 1160: --------------------------------------------------------------------------------
 1161:   SAME NOT binaire
 1162: --------------------------------------------------------------------------------
 1163: */
 1164: 
 1165:     else if (((*s_objet_argument_1).type == BIN) &&
 1166:             ((*s_objet_argument_2).type == BIN))
 1167:     {
 1168:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1169:         {
 1170:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1171:             return;
 1172:         }
 1173: 
 1174:         (*((integer8 *) (*s_objet_resultat).objet)) = 
 1175:                 ((*((logical8 *) (*s_objet_argument_1).objet)) !=
 1176:                 (*((logical8 *) (*s_objet_argument_2).objet)))
 1177:                 ? -1 : 0;
 1178:     }
 1179: 
 1180: /*
 1181: --------------------------------------------------------------------------------
 1182:   SAME NOT portant sur des chaînes de caractères
 1183: --------------------------------------------------------------------------------
 1184: */
 1185: 
 1186:     else if (((*s_objet_argument_1).type == CHN) &&
 1187:             ((*s_objet_argument_2).type == CHN))
 1188:     {
 1189:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1190:         {
 1191:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1192:             return;
 1193:         }
 1194: 
 1195:         (*((integer8 *) (*s_objet_resultat).objet)) =
 1196:                 (strcmp((unsigned char *) (*s_objet_argument_1).objet,
 1197:                 (unsigned char *) (*s_objet_argument_2).objet) != 0) ? -1 : 0;
 1198:     }
 1199: 
 1200: /*
 1201: --------------------------------------------------------------------------------
 1202:   SAME NOT portant sur des listes
 1203: --------------------------------------------------------------------------------
 1204: */
 1205:     /*
 1206:      * Il y a de la récursivité dans l'air...
 1207:      */
 1208: 
 1209:     else if ((((*s_objet_argument_1).type == LST) &&
 1210:             ((*s_objet_argument_2).type == LST)) ||
 1211:             (((*s_objet_argument_1).type == ALG) &&
 1212:             ((*s_objet_argument_2).type == ALG)) ||
 1213:             (((*s_objet_argument_1).type == RPN) &&
 1214:             ((*s_objet_argument_2).type == RPN)))
 1215:     {
 1216:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1217:         {
 1218:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1219:             return;
 1220:         }
 1221: 
 1222:         l_element_courant_1 = (struct_liste_chainee *)
 1223:                 (*s_objet_argument_1).objet;
 1224:         l_element_courant_2 = (struct_liste_chainee *)
 1225:                 (*s_objet_argument_2).objet;
 1226: 
 1227:         difference = d_faux;
 1228: 
 1229:         while((l_element_courant_1 != NULL) && (l_element_courant_2 != NULL)
 1230:                 && (difference == d_faux))
 1231:         {
 1232:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1233:                     (*l_element_courant_1).donnee) == d_erreur)
 1234:             {
 1235:                 return;
 1236:             }
 1237: 
 1238:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1239:                     (*l_element_courant_2).donnee) == d_erreur)
 1240:             {
 1241:                 return;
 1242:             }
 1243: 
 1244:             instruction_same(s_etat_processus);
 1245: 
 1246:             (*l_element_courant_1).donnee = NULL;
 1247:             (*l_element_courant_2).donnee = NULL;
 1248: 
 1249:             if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1250:                     &s_objet_resultat_intermediaire) == d_erreur)
 1251:             {
 1252:                 liberation(s_etat_processus, s_objet_argument_1);
 1253:                 liberation(s_etat_processus, s_objet_argument_2);
 1254:                 liberation(s_etat_processus, s_objet_resultat);
 1255: 
 1256:                 (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1257:                 return;
 1258:             }
 1259: 
 1260:             if ((*s_objet_resultat_intermediaire).type != INT)
 1261:             {
 1262:                 liberation(s_etat_processus, s_objet_argument_1);
 1263:                 liberation(s_etat_processus, s_objet_argument_2);
 1264:                 liberation(s_etat_processus, s_objet_resultat);
 1265: 
 1266:                 return;
 1267:             }
 1268: 
 1269:             difference = (*(((integer8 *) (*s_objet_resultat_intermediaire)
 1270:                     .objet)) == 0) ? d_vrai : d_faux;
 1271: 
 1272:             liberation(s_etat_processus, s_objet_resultat_intermediaire);
 1273: 
 1274:             l_element_courant_1 = (*l_element_courant_1).suivant;
 1275:             l_element_courant_2 = (*l_element_courant_2).suivant;
 1276:         }
 1277: 
 1278:         if (((l_element_courant_1 != NULL) && (l_element_courant_2 == NULL)) ||
 1279:                 ((l_element_courant_1 == NULL) &&
 1280:                 (l_element_courant_2 != NULL)))
 1281:         {
 1282:             (*((integer8 *) (*s_objet_resultat).objet)) = 0;
 1283:         }
 1284:         else
 1285:         {
 1286:             (*((integer8 *) (*s_objet_resultat).objet)) =
 1287:                     (difference == d_vrai) ? -1 : 0;
 1288:         }
 1289:     }
 1290: 
 1291: /*
 1292: --------------------------------------------------------------------------------
 1293:   SAME NOT portant sur des vecteurs
 1294: --------------------------------------------------------------------------------
 1295: */
 1296:     /*
 1297:      * Vecteurs d'entiers
 1298:      */
 1299: 
 1300:     else if (((*s_objet_argument_1).type == VIN) &&
 1301:             ((*s_objet_argument_2).type == VIN))
 1302:     {
 1303:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1304:         {
 1305:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1306:             return;
 1307:         }
 1308: 
 1309:         if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
 1310:                 (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
 1311:         {
 1312:             (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1313:         }
 1314:         else
 1315:         {
 1316:             difference = d_faux;
 1317: 
 1318:             for(i = 0; (i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
 1319:                     .taille) && (difference == d_faux); i++)
 1320:             {
 1321:                 difference = (((integer8 *) (*((struct_vecteur *)
 1322:                         (*s_objet_argument_1).objet)).tableau)[i] ==
 1323:                         ((integer8 *) (*((struct_vecteur *)
 1324:                         (*s_objet_argument_2).objet)).tableau)[i])
 1325:                         ? d_faux : d_vrai;
 1326:             }
 1327: 
 1328:             (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
 1329:                         d_vrai) ? -1 : 0;
 1330:         }
 1331:     }
 1332: 
 1333:     /*
 1334:      * Vecteurs de réels
 1335:      */
 1336: 
 1337:     else if (((*s_objet_argument_1).type == VRL) &&
 1338:             ((*s_objet_argument_2).type == VRL))
 1339:     {
 1340:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1341:         {
 1342:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1343:             return;
 1344:         }
 1345: 
 1346:         if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
 1347:                 (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
 1348:         {
 1349:             (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1350:         }
 1351:         else
 1352:         {
 1353:             difference = d_faux;
 1354: 
 1355:             for(i = 0; (i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
 1356:                     .taille) && (difference == d_faux); i++)
 1357:             {
 1358:                 difference = (((real8 *) (*((struct_vecteur *)
 1359:                         (*s_objet_argument_1).objet)).tableau)[i] ==
 1360:                         ((real8 *) (*((struct_vecteur *)
 1361:                         (*s_objet_argument_2).objet)).tableau)[i])
 1362:                         ? d_faux : d_vrai;
 1363:             }
 1364: 
 1365:             (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
 1366:                         d_vrai) ? -1 : 0;
 1367:         }
 1368:     }
 1369: 
 1370:     /*
 1371:      * Vecteurs de complexes
 1372:      */
 1373: 
 1374:     else if (((*s_objet_argument_1).type == VCX) &&
 1375:             ((*s_objet_argument_2).type == VCX))
 1376:     {
 1377:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1378:         {
 1379:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1380:             return;
 1381:         }
 1382: 
 1383:         if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
 1384:                 (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
 1385:         {
 1386:             (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1387:         }
 1388:         else
 1389:         {
 1390:             difference = d_faux;
 1391: 
 1392:             for(i = 0; (i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
 1393:                     .taille) && (difference == d_faux); i++)
 1394:             {
 1395:                 difference = ((((struct_complexe16 *) (*((struct_vecteur *)
 1396:                         (*s_objet_argument_1).objet)).tableau)[i].partie_reelle
 1397:                         == ((struct_complexe16 *) (*((struct_vecteur *)
 1398:                         (*s_objet_argument_2).objet)).tableau)[i].partie_reelle)
 1399:                         && (((struct_complexe16 *) (*((struct_vecteur *)
 1400:                         (*s_objet_argument_1).objet)).tableau)[i]
 1401:                         .partie_imaginaire == ((struct_complexe16 *)
 1402:                         (*((struct_vecteur *) (*s_objet_argument_2).objet))
 1403:                         .tableau)[i].partie_imaginaire)) ? d_faux : d_vrai;
 1404:             }
 1405: 
 1406:             (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
 1407:                         d_vrai) ? -1 : 0;
 1408:         }
 1409:     }
 1410: 
 1411: /*
 1412: --------------------------------------------------------------------------------
 1413:   SAME NOT portant sur des matrices
 1414: --------------------------------------------------------------------------------
 1415: */
 1416:     /*
 1417:      * Matrice d'entiers
 1418:      */
 1419: 
 1420:     else if (((*s_objet_argument_1).type == MIN) &&
 1421:             ((*s_objet_argument_2).type == MIN))
 1422:     {
 1423:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1424:         {
 1425:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1426:             return;
 1427:         }
 1428: 
 1429:         if (((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_lignes
 1430:                 != (*((struct_matrice *) (*s_objet_argument_2).objet))
 1431:                 .nombre_lignes) || ((*((struct_matrice *) (*s_objet_argument_1)
 1432:                 .objet)).nombre_colonnes != (*((struct_matrice *)
 1433:                 (*s_objet_argument_2).objet)).nombre_colonnes))
 1434:         {
 1435:             (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1436:         }
 1437:         else
 1438:         {
 1439:             difference = d_faux;
 1440: 
 1441:             for(i = 0; (i < (*((struct_matrice *) (*s_objet_argument_1).objet))
 1442:                     .nombre_lignes) && (difference == d_faux); i++)
 1443:             {
 1444:                 for(j = 0; (j < (*((struct_matrice *) (*s_objet_argument_1)
 1445:                         .objet)).nombre_colonnes) && (difference == d_faux);
 1446:                         j++)
 1447:                 {
 1448:                     difference = (((integer8 **) (*((struct_matrice *)
 1449:                             (*s_objet_argument_1).objet)).tableau)[i][j] ==
 1450:                             ((integer8 **) (*((struct_matrice *)
 1451:                             (*s_objet_argument_2).objet)).tableau)[i][j])
 1452:                             ? d_faux : d_vrai;
 1453:                 }
 1454:             }
 1455: 
 1456:             (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
 1457:                         d_vrai) ? -1 : 0;
 1458:         }
 1459:     }
 1460: 
 1461:     /*
 1462:      * Matrice de réels
 1463:      */
 1464: 
 1465:     else if (((*s_objet_argument_1).type == MRL) &&
 1466:             ((*s_objet_argument_2).type == MRL))
 1467:     {
 1468:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1469:         {
 1470:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1471:             return;
 1472:         }
 1473: 
 1474:         if (((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_lignes
 1475:                 != (*((struct_matrice *) (*s_objet_argument_2).objet))
 1476:                 .nombre_lignes) || ((*((struct_matrice *) (*s_objet_argument_1)
 1477:                 .objet)).nombre_colonnes != (*((struct_matrice *)
 1478:                 (*s_objet_argument_2).objet)).nombre_colonnes))
 1479:         {
 1480:             (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1481:         }
 1482:         else
 1483:         {
 1484:             difference = d_faux;
 1485: 
 1486:             for(i = 0; (i < (*((struct_matrice *) (*s_objet_argument_1).objet))
 1487:                     .nombre_lignes) && (difference == d_faux); i++)
 1488:             {
 1489:                 for(j = 0; (j < (*((struct_matrice *) (*s_objet_argument_1)
 1490:                         .objet)).nombre_colonnes) && (difference == d_faux);
 1491:                         j++)
 1492:                 {
 1493:                     difference = (((real8 **) (*((struct_matrice *)
 1494:                             (*s_objet_argument_1).objet)).tableau)[i][j] ==
 1495:                             ((real8 **) (*((struct_matrice *)
 1496:                             (*s_objet_argument_2).objet)).tableau)[i][j])
 1497:                             ? d_faux : d_vrai;
 1498:                 }
 1499:             }
 1500: 
 1501:             (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
 1502:                         d_vrai) ? -1 : 0;
 1503:         }
 1504:     }
 1505: 
 1506:     /*
 1507:      * Matrice de complexes
 1508:      */
 1509: 
 1510:     else if (((*s_objet_argument_1).type == MCX) &&
 1511:             ((*s_objet_argument_2).type == MCX))
 1512:     {
 1513:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 1514:         {
 1515:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1516:             return;
 1517:         }
 1518: 
 1519:         if (((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_lignes
 1520:                 != (*((struct_matrice *) (*s_objet_argument_2).objet))
 1521:                 .nombre_lignes) || ((*((struct_matrice *) (*s_objet_argument_1)
 1522:                 .objet)).nombre_colonnes != (*((struct_matrice *)
 1523:                 (*s_objet_argument_2).objet)).nombre_colonnes))
 1524:         {
 1525:             (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1526:         }
 1527:         else
 1528:         {
 1529:             difference = d_faux;
 1530: 
 1531:             for(i = 0; (i < (*((struct_matrice *) (*s_objet_argument_1).objet))
 1532:                     .nombre_lignes) && (difference == d_faux); i++)
 1533:             {
 1534:                 for(j = 0; (j < (*((struct_matrice *) (*s_objet_argument_1)
 1535:                         .objet)).nombre_colonnes) && (difference == d_faux);
 1536:                         j++)
 1537:                 {
 1538:                     difference = ((((struct_complexe16 **) (*((struct_matrice *)
 1539:                             (*s_objet_argument_1).objet)).tableau)[i][j]
 1540:                             .partie_reelle == ((struct_complexe16 **)
 1541:                             (*((struct_matrice *) (*s_objet_argument_2).objet))
 1542:                             .tableau)[i][j].partie_reelle) &&
 1543:                             (((struct_complexe16 **) (*((struct_matrice *)
 1544:                             (*s_objet_argument_1).objet)).tableau)[i][j]
 1545:                             .partie_imaginaire == ((struct_complexe16 **)
 1546:                             (*((struct_matrice *) (*s_objet_argument_2).objet))
 1547:                             .tableau)[i][j].partie_imaginaire))
 1548:                             ? d_faux : d_vrai;
 1549:                 }
 1550:             }
 1551: 
 1552:             (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
 1553:                         d_vrai) ? -1 : 0;
 1554:         }
 1555:     }
 1556: 
 1557: /*
 1558: --------------------------------------------------------------------------------
 1559:   SAME NOT entre des arguments complexes
 1560: --------------------------------------------------------------------------------
 1561: */
 1562: 
 1563:     /*
 1564:      * Nom ou valeur numérique / Nom ou valeur numérique
 1565:      */
 1566: 
 1567:     else if ((((*s_objet_argument_1).type == NOM) &&
 1568:             (((*s_objet_argument_2).type == NOM) ||
 1569:             ((*s_objet_argument_2).type == INT) ||
 1570:             ((*s_objet_argument_2).type == REL))) ||
 1571:             (((*s_objet_argument_2).type == NOM) &&
 1572:             (((*s_objet_argument_1).type == INT) ||
 1573:             ((*s_objet_argument_1).type == REL))))
 1574:     {
 1575:         if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
 1576:         {
 1577:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1578:             return;
 1579:         }
 1580: 
 1581:         if (((*s_objet_resultat).objet =
 1582:                 allocation_maillon(s_etat_processus)) == NULL)
 1583:         {
 1584:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1585:             return;
 1586:         }
 1587: 
 1588:         l_element_courant = (*s_objet_resultat).objet;
 1589: 
 1590:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1591:                 == NULL)
 1592:         {
 1593:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1594:             return;
 1595:         }
 1596: 
 1597:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1598:                 .nombre_arguments = 0;
 1599:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1600:                 .fonction = instruction_vers_niveau_superieur;
 1601: 
 1602:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1603:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1604:         {
 1605:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1606:             return;
 1607:         }
 1608: 
 1609:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1610:                 .nom_fonction, "<<");
 1611: 
 1612:         if (((*l_element_courant).suivant =
 1613:                 allocation_maillon(s_etat_processus)) == NULL)
 1614:         {
 1615:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1616:             return;
 1617:         }
 1618: 
 1619:         l_element_courant = (*l_element_courant).suivant;
 1620:         (*l_element_courant).donnee = s_objet_argument_2;
 1621: 
 1622:         if (((*l_element_courant).suivant =
 1623:                 allocation_maillon(s_etat_processus)) == NULL)
 1624:         {
 1625:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1626:             return;
 1627:         }
 1628: 
 1629:         l_element_courant = (*l_element_courant).suivant;
 1630:         (*l_element_courant).donnee = s_objet_argument_1;
 1631: 
 1632:         if (((*l_element_courant).suivant =
 1633:                 allocation_maillon(s_etat_processus)) == NULL)
 1634:         {
 1635:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1636:             return;
 1637:         }
 1638: 
 1639:         l_element_courant = (*l_element_courant).suivant;
 1640: 
 1641:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1642:                 == NULL)
 1643:         {
 1644:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1645:             return;
 1646:         }
 1647: 
 1648:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1649:                 .nombre_arguments = 0;
 1650:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1651:                 .fonction = instruction_ne;
 1652: 
 1653:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1654:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1655:         {
 1656:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1657:             return;
 1658:         }
 1659: 
 1660:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1661:                 .nom_fonction, "<>");
 1662: 
 1663:         if (((*l_element_courant).suivant =
 1664:                 allocation_maillon(s_etat_processus)) == NULL)
 1665:         {
 1666:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1667:             return;
 1668:         }
 1669: 
 1670:         l_element_courant = (*l_element_courant).suivant;
 1671: 
 1672:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1673:                 == NULL)
 1674:         {
 1675:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1676:             return;
 1677:         }
 1678: 
 1679:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1680:                 .nombre_arguments = 0;
 1681:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1682:                 .fonction = instruction_ne;
 1683: 
 1684:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1685:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1686:         {
 1687:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1688:             return;
 1689:         }
 1690: 
 1691:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1692:                 .nom_fonction, ">>");
 1693: 
 1694:         (*l_element_courant).suivant = NULL;
 1695: 
 1696:         s_objet_argument_1 = NULL;
 1697:         s_objet_argument_2 = NULL;
 1698:     }
 1699: 
 1700:     /*
 1701:      * Nom ou valeur numérique / Expression
 1702:      */
 1703: 
 1704:     else if (((((*s_objet_argument_1).type == ALG) ||
 1705:             ((*s_objet_argument_1).type == RPN))) &&
 1706:             (((*s_objet_argument_2).type == NOM) ||
 1707:             ((*s_objet_argument_2).type == INT) ||
 1708:             ((*s_objet_argument_2).type == REL)))
 1709:     {
 1710:         nombre_elements = 0;
 1711:         l_element_courant = (struct_liste_chainee *)
 1712:                 (*s_objet_argument_1).objet;
 1713: 
 1714:         while(l_element_courant != NULL)
 1715:         {
 1716:             nombre_elements++;
 1717:             l_element_courant = (*l_element_courant).suivant;
 1718:         }
 1719: 
 1720:         if (nombre_elements == 2)
 1721:         {
 1722:             liberation(s_etat_processus, s_objet_argument_1);
 1723:             liberation(s_etat_processus, s_objet_argument_2);
 1724: 
 1725:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1726:             return;
 1727:         }
 1728: 
 1729:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1730:                 s_objet_argument_1, 'N')) == NULL)
 1731:         {
 1732:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1733:             return;
 1734:         }
 1735: 
 1736:         l_element_courant = (struct_liste_chainee *)
 1737:                 (*s_objet_resultat).objet;
 1738:         l_element_precedent = l_element_courant;
 1739:         l_element_courant = (*l_element_courant).suivant;
 1740: 
 1741:         if (((*l_element_precedent).suivant =
 1742:                 allocation_maillon(s_etat_processus)) == NULL)
 1743:         {
 1744:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1745:             return;
 1746:         }
 1747: 
 1748:         (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
 1749:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1750: 
 1751:         while((*l_element_courant).suivant != NULL)
 1752:         {
 1753:             l_element_precedent = l_element_courant;
 1754:             l_element_courant = (*l_element_courant).suivant;
 1755:         }
 1756: 
 1757:         if (((*l_element_precedent).suivant =
 1758:                 allocation_maillon(s_etat_processus)) == NULL)
 1759:         {
 1760:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1761:             return;
 1762:         }
 1763: 
 1764:         if (((*(*l_element_precedent).suivant).donnee =
 1765:                 allocation(s_etat_processus, FCT)) == NULL)
 1766:         {
 1767:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1768:             return;
 1769:         }
 1770: 
 1771:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1772:                 .donnee).objet)).nombre_arguments = 0;
 1773:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1774:                 .donnee).objet)).fonction = instruction_ne;
 1775: 
 1776:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 1777:                 .suivant).donnee).objet)).nom_fonction =
 1778:                 malloc(3 * sizeof(unsigned char))) == NULL)
 1779:         {
 1780:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1781:             return;
 1782:         }
 1783: 
 1784:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 1785:                 .suivant).donnee).objet)).nom_fonction, "<>");
 1786: 
 1787:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1788: 
 1789:         s_objet_argument_2 = NULL;
 1790:     }
 1791: 
 1792:     /*
 1793:      * Expression / Nom ou valeur numérique
 1794:      */
 1795: 
 1796:     else if ((((*s_objet_argument_1).type == NOM) ||
 1797:             ((*s_objet_argument_1).type == INT) ||
 1798:             ((*s_objet_argument_1).type == REL)) &&
 1799:             ((((*s_objet_argument_2).type == ALG) ||
 1800:             ((*s_objet_argument_2).type == RPN))))
 1801:     {
 1802:         nombre_elements = 0;
 1803:         l_element_courant = (struct_liste_chainee *)
 1804:                 (*s_objet_argument_2).objet;
 1805: 
 1806:         while(l_element_courant != NULL)
 1807:         {
 1808:             nombre_elements++;
 1809:             l_element_courant = (*l_element_courant).suivant;
 1810:         }
 1811: 
 1812:         if (nombre_elements == 2)
 1813:         {
 1814:             liberation(s_etat_processus, s_objet_argument_1);
 1815:             liberation(s_etat_processus, s_objet_argument_2);
 1816: 
 1817:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1818:             return;
 1819:         }
 1820: 
 1821:         if ((s_objet_resultat = copie_objet(s_etat_processus,
 1822:                 s_objet_argument_2, 'N')) == NULL)
 1823:         {
 1824:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1825:             return;
 1826:         }
 1827: 
 1828:         l_element_courant = (struct_liste_chainee *)
 1829:                 (*s_objet_resultat).objet;
 1830:         l_element_precedent = l_element_courant;
 1831: 
 1832:         while((*l_element_courant).suivant != NULL)
 1833:         {
 1834:             l_element_precedent = l_element_courant;
 1835:             l_element_courant = (*l_element_courant).suivant;
 1836:         }
 1837: 
 1838:         if (((*l_element_precedent).suivant =
 1839:                 allocation_maillon(s_etat_processus)) == NULL)
 1840:         {
 1841:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1842:             return;
 1843:         }
 1844: 
 1845:         (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
 1846:         l_element_precedent = (*l_element_precedent).suivant;
 1847: 
 1848:         if (((*l_element_precedent).suivant =
 1849:                 allocation_maillon(s_etat_processus)) == NULL)
 1850:         {
 1851:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1852:             return;
 1853:         }
 1854: 
 1855:         if (((*(*l_element_precedent).suivant).donnee =
 1856:                 allocation(s_etat_processus, FCT)) == NULL)
 1857:         {
 1858:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1859:             return;
 1860:         }
 1861: 
 1862:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1863:                 .donnee).objet)).nombre_arguments = 0;
 1864:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1865:                 .donnee).objet)).fonction = instruction_ne;
 1866: 
 1867:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 1868:                 .suivant).donnee).objet)).nom_fonction =
 1869:                 malloc(3 * sizeof(unsigned char))) == NULL)
 1870:         {
 1871:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1872:             return;
 1873:         }
 1874: 
 1875:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 1876:                 .suivant).donnee).objet)).nom_fonction, "<>");
 1877: 
 1878:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1879: 
 1880:         s_objet_argument_1 = NULL;
 1881:     }
 1882: 
 1883:     /*
 1884:      * Expression / Expression
 1885:      */
 1886: 
 1887:     else if ((((*s_objet_argument_1).type == ALG) &&
 1888:             ((*s_objet_argument_2).type == ALG)) ||
 1889:             (((*s_objet_argument_1).type == RPN) &&
 1890:             ((*s_objet_argument_2).type == RPN)))
 1891:     {
 1892:         nombre_elements = 0;
 1893:         l_element_courant = (struct_liste_chainee *)
 1894:                 (*s_objet_argument_1).objet;
 1895: 
 1896:         while(l_element_courant != NULL)
 1897:         {
 1898:             nombre_elements++;
 1899:             l_element_courant = (*l_element_courant).suivant;
 1900:         }
 1901: 
 1902:         if (nombre_elements == 2)
 1903:         {
 1904:             liberation(s_etat_processus, s_objet_argument_1);
 1905:             liberation(s_etat_processus, s_objet_argument_2);
 1906: 
 1907:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1908:             return;
 1909:         }
 1910: 
 1911:         nombre_elements = 0;
 1912:         l_element_courant = (struct_liste_chainee *)
 1913:                 (*s_objet_argument_2).objet;
 1914: 
 1915:         while(l_element_courant != NULL)
 1916:         {
 1917:             nombre_elements++;
 1918:             l_element_courant = (*l_element_courant).suivant;
 1919:         }
 1920: 
 1921:         if (nombre_elements == 2)
 1922:         {
 1923:             liberation(s_etat_processus, s_objet_argument_1);
 1924:             liberation(s_etat_processus, s_objet_argument_2);
 1925: 
 1926:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1927:             return;
 1928:         }
 1929: 
 1930:         if ((s_copie_argument_1 = copie_objet(s_etat_processus,
 1931:                 s_objet_argument_1, 'N')) == NULL)
 1932:         {
 1933:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1934:             return;
 1935:         }
 1936: 
 1937:         if ((s_copie_argument_2 = copie_objet(s_etat_processus,
 1938:                 s_objet_argument_2, 'N')) == NULL)
 1939:         {
 1940:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1941:             return;
 1942:         }
 1943: 
 1944:         l_element_courant = (struct_liste_chainee *)
 1945:                 (*s_copie_argument_1).objet;
 1946:         (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
 1947:                 (*s_copie_argument_1).objet)).suivant;
 1948: 
 1949:         liberation(s_etat_processus, (*l_element_courant).donnee);
 1950:         free(l_element_courant);
 1951: 
 1952:         l_element_courant = (struct_liste_chainee *)
 1953:                 (*s_copie_argument_2).objet;
 1954:         l_element_precedent = l_element_courant;
 1955:         s_objet_resultat = s_copie_argument_2;
 1956: 
 1957:         while((*l_element_courant).suivant != NULL)
 1958:         {
 1959:             l_element_precedent = l_element_courant;
 1960:             l_element_courant = (*l_element_courant).suivant;
 1961:         }
 1962: 
 1963:         liberation(s_etat_processus, (*l_element_courant).donnee);
 1964:         free(l_element_courant);
 1965: 
 1966:         (*l_element_precedent).suivant = (struct_liste_chainee *)
 1967:                 (*s_copie_argument_1).objet;
 1968:         free(s_copie_argument_1);
 1969: 
 1970:         l_element_courant = (*l_element_precedent).suivant;
 1971:         while((*l_element_courant).suivant != NULL)
 1972:         {
 1973:             l_element_precedent = l_element_courant;
 1974:             l_element_courant = (*l_element_courant).suivant;
 1975:         }
 1976: 
 1977:         if (((*l_element_precedent).suivant =
 1978:                 allocation_maillon(s_etat_processus)) == NULL)
 1979:         {
 1980:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1981:             return;
 1982:         }
 1983: 
 1984:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1985:         l_element_courant = (*l_element_precedent).suivant;
 1986: 
 1987:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1988:                 == NULL)
 1989:         {
 1990:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1991:             return;
 1992:         }
 1993: 
 1994:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1995:                 .nombre_arguments = 0;
 1996:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1997:                 .donnee).objet)).fonction = instruction_ne;
 1998: 
 1999:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2000:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 2001:         {
 2002:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2003:             return;
 2004:         }
 2005: 
 2006:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2007:                 .nom_fonction, "<>");
 2008:     }
 2009: 
 2010: /*
 2011: --------------------------------------------------------------------------------
 2012:   SAME NOT nul
 2013: --------------------------------------------------------------------------------
 2014: */
 2015: 
 2016:     else
 2017:     {
 2018:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 2019:         {
 2020:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2021:             return;
 2022:         }
 2023: 
 2024:         (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 2025:     }
 2026: 
 2027:     liberation(s_etat_processus, s_objet_argument_1);
 2028:     liberation(s_etat_processus, s_objet_argument_2);
 2029: 
 2030:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2031:             s_objet_resultat) == d_erreur)
 2032:     {
 2033:         return;
 2034:     }
 2035: 
 2036:     return;
 2037: }
 2038: 
 2039: 
 2040: /*
 2041: ================================================================================
 2042:   Fonction 'next'
 2043: ================================================================================
 2044:   Entrées :
 2045: --------------------------------------------------------------------------------
 2046:   Sorties :
 2047: --------------------------------------------------------------------------------
 2048:   Effets de bord : néant
 2049: ================================================================================
 2050: */
 2051: 
 2052: void
 2053: instruction_next(struct_processus *s_etat_processus)
 2054: {
 2055:     struct_objet                *s_objet;
 2056:     struct_objet                *s_copie_objet;
 2057: 
 2058:     logical1                    presence_compteur;
 2059: 
 2060:     (*s_etat_processus).erreur_execution = d_ex;
 2061: 
 2062:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2063:     {
 2064:         printf("\n  NEXT ");
 2065: 
 2066:         if ((*s_etat_processus).langue == 'F')
 2067:         {
 2068:             printf("(fin d'une boucle définie)\n\n");
 2069:         }
 2070:         else
 2071:         {
 2072:             printf("(end of defined loop)\n\n");
 2073:         }
 2074: 
 2075:         if ((*s_etat_processus).langue == 'F')
 2076:         {
 2077:             printf("  Utilisation :\n\n");
 2078:         }
 2079:         else
 2080:         {
 2081:             printf("  Usage:\n\n");
 2082:         }
 2083: 
 2084:         printf("    %s/%s %s/%s START\n", d_INT, d_REL,
 2085:                 d_INT, d_REL);
 2086:         printf("        (expression)\n");
 2087:         printf("        [EXIT]/[CYCLE]\n");
 2088:         printf("        ...\n");
 2089:         printf("    NEXT\n\n");
 2090: 
 2091:         printf("    %s/%s %s/%s FOR (variable)\n", d_INT, d_REL,
 2092:                 d_INT, d_REL);
 2093:         printf("        (expression)\n");
 2094:         printf("        [EXIT]/[CYCLE]\n");
 2095:         printf("        ...\n");
 2096:         printf("    NEXT\n");
 2097: 
 2098:         return;
 2099:     }
 2100:     else if ((*s_etat_processus).test_instruction == 'Y')
 2101:     {
 2102:         (*s_etat_processus).nombre_arguments = -1;
 2103:         return;
 2104:     }
 2105: 
 2106:     presence_compteur = ((*(*s_etat_processus).l_base_pile_systeme)
 2107:             .type_cloture == 'F') ? d_vrai : d_faux;
 2108: 
 2109:     if (((*(*s_etat_processus).l_base_pile_systeme).type_cloture != 'S')
 2110:             && (presence_compteur == d_faux))
 2111:     {
 2112:         (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
 2113:         return;
 2114:     }
 2115: 
 2116:     /*
 2117:      * Pour une boucle avec indice, on fait pointer 
 2118:      * (*(*s_etat_processus).l_base_pile_systeme).indice_boucle sur
 2119:      * la variable correspondante. Remarque, le contenu de la variable
 2120:      * est détruit au courant de l'opération.
 2121:      */
 2122: 
 2123:     if (presence_compteur == d_vrai)
 2124:     {
 2125:         if (recherche_variable(s_etat_processus, (*(*s_etat_processus)
 2126:                 .l_base_pile_systeme).nom_variable) == d_faux)
 2127:         {
 2128:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
 2129:             return;
 2130:         }
 2131: 
 2132:         if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)
 2133:                 .position_variable_courante]).variable_verrouillee == d_vrai)
 2134:         {
 2135:             (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
 2136:             return;
 2137:         }
 2138: 
 2139:         if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)
 2140:                 .position_variable_courante]).objet == NULL)
 2141:         {
 2142:             (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
 2143:             return;
 2144:         }
 2145: 
 2146:         (*(*s_etat_processus).l_base_pile_systeme).indice_boucle =
 2147:                 ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
 2148:                 .position_variable_courante]).objet;
 2149:     }
 2150: 
 2151:     /*
 2152:      * Empilement pour calculer le nouvel indice. Au passage, la
 2153:      * variable (*(*s_etat_processus).l_base_pile_systeme).indice_boucle
 2154:      * est libérée.
 2155:      */
 2156: 
 2157:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2158:             (*(*s_etat_processus).l_base_pile_systeme).indice_boucle)
 2159:             == d_erreur)
 2160:     {
 2161:         return;
 2162:     }
 2163: 
 2164:     if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
 2165:     {
 2166:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2167:         return;
 2168:     }
 2169: 
 2170:     (*((integer8 *) (*s_objet).objet)) = 1;
 2171: 
 2172:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2173:             s_objet) == d_erreur)
 2174:     {
 2175:         return;
 2176:     }
 2177: 
 2178:     instruction_plus(s_etat_processus);
 2179: 
 2180:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2181:             &s_objet) == d_erreur)
 2182:     {
 2183:         liberation(s_etat_processus, s_objet);
 2184: 
 2185:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2186:         return;
 2187:     }
 2188: 
 2189:     if (((*s_objet).type != INT) &&
 2190:             ((*s_objet).type != REL))
 2191:     {
 2192:         liberation(s_etat_processus, s_objet);
 2193: 
 2194:         (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
 2195:         return;
 2196:     }
 2197: 
 2198:     if (presence_compteur == d_vrai)
 2199:     {
 2200:         /*
 2201:          * L'addition crée si besoin une copie de l'objet
 2202:          */
 2203: 
 2204:         (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = NULL;
 2205:         ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
 2206:                 .position_variable_courante]).objet = s_objet;
 2207:     }
 2208:     else
 2209:     {
 2210:         (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = s_objet;
 2211:     }
 2212: 
 2213:     if ((s_copie_objet = copie_objet(s_etat_processus, s_objet, 'P')) == NULL)
 2214:     {
 2215:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2216:         return;
 2217:     }
 2218: 
 2219:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2220:             s_copie_objet) == d_erreur)
 2221:     {
 2222:         return;
 2223:     }
 2224: 
 2225:     if ((s_copie_objet = copie_objet(s_etat_processus,
 2226:             (*(*s_etat_processus).l_base_pile_systeme)
 2227:             .limite_indice_boucle, 'P')) == NULL)
 2228:     {
 2229:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2230:         return;
 2231:     }
 2232: 
 2233:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2234:             s_copie_objet) == d_erreur)
 2235:     {
 2236:         return;
 2237:     }
 2238: 
 2239:     instruction_le(s_etat_processus);
 2240: 
 2241:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2242:             &s_objet) == d_erreur)
 2243:     {
 2244:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2245:         return;
 2246:     }
 2247: 
 2248:     if ((*s_objet).type != INT)
 2249:     {
 2250:         liberation(s_etat_processus, s_objet);
 2251: 
 2252:         (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
 2253:         return;
 2254:     }
 2255: 
 2256:     if ((*((integer8 *) (*s_objet).objet)) != 0)
 2257:     {
 2258:         if ((*(*s_etat_processus).l_base_pile_systeme)
 2259:                 .origine_routine_evaluation == 'N')
 2260:         {
 2261:             (*s_etat_processus).position_courante = (*(*s_etat_processus)
 2262:                     .l_base_pile_systeme).adresse_retour;
 2263:         }
 2264:         else
 2265:         {
 2266:             (*s_etat_processus).expression_courante = (*(*s_etat_processus)
 2267:                     .l_base_pile_systeme).pointeur_objet_retour;
 2268:         }
 2269:     }
 2270:     else
 2271:     {
 2272:         depilement_pile_systeme(s_etat_processus);
 2273: 
 2274:         if ((*s_etat_processus).erreur_systeme != d_es)
 2275:         {
 2276:             return;
 2277:         }
 2278: 
 2279:         if (presence_compteur == d_vrai)
 2280:         {
 2281:             (*s_etat_processus).niveau_courant--;
 2282: 
 2283:             if (retrait_variable_par_niveau(s_etat_processus) == d_erreur)
 2284:             {
 2285:                 return;
 2286:             }
 2287:         }
 2288:     }
 2289: 
 2290:     liberation(s_etat_processus, s_objet);
 2291: 
 2292:     return;
 2293: }
 2294: 
 2295: 
 2296: /*
 2297: ================================================================================
 2298:   Fonction 'nrand'
 2299: ================================================================================
 2300:   Entrées : structure processus
 2301: -------------------------------------------------------------------------------
 2302:   Sorties :
 2303: --------------------------------------------------------------------------------
 2304:   Effets de bord : néant
 2305: ================================================================================
 2306: */
 2307: 
 2308: void
 2309: instruction_nrand(struct_processus *s_etat_processus)
 2310: {
 2311:     struct_objet                *s_objet;
 2312: 
 2313:     (*s_etat_processus).erreur_execution = d_ex;
 2314: 
 2315:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2316:     {
 2317:         printf("\n  NRAND ");
 2318: 
 2319:         if ((*s_etat_processus).langue == 'F')
 2320:         {
 2321:             printf("(valeur aléatoire gaussienne)\n\n");
 2322:         }
 2323:         else
 2324:         {
 2325:             printf("(normal random number)\n\n");
 2326:         }
 2327: 
 2328:         printf("->  1: %s\n", d_REL);
 2329: 
 2330:         return;
 2331:     }
 2332:     else if ((*s_etat_processus).test_instruction == 'Y')
 2333:     {
 2334:         (*s_etat_processus).nombre_arguments = -1;
 2335:         return;
 2336:     }
 2337: 
 2338:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2339:     {
 2340:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 2341:         {
 2342:             return;
 2343:         }
 2344:     }
 2345: 
 2346:     if ((*s_etat_processus).generateur_aleatoire == NULL)
 2347:     {
 2348:         initialisation_generateur_aleatoire(s_etat_processus, d_vrai, 0);
 2349:     }
 2350: 
 2351:     if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
 2352:     {
 2353:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2354:         return;
 2355:     }
 2356: 
 2357:     (*((real8 *) (*s_objet).objet)) = gsl_ran_gaussian_ratio_method(
 2358:             (*s_etat_processus).generateur_aleatoire, 1.0);
 2359: 
 2360:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2361:             s_objet) == d_erreur)
 2362:     {
 2363:         return;
 2364:     }
 2365: 
 2366:     return;
 2367: }
 2368: 
 2369: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>