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

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

CVSweb interface <joel.bertrand@systella.fr>