File:  [local] / rpl / src / instructions_r1.c
Revision 1.52: download - view: text, annotated - select for diffs - revision graph
Mon Jan 5 15:32:21 2015 UTC (9 years, 4 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
En route vers la 4.1.20.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.20
    4:   Copyright (C) 1989-2015 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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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\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);
  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).instruction_courante)) == NULL)
  600:                     {
  601:                         liberation(s_etat_processus, s_objet);
  602: 
  603:                         free((*s_etat_processus).instruction_courante);
  604:                         (*s_etat_processus).instruction_courante = tampon;
  605:                         (*s_etat_processus).erreur_systeme =
  606:                                 d_es_allocation_memoire;
  607:                         return;
  608:                     }
  609: 
  610: 
  611:                     if (niveau == 0)
  612:                     {
  613:                         if ((strcmp(instruction_majuscule, "END") == 0)
  614:                                 || (strcmp(instruction_majuscule, "ELSE") == 0)
  615:                                 || (strcmp(instruction_majuscule, "ELSEIF")
  616:                                 == 0))
  617:                         {
  618:                             (*s_etat_processus).position_courante -=
  619:                                     (integer8) (strlen(
  620:                                     instruction_majuscule) + 1);
  621:                             drapeau_fin = d_vrai;
  622:                         }
  623:                         else
  624:                         {
  625:                             drapeau_fin = d_faux;
  626:                         }
  627:                     }
  628:                     else
  629:                     {
  630:                         drapeau_fin = d_faux;
  631:                     }
  632: 
  633:                     if ((strcmp(instruction_majuscule, "CASE") == 0) ||
  634:                             (strcmp(instruction_majuscule, "DO") == 0) ||
  635:                             (strcmp(instruction_majuscule, "IF") == 0) ||
  636:                             (strcmp(instruction_majuscule, "IFERR") == 0) ||
  637:                             (strcmp(instruction_majuscule, "SELECT") == 0)
  638:                             || (strcmp(instruction_majuscule, "WHILE")
  639:                             == 0))
  640:                     {
  641:                         niveau++;
  642:                     }
  643:                     else if (strcmp(instruction_majuscule, "END") == 0)
  644:                     {
  645:                         niveau--;
  646:                     }
  647: 
  648:                     free(instruction_majuscule);
  649:                     free((*s_etat_processus).instruction_courante);
  650:                 } while(drapeau_fin == d_faux);
  651: 
  652:                 (*s_etat_processus).instruction_courante = tampon;
  653:             }
  654:             else
  655:             {
  656:                 /*
  657:                  * Vérification du pointeur de prédiction de saut
  658:                  */
  659: 
  660:                 if (pthread_mutex_lock(&((*(*(*s_etat_processus)
  661:                         .expression_courante).donnee).mutex)) != 0)
  662:                 {
  663:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  664:                     return;
  665:                 }
  666: 
  667:                 if ((*((struct_fonction *) (*(*(*s_etat_processus)
  668:                         .expression_courante).donnee).objet)).prediction_saut
  669:                         != NULL)
  670:                 {
  671:                     s_registre = (*s_etat_processus).expression_courante;
  672: 
  673:                     (*s_etat_processus).expression_courante =
  674:                             (struct_liste_chainee *)
  675:                             (*((struct_fonction *) (*(*(*s_etat_processus)
  676:                             .expression_courante).donnee).objet))
  677:                             .prediction_saut;
  678:                     fonction = (*((struct_fonction *)
  679:                             (*(*(*s_etat_processus).expression_courante)
  680:                             .donnee).objet)).fonction;
  681:                     execution = (*((struct_fonction *)
  682:                             (*(*s_registre).donnee).objet))
  683:                             .prediction_execution;
  684: 
  685:                     if (pthread_mutex_unlock(&((*(*s_registre).donnee).mutex))
  686:                             != 0)
  687:                     {
  688:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  689:                         return;
  690:                     }
  691: 
  692:                     if (execution == d_vrai)
  693:                     {
  694:                         fonction(s_etat_processus);
  695:                     }
  696:                 }
  697:                 else
  698:                 {
  699:                     if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
  700:                             .expression_courante).donnee).mutex)) != 0)
  701:                     {
  702:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  703:                         return;
  704:                     }
  705: 
  706:                     s_registre = (*s_etat_processus).expression_courante;
  707:                     execution = d_faux;
  708: 
  709:                     do
  710:                     {
  711:                         if (((*s_etat_processus).expression_courante =
  712:                                 (*(*s_etat_processus)
  713:                                 .expression_courante).suivant) == NULL)
  714:                         {
  715:                             liberation(s_etat_processus, s_objet);
  716: 
  717:                             (*s_etat_processus).erreur_execution =
  718:                                     d_ex_erreur_traitement_condition;
  719:                             return;
  720:                         }
  721: 
  722:                         if ((*(*(*s_etat_processus).expression_courante)
  723:                                 .donnee).type == FCT)
  724:                         {
  725:                             fonction = (*((struct_fonction *)
  726:                                     (*(*(*s_etat_processus).expression_courante)
  727:                                     .donnee).objet)).fonction;
  728: 
  729:                             if (niveau == 0)
  730:                             {
  731:                                 if ((fonction == instruction_end) ||
  732:                                         (fonction == instruction_else) ||
  733:                                         (fonction == instruction_elseif))
  734:                                 {
  735:                                     fonction(s_etat_processus);
  736:                                     execution = d_vrai;
  737:                                     drapeau_fin = d_vrai;
  738:                                 }
  739:                                 else
  740:                                 {
  741:                                     drapeau_fin = d_faux;
  742:                                 }
  743:                             }
  744:                             else
  745:                             {
  746:                                 drapeau_fin = d_faux;
  747:                             }
  748: 
  749:                             if ((fonction == instruction_case) ||
  750:                                     (fonction == instruction_do) ||
  751:                                     (fonction == instruction_if) ||
  752:                                     (fonction == instruction_iferr) ||
  753:                                     (fonction == instruction_select) ||
  754:                                     (fonction == instruction_while))
  755:                             {
  756:                                 niveau++;
  757:                             }
  758:                             else if (fonction == instruction_end)
  759:                             {
  760:                                 niveau--;
  761:                             }
  762:                         }
  763:                     } while(drapeau_fin == d_faux);
  764: 
  765:                     if (pthread_mutex_lock(&((*(*(*s_etat_processus)
  766:                             .expression_courante).donnee).mutex)) != 0)
  767:                     {
  768:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  769:                         return;
  770:                     }
  771: 
  772:                     (*((struct_fonction *) (*(*s_registre).donnee).objet))
  773:                             .prediction_saut = (*s_etat_processus)
  774:                             .expression_courante;
  775:                     (*((struct_fonction *) (*(*s_registre).donnee).objet))
  776:                             .prediction_execution = execution;
  777: 
  778:                     if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
  779:                             .expression_courante).donnee).mutex)) != 0)
  780:                     {
  781:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  782:                         return;
  783:                     }
  784:                 }
  785:             }
  786:         }
  787:     }
  788:     else
  789:     {
  790:         liberation(s_etat_processus, s_objet);
  791: 
  792:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  793:         return;
  794:     }
  795: 
  796:     liberation(s_etat_processus, s_objet);
  797: 
  798:     return;
  799: }
  800: 
  801: 
  802: /*
  803: ================================================================================
  804:   Fonction 'rclf'
  805: ================================================================================
  806:   Entrées : structure processus
  807: --------------------------------------------------------------------------------
  808:   Sorties :
  809: --------------------------------------------------------------------------------
  810:   Effets de bord : néant
  811: ================================================================================
  812: */
  813: 
  814: void
  815: instruction_rclf(struct_processus *s_etat_processus)
  816: {
  817:     struct_objet                        *s_objet_resultat;
  818: 
  819:     t_8_bits                            masque;
  820: 
  821:     unsigned char                       indice_bit;
  822:     unsigned char                       indice_bloc;
  823:     unsigned char                       indice_drapeau;
  824:     unsigned char                       taille_bloc;
  825: 
  826:     unsigned long                       i;
  827: 
  828:     (*s_etat_processus).erreur_execution = d_ex;
  829: 
  830:     if ((*s_etat_processus).affichage_arguments == 'Y')
  831:     {
  832:         printf("\n  RCLF ");
  833: 
  834:         if ((*s_etat_processus).langue == 'F')
  835:         {
  836:             printf("(renvoie les drapeaux d'état)\n\n");
  837:         }
  838:         else
  839:         {
  840:             printf("(recall flags)\n\n");
  841:         }
  842: 
  843:         printf("->  1: %s\n", d_BIN);
  844: 
  845:         return;
  846:     }
  847:     else if ((*s_etat_processus).test_instruction == 'Y')
  848:     {
  849:         (*s_etat_processus).nombre_arguments = -1;
  850:         return;
  851:     }
  852:     
  853:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  854:     {
  855:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  856:         {
  857:             return;
  858:         }
  859:     }
  860: 
  861:     if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL)
  862:     {
  863:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  864:         return;
  865:     }
  866: 
  867:     (*((logical8 *) (*s_objet_resultat).objet)) = 0;
  868:     taille_bloc = sizeof(t_8_bits) * 8;
  869: 
  870:     for(i = 1; i <= 64; i++)
  871:     {
  872:         indice_drapeau = (unsigned char) (i - 1);
  873:         indice_bloc = indice_drapeau / taille_bloc;
  874:         indice_bit = indice_drapeau % taille_bloc;
  875:         masque = (t_8_bits) (((t_8_bits) 1) << (taille_bloc - indice_bit - 1));
  876: 
  877:         if (((*s_etat_processus).drapeaux_etat[indice_bloc] & masque) != 0)
  878:         {
  879:             (*((logical8 *) (*s_objet_resultat).objet)) |=
  880:                     ((logical8) 1) << indice_drapeau;
  881:         }
  882:     }
  883: 
  884:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  885:             s_objet_resultat) == d_erreur)
  886:     {
  887:         return;
  888:     }
  889: 
  890:     return;
  891: }
  892: 
  893: 
  894: /*
  895: ================================================================================
  896:   Fonction 'rcl'
  897: ================================================================================
  898:   Entrées : structure processus
  899: -------------------------------------------------------------------------------
  900:   Sorties :
  901: --------------------------------------------------------------------------------
  902:   Effets de bord : néant
  903: ================================================================================
  904: */
  905: 
  906: void
  907: instruction_rcl(struct_processus *s_etat_processus)
  908: {
  909:     struct_objet                        *s_objet;
  910:     struct_objet                        *s_objet_variable;
  911: 
  912:     (*s_etat_processus).erreur_execution = d_ex;
  913: 
  914:     if ((*s_etat_processus).affichage_arguments == 'Y')
  915:     {
  916:         printf("\n  RCL ");
  917: 
  918:         if ((*s_etat_processus).langue == 'F')
  919:         {
  920:             printf("(renvoie le contenu d'une variable globale)\n\n");
  921:         }
  922:         else
  923:         {
  924:             printf("(recall global variable)\n\n");
  925:         }
  926: 
  927:         printf("    1: %s\n", d_NOM);
  928:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
  929:                 "       %s, %s, %s, %s, %s,\n"
  930:                 "       %s, %s, %s, %s, %s,\n"
  931:                 "       %s, %s, %s, %s,\n"
  932:                 "       %s, %s\n",
  933:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  934:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
  935:                 d_SQL, d_SLB, d_PRC, d_MTX);
  936: 
  937:         return;
  938:     }
  939:     else if ((*s_etat_processus).test_instruction == 'Y')
  940:     {
  941:         (*s_etat_processus).nombre_arguments = -1;
  942:         return;
  943:     }
  944:     
  945:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  946:     {
  947:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  948:         {
  949:             return;
  950:         }
  951:     }
  952: 
  953:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  954:             &s_objet) == d_erreur)
  955:     {
  956:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  957:         return;
  958:     }
  959: 
  960:     if ((*s_objet).type != NOM)
  961:     {
  962:         liberation(s_etat_processus, s_objet);
  963: 
  964:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  965:         return;
  966:     }
  967: 
  968:     if (recherche_variable_globale(s_etat_processus, (*((struct_nom *)
  969:             (*s_objet).objet)).nom) == d_faux)
  970:     {
  971:         liberation(s_etat_processus, s_objet);
  972: 
  973:         (*s_etat_processus).erreur_systeme = d_es;
  974: 
  975:         if ((*s_etat_processus).erreur_execution == d_ex)
  976:         {
  977:             (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
  978:         }
  979: 
  980:         return;
  981:     }
  982: 
  983:     if ((s_objet_variable = copie_objet(s_etat_processus,
  984:             (*(*s_etat_processus).pointeur_variable_courante).objet, 'P'))
  985:             == NULL)
  986:     {
  987:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  988:         return;
  989:     }
  990: 
  991:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  992:             s_objet_variable) == d_erreur)
  993:     {
  994:         return;
  995:     }
  996: 
  997:     liberation(s_etat_processus, s_objet);
  998: 
  999:     return;
 1000: }
 1001: 
 1002: 
 1003: /*
 1004: ================================================================================
 1005:   Fonction 'rand'
 1006: ================================================================================
 1007:   Entrées : structure processus
 1008: -------------------------------------------------------------------------------
 1009:   Sorties :
 1010: --------------------------------------------------------------------------------
 1011:   Effets de bord : néant
 1012: ================================================================================
 1013: */
 1014: 
 1015: void
 1016: instruction_rand(struct_processus *s_etat_processus)
 1017: {
 1018:     struct_objet                *s_objet;
 1019: 
 1020:     (*s_etat_processus).erreur_execution = d_ex;
 1021: 
 1022:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1023:     {
 1024:         printf("\n  RAND ");
 1025: 
 1026:         if ((*s_etat_processus).langue == 'F')
 1027:         {
 1028:             printf("(variable aléatoire uniforme)\n\n");
 1029:         }
 1030:         else
 1031:         {
 1032:             printf("(uniform random number)\n\n");
 1033:         }
 1034: 
 1035:         printf("->  1: %s\n", d_REL);
 1036: 
 1037:         return;
 1038:     }
 1039:     else if ((*s_etat_processus).test_instruction == 'Y')
 1040:     {
 1041:         (*s_etat_processus).nombre_arguments = -1;
 1042:         return;
 1043:     }
 1044:     
 1045:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1046:     {
 1047:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1048:         {
 1049:             return;
 1050:         }
 1051:     }
 1052: 
 1053:     if ((*s_etat_processus).generateur_aleatoire == NULL)
 1054:     {
 1055:         initialisation_generateur_aleatoire(s_etat_processus, d_vrai, 0);
 1056:     }
 1057: 
 1058:     if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
 1059:     {
 1060:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1061:         return;
 1062:     }
 1063: 
 1064:     (*((real8 *) (*s_objet).objet)) = gsl_rng_uniform(
 1065:             (*s_etat_processus).generateur_aleatoire);
 1066: 
 1067:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1068:             s_objet) == d_erreur)
 1069:     {
 1070:         return;
 1071:     }
 1072: 
 1073:     return;
 1074: }
 1075: 
 1076: 
 1077: /*
 1078: ================================================================================
 1079:   Fonction 'rdz'
 1080: ================================================================================
 1081:   Entrées : structure processus
 1082: -------------------------------------------------------------------------------
 1083:   Sorties :
 1084: --------------------------------------------------------------------------------
 1085:   Effets de bord : néant
 1086: ================================================================================
 1087: */
 1088: 
 1089: void
 1090: instruction_rdz(struct_processus *s_etat_processus)
 1091: {
 1092:     struct_objet                *s_objet;
 1093: 
 1094:     (*s_etat_processus).erreur_execution = d_ex;
 1095: 
 1096:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1097:     {
 1098:         printf("\n  RDZ ");
 1099: 
 1100:         if ((*s_etat_processus).langue == 'F')
 1101:         {
 1102:             printf("(racine des nombres aléatoires)\n\n");
 1103:         }
 1104:         else
 1105:         {
 1106:             printf("(random seed)\n\n");
 1107:         }
 1108: 
 1109:         printf("    1: %s\n", d_INT);
 1110: 
 1111:         return;
 1112:     }
 1113:     else if ((*s_etat_processus).test_instruction == 'Y')
 1114:     {
 1115:         (*s_etat_processus).nombre_arguments = -1;
 1116:         return;
 1117:     }
 1118:     
 1119:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1120:     {
 1121:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1122:         {
 1123:             return;
 1124:         }
 1125:     }
 1126: 
 1127:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1128:             &s_objet) == d_erreur)
 1129:     {
 1130:         return;
 1131:     }
 1132: 
 1133:     if ((*s_objet).type == INT)
 1134:     {
 1135:         initialisation_generateur_aleatoire(s_etat_processus, d_faux,
 1136:                 (*((integer8 *) (*s_objet).objet)));
 1137:     }
 1138:     else
 1139:     {
 1140:         liberation(s_etat_processus, s_objet);
 1141: 
 1142:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1143:         return;
 1144:     }
 1145: 
 1146:     liberation(s_etat_processus, s_objet);
 1147: }
 1148: 
 1149: 
 1150: /*
 1151: ================================================================================
 1152:   Fonction 'rnd'
 1153: ================================================================================
 1154:   Entrées : structure processus
 1155: --------------------------------------------------------------------------------
 1156:   Sorties :
 1157: --------------------------------------------------------------------------------
 1158:   Effets de bord : néant
 1159: ================================================================================
 1160: */
 1161: 
 1162: void
 1163: instruction_rnd(struct_processus *s_etat_processus)
 1164: {
 1165:     struct_objet                        *s_objet_argument;
 1166: 
 1167:     unsigned char                       *instruction_courante;
 1168: 
 1169:     (*s_etat_processus).erreur_execution = d_ex;
 1170: 
 1171:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1172:     {
 1173:         printf("\n  RND ");
 1174: 
 1175:         if ((*s_etat_processus).langue == 'F')
 1176:         {
 1177:             printf("(arrondi)\n\n");
 1178:         }
 1179:         else
 1180:         {
 1181:             printf("(rounding)\n\n");
 1182:         }
 1183: 
 1184:         printf("    1: %s, %s, %s, %s, %s, %s,\n"
 1185:                 "       %s, %s, %s\n",
 1186:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
 1187:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
 1188:                 "       %s, %s, %s\n",
 1189:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
 1190: 
 1191:         return;
 1192:     }
 1193:     else if ((*s_etat_processus).test_instruction == 'Y')
 1194:     {
 1195:         (*s_etat_processus).nombre_arguments = 1;
 1196:         return;
 1197:     }
 1198:     
 1199:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1200:     {
 1201:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1202:         {
 1203:             return;
 1204:         }
 1205:     }
 1206: 
 1207:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1208:             &s_objet_argument) == d_erreur)
 1209:     {
 1210:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1211:         return;
 1212:     }
 1213: 
 1214:     if (((*s_objet_argument).type == INT) ||
 1215:             ((*s_objet_argument).type == REL) ||
 1216:             ((*s_objet_argument).type == CPL) ||
 1217:             ((*s_objet_argument).type == VIN) ||
 1218:             ((*s_objet_argument).type == VRL) ||
 1219:             ((*s_objet_argument).type == VCX) ||
 1220:             ((*s_objet_argument).type == MIN) ||
 1221:             ((*s_objet_argument).type == MRL) ||
 1222:             ((*s_objet_argument).type == MCX))
 1223:     {
 1224:         instruction_courante = (*s_etat_processus).instruction_courante;
 1225: 
 1226:         if (((*s_etat_processus).instruction_courante =
 1227:                 formateur(s_etat_processus, 0, s_objet_argument)) == NULL)
 1228:         {
 1229:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1230:             (*s_etat_processus).instruction_courante = instruction_courante;
 1231:             return;
 1232:         }
 1233: 
 1234:         (*s_etat_processus).type_en_cours = NON;
 1235:         recherche_type(s_etat_processus);
 1236: 
 1237:         free((*s_etat_processus).instruction_courante);
 1238:         (*s_etat_processus).instruction_courante = instruction_courante;
 1239: 
 1240:         if ((*s_etat_processus).erreur_systeme != d_es)
 1241:         {
 1242:             return;
 1243:         }
 1244: 
 1245:         if ((*s_etat_processus).erreur_execution != d_ex)
 1246:         {
 1247:             liberation(s_etat_processus, s_objet_argument);
 1248:             return;
 1249:         }
 1250:     }
 1251:     else
 1252:     {
 1253:         liberation(s_etat_processus, s_objet_argument);
 1254: 
 1255:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1256:         return;
 1257:     }
 1258: 
 1259:     liberation(s_etat_processus, s_objet_argument);
 1260: 
 1261:     return;
 1262: }
 1263: 
 1264: 
 1265: /*
 1266: ================================================================================
 1267:   Fonction 'r->c'
 1268: ================================================================================
 1269:   Entrées : structure processus
 1270: --------------------------------------------------------------------------------
 1271:   Sorties :
 1272: --------------------------------------------------------------------------------
 1273:   Effets de bord : néant
 1274: ================================================================================
 1275: */
 1276: 
 1277: void
 1278: instruction_r_vers_c(struct_processus *s_etat_processus)
 1279: {
 1280:     struct_objet                    *s_objet_argument_1;
 1281:     struct_objet                    *s_objet_argument_2;
 1282:     struct_objet                    *s_objet_resultat;
 1283: 
 1284:     integer8                        i;
 1285:     integer8                        j;
 1286: 
 1287:     (*s_etat_processus).erreur_execution = d_ex;
 1288: 
 1289:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1290:     {
 1291:         printf("\n  R->C ");
 1292: 
 1293:         if ((*s_etat_processus).langue == 'F')
 1294:         {
 1295:             printf("(réel vers complexe)\n\n");
 1296:         }
 1297:         else
 1298:         {
 1299:             printf("(real to complex)\n\n");
 1300:         }
 1301: 
 1302:         printf("    2: %s, %s\n", d_INT, d_REL);
 1303:         printf("    1: %s, %s\n", d_INT, d_REL);
 1304:         printf("->  1: %s\n\n", d_CPL);
 1305: 
 1306:         printf("    2: %s, %s\n", d_VIN, d_VRL);
 1307:         printf("    1: %s, %s\n", d_VIN, d_VRL);
 1308:         printf("->  1: %s\n\n", d_VCX);
 1309: 
 1310:         printf("    2: %s, %s\n", d_MIN, d_MRL);
 1311:         printf("    1: %s, %s\n", d_MIN, d_MRL);
 1312:         printf("->  1: %s\n", d_MCX);
 1313: 
 1314:         return;
 1315:     }
 1316:     else if ((*s_etat_processus).test_instruction == 'Y')
 1317:     {
 1318:         (*s_etat_processus).nombre_arguments = -1;
 1319:         return;
 1320:     }
 1321: 
 1322:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1323:     {
 1324:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
 1325:         {
 1326:             return;
 1327:         }
 1328:     }
 1329: 
 1330:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1331:             &s_objet_argument_1) == d_erreur)
 1332:     {
 1333:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1334:         return;
 1335:     }
 1336: 
 1337:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1338:             &s_objet_argument_2) == d_erreur)
 1339:     {
 1340:         liberation(s_etat_processus, s_objet_argument_1);
 1341: 
 1342:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1343:         return;
 1344:     }
 1345: 
 1346: /*
 1347: --------------------------------------------------------------------------------
 1348:   Formation d'un complexe à partir de deux réels
 1349: --------------------------------------------------------------------------------
 1350: */
 1351: 
 1352:     if ((((*s_objet_argument_1).type == INT) ||
 1353:             ((*s_objet_argument_1).type == REL)) &&
 1354:             (((*s_objet_argument_2).type == INT) ||
 1355:             ((*s_objet_argument_2).type == REL)))
 1356:     {
 1357:         if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
 1358:         {
 1359:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1360:             return;
 1361:         }
 1362: 
 1363:         if ((*s_objet_argument_1).type == INT)
 1364:         {
 1365:             (*((struct_complexe16 *) (*s_objet_resultat).objet))
 1366:                     .partie_imaginaire = (real8)
 1367:                     (*((integer8 *) (*s_objet_argument_1).objet));
 1368:         }
 1369:         else
 1370:         {
 1371:             (*((struct_complexe16 *) (*s_objet_resultat).objet))
 1372:                     .partie_imaginaire =
 1373:                     (*((real8 *) (*s_objet_argument_1).objet));
 1374:         }
 1375: 
 1376:         if ((*s_objet_argument_2).type == INT)
 1377:         {
 1378:             (*((struct_complexe16 *) (*s_objet_resultat).objet))
 1379:                     .partie_reelle = (real8)
 1380:                     (*((integer8 *) (*s_objet_argument_2).objet));
 1381:         }
 1382:         else
 1383:         {
 1384:             (*((struct_complexe16 *) (*s_objet_resultat).objet))
 1385:                     .partie_reelle =
 1386:                     (*((real8 *) (*s_objet_argument_2).objet));
 1387:         }
 1388:     }
 1389: 
 1390: /*
 1391: --------------------------------------------------------------------------------
 1392:   Formation à partir de deux vecteurs
 1393: --------------------------------------------------------------------------------
 1394: */
 1395: 
 1396:     else if ((((*s_objet_argument_1).type == VIN) ||
 1397:             ((*s_objet_argument_1).type == VRL)) &&
 1398:             (((*s_objet_argument_2).type == VIN) ||
 1399:             ((*s_objet_argument_2).type == VRL)))
 1400:     {
 1401:         if ((*(((struct_vecteur *) (*s_objet_argument_1).objet))).taille !=
 1402:                 (*(((struct_vecteur *) (*s_objet_argument_2).objet))).taille)
 1403:         {
 1404:             liberation(s_etat_processus, s_objet_argument_1);
 1405:             liberation(s_etat_processus, s_objet_argument_2);
 1406: 
 1407:             (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
 1408:             return;
 1409:         }
 1410: 
 1411:         if ((s_objet_resultat = allocation(s_etat_processus, VCX)) == NULL)
 1412:         {
 1413:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1414:             return;
 1415:         }
 1416: 
 1417:         (*((struct_vecteur *) (*s_objet_resultat).objet)).taille =
 1418:                 (*((struct_vecteur *) (*s_objet_argument_1).objet)).taille;
 1419: 
 1420:         if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau =
 1421:                 malloc(((size_t) (*(((struct_vecteur *) (*s_objet_resultat)
 1422:                 .objet))).taille) * sizeof(struct_complexe16))) == NULL)
 1423:         {
 1424:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1425:             return;
 1426:         }
 1427: 
 1428:         for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument_1).objet)))
 1429:                 .taille; i++)
 1430:         {
 1431:             if ((*s_objet_argument_1).type == VIN)
 1432:             {
 1433:                 ((struct_complexe16 *) (*((struct_vecteur *)
 1434:                         (*s_objet_resultat).objet)).tableau)[i]
 1435:                         .partie_imaginaire = (real8) ((integer8 *)
 1436:                         (*((struct_vecteur *) (*s_objet_argument_1).objet))
 1437:                         .tableau)[i];
 1438:             }
 1439:             else
 1440:             {
 1441:                 ((struct_complexe16 *) (*((struct_vecteur *)
 1442:                         (*s_objet_resultat).objet)).tableau)[i]
 1443:                         .partie_imaginaire = ((real8 *)
 1444:                         (*((struct_vecteur *) (*s_objet_argument_1).objet))
 1445:                         .tableau)[i];
 1446:             }
 1447: 
 1448:             if ((*s_objet_argument_2).type == VIN)
 1449:             {
 1450:                 ((struct_complexe16 *) (*((struct_vecteur *)
 1451:                         (*s_objet_resultat).objet)).tableau)[i]
 1452:                         .partie_reelle = (real8) ((integer8 *)
 1453:                         (*((struct_vecteur *) (*s_objet_argument_2).objet))
 1454:                         .tableau)[i];
 1455:             }
 1456:             else
 1457:             {
 1458:                 ((struct_complexe16 *) (*((struct_vecteur *)
 1459:                         (*s_objet_resultat).objet)).tableau)[i]
 1460:                         .partie_reelle = ((real8 *)
 1461:                         (*((struct_vecteur *) (*s_objet_argument_2).objet))
 1462:                         .tableau)[i];
 1463:             }
 1464:         }
 1465:     }
 1466: 
 1467: /*
 1468: --------------------------------------------------------------------------------
 1469:   Formation à partir de deux matrices
 1470: --------------------------------------------------------------------------------
 1471: */
 1472: 
 1473:     else if ((((*s_objet_argument_1).type == MIN) ||
 1474:             ((*s_objet_argument_1).type == MRL)) &&
 1475:             (((*s_objet_argument_2).type == MIN) ||
 1476:             ((*s_objet_argument_2).type == MRL)))
 1477:     {
 1478:         if (((*(((struct_matrice *) (*s_objet_argument_1).objet)))
 1479:                 .nombre_lignes != (*(((struct_matrice *) (*s_objet_argument_2)
 1480:                 .objet))).nombre_lignes) || ((*(((struct_matrice *)
 1481:                 (*s_objet_argument_1).objet))).nombre_colonnes !=
 1482:                 (*(((struct_matrice *) (*s_objet_argument_2).objet)))
 1483:                 .nombre_lignes))
 1484:         {
 1485:             liberation(s_etat_processus, s_objet_argument_1);
 1486:             liberation(s_etat_processus, s_objet_argument_2);
 1487: 
 1488:             (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
 1489:             return;
 1490:         }
 1491: 
 1492:         if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
 1493:         {
 1494:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1495:             return;
 1496:         }
 1497: 
 1498:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
 1499:                 (*((struct_matrice *) (*s_objet_argument_1).objet))
 1500:                 .nombre_lignes;
 1501:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
 1502:                 (*((struct_matrice *) (*s_objet_argument_1).objet))
 1503:                 .nombre_colonnes;
 1504: 
 1505:         if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
 1506:                 malloc(((size_t) (*(((struct_matrice *) (*s_objet_resultat)
 1507:                 .objet))).nombre_lignes) * sizeof(struct_complexe16 *)))
 1508:                 == NULL)
 1509:         {
 1510:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1511:             return;
 1512:         }
 1513: 
 1514:         for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument_1).objet)))
 1515:                 .nombre_lignes; i++)
 1516:         {
 1517:             if ((((struct_complexe16 **) (*((struct_matrice *)
 1518:                     (*s_objet_resultat).objet)).tableau)[i] =
 1519:                     malloc(((size_t) (*((struct_matrice *)
 1520:                     (*s_objet_resultat).objet)).nombre_colonnes) *
 1521:                     sizeof(struct_complexe16))) == NULL)
 1522:             {
 1523:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1524:                 return;
 1525:             }
 1526: 
 1527:             for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument_1).objet)))
 1528:                     .nombre_colonnes; j++)
 1529:             {
 1530:                 if ((*s_objet_argument_1).type == MIN)
 1531:                 {
 1532:                     ((struct_complexe16 **) (*((struct_matrice *)
 1533:                             (*s_objet_resultat).objet)).tableau)[i][j]
 1534:                             .partie_imaginaire = (real8) ((integer8 **)
 1535:                             (*((struct_matrice *) (*s_objet_argument_1).objet))
 1536:                             .tableau)[i][j];
 1537:                 }
 1538:                 else
 1539:                 {
 1540:                     ((struct_complexe16 **) (*((struct_matrice *)
 1541:                             (*s_objet_resultat).objet)).tableau)[i][j]
 1542:                             .partie_imaginaire = ((real8 **)
 1543:                             (*((struct_matrice *) (*s_objet_argument_1).objet))
 1544:                             .tableau)[i][j];
 1545:                 }
 1546: 
 1547:                 if ((*s_objet_argument_2).type == MIN)
 1548:                 {
 1549:                     ((struct_complexe16 **) (*((struct_matrice *)
 1550:                             (*s_objet_resultat).objet)).tableau)[i][j]
 1551:                             .partie_reelle = (real8) ((integer8 **)
 1552:                             (*((struct_matrice *) (*s_objet_argument_2).objet))
 1553:                             .tableau)[i][j];
 1554:                 }
 1555:                 else
 1556:                 {
 1557:                     ((struct_complexe16 **) (*((struct_matrice *)
 1558:                             (*s_objet_resultat).objet)).tableau)[i][j]
 1559:                             .partie_reelle = ((real8 **)
 1560:                             (*((struct_matrice *) (*s_objet_argument_2).objet))
 1561:                             .tableau)[i][j];
 1562:                 }
 1563:             }
 1564:         }
 1565:     }
 1566: 
 1567: /*
 1568: --------------------------------------------------------------------------------
 1569:   Formation impossible
 1570: --------------------------------------------------------------------------------
 1571: */
 1572: 
 1573:     else
 1574:     {
 1575:         liberation(s_etat_processus, s_objet_argument_1);
 1576:         liberation(s_etat_processus, s_objet_argument_2);
 1577: 
 1578:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1579:         return;
 1580:     }
 1581: 
 1582:     liberation(s_etat_processus, s_objet_argument_1);
 1583:     liberation(s_etat_processus, s_objet_argument_2);
 1584: 
 1585:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1586:             s_objet_resultat) == d_erreur)
 1587:     {
 1588:         return;
 1589:     }
 1590: 
 1591:     return;
 1592: }
 1593: 
 1594: 
 1595: /*
 1596: ================================================================================
 1597:   Fonction 're'
 1598: ================================================================================
 1599:   Entrées : structure processus
 1600: --------------------------------------------------------------------------------
 1601:   Sorties :
 1602: --------------------------------------------------------------------------------
 1603:   Effets de bord : néant
 1604: ================================================================================
 1605: */
 1606: 
 1607: void
 1608: instruction_re(struct_processus *s_etat_processus)
 1609: {
 1610:     struct_liste_chainee            *l_element_courant;
 1611:     struct_liste_chainee            *l_element_precedent;
 1612: 
 1613:     struct_objet                    *s_copie_argument;
 1614:     struct_objet                    *s_objet_argument;
 1615:     struct_objet                    *s_objet_resultat;
 1616: 
 1617:     integer8                        i;
 1618:     integer8                        j;
 1619: 
 1620:     (*s_etat_processus).erreur_execution = d_ex;
 1621: 
 1622:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1623:     {
 1624:         printf("\n  RE ");
 1625: 
 1626:         if ((*s_etat_processus).langue == 'F')
 1627:         {
 1628:             printf("(partie réelle)\n\n");
 1629:         }
 1630:         else
 1631:         {
 1632:             printf("(real part)\n\n");
 1633:         }
 1634: 
 1635:         printf("    1: %s, %s\n", d_INT, d_REL);
 1636:         printf("->  1: %s\n\n", d_INT);
 1637: 
 1638:         printf("    1: %s\n", d_CPL);
 1639:         printf("->  1: %s\n\n", d_REL);
 1640: 
 1641:         printf("    1: %s, %s\n", d_VIN, d_VRL);
 1642:         printf("->  1: %s\n\n", d_VIN);
 1643: 
 1644:         printf("    1: %s\n", d_VCX);
 1645:         printf("->  1: %s\n\n", d_VRL);
 1646: 
 1647:         printf("    1: %s, %s\n", d_MIN, d_MRL);
 1648:         printf("->  1: %s\n\n", d_MIN);
 1649: 
 1650:         printf("    1: %s\n", d_MCX);
 1651:         printf("->  1: %s\n\n", d_MRL);
 1652: 
 1653:         printf("    1: %s, %s\n", d_NOM, d_ALG);
 1654:         printf("->  1: %s\n\n", d_ALG);
 1655: 
 1656:         printf("    1: %s\n", d_RPN);
 1657:         printf("->  1: %s\n", d_RPN);
 1658: 
 1659:         return;
 1660:     }
 1661:     else if ((*s_etat_processus).test_instruction == 'Y')
 1662:     {
 1663:         (*s_etat_processus).nombre_arguments = 1;
 1664:         return;
 1665:     }
 1666:     
 1667:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1668:     {
 1669:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1670:         {
 1671:             return;
 1672:         }
 1673:     }
 1674: 
 1675:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1676:             &s_objet_argument) == d_erreur)
 1677:     {
 1678:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1679:         return;
 1680:     }
 1681: 
 1682: /*
 1683: --------------------------------------------------------------------------------
 1684:   Partie réelle d'un entier ou d'un réel
 1685: --------------------------------------------------------------------------------
 1686: */
 1687: 
 1688:     if (((*s_objet_argument).type == INT) ||
 1689:             ((*s_objet_argument).type == REL))
 1690:     {
 1691:         s_objet_resultat = s_objet_argument;
 1692:         s_objet_argument = NULL;
 1693:     }
 1694: 
 1695: /*
 1696: --------------------------------------------------------------------------------
 1697:   Partie réelle d'un complexe
 1698: --------------------------------------------------------------------------------
 1699: */
 1700: 
 1701:     else if ((*s_objet_argument).type == CPL)
 1702:     {
 1703:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
 1704:         {
 1705:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1706:             return;
 1707:         }
 1708: 
 1709:         (*((real8 *) (*s_objet_resultat).objet)) =
 1710:                 (*((struct_complexe16 *) (*s_objet_argument).objet))
 1711:                 .partie_reelle;
 1712:     }
 1713: 
 1714: /*
 1715: --------------------------------------------------------------------------------
 1716:   Partie réelle d'un vecteur
 1717: --------------------------------------------------------------------------------
 1718: */
 1719: 
 1720:     else if (((*s_objet_argument).type == VIN) ||
 1721:             ((*s_objet_argument).type == VRL))
 1722:     {
 1723:         s_objet_resultat = s_objet_argument;
 1724:         s_objet_argument = NULL;
 1725:     }
 1726:     else if ((*s_objet_argument).type == VCX)
 1727:     {
 1728:         if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
 1729:         {
 1730:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1731:             return;
 1732:         }
 1733: 
 1734:         if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau =
 1735:                 malloc(((size_t) (*(((struct_vecteur *) (*s_objet_argument)
 1736:                 .objet))).taille) * sizeof(real8))) == NULL)
 1737:         {
 1738:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1739:             return;
 1740:         }
 1741: 
 1742:         (*((struct_vecteur *) (*s_objet_resultat).objet)).taille =
 1743:                 (*(((struct_vecteur *) (*s_objet_argument).objet))).taille;
 1744: 
 1745:         for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument).objet)))
 1746:                 .taille; i++)
 1747:         {
 1748:             ((real8 *) (*((struct_vecteur *) (*s_objet_resultat).objet))
 1749:                     .tableau)[i] = ((struct_complexe16 *) (*((struct_vecteur *)
 1750:                     (*s_objet_argument).objet)).tableau)[i].partie_reelle;
 1751:         }
 1752:     }
 1753: 
 1754: /*
 1755: --------------------------------------------------------------------------------
 1756:   Partie réelle d'une matrice
 1757: --------------------------------------------------------------------------------
 1758: */
 1759: 
 1760:     else if (((*s_objet_argument).type == MIN) ||
 1761:             ((*s_objet_argument).type == MRL))
 1762:     {
 1763:         s_objet_resultat = s_objet_argument;
 1764:         s_objet_argument = NULL;
 1765:     }
 1766:     else if ((*s_objet_argument).type == MCX)
 1767:     {
 1768:         if ((s_objet_resultat = allocation(s_etat_processus, MRL)) == NULL)
 1769:         {
 1770:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1771:             return;
 1772:         }
 1773: 
 1774:         if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
 1775:                 malloc(((size_t) (*(((struct_matrice *) (*s_objet_argument)
 1776:                 .objet))).nombre_lignes) * sizeof(real8 *))) == NULL)
 1777:         {
 1778:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1779:             return;
 1780:         }
 1781: 
 1782:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
 1783:                 (*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes;
 1784:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
 1785:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1786:                 .nombre_colonnes;
 1787: 
 1788:         for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument).objet)))
 1789:                 .nombre_lignes; i++)
 1790:         {
 1791:             if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat)
 1792:                     .objet)).tableau)[i] = malloc(((size_t) 
 1793:                     (*(((struct_matrice *) (*s_objet_argument).objet)))
 1794:                     .nombre_colonnes) * sizeof(real8))) == NULL)
 1795:             {
 1796:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1797:                 return;
 1798:             }
 1799: 
 1800:             for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument).objet)))
 1801:                     .nombre_colonnes; j++)
 1802:             {
 1803:                 ((real8 **) (*((struct_matrice *) (*s_objet_resultat).objet))
 1804:                         .tableau)[i][j] = ((struct_complexe16 **)
 1805:                         (*((struct_matrice *) (*s_objet_argument).objet))
 1806:                         .tableau)[i][j].partie_reelle;
 1807:             }
 1808:         }
 1809:     }
 1810: 
 1811: /*
 1812: --------------------------------------------------------------------------------
 1813:   Partie réelle d'un nom
 1814: --------------------------------------------------------------------------------
 1815: */
 1816: 
 1817:     else if ((*s_objet_argument).type == NOM)
 1818:     {
 1819:         if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
 1820:         {
 1821:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1822:             return;
 1823:         }
 1824: 
 1825:         if (((*s_objet_resultat).objet =
 1826:                 allocation_maillon(s_etat_processus)) == NULL)
 1827:         {
 1828:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1829:             return;
 1830:         }
 1831: 
 1832:         l_element_courant = (*s_objet_resultat).objet;
 1833: 
 1834:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1835:                 == NULL)
 1836:         {
 1837:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1838:             return;
 1839:         }
 1840: 
 1841:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1842:                 .nombre_arguments = 0;
 1843:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1844:                 .fonction = instruction_vers_niveau_superieur;
 1845: 
 1846:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1847:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1848:         {
 1849:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1850:             return;
 1851:         }
 1852: 
 1853:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1854:                 .nom_fonction, "<<");
 1855: 
 1856:         if (((*l_element_courant).suivant =
 1857:                 allocation_maillon(s_etat_processus)) == NULL)
 1858:         {
 1859:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1860:             return;
 1861:         }
 1862: 
 1863:         l_element_courant = (*l_element_courant).suivant;
 1864:         (*l_element_courant).donnee = s_objet_argument;
 1865: 
 1866:         if (((*l_element_courant).suivant =
 1867:                 allocation_maillon(s_etat_processus)) == NULL)
 1868:         {
 1869:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1870:             return;
 1871:         }
 1872: 
 1873:         l_element_courant = (*l_element_courant).suivant;
 1874: 
 1875:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1876:                 == NULL)
 1877:         {
 1878:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1879:             return;
 1880:         }
 1881: 
 1882:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1883:                 .nombre_arguments = 1;
 1884:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1885:                 .fonction = instruction_re;
 1886: 
 1887:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1888:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1889:         {
 1890:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1891:             return;
 1892:         }
 1893: 
 1894:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1895:                 .nom_fonction, "RE");
 1896: 
 1897:         if (((*l_element_courant).suivant =
 1898:                 allocation_maillon(s_etat_processus)) == NULL)
 1899:         {
 1900:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1901:             return;
 1902:         }
 1903: 
 1904:         l_element_courant = (*l_element_courant).suivant;
 1905: 
 1906:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1907:                 == NULL)
 1908:         {
 1909:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1910:             return;
 1911:         }
 1912: 
 1913:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1914:                 .nombre_arguments = 0;
 1915:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1916:                 .fonction = instruction_vers_niveau_inferieur;
 1917: 
 1918:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1919:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1920:         {
 1921:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1922:             return;
 1923:         }
 1924: 
 1925:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1926:                 .nom_fonction, ">>");
 1927: 
 1928:         (*l_element_courant).suivant = NULL;
 1929:         s_objet_argument = NULL;
 1930:     }
 1931: 
 1932: /*
 1933: --------------------------------------------------------------------------------
 1934:   Partie réelle d'une expression
 1935: --------------------------------------------------------------------------------
 1936: */
 1937: 
 1938:     else if (((*s_objet_argument).type == ALG) ||
 1939:             ((*s_objet_argument).type == RPN))
 1940:     {
 1941:         if ((s_copie_argument = copie_objet(s_etat_processus,
 1942:                 s_objet_argument, 'N')) == NULL)
 1943:         {
 1944:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1945:             return;
 1946:         }
 1947: 
 1948:         l_element_courant = (struct_liste_chainee *)
 1949:                 (*s_copie_argument).objet;
 1950:         l_element_precedent = l_element_courant;
 1951: 
 1952:         while((*l_element_courant).suivant != NULL)
 1953:         {
 1954:             l_element_precedent = l_element_courant;
 1955:             l_element_courant = (*l_element_courant).suivant;
 1956:         }
 1957: 
 1958:         if (((*l_element_precedent).suivant =
 1959:                 allocation_maillon(s_etat_processus)) == NULL)
 1960:         {
 1961:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1962:             return;
 1963:         }
 1964: 
 1965:         if (((*(*l_element_precedent).suivant).donnee =
 1966:                 allocation(s_etat_processus, FCT)) == NULL)
 1967:         {
 1968:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1969:             return;
 1970:         }
 1971: 
 1972:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1973:                 .donnee).objet)).nombre_arguments = 1;
 1974:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1975:                 .donnee).objet)).fonction = instruction_re;
 1976: 
 1977:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 1978:                 .suivant).donnee).objet)).nom_fonction =
 1979:                 malloc(3 * sizeof(unsigned char))) == NULL)
 1980:         {
 1981:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1982:             return;
 1983:         }
 1984: 
 1985:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 1986:                 .suivant).donnee).objet)).nom_fonction, "RE");
 1987: 
 1988:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1989: 
 1990:         s_objet_resultat = s_copie_argument;
 1991:     }
 1992: 
 1993: /*
 1994: --------------------------------------------------------------------------------
 1995:   Réalisation impossible de la fonction partie réelle
 1996: --------------------------------------------------------------------------------
 1997: */
 1998: 
 1999:     else
 2000:     {
 2001:         liberation(s_etat_processus, s_objet_argument);
 2002: 
 2003:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2004:         return;
 2005:     }
 2006: 
 2007:     liberation(s_etat_processus, s_objet_argument);
 2008: 
 2009:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2010:             s_objet_resultat) == d_erreur)
 2011:     {
 2012:         return;
 2013:     }
 2014: 
 2015:     return;
 2016: }
 2017: 
 2018: 
 2019: /*
 2020: ================================================================================
 2021:   Fonction 'r->p'
 2022: ================================================================================
 2023:   Entrées : pointeur sur une structure struct_processus
 2024: --------------------------------------------------------------------------------
 2025:   Sorties :
 2026: --------------------------------------------------------------------------------
 2027:   Effets de bord : néant
 2028: ================================================================================
 2029: */
 2030: 
 2031: void
 2032: instruction_r_vers_p(struct_processus *s_etat_processus)
 2033: {
 2034:     struct_liste_chainee            *l_element_courant;
 2035:     struct_liste_chainee            *l_element_precedent;
 2036: 
 2037:     struct_objet                    *s_copie_argument;
 2038:     struct_objet                    *s_objet_argument;
 2039:     struct_objet                    *s_objet_resultat;
 2040: 
 2041:     (*s_etat_processus).erreur_execution = d_ex;
 2042: 
 2043:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2044:     {
 2045:         printf("\n  P->R ");
 2046: 
 2047:         if ((*s_etat_processus).langue == 'F')
 2048:         {
 2049:             printf("(coordonnées polaires vers cartésiennes)\n\n");
 2050:         }
 2051:         else
 2052:         {
 2053:             printf("(polar to cartesian coordinates)\n\n");
 2054:         }
 2055: 
 2056:         printf("    1: %s, %s, %s\n", d_INT, d_REL, d_CPL);
 2057:         printf("->  1: %s\n\n", d_CPL);
 2058: 
 2059:         printf("    1: %s, %s\n", d_NOM, d_ALG);
 2060:         printf("->  1: %s\n\n", d_ALG);
 2061: 
 2062:         printf("    1: %s\n", d_RPN);
 2063:         printf("->  1: %s\n", d_RPN);
 2064: 
 2065:         return;
 2066:     }
 2067:     else if ((*s_etat_processus).test_instruction == 'Y')
 2068:     {
 2069:         (*s_etat_processus).nombre_arguments = -1;
 2070:         return;
 2071:     }
 2072: 
 2073:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2074:     {
 2075:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 2076:         {
 2077:             return;
 2078:         }
 2079:     }
 2080: 
 2081:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2082:             &s_objet_argument) == d_erreur)
 2083:     {
 2084:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2085:         return;
 2086:     }
 2087: 
 2088: /*
 2089: --------------------------------------------------------------------------------
 2090:   Conversion d'un entier ou d'un réel
 2091: --------------------------------------------------------------------------------
 2092: */
 2093: 
 2094:     if (((*s_objet_argument).type == INT) ||
 2095:             ((*s_objet_argument).type == REL))
 2096:     {
 2097:         if ((s_objet_resultat = allocation(s_etat_processus, CPL))
 2098:                 == NULL)
 2099:         {
 2100:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2101:             return;
 2102:         }
 2103: 
 2104:         if ((*s_objet_argument).type == INT)
 2105:         {
 2106:             (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle
 2107:                     = (real8) (*((integer8 *) (*s_objet_argument).objet));
 2108:         }
 2109:         else
 2110:         {
 2111:             (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle
 2112:                     = (*((real8 *) (*s_objet_argument).objet));
 2113:         }
 2114: 
 2115:         (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_imaginaire
 2116:                 = 0;
 2117:     }
 2118: 
 2119: /*
 2120: --------------------------------------------------------------------------------
 2121:   Conversion d'un complexe
 2122: --------------------------------------------------------------------------------
 2123: */
 2124: 
 2125:     else if ((*s_objet_argument).type == CPL)
 2126:     {
 2127:         if ((s_objet_resultat = allocation(s_etat_processus, CPL))
 2128:                 == NULL)
 2129:         {
 2130:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2131:             return;
 2132:         }
 2133: 
 2134:         f77absc_(((struct_complexe16 *) (*s_objet_argument).objet),
 2135:                 &((*((struct_complexe16 *) (*s_objet_resultat).objet))
 2136:                 .partie_reelle));
 2137: 
 2138:         (*((struct_complexe16 *) (*s_objet_resultat).objet))
 2139:                 .partie_imaginaire = atan2((*((struct_complexe16 *)
 2140:                 (*s_objet_argument).objet)).partie_imaginaire,
 2141:                 (*((struct_complexe16 *) (*s_objet_argument).objet))
 2142:                 .partie_reelle);
 2143: 
 2144:         if (test_cfsf(s_etat_processus, 60) == d_faux)
 2145:         {
 2146:             conversion_radians_vers_degres(&((*((struct_complexe16 *)
 2147:                     (*s_objet_resultat).objet)).partie_imaginaire));
 2148:         }
 2149:     }
 2150: 
 2151: /*
 2152: --------------------------------------------------------------------------------
 2153:   Conversion d'un nom
 2154: --------------------------------------------------------------------------------
 2155: */
 2156: 
 2157:     else if ((*s_objet_argument).type == NOM)
 2158:     {
 2159:         if ((s_objet_resultat = allocation(s_etat_processus, ALG))
 2160:                 == NULL)
 2161:         {
 2162:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2163:             return;
 2164:         }
 2165: 
 2166:         if (((*s_objet_resultat).objet =
 2167:                 allocation_maillon(s_etat_processus)) == NULL)
 2168:         {
 2169:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2170:             return;
 2171:         }
 2172: 
 2173:         l_element_courant = (*s_objet_resultat).objet;
 2174: 
 2175:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 2176:                 == NULL)
 2177:         {
 2178:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2179:             return;
 2180:         }
 2181: 
 2182:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2183:                 .nombre_arguments = 0;
 2184:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2185:                 .fonction = instruction_vers_niveau_superieur;
 2186: 
 2187:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2188:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 2189:         {
 2190:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2191:             return;
 2192:         }
 2193: 
 2194:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2195:                 .nom_fonction, "<<");
 2196: 
 2197:         if (((*l_element_courant).suivant =
 2198:                 allocation_maillon(s_etat_processus)) == NULL)
 2199:         {
 2200:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2201:             return;
 2202:         }
 2203: 
 2204:         l_element_courant = (*l_element_courant).suivant;
 2205:         (*l_element_courant).donnee = s_objet_argument;
 2206: 
 2207:         if (((*l_element_courant).suivant =
 2208:                 allocation_maillon(s_etat_processus)) == NULL)
 2209:         {
 2210:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2211:             return;
 2212:         }
 2213: 
 2214:         l_element_courant = (*l_element_courant).suivant;
 2215: 
 2216:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 2217:                 == NULL)
 2218:         {
 2219:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2220:             return;
 2221:         }
 2222: 
 2223:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2224:                 .nombre_arguments = 1;
 2225:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2226:                 .fonction = instruction_r_vers_p;
 2227: 
 2228:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2229:                 .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
 2230:         {
 2231:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2232:             return;
 2233:         }
 2234: 
 2235:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2236:                 .nom_fonction, "R->P");
 2237: 
 2238:         if (((*l_element_courant).suivant =
 2239:                 allocation_maillon(s_etat_processus)) == NULL)
 2240:         {
 2241:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2242:             return;
 2243:         }
 2244: 
 2245:         l_element_courant = (*l_element_courant).suivant;
 2246: 
 2247:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 2248:                 == NULL)
 2249:         {
 2250:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2251:             return;
 2252:         }
 2253: 
 2254:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2255:                 .nombre_arguments = 0;
 2256:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2257:                 .fonction = instruction_vers_niveau_inferieur;
 2258: 
 2259:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2260:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 2261:         {
 2262:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2263:             return;
 2264:         }
 2265: 
 2266:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2267:                 .nom_fonction, ">>");
 2268: 
 2269:         (*l_element_courant).suivant = NULL;
 2270:         s_objet_argument = NULL;
 2271:     }
 2272: 
 2273: /*
 2274: --------------------------------------------------------------------------------
 2275:   Conversion d'une expression
 2276: --------------------------------------------------------------------------------
 2277: */
 2278: 
 2279:     else if (((*s_objet_argument).type == ALG) ||
 2280:             ((*s_objet_argument).type == RPN))
 2281:     {
 2282:         if ((s_copie_argument = copie_objet(s_etat_processus,
 2283:                 s_objet_argument, 'N')) == NULL)
 2284:         {
 2285:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2286:             return;
 2287:         }
 2288: 
 2289:         l_element_courant = (struct_liste_chainee *)
 2290:                 (*s_copie_argument).objet;
 2291:         l_element_precedent = l_element_courant;
 2292: 
 2293:         while((*l_element_courant).suivant != NULL)
 2294:         {
 2295:             l_element_precedent = l_element_courant;
 2296:             l_element_courant = (*l_element_courant).suivant;
 2297:         }
 2298: 
 2299:         if (((*l_element_precedent).suivant =
 2300:                 allocation_maillon(s_etat_processus)) == NULL)
 2301:         {
 2302:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2303:             return;
 2304:         }
 2305: 
 2306:         if (((*(*l_element_precedent).suivant).donnee =
 2307:                 allocation(s_etat_processus, FCT)) == NULL)
 2308:         {
 2309:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2310:             return;
 2311:         }
 2312: 
 2313:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 2314:                 .donnee).objet)).nombre_arguments = 1;
 2315:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 2316:                 .donnee).objet)).fonction = instruction_r_vers_p;
 2317: 
 2318:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 2319:                 .suivant).donnee).objet)).nom_fonction =
 2320:                 malloc(5 * sizeof(unsigned char))) == NULL)
 2321:         {
 2322:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2323:             return;
 2324:         }
 2325: 
 2326:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 2327:                 .suivant).donnee).objet)).nom_fonction, "R->P");
 2328: 
 2329:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 2330: 
 2331:         s_objet_resultat = s_copie_argument;
 2332:     }
 2333: 
 2334: /*
 2335: --------------------------------------------------------------------------------
 2336:   Réalisation impossible de la fonction R->P
 2337: --------------------------------------------------------------------------------
 2338: */
 2339: 
 2340:     else
 2341:     {
 2342:         liberation(s_etat_processus, s_objet_argument);
 2343: 
 2344:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2345:         return;
 2346:     }
 2347: 
 2348:     liberation(s_etat_processus, s_objet_argument);
 2349: 
 2350:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2351:             s_objet_resultat) == d_erreur)
 2352:     {
 2353:         return;
 2354:     }
 2355: 
 2356:     return;
 2357: }
 2358: 
 2359: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>