File:  [local] / rpl / src / instructions_f1.c
Revision 1.10: download - view: text, annotated - select for diffs - revision graph
Wed Apr 21 13:45:47 2010 UTC (14 years ago) by bertrand
Branches: MAIN
CVS tags: HEAD
En route pour la 4.0.15 !

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

CVSweb interface <joel.bertrand@systella.fr>