File:  [local] / rpl / src / instructions_f1.c
Revision 1.8: download - view: text, annotated - select for diffs - revision graph
Sat Apr 17 18:57:35 2010 UTC (14 years ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Ajout du support pour MacOS X et Windows/Cygwin

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.14
    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl.conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction '->'
   29: ================================================================================
   30:   Entrées : structure processus
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_fleche(struct_processus *s_etat_processus)
   40: {
   41:     struct_liste_chainee                *l_element_courant;
   42:     struct_liste_chainee                *l_emplacement_valeurs;
   43: 
   44:     struct_objet                        *s_objet;
   45:     struct_objet                        *s_objet_elementaire;
   46:     struct_objet                        *s_expression_algebrique;
   47: 
   48:     struct_variable                     s_variable;
   49: 
   50:     struct_variable_partagee            s_variable_partagee;
   51:     struct_variable_statique            s_variable_statique;
   52: 
   53:     logical1                            fin_scrutation;
   54:     logical1                            presence_expression_algebrique;
   55: 
   56:     union_position_variable             position_variable;
   57: 
   58:     unsigned char                       instruction_valide;
   59:     unsigned char                       *tampon;
   60:     unsigned char                       test_instruction;
   61: 
   62:     unsigned long                       i;
   63:     unsigned long                       nombre_variables;
   64: 
   65:     void                                (*fonction)();
   66: 
   67:     (*s_etat_processus).erreur_execution = d_ex;
   68: 
   69:     if ((*s_etat_processus).affichage_arguments == 'Y')
   70:     {
   71:         printf("\n  -> ");
   72: 
   73:         if ((*s_etat_processus).langue == 'F')
   74:         {
   75:             printf("(création de variables locales)\n\n");
   76:         }
   77:         else
   78:         {
   79:             printf("(create local variables)\n\n");
   80:         }
   81: 
   82:         printf("    n: %s, %s, %s, %s, %s, %s,\n"
   83:                 "       %s, %s, %s, %s, %s,\n"
   84:                 "       %s, %s, %s, %s, %s,\n"
   85:                 "       %s, %s, %s, %s,\n"
   86:                 "       %s, %s\n",
   87:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
   88:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
   89:                 d_SQL, d_SLB, d_PRC, d_MTX);
   90:         printf("    ...\n");
   91:         printf("    1: %s, %s, %s, %s, %s, %s,\n"
   92:                 "       %s, %s, %s, %s, %s,\n"
   93:                 "       %s, %s, %s, %s, %s,\n"
   94:                 "       %s, %s, %s, %s,\n"
   95:                 "       %s, %s\n",
   96:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
   97:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
   98:                 d_SQL, d_SLB, d_PRC, d_MTX);
   99: 
  100:         if ((*s_etat_processus).langue == 'F')
  101:         {
  102:             printf("  Utilisation :\n\n");
  103:         }
  104:         else
  105:         {
  106:             printf("  Usage:\n\n");
  107:         }
  108: 
  109:         printf("    -> (variables) %s\n\n", d_RPN);
  110: 
  111:         printf("    -> (variables) %s\n", d_ALG);
  112: 
  113:         return;
  114:     }
  115:     else if ((*s_etat_processus).test_instruction == 'Y')
  116:     {
  117:         (*s_etat_processus).nombre_arguments = -1;
  118:         return;
  119:     }
  120: 
  121:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  122:     {
  123:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  124:         {
  125:             return;
  126:         }
  127:     }
  128: 
  129:     (*s_etat_processus).autorisation_empilement_programme = 'N';
  130: 
  131: /*
  132: --------------------------------------------------------------------------------
  133:   Boucler jusqu'au prochain '<<' ou jusqu'à la prochaine expression algébrique
  134: --------------------------------------------------------------------------------
  135: */
  136: 
  137:     test_instruction = (*s_etat_processus).test_instruction;
  138:     instruction_valide = (*s_etat_processus).instruction_valide;
  139:     presence_expression_algebrique = d_faux;
  140: 
  141:     if ((*s_etat_processus).debug == d_vrai)
  142:         if (((*s_etat_processus).type_debug &
  143:                 d_debug_variables) != 0)
  144:     {
  145:         if ((*s_etat_processus).langue == 'F')
  146:         {
  147:             printf("[%d] Recherche des variables locales\n", (int) getpid());
  148:         }
  149:         else
  150:         {
  151:             printf("[%d] Searching for local variables\n", (int) getpid());
  152:         }
  153: 
  154:         fflush(stdout);
  155:     }
  156: 
  157:     nombre_variables = 0;
  158: 
  159:     if ((*s_etat_processus).mode_execution_programme == 'Y')
  160:     {
  161:         /*
  162:          * Le programme est exécuté normalement.
  163:          */
  164: 
  165:         tampon = (*s_etat_processus).instruction_courante;
  166: 
  167:         do
  168:         {
  169:             if (recherche_instruction_suivante(s_etat_processus) == d_erreur)
  170:             {
  171:                 (*s_etat_processus).instruction_courante = tampon;
  172:                 return;
  173:             }
  174: 
  175:             if (strcmp((*s_etat_processus).instruction_courante, "<<") == 0)
  176:             {
  177:                 fin_scrutation = d_vrai;
  178:                 (*s_etat_processus).test_instruction = 'N';
  179:             }
  180:             else
  181:             {
  182:                 fin_scrutation = d_faux;
  183:                 (*s_etat_processus).test_instruction = 'Y';
  184:             }
  185: 
  186:             analyse(s_etat_processus, NULL);
  187: 
  188:             if ((*s_etat_processus).instruction_valide == 'N')
  189:             {
  190:                 recherche_type(s_etat_processus);
  191: 
  192:                 if ((*s_etat_processus).erreur_execution != d_ex)
  193:                 {
  194:                     (*s_etat_processus).instruction_courante = tampon;
  195:                     return;
  196:                 }
  197:                 
  198:                 if ((*(*(*s_etat_processus).l_base_pile).donnee).type == ALG)
  199:                 {
  200:                     (*s_etat_processus).niveau_courant++;
  201:                     fin_scrutation = d_vrai;
  202:                     presence_expression_algebrique = d_vrai;
  203: 
  204:                     if (depilement(s_etat_processus, &((*s_etat_processus)
  205:                             .l_base_pile), &s_expression_algebrique)
  206:                             == d_erreur)
  207:                     {
  208:                         (*s_etat_processus).erreur_execution =
  209:                                 d_ex_manque_argument;
  210:                         (*s_etat_processus).instruction_courante = tampon;
  211:                         return;
  212:                     }
  213:                 }
  214:                 else if ((*(*(*s_etat_processus).l_base_pile).donnee)
  215:                         .type != NOM)
  216:                 {
  217:                     (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
  218:                     (*s_etat_processus).instruction_courante = tampon;
  219:                     return;
  220:                 }
  221:                 else if ((*((struct_nom *) (*(*(*s_etat_processus).l_base_pile)
  222:                         .donnee).objet)).symbole == d_vrai)
  223:                 {
  224:                     (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
  225:                     (*s_etat_processus).instruction_courante = tampon;
  226:                     return;
  227:                 }
  228:                 else
  229:                 {
  230:                     nombre_variables = nombre_variables + 1;
  231:                 }
  232:             }
  233:             else
  234:             {
  235:                 if (fin_scrutation == d_faux)
  236:                 {
  237:                     (*s_etat_processus).erreur_execution = d_ex_nom_reserve;
  238:                     (*s_etat_processus).instruction_courante = tampon;
  239:                     return;
  240:                 }
  241:             }
  242: 
  243:             free((*s_etat_processus).instruction_courante);
  244:         } while(fin_scrutation == d_faux);
  245: 
  246:         (*s_etat_processus).instruction_courante = tampon;
  247:     }
  248:     else
  249:     {
  250:         /*
  251:          * Une expression est en cours d'évaluation.
  252:          */
  253: 
  254:         l_element_courant = (*(*s_etat_processus).expression_courante).suivant;
  255:         tampon = (*s_etat_processus).instruction_courante;
  256: 
  257:         do
  258:         {
  259:             if ((*(*l_element_courant).donnee).type == FCT)
  260:             {
  261:                 fonction = (*((struct_fonction *) (*(*l_element_courant)
  262:                         .donnee).objet)).fonction;
  263: 
  264:                 if (fonction == instruction_vers_niveau_superieur)
  265:                 {
  266:                     fin_scrutation = d_vrai;
  267:                     (*s_etat_processus).test_instruction = 'N';
  268: 
  269:                     analyse(s_etat_processus,
  270:                             instruction_vers_niveau_superieur);
  271:                 }
  272:                 else
  273:                 {
  274:                     (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
  275:                     return;
  276:                 }
  277:             }
  278:             else if ((*(*l_element_courant).donnee).type == ALG)
  279:             {
  280:                 (*s_etat_processus).niveau_courant++;
  281:                 fin_scrutation = d_vrai;
  282:                 presence_expression_algebrique = d_vrai;
  283: 
  284:                 s_expression_algebrique = (*l_element_courant).donnee;
  285:             }
  286:             else if ((*(*l_element_courant).donnee).type != NOM)
  287:             {
  288:                 (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
  289:                 return;
  290:             }
  291:             else
  292:             {
  293:                 if ((s_objet_elementaire = copie_objet(s_etat_processus,
  294:                         (*l_element_courant).donnee, 'P')) == NULL)
  295:                 {
  296:                     (*s_etat_processus).erreur_systeme =
  297:                             d_es_allocation_memoire;
  298:                     return;
  299:                 }
  300: 
  301:                 if (empilement(s_etat_processus, &((*s_etat_processus)
  302:                         .l_base_pile), s_objet_elementaire) == d_erreur)
  303:                 {
  304:                     return;
  305:                 }
  306: 
  307:                 nombre_variables = nombre_variables + 1;
  308:                 fin_scrutation = d_faux;
  309:             }
  310: 
  311:             (*s_etat_processus).expression_courante = l_element_courant;
  312:             l_element_courant = (*l_element_courant).suivant;
  313:         } while((fin_scrutation == d_faux) && (l_element_courant != NULL));
  314: 
  315:         (*s_etat_processus).instruction_courante = tampon;
  316: 
  317:         if (fin_scrutation == d_faux)
  318:         {
  319:             (*s_etat_processus).erreur_execution = d_ex_erreur_evaluation;
  320:             return;
  321:         }
  322:     }
  323: 
  324:     if (nombre_variables < 1)
  325:     {
  326:         (*s_etat_processus).erreur_execution = d_ex_absence_variable;
  327:         return;
  328:     }
  329: 
  330:     if ((*s_etat_processus).debug == d_vrai)
  331:         if (((*s_etat_processus).type_debug &
  332:                 d_debug_variables) != 0)
  333:     {
  334:         if ((*s_etat_processus).langue == 'F')
  335:         {
  336:             printf("[%d] Nombre de variables de niveau %lu : %lu\n",
  337:                     (int) getpid(),
  338:                     (*s_etat_processus).niveau_courant, nombre_variables);
  339:         }
  340:         else
  341:         {
  342:             printf("[%d] Number of level %lu variables : %lu\n",
  343:                     (int) getpid(),
  344:                     (*s_etat_processus).niveau_courant, nombre_variables);
  345:         }
  346: 
  347:         fflush(stdout);
  348:     }
  349: 
  350:     l_emplacement_valeurs = (*s_etat_processus).l_base_pile;
  351: 
  352:     for(i = 0; i < nombre_variables; i++)
  353:     {
  354:         l_emplacement_valeurs = (*l_emplacement_valeurs).suivant;
  355:     }
  356: 
  357:     l_element_courant = l_emplacement_valeurs;
  358: 
  359:     for(i = 0; i < nombre_variables; i++)
  360:     {
  361:         if (l_element_courant == NULL)
  362:         {
  363:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  364:             return;
  365:         }
  366: 
  367:         l_element_courant = (*l_element_courant).suivant;
  368:     }
  369: 
  370:     for(i = 0; i < nombre_variables; i++)
  371:     {
  372:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  373:                 &s_objet) == d_erreur)
  374:         {
  375:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  376:             return;
  377:         }
  378: 
  379:         if ((s_variable.nom = malloc((strlen(
  380:                 (*((struct_nom *) (*s_objet).objet)).nom) + 1) *
  381:                 sizeof(unsigned char))) == NULL)
  382:         {
  383:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  384:             return;
  385:         }
  386: 
  387:         strcpy(s_variable.nom, (*((struct_nom *) (*s_objet).objet)).nom);
  388: 
  389:         if ((*s_etat_processus).debug == d_vrai)
  390:             if (((*s_etat_processus).type_debug &
  391:                     d_debug_variables) != 0)
  392:         {
  393:             printf("[%d] Variable %s\n", (int) getpid(), s_variable.nom);
  394:             fflush(stdout);
  395:         }
  396: 
  397:         s_variable.niveau = (*s_etat_processus).niveau_courant;
  398: 
  399:         // Si le drapeau creation_variables_statiques est positionné,
  400:         // on recherche une entrée dans la table des variables statiques.
  401:         // Si cette entrée existe, on affecte à la variable créée l'objet
  402:         // contenu dans la table des variables statiques. Dans le cas contraire,
  403:         // on crée une entrée dans la table des variables statiques avec
  404:         // ce qui se trouve dans la pile.
  405: 
  406:         if ((*s_etat_processus).l_base_pile_systeme == NULL)
  407:         {
  408:             (*s_etat_processus).erreur_systeme = d_es_pile_vide;
  409:             return;
  410:         }
  411: 
  412:         /*
  413:          * Vérification de l'unicité de la variable pour un niveau donné
  414:          */
  415: 
  416:         if (recherche_variable(s_etat_processus, s_variable.nom) == d_vrai)
  417:         {
  418:             if ((*s_etat_processus).niveau_courant ==
  419:                     (*s_etat_processus).s_liste_variables[(*s_etat_processus)
  420:                     .position_variable_courante].niveau)
  421:             {
  422:                 liberation(s_etat_processus, s_objet);
  423:                 free(s_variable.nom);
  424: 
  425:                 (*s_etat_processus).erreur_execution = d_ex_creation_variable;
  426:                 return;
  427:             }
  428:         }
  429: 
  430:         (*s_etat_processus).erreur_systeme = d_es;
  431: 
  432:         if ((*(*s_etat_processus).l_base_pile_systeme)
  433:                 .creation_variables_statiques == d_vrai)
  434:         {
  435:             if ((*s_etat_processus).mode_execution_programme == 'Y')
  436:             {
  437:                 position_variable.adresse =
  438:                         (*s_etat_processus).position_courante;
  439:             }
  440:             else
  441:             {
  442:                 position_variable.pointeur =
  443:                         (*s_etat_processus).objet_courant;
  444:             }
  445: 
  446:             if (recherche_variable_statique(s_etat_processus, s_variable.nom,
  447:                     position_variable,
  448:                     ((*s_etat_processus).mode_execution_programme == 'Y')
  449:                     ? 'P' : 'E') == d_vrai)
  450:             {
  451:                 // Variable statique à utiliser
  452: 
  453:                 if ((*s_etat_processus).mode_execution_programme == 'Y')
  454:                 {
  455:                     s_variable.origine = 'P';
  456:                 }
  457:                 else
  458:                 {
  459:                     s_variable.origine = 'E';
  460:                 }
  461: 
  462:                 s_variable.objet = (*s_etat_processus)
  463:                         .s_liste_variables_statiques[(*s_etat_processus)
  464:                         .position_variable_statique_courante].objet;
  465:                 (*s_etat_processus).s_liste_variables_statiques
  466:                         [(*s_etat_processus)
  467:                         .position_variable_statique_courante].objet = NULL;
  468:             }
  469:             else
  470:             {
  471:                 // Variable statique à créer
  472: 
  473:                 s_variable_statique.objet = NULL;
  474:                 (*s_etat_processus).erreur_systeme = d_es;
  475: 
  476:                 if ((s_variable_statique.nom = malloc((strlen(s_variable.nom)
  477:                         + 1) * sizeof(unsigned char))) == NULL)
  478:                 {
  479:                     (*s_etat_processus).erreur_systeme =
  480:                             d_es_allocation_memoire;
  481:                     return;
  482:                 }
  483: 
  484:                 strcpy(s_variable_statique.nom, s_variable.nom);
  485: 
  486:                 if ((*s_etat_processus).mode_execution_programme == 'Y')
  487:                 {
  488:                     s_variable_statique.origine = 'P';
  489:                     s_variable_statique.niveau = 0;
  490:                     s_variable_statique.variable_statique.adresse =
  491:                             (*s_etat_processus).position_courante;
  492:                 }
  493:                 else
  494:                 {
  495:                     s_variable_statique.origine = 'E';
  496: 
  497:                     /*
  498:                      * Si la variable est appelée depuis une expression
  499:                      * compilée (variable de niveau 0), la variable statique
  500:                      * est persistante (niveau 0). Dans le cas contraire, elle
  501:                      * est persistante à l'expression (niveau courant).
  502:                      */
  503: 
  504:                     if ((*s_etat_processus).evaluation_expression_compilee
  505:                             == 'Y')
  506:                     {
  507:                         s_variable_statique.niveau = 0;
  508:                     }
  509:                     else
  510:                     {
  511:                         s_variable_statique.niveau =
  512:                                 (*s_etat_processus).niveau_courant;
  513:                     }
  514: 
  515:                     s_variable_statique.variable_statique.pointeur =
  516:                             (*s_etat_processus).objet_courant;
  517:                 }
  518: 
  519:                 if (creation_variable_statique(s_etat_processus,
  520:                         &s_variable_statique) == d_erreur)
  521:                 {
  522:                     return;
  523:                 }
  524: 
  525:                 s_variable.objet = (*l_emplacement_valeurs).donnee;
  526:                 (*l_emplacement_valeurs).donnee = NULL;
  527:             }
  528:         }
  529:         else if ((*(*s_etat_processus).l_base_pile_systeme)
  530:                 .creation_variables_partagees == d_vrai)
  531:         {
  532:             if ((*s_etat_processus).mode_execution_programme == 'Y')
  533:             {
  534:                 position_variable.adresse =
  535:                         (*s_etat_processus).position_courante;
  536:             }
  537:             else
  538:             {
  539:                 position_variable.pointeur =
  540:                         (*s_etat_processus).objet_courant;
  541:             }
  542: 
  543:             if (pthread_mutex_lock(&((*(*s_etat_processus)
  544:                     .s_liste_variables_partagees).mutex)) != 0)
  545:             {
  546:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  547:                 return;
  548:             }
  549: 
  550:             if (recherche_variable_partagee(s_etat_processus, s_variable.nom,
  551:                     position_variable,
  552:                     ((*s_etat_processus).mode_execution_programme == 'Y')
  553:                     ? 'P' : 'E') == d_vrai)
  554:             {
  555:                 // Variable partagée à utiliser
  556: 
  557:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  558:                         .s_liste_variables_partagees).mutex)) != 0)
  559:                 {
  560:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  561:                     return;
  562:                 }
  563: 
  564:                 // Les champs niveau, variable_statique, variable_partagee
  565:                 // et variable_verrouillee sont renseignés lors de l'appel
  566:                 // à la fonction creation_variable().
  567: 
  568:                 if ((*s_etat_processus).mode_execution_programme == 'Y')
  569:                 {
  570:                     s_variable.origine = 'P';
  571:                 }
  572:                 else
  573:                 {
  574:                     s_variable.origine = 'E';
  575:                 }
  576: 
  577:                 s_variable.objet = NULL;
  578:             }
  579:             else
  580:             {
  581:                 // Variable partagée à utiliser
  582:                 // Variable partagee à créer
  583: 
  584:                 (*s_etat_processus).erreur_systeme = d_es;
  585: 
  586:                 if ((s_variable_partagee.nom = malloc((strlen(s_variable.nom)
  587:                         + 1) * sizeof(unsigned char))) == NULL)
  588:                 {
  589:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  590:                             .s_liste_variables_partagees).mutex)) != 0)
  591:                     {
  592:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  593:                         return;
  594:                     }
  595: 
  596:                     (*s_etat_processus).erreur_systeme =
  597:                             d_es_allocation_memoire;
  598:                     return;
  599:                 }
  600: 
  601:                 strcpy(s_variable_partagee.nom, s_variable.nom);
  602: 
  603:                 if ((*s_etat_processus).mode_execution_programme == 'Y')
  604:                 {
  605:                     s_variable_partagee.origine = 'P';
  606:                     s_variable_partagee.niveau = 0;
  607:                     s_variable_partagee.variable_partagee.adresse =
  608:                             (*s_etat_processus).position_courante;
  609:                 }
  610:                 else
  611:                 {
  612:                     s_variable_partagee.origine = 'E';
  613: 
  614:                     /*
  615:                      * Si la variable est appelée depuis une expression
  616:                      * compilée (variable de niveau 0), la variable statique
  617:                      * est persistante (niveau 0). Dans le cas contraire, elle
  618:                      * est persistante à l'expression (niveau courant).
  619:                      */
  620: 
  621:                     if ((*s_etat_processus).evaluation_expression_compilee
  622:                             == 'Y')
  623:                     {
  624:                         s_variable_partagee.niveau = 0;
  625:                     }
  626:                     else
  627:                     {
  628:                         s_variable_partagee.niveau =
  629:                                 (*s_etat_processus).niveau_courant;
  630:                     }
  631: 
  632:                     s_variable_partagee.variable_partagee.pointeur =
  633:                             (*s_etat_processus).objet_courant;
  634:                 }
  635: 
  636:                 s_variable_partagee.objet = (*l_emplacement_valeurs).donnee;
  637:                 (*l_emplacement_valeurs).donnee = NULL;
  638: 
  639:                 if (creation_variable_partagee(s_etat_processus,
  640:                         &s_variable_partagee) == d_erreur)
  641:                 {
  642:                     if (pthread_mutex_unlock(&((*(*s_etat_processus)
  643:                             .s_liste_variables_partagees).mutex)) != 0)
  644:                     {
  645:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  646:                         return;
  647:                     }
  648: 
  649:                     return;
  650:                 }
  651: 
  652:                 if (pthread_mutex_unlock(&((*(*s_etat_processus)
  653:                         .s_liste_variables_partagees).mutex)) != 0)
  654:                 {
  655:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  656:                     return;
  657:                 }
  658: 
  659:                 s_variable.objet = NULL;
  660:             }
  661:         }
  662:         else
  663:         {
  664:             s_variable.objet = (*l_emplacement_valeurs).donnee;
  665:             (*l_emplacement_valeurs).donnee = NULL;
  666:         }
  667: 
  668:         l_emplacement_valeurs = (*l_emplacement_valeurs).suivant;
  669: 
  670:         if (creation_variable(s_etat_processus, &s_variable,
  671:                 ((*(*s_etat_processus).l_base_pile_systeme)
  672:                 .creation_variables_statiques == d_vrai) ? 'S' : 'V',
  673:                 ((*(*s_etat_processus).l_base_pile_systeme)
  674:                 .creation_variables_partagees == d_vrai) ? 'S' : 'P')
  675:                 == d_erreur)
  676:         {
  677:             return;
  678:         }
  679: 
  680:         liberation(s_etat_processus, s_objet);
  681:     }
  682: 
  683:     // Les prochaines variables créées seront forcément du type volatile et
  684:     // seront obligatoirement privées.
  685: 
  686:     if ((*s_etat_processus).l_base_pile_systeme == NULL)
  687:     {
  688:         (*s_etat_processus).erreur_systeme = d_es_pile_vide;
  689:         return;
  690:     }
  691: 
  692:     (*(*s_etat_processus).l_base_pile_systeme).creation_variables_statiques
  693:             = d_faux;
  694:     (*(*s_etat_processus).l_base_pile_systeme).creation_variables_partagees
  695:             = d_faux;
  696: 
  697:     for(i = 0; i < nombre_variables; i++)
  698:     {
  699:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  700:                 &s_objet) == d_erreur)
  701:         {
  702:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  703:             return;
  704:         }
  705: 
  706:         liberation(s_etat_processus, s_objet);
  707:     }
  708: 
  709:     (*s_etat_processus).test_instruction = test_instruction;
  710:     (*s_etat_processus).instruction_valide = instruction_valide;
  711: 
  712:     /*
  713:      * Traitement le cas échéant de l'expression algébrique
  714:      */
  715: 
  716:     if (presence_expression_algebrique == d_vrai)
  717:     {
  718:         evaluation(s_etat_processus, s_expression_algebrique, 'N');
  719: 
  720:         if ((*s_etat_processus).mode_execution_programme == 'Y')
  721:         {
  722:             liberation(s_etat_processus, s_expression_algebrique);
  723:         }
  724: 
  725:         (*s_etat_processus).niveau_courant--;
  726: 
  727:         if (retrait_variable_par_niveau(s_etat_processus) == d_erreur)
  728:         {
  729:             return;
  730:         }
  731: 
  732:         (*s_etat_processus).autorisation_empilement_programme = 'Y';
  733:     }
  734: 
  735:     return;
  736: }
  737: 
  738: 
  739: /*
  740: ================================================================================
  741:   Fonction '->list'
  742: ================================================================================
  743:   Entrées : structure processus
  744: --------------------------------------------------------------------------------
  745:   Sorties :
  746: --------------------------------------------------------------------------------
  747:   Effets de bord : néant
  748: ================================================================================
  749: */
  750: 
  751: void
  752: instruction_fleche_list(struct_processus *s_etat_processus)
  753: {
  754:     struct_liste_chainee            *l_element_courant;
  755: 
  756:     struct_objet                    *s_objet;
  757: 
  758:     signed long                     i;
  759:     signed long                     nombre_elements;
  760: 
  761:     (*s_etat_processus).erreur_execution = d_ex;
  762: 
  763:     if ((*s_etat_processus).affichage_arguments == 'Y')
  764:     {
  765:         printf("\n  ->LIST ");
  766: 
  767:         if ((*s_etat_processus).langue == 'F')
  768:         {
  769:             printf("(création d'une liste)\n\n");
  770:         }
  771:         else
  772:         {
  773:             printf("(create list)\n\n");
  774:         }
  775: 
  776:         printf("    n: %s, %s, %s, %s, %s, %s,\n"
  777:                 "       %s, %s, %s, %s, %s,\n"
  778:                 "       %s, %s, %s, %s, %s,\n"
  779:                 "       %s, %s\n",
  780:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  781:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
  782:         printf("    ...\n");
  783:         printf("    2: %s, %s, %s, %s, %s, %s,\n"
  784:                 "       %s, %s, %s, %s, %s,\n"
  785:                 "       %s, %s, %s, %s, %s,\n"
  786:                 "       %s, %s\n",
  787:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  788:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
  789:         printf("    1: %s\n", d_INT);
  790:         printf("->  1: %s\n", d_LST);
  791: 
  792:         return;
  793:     }
  794:     else if ((*s_etat_processus).test_instruction == 'Y')
  795:     {
  796:         (*s_etat_processus).nombre_arguments = -1;
  797:         return;
  798:     }
  799: 
  800:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  801:     {
  802:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  803:         {
  804:             return;
  805:         }
  806:     }
  807: 
  808:     if ((*s_etat_processus).hauteur_pile_operationnelle == 0)
  809:     {
  810:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  811:         return;
  812:     }
  813: 
  814:     if ((*(*(*s_etat_processus).l_base_pile).donnee).type != INT)
  815:     {
  816:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  817:         return;
  818:     }
  819: 
  820:     nombre_elements = (*((integer8 *) (*(*(*s_etat_processus).l_base_pile)
  821:             .donnee).objet));
  822: 
  823:     if (nombre_elements < 0)
  824:     {
  825: 
  826: /*
  827: -- Opération absurde autorisée sur le calculateur HP-28S -----------------------
  828: */
  829: 
  830:         (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  831:         return;
  832:     }
  833: 
  834:     if ((unsigned long) nombre_elements >=
  835:             (*s_etat_processus).hauteur_pile_operationnelle)
  836:     {
  837:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  838:         return;
  839:     }
  840: 
  841:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  842:     {
  843:         if (empilement_pile_last(s_etat_processus, nombre_elements + 1)
  844:                 == d_erreur)
  845:         {
  846:             return;
  847:         }
  848:     }
  849: 
  850:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  851:             &s_objet) == d_erreur)
  852:     {
  853:         return;
  854:     }
  855: 
  856:     liberation(s_etat_processus, s_objet);
  857:     l_element_courant = NULL;
  858: 
  859:     for(i = 0; i < nombre_elements; i++)
  860:     {
  861:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  862:                 &s_objet) == d_erreur)
  863:         {
  864:             return;
  865:         }
  866: 
  867:         if (empilement(s_etat_processus, &l_element_courant, s_objet)
  868:                 == d_erreur)
  869:         {
  870:             return;
  871:         }
  872:     }
  873: 
  874:     if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
  875:     {
  876:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  877:         return;
  878:     }
  879: 
  880:     (*s_objet).objet = (void *) l_element_courant;
  881: 
  882:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  883:             s_objet) == d_erreur)
  884:     {
  885:         return;
  886:     }
  887: 
  888:     return;
  889: }
  890: 
  891: 
  892: /*
  893: ================================================================================
  894:   Fonction 'for'
  895: ================================================================================
  896:   Entrées : structure processus
  897: --------------------------------------------------------------------------------
  898:   Sorties :
  899: --------------------------------------------------------------------------------
  900:   Effets de bord : néant
  901: ================================================================================
  902: */
  903: 
  904: void
  905: instruction_for(struct_processus *s_etat_processus)
  906: {
  907:     struct_objet                        *s_objet_1;
  908:     struct_objet                        *s_objet_2;
  909:     struct_objet                        *s_objet_3;
  910: 
  911:     struct_variable                     s_variable;
  912: 
  913:     unsigned char                       instruction_valide;
  914:     unsigned char                       *tampon;
  915:     unsigned char                       test_instruction;
  916: 
  917:     (*s_etat_processus).erreur_execution = d_ex;
  918: 
  919:     if ((*s_etat_processus).affichage_arguments == 'Y')
  920:     {
  921:         printf("\n  FOR ");
  922: 
  923:         if ((*s_etat_processus).langue == 'F')
  924:         {
  925:             printf("(boucle définie avec compteur)\n\n");
  926:         }
  927:         else
  928:         {
  929:             printf("(define a counter-based loop)\n\n");
  930:         }
  931: 
  932:         if ((*s_etat_processus).langue == 'F')
  933:         {
  934:             printf("  Utilisation :\n\n");
  935:         }
  936:         else
  937:         {
  938:             printf("  Usage:\n\n");
  939:         }
  940: 
  941:         printf("    %s/%s %s/%s FOR (variable)\n", d_INT, d_REL,
  942:                 d_INT, d_REL);
  943:         printf("        (expression)\n");
  944:         printf("        [EXIT]/[CYCLE]\n");
  945:         printf("        ...\n");
  946:         printf("    NEXT\n\n");
  947: 
  948:         printf("    %s/%s %s/%s FOR (variable)\n", d_INT, d_REL,
  949:                 d_INT, d_REL);
  950:         printf("        (expression)\n");
  951:         printf("        [EXIT]/[CYCLE]\n");
  952:         printf("        ...\n");
  953:         printf("    %s/%s STEP\n", d_INT, d_REL);
  954: 
  955:         return;
  956:     }
  957:     else if ((*s_etat_processus).test_instruction == 'Y')
  958:     {
  959:         (*s_etat_processus).nombre_arguments = -1;
  960:         return;
  961:     }
  962: 
  963:     if ((*s_etat_processus).erreur_systeme != d_es)
  964:     {
  965:         return;
  966:     }
  967: 
  968:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  969:     {
  970:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  971:         {
  972:             return;
  973:         }
  974:     }
  975: 
  976:     empilement_pile_systeme(s_etat_processus);
  977: 
  978:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  979:             &s_objet_1) == d_erreur)
  980:     {
  981:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  982:         return;
  983:     }
  984: 
  985:     if (((*s_objet_1).type != INT) &&
  986:             ((*s_objet_1).type != REL))
  987:     {
  988:         liberation(s_etat_processus, s_objet_1);
  989: 
  990:         (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
  991:         return;
  992:     }
  993: 
  994:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  995:             &s_objet_2) == d_erreur)
  996:     {
  997:         liberation(s_etat_processus, s_objet_1);
  998: 
  999:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1000:         return;
 1001:     }
 1002: 
 1003:     if (((*s_objet_2).type != INT) &&
 1004:             ((*s_objet_2).type != REL))
 1005:     {
 1006:         liberation(s_etat_processus, s_objet_1);
 1007:         liberation(s_etat_processus, s_objet_2);
 1008: 
 1009:         (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
 1010:         return;
 1011:     }
 1012: 
 1013:     tampon = (*s_etat_processus).instruction_courante;
 1014:     test_instruction = (*s_etat_processus).test_instruction;
 1015:     instruction_valide = (*s_etat_processus).instruction_valide;
 1016:     (*s_etat_processus).test_instruction = 'Y';
 1017: 
 1018:     if ((*s_etat_processus).mode_execution_programme == 'Y')
 1019:     {
 1020:         if (recherche_instruction_suivante(s_etat_processus) == d_erreur)
 1021:         {
 1022:             return;
 1023:         }
 1024: 
 1025:         analyse(s_etat_processus, NULL);
 1026: 
 1027:         if ((*s_etat_processus).instruction_valide == 'Y')
 1028:         {
 1029:             liberation(s_etat_processus, s_objet_1);
 1030:             liberation(s_etat_processus, s_objet_2);
 1031: 
 1032:             free((*s_etat_processus).instruction_courante);
 1033:             (*s_etat_processus).instruction_courante = tampon;
 1034: 
 1035:             (*s_etat_processus).erreur_execution = d_ex_nom_reserve;
 1036:             return;
 1037:         }
 1038: 
 1039:         recherche_type(s_etat_processus);
 1040: 
 1041:         free((*s_etat_processus).instruction_courante);
 1042:         (*s_etat_processus).instruction_courante = tampon;
 1043: 
 1044:         if ((*s_etat_processus).erreur_execution != d_ex)
 1045:         {
 1046:             liberation(s_etat_processus, s_objet_1);
 1047:             liberation(s_etat_processus, s_objet_2);
 1048: 
 1049:             return;
 1050:         }
 1051: 
 1052:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1053:                 &s_objet_3) == d_erreur)
 1054:         {
 1055:             liberation(s_etat_processus, s_objet_1);
 1056:             liberation(s_etat_processus, s_objet_2);
 1057: 
 1058:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1059:             return;
 1060:         }
 1061: 
 1062:         (*(*s_etat_processus).l_base_pile_systeme)
 1063:                 .origine_routine_evaluation = 'N';
 1064:     }
 1065:     else
 1066:     {
 1067:         if ((*s_etat_processus).expression_courante == NULL)
 1068:         {
 1069:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1070:             return;
 1071:         }
 1072: 
 1073:         (*s_etat_processus).expression_courante = (*(*s_etat_processus)
 1074:                 .expression_courante).suivant;
 1075: 
 1076:         if ((s_objet_3 = copie_objet(s_etat_processus,
 1077:                 (*(*s_etat_processus).expression_courante)
 1078:                 .donnee, 'P')) == NULL)
 1079:         {
 1080:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1081:             return;
 1082:         }
 1083: 
 1084:         (*(*s_etat_processus).l_base_pile_systeme)
 1085:                 .origine_routine_evaluation = 'Y';
 1086:     }
 1087: 
 1088:     if ((*s_objet_3).type != NOM)
 1089:     {
 1090:         liberation(s_etat_processus, s_objet_1);
 1091:         liberation(s_etat_processus, s_objet_2);
 1092: 
 1093:         (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
 1094:         return;
 1095:     }
 1096:     else if ((*((struct_nom *) (*s_objet_3).objet)).symbole == d_vrai)
 1097:     {
 1098:         liberation(s_etat_processus, s_objet_1);
 1099:         liberation(s_etat_processus, s_objet_2);
 1100: 
 1101:         (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
 1102:         return;
 1103:     }
 1104: 
 1105:     (*s_etat_processus).niveau_courant++;
 1106: 
 1107:     if ((s_variable.nom = malloc((strlen(
 1108:             (*((struct_nom *) (*s_objet_3).objet)).nom) + 1) *
 1109:             sizeof(unsigned char))) == NULL)
 1110:     {
 1111:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1112:         return;
 1113:     }
 1114: 
 1115:     strcpy(s_variable.nom, (*((struct_nom *) (*s_objet_3).objet)).nom);
 1116:     s_variable.niveau = (*s_etat_processus).niveau_courant;
 1117:     s_variable.objet = s_objet_2;
 1118: 
 1119:     if (creation_variable(s_etat_processus, &s_variable, 'V', 'P') == d_erreur)
 1120:     {
 1121:         return;
 1122:     }
 1123: 
 1124:     liberation(s_etat_processus, s_objet_3);
 1125: 
 1126:     (*s_etat_processus).test_instruction = test_instruction;
 1127:     (*s_etat_processus).instruction_valide = instruction_valide;
 1128: 
 1129:     (*(*s_etat_processus).l_base_pile_systeme).limite_indice_boucle = s_objet_1;
 1130: 
 1131:     if ((*s_etat_processus).mode_execution_programme == 'Y')
 1132:     {
 1133:         (*(*s_etat_processus).l_base_pile_systeme).adresse_retour =
 1134:                 (*s_etat_processus).position_courante;
 1135:     }
 1136:     else
 1137:     {
 1138:         (*(*s_etat_processus).l_base_pile_systeme).pointeur_objet_retour =
 1139:                 (*s_etat_processus).expression_courante;
 1140:     }
 1141: 
 1142:     (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'F';
 1143: 
 1144:     if (((*(*s_etat_processus).l_base_pile_systeme).nom_variable =
 1145:             malloc((strlen(s_variable.nom) + 1) *
 1146:             sizeof(unsigned char))) == NULL)
 1147:     {
 1148:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1149:         return;
 1150:     }
 1151: 
 1152:     strcpy((*(*s_etat_processus).l_base_pile_systeme).nom_variable,
 1153:             s_variable.nom);
 1154: 
 1155:     return;
 1156: }
 1157: 
 1158: 
 1159: /*
 1160: ================================================================================
 1161:   Fonction 'fc?'
 1162: ================================================================================
 1163:   Entrées : structure processus
 1164: --------------------------------------------------------------------------------
 1165:   Sorties :
 1166: --------------------------------------------------------------------------------
 1167:   Effets de bord : néant
 1168: ================================================================================
 1169: */
 1170: 
 1171: void
 1172: instruction_fc_test(struct_processus *s_etat_processus)
 1173: {
 1174:     struct_objet                *s_objet_argument;
 1175:     struct_objet                *s_objet_resultat;
 1176: 
 1177:     (*s_etat_processus).erreur_execution = d_ex;
 1178: 
 1179:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1180:     {
 1181:         printf("\n  FC? ");
 1182: 
 1183:         if ((*s_etat_processus).langue == 'F')
 1184:         {
 1185:             printf("(teste si un drapeau est désarmé)\n\n");
 1186:         }
 1187:         else
 1188:         {
 1189:             printf("(test if flag is clear)\n\n");
 1190:         }
 1191: 
 1192:         printf("    1: %s\n", d_INT);
 1193:         printf("->  1: %s\n", d_INT);
 1194: 
 1195:         return;
 1196:     }
 1197:     else if ((*s_etat_processus).test_instruction == 'Y')
 1198:     {
 1199:         (*s_etat_processus).nombre_arguments = -1;
 1200:         return;
 1201:     }
 1202:     
 1203:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1204:     {
 1205:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1206:         {
 1207:             return;
 1208:         }
 1209:     }
 1210: 
 1211:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1212:             &s_objet_argument) == d_erreur)
 1213:     {
 1214:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1215:         return;
 1216:     }
 1217: 
 1218:     if ((*s_objet_argument).type == INT)
 1219:     {
 1220:         if (((*((integer8 *) (*s_objet_argument).objet)) < 1) ||
 1221:                 ((*((integer8 *) (*s_objet_argument).objet)) > 64))
 1222:         {
 1223:             liberation(s_etat_processus, s_objet_argument);
 1224: 
 1225:             (*s_etat_processus).erreur_execution = d_ex_drapeau_inexistant;
 1226:             return;
 1227:         }
 1228: 
 1229:         if ((s_objet_resultat = allocation(s_etat_processus, INT))
 1230:                 == NULL)
 1231:         {
 1232:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1233:             return;
 1234:         }
 1235: 
 1236:         if (test_cfsf(s_etat_processus, (unsigned char) (*((integer8 *)
 1237:                 (*s_objet_argument).objet))) == d_vrai)
 1238:         {
 1239:             (*((integer8 *) (*s_objet_resultat).objet)) = 0;
 1240:         }
 1241:         else
 1242:         {
 1243:             (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1244:         }
 1245:     }
 1246:     else
 1247:     {
 1248:         liberation(s_etat_processus, s_objet_argument);
 1249: 
 1250:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1251:         return;
 1252:     }
 1253: 
 1254:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1255:             s_objet_resultat) == d_erreur)
 1256:     {
 1257:         return;
 1258:     }
 1259: 
 1260:     liberation(s_etat_processus, s_objet_argument);
 1261: 
 1262:     return;
 1263: }
 1264: 
 1265: 
 1266: /*
 1267: ================================================================================
 1268:   Fonction 'fs?'
 1269: ================================================================================
 1270:   Entrées : structure processus
 1271: --------------------------------------------------------------------------------
 1272:   Sorties :
 1273: --------------------------------------------------------------------------------
 1274:   Effets de bord : néant
 1275: ================================================================================
 1276: */
 1277: 
 1278: void
 1279: instruction_fs_test(struct_processus *s_etat_processus)
 1280: {
 1281:     struct_objet                *s_objet_argument;
 1282:     struct_objet                *s_objet_resultat;
 1283: 
 1284:     (*s_etat_processus).erreur_execution = d_ex;
 1285: 
 1286:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1287:     {
 1288:         printf("\n  FS? ");
 1289: 
 1290:         if ((*s_etat_processus).langue == 'F')
 1291:         {
 1292:             printf("(teste si un drapeau est armé)\n\n");
 1293:         }
 1294:         else
 1295:         {
 1296:             printf("(test if flag is set)\n\n");
 1297:         }
 1298: 
 1299:         printf("    1: %s\n", d_INT);
 1300:         printf("->  1: %s\n", d_INT);
 1301: 
 1302:         return;
 1303:     }
 1304:     else if ((*s_etat_processus).test_instruction == 'Y')
 1305:     {
 1306:         (*s_etat_processus).nombre_arguments = -1;
 1307:         return;
 1308:     }
 1309:     
 1310:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1311:     {
 1312:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1313:         {
 1314:             return;
 1315:         }
 1316:     }
 1317: 
 1318:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1319:             &s_objet_argument) == d_erreur)
 1320:     {
 1321:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1322:         return;
 1323:     }
 1324: 
 1325:     if ((*s_objet_argument).type == INT)
 1326:     {
 1327:         if (((*((integer8 *) (*s_objet_argument).objet)) < 1) ||
 1328:                 ((*((integer8 *) (*s_objet_argument).objet)) > 64))
 1329:         {
 1330:             liberation(s_etat_processus, s_objet_argument);
 1331: 
 1332:             (*s_etat_processus).erreur_execution = d_ex_drapeau_inexistant;
 1333:             return;
 1334:         }
 1335: 
 1336:         if ((s_objet_resultat = allocation(s_etat_processus, INT))
 1337:                 == NULL)
 1338:         {
 1339:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1340:             return;
 1341:         }
 1342: 
 1343:         if (test_cfsf(s_etat_processus, (unsigned char) (*((integer8 *)
 1344:                 (*s_objet_argument).objet))) == d_vrai)
 1345:         {
 1346:             (*((integer8 *) (*s_objet_resultat).objet)) = -1;
 1347:         }
 1348:         else
 1349:         {
 1350:             (*((integer8 *) (*s_objet_resultat).objet)) = 0;
 1351:         }
 1352:     }
 1353:     else
 1354:     {
 1355:         liberation(s_etat_processus, s_objet_argument);
 1356: 
 1357:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1358:         return;
 1359:     }
 1360: 
 1361:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1362:             s_objet_resultat) == d_erreur)
 1363:     {
 1364:         return;
 1365:     }
 1366: 
 1367:     liberation(s_etat_processus, s_objet_argument);
 1368: 
 1369:     return;
 1370: }
 1371: 
 1372: 
 1373: /*
 1374: ================================================================================
 1375:   Fonction 'fs?s'
 1376: ================================================================================
 1377:   Entrées : structure processus
 1378: --------------------------------------------------------------------------------
 1379:   Sorties :
 1380: --------------------------------------------------------------------------------
 1381:   Effets de bord : néant
 1382: ================================================================================
 1383: */
 1384: 
 1385: void
 1386: instruction_fs_test_s(struct_processus *s_etat_processus)
 1387: {
 1388:     (*s_etat_processus).erreur_execution = d_ex;
 1389: 
 1390:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1391:     {
 1392:         printf("\n  FS?S ");
 1393: 
 1394:         if ((*s_etat_processus).langue == 'F')
 1395:         {
 1396:             printf("(teste si un drapeau est armé et arme le drapeau)\n\n");
 1397:         }
 1398:         else
 1399:         {
 1400:             printf("(test if flag is set and set flag)\n\n");
 1401:         }
 1402: 
 1403:         printf("    1: %s\n", d_INT);
 1404:         printf("->  1: %s\n", d_INT);
 1405: 
 1406:         return;
 1407:     }
 1408:     else if ((*s_etat_processus).test_instruction == 'Y')
 1409:     {
 1410:         (*s_etat_processus).nombre_arguments = -1;
 1411:         return;
 1412:     }
 1413:     
 1414:     instruction_dup(s_etat_processus);
 1415: 
 1416:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1417:             ((*s_etat_processus).erreur_execution != d_ex))
 1418:     {
 1419:         return;
 1420:     }
 1421: 
 1422:     instruction_fs_test(s_etat_processus);
 1423: 
 1424:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1425:             ((*s_etat_processus).erreur_execution != d_ex))
 1426:     {
 1427:         return;
 1428:     }
 1429: 
 1430:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1431:             ((*s_etat_processus).erreur_execution != d_ex))
 1432:     {
 1433:         return;
 1434:     }
 1435: 
 1436:     instruction_swap(s_etat_processus);
 1437: 
 1438:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1439:             ((*s_etat_processus).erreur_execution != d_ex))
 1440:     {
 1441:         return;
 1442:     }
 1443: 
 1444:     instruction_sf(s_etat_processus);
 1445: 
 1446:     return;
 1447: }
 1448: 
 1449: 
 1450: /*
 1451: ================================================================================
 1452:   Fonction 'fs?c'
 1453: ================================================================================
 1454:   Entrées : structure processus
 1455: --------------------------------------------------------------------------------
 1456:   Sorties :
 1457: --------------------------------------------------------------------------------
 1458:   Effets de bord : néant
 1459: ================================================================================
 1460: */
 1461: 
 1462: void
 1463: instruction_fs_test_c(struct_processus *s_etat_processus)
 1464: {
 1465:     (*s_etat_processus).erreur_execution = d_ex;
 1466: 
 1467:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1468:     {
 1469:         printf("\n  FS?C ");
 1470: 
 1471:         if ((*s_etat_processus).langue == 'F')
 1472:         {
 1473:             printf("(teste si un drapeau est armé et désarme le drapeau)\n\n");
 1474:         }
 1475:         else
 1476:         {
 1477:             printf("(test if flag is set and clear flag)\n\n");
 1478:         }
 1479: 
 1480:         printf("    1: %s\n", d_INT);
 1481:         printf("->  1: %s\n", d_INT);
 1482: 
 1483:         return;
 1484:     }
 1485:     else if ((*s_etat_processus).test_instruction == 'Y')
 1486:     {
 1487:         (*s_etat_processus).nombre_arguments = -1;
 1488:         return;
 1489:     }
 1490:     
 1491:     instruction_dup(s_etat_processus);
 1492: 
 1493:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1494:             ((*s_etat_processus).erreur_execution != d_ex))
 1495:     {
 1496:         return;
 1497:     }
 1498: 
 1499:     instruction_fs_test(s_etat_processus);
 1500: 
 1501:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1502:             ((*s_etat_processus).erreur_execution != d_ex))
 1503:     {
 1504:         return;
 1505:     }
 1506: 
 1507:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1508:             ((*s_etat_processus).erreur_execution != d_ex))
 1509:     {
 1510:         return;
 1511:     }
 1512: 
 1513:     instruction_swap(s_etat_processus);
 1514: 
 1515:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1516:             ((*s_etat_processus).erreur_execution != d_ex))
 1517:     {
 1518:         return;
 1519:     }
 1520: 
 1521:     instruction_cf(s_etat_processus);
 1522: 
 1523:     return;
 1524: }
 1525: 
 1526: 
 1527: /*
 1528: ================================================================================
 1529:   Fonction 'fc?s'
 1530: ================================================================================
 1531:   Entrées : structure processus
 1532: --------------------------------------------------------------------------------
 1533:   Sorties :
 1534: --------------------------------------------------------------------------------
 1535:   Effets de bord : néant
 1536: ================================================================================
 1537: */
 1538: 
 1539: void
 1540: instruction_fc_test_s(struct_processus *s_etat_processus)
 1541: {
 1542:     (*s_etat_processus).erreur_execution = d_ex;
 1543: 
 1544:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1545:     {
 1546:         printf("\n  FC?S ");
 1547: 
 1548:         if ((*s_etat_processus).langue == 'F')
 1549:         {
 1550:             printf("(teste si un drapeau est désarmé et arme le drapeau)\n\n");
 1551:         }
 1552:         else
 1553:         {
 1554:             printf("(test if flag is clear and set flag)\n\n");
 1555:         }
 1556: 
 1557:         printf("    1: %s\n", d_INT);
 1558:         printf("->  1: %s\n", d_INT);
 1559: 
 1560:         return;
 1561:     }
 1562:     else if ((*s_etat_processus).test_instruction == 'Y')
 1563:     {
 1564:         (*s_etat_processus).nombre_arguments = -1;
 1565:         return;
 1566:     }
 1567:     
 1568:     instruction_dup(s_etat_processus);
 1569: 
 1570:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1571:             ((*s_etat_processus).erreur_execution != d_ex))
 1572:     {
 1573:         return;
 1574:     }
 1575: 
 1576:     instruction_fc_test(s_etat_processus);
 1577: 
 1578:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1579:             ((*s_etat_processus).erreur_execution != d_ex))
 1580:     {
 1581:         return;
 1582:     }
 1583: 
 1584:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1585:             ((*s_etat_processus).erreur_execution != d_ex))
 1586:     {
 1587:         return;
 1588:     }
 1589: 
 1590:     instruction_swap(s_etat_processus);
 1591: 
 1592:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1593:             ((*s_etat_processus).erreur_execution != d_ex))
 1594:     {
 1595:         return;
 1596:     }
 1597: 
 1598:     instruction_sf(s_etat_processus);
 1599: 
 1600:     return;
 1601: }
 1602: 
 1603: 
 1604: /*
 1605: ================================================================================
 1606:   Fonction 'fc?c'
 1607: ================================================================================
 1608:   Entrées : structure processus
 1609: --------------------------------------------------------------------------------
 1610:   Sorties :
 1611: --------------------------------------------------------------------------------
 1612:   Effets de bord : néant
 1613: ================================================================================
 1614: */
 1615: 
 1616: void
 1617: instruction_fc_test_c(struct_processus *s_etat_processus)
 1618: {
 1619:     (*s_etat_processus).erreur_execution = d_ex;
 1620: 
 1621:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1622:     {
 1623:         printf("\n  FC?C ");
 1624: 
 1625:         if ((*s_etat_processus).langue == 'F')
 1626:         {
 1627:             printf("(teste si un drapeau est désarmé et désarme le drapeau)"
 1628:                     "\n\n");
 1629:         }
 1630:         else
 1631:         {
 1632:             printf("(test if flag is clear and clear flag)\n\n");
 1633:         }
 1634: 
 1635:         printf("    1: %s\n", d_INT);
 1636:         printf("->  1: %s\n", d_INT);
 1637: 
 1638:         return;
 1639:     }
 1640:     else if ((*s_etat_processus).test_instruction == 'Y')
 1641:     {
 1642:         (*s_etat_processus).nombre_arguments = -1;
 1643:         return;
 1644:     }
 1645:     
 1646:     instruction_dup(s_etat_processus);
 1647: 
 1648:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1649:             ((*s_etat_processus).erreur_execution != d_ex))
 1650:     {
 1651:         return;
 1652:     }
 1653: 
 1654:     instruction_fc_test(s_etat_processus);
 1655: 
 1656:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1657:             ((*s_etat_processus).erreur_execution != d_ex))
 1658:     {
 1659:         return;
 1660:     }
 1661: 
 1662:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1663:             ((*s_etat_processus).erreur_execution != d_ex))
 1664:     {
 1665:         return;
 1666:     }
 1667: 
 1668:     instruction_swap(s_etat_processus);
 1669: 
 1670:     if (((*s_etat_processus).erreur_systeme != d_es) ||
 1671:             ((*s_etat_processus).erreur_execution != d_ex))
 1672:     {
 1673:         return;
 1674:     }
 1675: 
 1676:     instruction_cf(s_etat_processus);
 1677: 
 1678:     return;
 1679: }
 1680: 
 1681: 
 1682: /*
 1683: ================================================================================
 1684:   Fonction 'fact'
 1685: ================================================================================
 1686:   Entrées :
 1687: --------------------------------------------------------------------------------
 1688:   Sorties :
 1689: --------------------------------------------------------------------------------
 1690:   Effets de bord : néant
 1691: ================================================================================
 1692: */
 1693: 
 1694: void
 1695: instruction_fact(struct_processus *s_etat_processus)
 1696: {
 1697:     logical1                            depassement;
 1698: 
 1699:     real8                               produit;
 1700: 
 1701:     integer8                            i;
 1702:     integer8                            ifact;
 1703:     integer8                            tampon;
 1704: 
 1705:     struct_liste_chainee                *l_element_courant;
 1706:     struct_liste_chainee                *l_element_precedent;
 1707: 
 1708:     struct_objet                        *s_copie_argument;
 1709:     struct_objet                        *s_objet_argument;
 1710:     struct_objet                        *s_objet_resultat;
 1711: 
 1712:     (*s_etat_processus).erreur_execution = d_ex;
 1713: 
 1714:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1715:     {
 1716:         printf("\n  FACT ");
 1717: 
 1718:         if ((*s_etat_processus).langue == 'F')
 1719:         {
 1720:             printf("(factorielle)\n\n");
 1721:         }
 1722:         else
 1723:         {
 1724:             printf("(factorial)\n\n");
 1725:         }
 1726: 
 1727:         printf("    1: %s\n", d_INT);
 1728:         printf("->  1: %s, %s\n\n", d_INT, d_REL);
 1729: 
 1730:         printf("    1: %s, %s\n", d_NOM, d_ALG);
 1731:         printf("->  1: %s\n\n", d_ALG);
 1732: 
 1733:         printf("    1: %s\n", d_RPN);
 1734:         printf("->  1: %s\n", d_RPN);
 1735: 
 1736:         return;
 1737:     }
 1738:     else if ((*s_etat_processus).test_instruction == 'Y')
 1739:     {
 1740:         (*s_etat_processus).nombre_arguments = 1;
 1741:         return;
 1742:     }
 1743:     
 1744:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1745:     {
 1746:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1747:         {
 1748:             return;
 1749:         }
 1750:     }
 1751: 
 1752:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1753:             &s_objet_argument) == d_erreur)
 1754:     {
 1755:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1756:         return;
 1757:     }
 1758: 
 1759: /*
 1760: --------------------------------------------------------------------------------
 1761:   Calcul de la factorielle d'un entier (résultat réel)
 1762: --------------------------------------------------------------------------------
 1763: */
 1764: 
 1765:     if ((*s_objet_argument).type == INT)
 1766:     {
 1767:         if ((*((integer8 *) (*s_objet_argument).objet)) < 0)
 1768:         {
 1769:             if (test_cfsf(s_etat_processus, 59) == d_vrai)
 1770:             {
 1771:                 liberation(s_etat_processus, s_objet_argument);
 1772: 
 1773:                 (*s_etat_processus).exception = d_ep_overflow;
 1774:                 return;
 1775:             }
 1776:             else
 1777:             {
 1778:                 if ((s_objet_resultat = allocation(s_etat_processus, REL))
 1779:                         == NULL)
 1780:                 {
 1781:                     (*s_etat_processus).erreur_systeme =
 1782:                             d_es_allocation_memoire;
 1783:                     return;
 1784:                 }
 1785: 
 1786:                 (*((real8 *) (*s_objet_resultat).objet)) =
 1787:                         ((double) 1) / ((double) 0);
 1788:             }
 1789:         }
 1790:         else
 1791:         {
 1792:             ifact = 1;
 1793:             depassement = d_faux;
 1794: 
 1795:             for (i = 1; i <= (*((integer8 *) (*s_objet_argument).objet)); i++)
 1796:             {
 1797:                 if (depassement_multiplication(&ifact, &i, &tampon) == d_erreur)
 1798:                 {
 1799:                     depassement = d_vrai;
 1800:                     break;
 1801:                 }
 1802: 
 1803:                 ifact = tampon;
 1804:             }
 1805: 
 1806:             if (depassement == d_faux)
 1807:             {
 1808:                 if ((s_objet_resultat = allocation(s_etat_processus, INT))
 1809:                         == NULL)
 1810:                 {
 1811:                     (*s_etat_processus).erreur_systeme =
 1812:                             d_es_allocation_memoire;
 1813:                     return;
 1814:                 }
 1815: 
 1816:                 (*((integer8 *) (*s_objet_resultat).objet)) = ifact;
 1817:             }
 1818:             else
 1819:             {
 1820:                 produit = 1;
 1821: 
 1822:                 for (i = 1; i <= (*((integer8 *) (*s_objet_argument).objet));
 1823:                         i++)
 1824:                 {
 1825:                     produit *= i;
 1826:                 }
 1827: 
 1828:                 if ((s_objet_resultat = allocation(s_etat_processus, REL))
 1829:                         == NULL)
 1830:                 {
 1831:                     (*s_etat_processus).erreur_systeme =
 1832:                             d_es_allocation_memoire;
 1833:                     return;
 1834:                 }
 1835: 
 1836:                 (*((real8 *) (*s_objet_resultat).objet)) = produit;
 1837:             }
 1838:         }
 1839:     }
 1840: 
 1841: /*
 1842: --------------------------------------------------------------------------------
 1843:   Factorielle d'un nom
 1844: --------------------------------------------------------------------------------
 1845: */
 1846: 
 1847:     else if ((*s_objet_argument).type == NOM)
 1848:     {
 1849:         if ((s_objet_resultat = allocation(s_etat_processus, ALG))
 1850:                 == NULL)
 1851:         {
 1852:             (*s_etat_processus).erreur_systeme =
 1853:                     d_es_allocation_memoire;
 1854:             return;
 1855:         }
 1856: 
 1857:         if (((*s_objet_resultat).objet =
 1858:                 allocation_maillon(s_etat_processus)) == NULL)
 1859:         {
 1860:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1861:             return;
 1862:         }
 1863: 
 1864:         l_element_courant = (*s_objet_resultat).objet;
 1865: 
 1866:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1867:                 == NULL)
 1868:         {
 1869:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1870:             return;
 1871:         }
 1872: 
 1873:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1874:                 .nombre_arguments = 0;
 1875:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1876:                 .fonction = instruction_vers_niveau_superieur;
 1877: 
 1878:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1879:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1880:         {
 1881:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1882:             return;
 1883:         }
 1884: 
 1885:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1886:                 .nom_fonction, "<<");
 1887: 
 1888:         if (((*l_element_courant).suivant =
 1889:                 allocation_maillon(s_etat_processus)) == NULL)
 1890:         {
 1891:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1892:             return;
 1893:         }
 1894: 
 1895:         l_element_courant = (*l_element_courant).suivant;
 1896:         (*l_element_courant).donnee = s_objet_argument;
 1897: 
 1898:         if (((*l_element_courant).suivant =
 1899:                 allocation_maillon(s_etat_processus)) == NULL)
 1900:         {
 1901:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1902:             return;
 1903:         }
 1904: 
 1905:         l_element_courant = (*l_element_courant).suivant;
 1906: 
 1907:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1908:                 == NULL)
 1909:         {
 1910:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1911:             return;
 1912:         }
 1913: 
 1914:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1915:                 .nombre_arguments = 1;
 1916:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1917:                 .fonction = instruction_fact;
 1918: 
 1919:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1920:                 .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
 1921:         {
 1922:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1923:             return;
 1924:         }
 1925: 
 1926:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1927:                 .nom_fonction, "FACT");
 1928: 
 1929:         if (((*l_element_courant).suivant =
 1930:                 allocation_maillon(s_etat_processus)) == NULL)
 1931:         {
 1932:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1933:             return;
 1934:         }
 1935: 
 1936:         l_element_courant = (*l_element_courant).suivant;
 1937: 
 1938:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1939:                 == NULL)
 1940:         {
 1941:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1942:             return;
 1943:         }
 1944: 
 1945:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1946:                 .nombre_arguments = 0;
 1947:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1948:                 .fonction = instruction_vers_niveau_inferieur;
 1949: 
 1950:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1951:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1952:         {
 1953:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1954:             return;
 1955:         }
 1956: 
 1957:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1958:                 .nom_fonction, ">>");
 1959: 
 1960:         (*l_element_courant).suivant = NULL;
 1961:         s_objet_argument = NULL;
 1962:     }
 1963: 
 1964: /*
 1965: --------------------------------------------------------------------------------
 1966:   Factorielle d'une expression
 1967: --------------------------------------------------------------------------------
 1968: */
 1969: 
 1970:     else if (((*s_objet_argument).type == ALG) ||
 1971:             ((*s_objet_argument).type == RPN))
 1972:     {
 1973:         if ((s_copie_argument = copie_objet(s_etat_processus,
 1974:                 s_objet_argument, 'N')) == NULL)
 1975:         {
 1976:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1977:             return;
 1978:         }
 1979: 
 1980:         l_element_courant = (struct_liste_chainee *)
 1981:                 (*s_copie_argument).objet;
 1982:         l_element_precedent = l_element_courant;
 1983: 
 1984:         while((*l_element_courant).suivant != NULL)
 1985:         {
 1986:             l_element_precedent = l_element_courant;
 1987:             l_element_courant = (*l_element_courant).suivant;
 1988:         }
 1989: 
 1990:         if (((*l_element_precedent).suivant =
 1991:                 allocation_maillon(s_etat_processus)) == NULL)
 1992:         {
 1993:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1994:             return;
 1995:         }
 1996: 
 1997:         if (((*(*l_element_precedent).suivant).donnee =
 1998:                 allocation(s_etat_processus, FCT)) == NULL)
 1999:         {
 2000:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2001:             return;
 2002:         }
 2003: 
 2004:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 2005:                 .donnee).objet)).nombre_arguments = 1;
 2006:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 2007:                 .donnee).objet)).fonction = instruction_fact;
 2008: 
 2009:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 2010:                 .suivant).donnee).objet)).nom_fonction =
 2011:                 malloc(5 * sizeof(unsigned char))) == NULL)
 2012:         {
 2013:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2014:             return;
 2015:         }
 2016: 
 2017:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 2018:                 .suivant).donnee).objet)).nom_fonction, "FACT");
 2019: 
 2020:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 2021: 
 2022:         s_objet_resultat = s_copie_argument;
 2023:     }
 2024: 
 2025: /*
 2026: --------------------------------------------------------------------------------
 2027:   Factorielle impossible à réaliser
 2028: --------------------------------------------------------------------------------
 2029: */
 2030: 
 2031:     else
 2032:     {
 2033:         liberation(s_etat_processus, s_objet_argument);
 2034: 
 2035:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2036:         return;
 2037:     }
 2038: 
 2039:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2040:             s_objet_resultat) == d_erreur)
 2041:     {
 2042:         return;
 2043:     }
 2044: 
 2045:     liberation(s_etat_processus, s_objet_argument);
 2046: 
 2047:     return;
 2048: }
 2049: 
 2050: 
 2051: /*
 2052: ================================================================================
 2053:   Fonction 'floor'
 2054: ================================================================================
 2055:   Entrées :
 2056: --------------------------------------------------------------------------------
 2057:   Sorties :
 2058: --------------------------------------------------------------------------------
 2059:   Effets de bord : néant
 2060: ================================================================================
 2061: */
 2062: 
 2063: void
 2064: instruction_floor(struct_processus *s_etat_processus)
 2065: {
 2066:     struct_liste_chainee                *l_element_courant;
 2067:     struct_liste_chainee                *l_element_precedent;
 2068: 
 2069:     struct_objet                        *s_copie_argument;
 2070:     struct_objet                        *s_objet_argument;
 2071:     struct_objet                        *s_objet_resultat;
 2072: 
 2073:     (*s_etat_processus).erreur_execution = d_ex;
 2074: 
 2075:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2076:     {
 2077:         printf("\n  FLOOR ");
 2078: 
 2079:         if ((*s_etat_processus).langue == 'F')
 2080:         {
 2081:             printf("(valeur plancher)\n\n");
 2082:         }
 2083:         else
 2084:         {
 2085:             printf("(floor value)\n\n");
 2086:         }
 2087: 
 2088:         printf("    1: %s\n", d_INT);
 2089:         printf("->  1: %s\n\n", d_INT);
 2090: 
 2091:         printf("    1: %s\n", d_REL);
 2092:         printf("->  1: %s, %s\n\n", d_INT, d_REL);
 2093: 
 2094:         printf("    1: %s, %s\n", d_NOM, d_ALG);
 2095:         printf("->  1: %s\n\n", d_ALG);
 2096: 
 2097:         printf("    1: %s\n", d_RPN);
 2098:         printf("->  1: %s\n", d_RPN);
 2099: 
 2100:         return;
 2101:     }
 2102:     else if ((*s_etat_processus).test_instruction == 'Y')
 2103:     {
 2104:         (*s_etat_processus).nombre_arguments = 1;
 2105:         return;
 2106:     }
 2107:     
 2108:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2109:     {
 2110:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 2111:         {
 2112:             return;
 2113:         }
 2114:     }
 2115: 
 2116:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2117:             &s_objet_argument) == d_erreur)
 2118:     {
 2119:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2120:         return;
 2121:     }
 2122: 
 2123: /*
 2124: --------------------------------------------------------------------------------
 2125:   Plancher d'un entier
 2126: --------------------------------------------------------------------------------
 2127: */
 2128: 
 2129:     if ((*s_objet_argument).type == INT)
 2130:     {
 2131:         s_objet_resultat = s_objet_argument;
 2132:         s_objet_argument = NULL;
 2133:     }
 2134: 
 2135: /*
 2136: --------------------------------------------------------------------------------
 2137:   Plancher d'un réel
 2138: --------------------------------------------------------------------------------
 2139: */
 2140: 
 2141:     else if ((*s_objet_argument).type == REL)
 2142:     {
 2143:         if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
 2144:         {
 2145:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2146:             return;
 2147:         }
 2148: 
 2149:         (*((integer8 *) (*s_objet_resultat).objet)) =
 2150:                 floor((*((real8 *) (*s_objet_argument).objet)));
 2151: 
 2152:         if (!((((*((integer8 *) (*s_objet_resultat).objet)) <
 2153:                 (*((real8 *) (*s_objet_argument).objet))) && (((*((integer8 *)
 2154:                 (*s_objet_resultat).objet)) + 1) > (*((real8 *)
 2155:                 (*s_objet_argument).objet))))))
 2156:         {
 2157:             free((*s_objet_resultat).objet);
 2158: 
 2159:             if (((*s_objet_resultat).objet = malloc(sizeof(real8))) == NULL)
 2160:             {
 2161:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2162:                 return;
 2163:             }
 2164: 
 2165:             (*s_objet_resultat).type = REL;
 2166:             (*((real8 *) (*s_objet_resultat).objet)) =
 2167:                     ceil((*((real8 *) (*s_objet_argument).objet)));
 2168:         }
 2169:     }
 2170: 
 2171: /*
 2172: --------------------------------------------------------------------------------
 2173:   Plancher d'un nom
 2174: --------------------------------------------------------------------------------
 2175: */
 2176: 
 2177:     else if ((*s_objet_argument).type == NOM)
 2178:     {
 2179:         if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
 2180:         {
 2181:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2182:             return;
 2183:         }
 2184: 
 2185:         if (((*s_objet_resultat).objet =
 2186:                 allocation_maillon(s_etat_processus)) == NULL)
 2187:         {
 2188:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2189:             return;
 2190:         }
 2191: 
 2192:         l_element_courant = (*s_objet_resultat).objet;
 2193: 
 2194:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 2195:                 == NULL)
 2196:         {
 2197:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2198:             return;
 2199:         }
 2200: 
 2201:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2202:                 .nombre_arguments = 0;
 2203:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2204:                 .fonction = instruction_vers_niveau_superieur;
 2205: 
 2206:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2207:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 2208:         {
 2209:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2210:             return;
 2211:         }
 2212: 
 2213:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2214:                 .nom_fonction, "<<");
 2215: 
 2216:         if (((*l_element_courant).suivant =
 2217:                 allocation_maillon(s_etat_processus)) == NULL)
 2218:         {
 2219:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2220:             return;
 2221:         }
 2222: 
 2223:         l_element_courant = (*l_element_courant).suivant;
 2224:         (*l_element_courant).donnee = s_objet_argument;
 2225: 
 2226:         if (((*l_element_courant).suivant =
 2227:                 allocation_maillon(s_etat_processus)) == NULL)
 2228:         {
 2229:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2230:             return;
 2231:         }
 2232: 
 2233:         l_element_courant = (*l_element_courant).suivant;
 2234: 
 2235:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 2236:                 == NULL)
 2237:         {
 2238:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2239:             return;
 2240:         }
 2241: 
 2242:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2243:                 .nombre_arguments = 1;
 2244:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2245:                 .fonction = instruction_floor;
 2246: 
 2247:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2248:                 .nom_fonction = malloc(6 * sizeof(unsigned char))) == NULL)
 2249:         {
 2250:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2251:             return;
 2252:         }
 2253: 
 2254:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2255:                 .nom_fonction, "FLOOR");
 2256: 
 2257:         if (((*l_element_courant).suivant =
 2258:                 allocation_maillon(s_etat_processus)) == NULL)
 2259:         {
 2260:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2261:             return;
 2262:         }
 2263: 
 2264:         l_element_courant = (*l_element_courant).suivant;
 2265: 
 2266:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 2267:                 == NULL)
 2268:         {
 2269:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2270:             return;
 2271:         }
 2272: 
 2273:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2274:                 .nombre_arguments = 0;
 2275:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2276:                 .fonction = instruction_vers_niveau_inferieur;
 2277: 
 2278:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2279:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 2280:         {
 2281:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2282:             return;
 2283:         }
 2284: 
 2285:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2286:                 .nom_fonction, ">>");
 2287: 
 2288:         (*l_element_courant).suivant = NULL;
 2289:         s_objet_argument = NULL;
 2290:     }
 2291: 
 2292: /*
 2293: --------------------------------------------------------------------------------
 2294:   Plancher d'une expression
 2295: --------------------------------------------------------------------------------
 2296: */
 2297: 
 2298:     else if (((*s_objet_argument).type == ALG) ||
 2299:             ((*s_objet_argument).type == RPN))
 2300:     {
 2301:         if ((s_copie_argument = copie_objet(s_etat_processus,
 2302:                 s_objet_argument, 'N')) == NULL)
 2303:         {
 2304:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2305:             return;
 2306:         }
 2307: 
 2308:         l_element_courant = (struct_liste_chainee *)
 2309:                 (*s_copie_argument).objet;
 2310:         l_element_precedent = l_element_courant;
 2311: 
 2312:         while((*l_element_courant).suivant != NULL)
 2313:         {
 2314:             l_element_precedent = l_element_courant;
 2315:             l_element_courant = (*l_element_courant).suivant;
 2316:         }
 2317: 
 2318:         if (((*l_element_precedent).suivant =
 2319:                 allocation_maillon(s_etat_processus)) == NULL)
 2320:         {
 2321:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2322:             return;
 2323:         }
 2324: 
 2325:         if (((*(*l_element_precedent).suivant).donnee =
 2326:                 allocation(s_etat_processus, FCT)) == NULL)
 2327:         {
 2328:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2329:             return;
 2330:         }
 2331: 
 2332:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 2333:                 .donnee).objet)).nombre_arguments = 1;
 2334:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 2335:                 .donnee).objet)).fonction = instruction_floor;
 2336: 
 2337:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 2338:                 .suivant).donnee).objet)).nom_fonction =
 2339:                 malloc(6 * sizeof(unsigned char))) == NULL)
 2340:         {
 2341:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2342:             return;
 2343:         }
 2344: 
 2345:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 2346:                 .suivant).donnee).objet)).nom_fonction, "FLOOR");
 2347: 
 2348:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 2349: 
 2350:         s_objet_resultat = s_copie_argument;
 2351:     }
 2352: 
 2353: /*
 2354: --------------------------------------------------------------------------------
 2355:   Fonction floor impossible à réaliser
 2356: --------------------------------------------------------------------------------
 2357: */
 2358: 
 2359:     else
 2360:     {
 2361:         liberation(s_etat_processus, s_objet_argument);
 2362: 
 2363:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2364:         return;
 2365:     }
 2366: 
 2367:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2368:             s_objet_resultat) == d_erreur)
 2369:     {
 2370:         return;
 2371:     }
 2372: 
 2373:     liberation(s_etat_processus, s_objet_argument);
 2374: 
 2375:     return;
 2376: }
 2377: 
 2378: 
 2379: /*
 2380: ================================================================================
 2381:   Fonction 'fp'
 2382: ================================================================================
 2383:   Entrées :
 2384: --------------------------------------------------------------------------------
 2385:   Sorties :
 2386: --------------------------------------------------------------------------------
 2387:   Effets de bord : néant
 2388: ================================================================================
 2389: */
 2390: 
 2391: void
 2392: instruction_fp(struct_processus *s_etat_processus)
 2393: {
 2394:     struct_liste_chainee                *l_element_courant;
 2395:     struct_liste_chainee                *l_element_precedent;
 2396: 
 2397:     struct_objet                        *s_copie_argument;
 2398:     struct_objet                        *s_objet_argument;
 2399:     struct_objet                        *s_objet_resultat;
 2400: 
 2401:     (*s_etat_processus).erreur_execution = d_ex;
 2402: 
 2403:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2404:     {
 2405:         printf("\n  FP ");
 2406: 
 2407:         if ((*s_etat_processus).langue == 'F')
 2408:         {
 2409:             printf("(part fractionnaire)\n\n");
 2410:         }
 2411:         else
 2412:         {
 2413:             printf("(fractional part)\n\n");
 2414:         }
 2415: 
 2416:         printf("    1: %s, %s\n", d_INT, d_REL);
 2417:         printf("->  1: %s\n\n", d_REL);
 2418: 
 2419:         printf("    1: %s, %s\n", d_NOM, d_ALG);
 2420:         printf("->  1: %s\n\n", d_ALG);
 2421: 
 2422:         printf("    1: %s\n", d_RPN);
 2423:         printf("->  1: %s\n", d_RPN);
 2424: 
 2425:         return;
 2426:     }
 2427:     else if ((*s_etat_processus).test_instruction == 'Y')
 2428:     {
 2429:         (*s_etat_processus).nombre_arguments = 1;
 2430:         return;
 2431:     }
 2432:     
 2433:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2434:     {
 2435:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 2436:         {
 2437:             return;
 2438:         }
 2439:     }
 2440: 
 2441:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2442:             &s_objet_argument) == d_erreur)
 2443:     {
 2444:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2445:         return;
 2446:     }
 2447: 
 2448: /*
 2449: --------------------------------------------------------------------------------
 2450:   fp d'un entier
 2451: --------------------------------------------------------------------------------
 2452: */
 2453: 
 2454:     if ((*s_objet_argument).type == INT)
 2455:     {
 2456:         if ((s_objet_resultat = allocation(s_etat_processus, REL))
 2457:                 == NULL)
 2458:         {
 2459:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2460:             return;
 2461:         }
 2462: 
 2463:         (*((real8 *) (*s_objet_resultat).objet)) = 0;
 2464:     }
 2465: 
 2466: /*
 2467: --------------------------------------------------------------------------------
 2468:   fp d'un réel
 2469: --------------------------------------------------------------------------------
 2470: */
 2471: 
 2472:     else if ((*s_objet_argument).type == REL)
 2473:     {
 2474:         if ((s_objet_resultat = allocation(s_etat_processus, REL))
 2475:                 == NULL)
 2476:         {
 2477:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2478:             return;
 2479:         }
 2480: 
 2481:         if ((*((real8 *) (*s_objet_argument).objet)) > 0)
 2482:         {
 2483:             (*((real8 *) (*s_objet_resultat).objet)) =
 2484:                     (*((real8 *) (*s_objet_argument).objet)) -
 2485:                     floor((*((real8 *) (*s_objet_argument).objet)));
 2486:         }
 2487:         else
 2488:         {
 2489:             (*((real8 *) (*s_objet_resultat).objet)) =
 2490:                     (*((real8 *) (*s_objet_argument).objet)) -
 2491:                     ceil((*((real8 *) (*s_objet_argument).objet)));
 2492:         }
 2493:     }
 2494: 
 2495: /*
 2496: --------------------------------------------------------------------------------
 2497:   fp d'un nom
 2498: --------------------------------------------------------------------------------
 2499: */
 2500: 
 2501:     else if ((*s_objet_argument).type == NOM)
 2502:     {
 2503:         if ((s_objet_resultat = allocation(s_etat_processus, ALG))
 2504:                 == NULL)
 2505:         {
 2506:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2507:             return;
 2508:         }
 2509: 
 2510:         if (((*s_objet_resultat).objet =
 2511:                 allocation_maillon(s_etat_processus)) == NULL)
 2512:         {
 2513:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2514:             return;
 2515:         }
 2516: 
 2517:         l_element_courant = (*s_objet_resultat).objet;
 2518: 
 2519:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 2520:                 == NULL)
 2521:         {
 2522:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2523:             return;
 2524:         }
 2525: 
 2526:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2527:                 .nombre_arguments = 0;
 2528:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2529:                 .fonction = instruction_vers_niveau_superieur;
 2530: 
 2531:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2532:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 2533:         {
 2534:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2535:             return;
 2536:         }
 2537: 
 2538:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2539:                 .nom_fonction, "<<");
 2540: 
 2541:         if (((*l_element_courant).suivant =
 2542:                 allocation_maillon(s_etat_processus)) == NULL)
 2543:         {
 2544:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2545:             return;
 2546:         }
 2547: 
 2548:         l_element_courant = (*l_element_courant).suivant;
 2549:         (*l_element_courant).donnee = s_objet_argument;
 2550: 
 2551:         if (((*l_element_courant).suivant =
 2552:                 allocation_maillon(s_etat_processus)) == NULL)
 2553:         {
 2554:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2555:             return;
 2556:         }
 2557: 
 2558:         l_element_courant = (*l_element_courant).suivant;
 2559: 
 2560:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 2561:                 == NULL)
 2562:         {
 2563:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2564:             return;
 2565:         }
 2566: 
 2567:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2568:                 .nombre_arguments = 1;
 2569:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2570:                 .fonction = instruction_fp;
 2571: 
 2572:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2573:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 2574:         {
 2575:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2576:             return;
 2577:         }
 2578: 
 2579:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2580:                 .nom_fonction, "FP");
 2581: 
 2582:         if (((*l_element_courant).suivant =
 2583:                 allocation_maillon(s_etat_processus)) == NULL)
 2584:         {
 2585:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2586:             return;
 2587:         }
 2588: 
 2589:         l_element_courant = (*l_element_courant).suivant;
 2590: 
 2591:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 2592:                 == NULL)
 2593:         {
 2594:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2595:             return;
 2596:         }
 2597: 
 2598:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2599:                 .nombre_arguments = 0;
 2600:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2601:                 .fonction = instruction_vers_niveau_inferieur;
 2602: 
 2603:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2604:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 2605:         {
 2606:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2607:             return;
 2608:         }
 2609: 
 2610:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 2611:                 .nom_fonction, ">>");
 2612: 
 2613:         (*l_element_courant).suivant = NULL;
 2614:         s_objet_argument = NULL;
 2615:     }
 2616: 
 2617: /*
 2618: --------------------------------------------------------------------------------
 2619:   fp d'une expression
 2620: --------------------------------------------------------------------------------
 2621: */
 2622: 
 2623:     else if (((*s_objet_argument).type == ALG) ||
 2624:             ((*s_objet_argument).type == RPN))
 2625:     {
 2626:         if ((s_copie_argument = copie_objet(s_etat_processus,
 2627:                 s_objet_argument, 'N')) == NULL)
 2628:         {
 2629:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2630:             return;
 2631:         }
 2632: 
 2633:         l_element_courant = (struct_liste_chainee *)
 2634:                 (*s_copie_argument).objet;
 2635:         l_element_precedent = l_element_courant;
 2636: 
 2637:         while((*l_element_courant).suivant != NULL)
 2638:         {
 2639:             l_element_precedent = l_element_courant;
 2640:             l_element_courant = (*l_element_courant).suivant;
 2641:         }
 2642: 
 2643:         if (((*l_element_precedent).suivant =
 2644:                 allocation_maillon(s_etat_processus)) == NULL)
 2645:         {
 2646:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2647:             return;
 2648:         }
 2649: 
 2650:         if (((*(*l_element_precedent).suivant).donnee =
 2651:                 allocation(s_etat_processus, FCT)) == NULL)
 2652:         {
 2653:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2654:             return;
 2655:         }
 2656: 
 2657:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 2658:                 .donnee).objet)).nombre_arguments = 1;
 2659:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 2660:                 .donnee).objet)).fonction = instruction_fp;
 2661: 
 2662:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 2663:                 .suivant).donnee).objet)).nom_fonction =
 2664:                 malloc(3 * sizeof(unsigned char))) == NULL)
 2665:         {
 2666:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2667:             return;
 2668:         }
 2669: 
 2670:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 2671:                 .suivant).donnee).objet)).nom_fonction, "FP");
 2672: 
 2673:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 2674: 
 2675:         s_objet_resultat = s_copie_argument;
 2676:     }
 2677: 
 2678: /*
 2679: --------------------------------------------------------------------------------
 2680:   Fonction fp impossible à réaliser
 2681: --------------------------------------------------------------------------------
 2682: */
 2683: 
 2684:     else
 2685:     {
 2686:         liberation(s_etat_processus, s_objet_argument);
 2687: 
 2688:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2689:         return;
 2690:     }
 2691: 
 2692:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2693:             s_objet_resultat) == d_erreur)
 2694:     {
 2695:         return;
 2696:     }
 2697: 
 2698:     liberation(s_etat_processus, s_objet_argument);
 2699: 
 2700:     return;
 2701: }
 2702: 
 2703: 
 2704: /*
 2705: ================================================================================
 2706:   Fonction 'fix'
 2707: ================================================================================
 2708:   Entrées : pointeur sur une struct_processus
 2709: --------------------------------------------------------------------------------
 2710:   Sorties :
 2711: --------------------------------------------------------------------------------
 2712:   Effets de bord : néant
 2713: ================================================================================
 2714: */
 2715: 
 2716: void
 2717: instruction_fix(struct_processus *s_etat_processus)
 2718: {
 2719:     struct_objet                        *s_objet_argument;
 2720:     struct_objet                        *s_objet;
 2721: 
 2722:     logical1                            i43;
 2723:     logical1                            i44;
 2724: 
 2725:     unsigned char                       *valeur_binaire;
 2726: 
 2727:     unsigned long                       i;
 2728:     unsigned long                       j;
 2729: 
 2730:     (*s_etat_processus).erreur_execution = d_ex;
 2731: 
 2732:     if ((*s_etat_processus).affichage_arguments == 'Y')
 2733:     {
 2734:         printf("\n  FIX ");
 2735: 
 2736:         if ((*s_etat_processus).langue == 'F')
 2737:         {
 2738:             printf("(format virgule fixe)\n\n");
 2739:         }
 2740:         else
 2741:         {
 2742:             printf("(fixed point format)\n\n");
 2743:         }
 2744: 
 2745:         printf("    1: %s\n", d_INT);
 2746: 
 2747:         return;
 2748:     }
 2749:     else if ((*s_etat_processus).test_instruction == 'Y')
 2750:     {
 2751:         (*s_etat_processus).nombre_arguments = -1;
 2752:         return;
 2753:     }
 2754: 
 2755:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 2756:     {
 2757:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 2758:         {
 2759:             return;
 2760:         }
 2761:     }
 2762: 
 2763:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 2764:             &s_objet_argument) == d_erreur)
 2765:     {
 2766:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 2767:         return;
 2768:     }
 2769: 
 2770:     if ((*s_objet_argument).type == INT)
 2771:     {
 2772:         if (((*((integer8 *) (*s_objet_argument).objet)) >= 0) &&
 2773:                 ((*((integer8 *) (*s_objet_argument).objet)) <= 15))
 2774:         {
 2775:             if ((s_objet = allocation(s_etat_processus, BIN)) == NULL)
 2776:             {
 2777:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2778:                 return;
 2779:             }
 2780: 
 2781:             (*((logical8 *) (*s_objet).objet)) =
 2782:                     (*((integer8 *) (*s_objet_argument).objet));
 2783: 
 2784:             i43 = test_cfsf(s_etat_processus, 43);
 2785:             i44 = test_cfsf(s_etat_processus, 44);
 2786: 
 2787:             sf(s_etat_processus, 44);
 2788:             cf(s_etat_processus, 43);
 2789: 
 2790:             if ((valeur_binaire = formateur(s_etat_processus, 0, s_objet))
 2791:                     == NULL)
 2792:             {
 2793:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2794:                 return;
 2795:             }
 2796: 
 2797:             if (i43 == d_vrai)
 2798:             {
 2799:                 sf(s_etat_processus, 43);
 2800:             }
 2801:             else
 2802:             {
 2803:                 cf(s_etat_processus, 43);
 2804:             }
 2805: 
 2806:             if (i44 == d_vrai)
 2807:             {
 2808:                 sf(s_etat_processus, 44);
 2809:             }
 2810:             else
 2811:             {
 2812:                 cf(s_etat_processus, 44);
 2813:             }
 2814: 
 2815:             for(j = 53, i = strlen(valeur_binaire) - 2; i >= 2; i--)
 2816:             {
 2817:                 if (valeur_binaire[i] == '0')
 2818:                 {
 2819:                     cf(s_etat_processus, j++);
 2820:                 }
 2821:                 else
 2822:                 {
 2823:                     sf(s_etat_processus, j++);
 2824:                 }
 2825:             }
 2826: 
 2827:             for(; j <= 56; cf(s_etat_processus, j++));
 2828: 
 2829:             sf(s_etat_processus, 49);
 2830:             cf(s_etat_processus, 50);
 2831: 
 2832:             free(valeur_binaire);
 2833:             liberation(s_etat_processus, s_objet);
 2834:         }
 2835:         else
 2836:         {
 2837:             liberation(s_etat_processus, s_objet_argument);
 2838: 
 2839:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 2840:             return;
 2841:         }
 2842:     }
 2843:     else
 2844:     {
 2845:         liberation(s_etat_processus, s_objet_argument);
 2846: 
 2847:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2848:         return;
 2849:     }
 2850: 
 2851:     liberation(s_etat_processus, s_objet_argument);
 2852: 
 2853:     return;
 2854: }
 2855: 
 2856: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>