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

CVSweb interface <joel.bertrand@systella.fr>