File:  [local] / rpl / src / instructions_t1.c
Revision 1.11: download - view: text, annotated - select for diffs - revision graph
Tue Jul 13 08:59:20 2010 UTC (13 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Correction d'un problème de traitement des choix multiples vrais dans les
structures conditionnelles non exclusives.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.17
    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 'type'
   29: ================================================================================
   30:   Entrées : structure processus
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_type(struct_processus *s_etat_processus)
   40: {
   41:     struct_objet                        *s_objet_argument;
   42:     struct_objet                        *s_objet_resultat;
   43: 
   44:     (*s_etat_processus).erreur_execution = d_ex;
   45: 
   46:     if ((*s_etat_processus).affichage_arguments == 'Y')
   47:     {
   48:         printf("\n  TYPE ");
   49: 
   50:         if ((*s_etat_processus).langue == 'F')
   51:         {
   52:             printf("(type d'objet)\n\n");
   53:         }
   54:         else
   55:         {
   56:             printf("(object type)\n\n");
   57:         }
   58: 
   59:         printf("    1: %s, %s, %s, %s, %s, %s,\n"
   60:                 "       %s, %s, %s, %s, %s,\n"
   61:                 "       %s, %s, %s, %s, %s,\n"
   62:                 "       %s, %s, %s, %s\n",
   63:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
   64:                 d_TAB,
   65:                 d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB, d_SCK,
   66:                 d_PRC);
   67:         printf("->  1: %s\n", d_INT);
   68: 
   69:         return;
   70:     }
   71:     else if ((*s_etat_processus).test_instruction == 'Y')
   72:     {
   73:         (*s_etat_processus).nombre_arguments = -1;
   74:         return;
   75:     }
   76: 
   77:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   78:     {
   79:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
   80:         {
   81:             return;
   82:         }
   83:     }
   84: 
   85:     if (depilement(s_etat_processus, &((*s_etat_processus)
   86:                 .l_base_pile), &s_objet_argument) == d_erreur)
   87:     {
   88:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
   89:         return;
   90:     }
   91: 
   92:     if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
   93:     {
   94:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   95:         return;
   96:     }
   97: 
   98:     if (((*s_objet_argument).type == INT) ||
   99:             ((*s_objet_argument).type == REL))
  100:     {
  101:         (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  102:     }
  103:     else if ((*s_objet_argument).type == CPL)
  104:     {
  105:         (*((integer8 *) (*s_objet_resultat).objet)) = 1;
  106:     }
  107:     else if ((*s_objet_argument).type == CHN)
  108:     {
  109:         (*((integer8 *) (*s_objet_resultat).objet)) = 2;
  110:     }
  111:     else if (((*s_objet_argument).type == VIN) ||
  112:             ((*s_objet_argument).type == VRL) ||
  113:             ((*s_objet_argument).type == MIN) ||
  114:             ((*s_objet_argument).type == MRL))
  115:     {
  116:         (*((integer8 *) (*s_objet_resultat).objet)) = 3;
  117:     }
  118:     else if (((*s_objet_argument).type == VCX) ||
  119:             ((*s_objet_argument).type == MCX))
  120:     {
  121:         (*((integer8 *) (*s_objet_resultat).objet)) = 4;
  122:     }
  123:     else if ((*s_objet_argument).type == LST)
  124:     {
  125:         (*((integer8 *) (*s_objet_resultat).objet)) = 5;
  126:     }
  127:     else if ((*s_objet_argument).type == ADR)
  128:     {
  129:         (*((integer8 *) (*s_objet_resultat).objet)) = 6;
  130:     }
  131:     else if ((*s_objet_argument).type == NOM)
  132:     {
  133:         (*((integer8 *) (*s_objet_resultat).objet)) = 7;
  134:     }
  135:     else if ((*s_objet_argument).type == RPN)
  136:     {
  137:         (*((integer8 *) (*s_objet_resultat).objet)) = 8;
  138:     }
  139:     else if ((*s_objet_argument).type == ALG)
  140:     {
  141:         (*((integer8 *) (*s_objet_resultat).objet)) = 9;
  142:     }
  143:     else if ((*s_objet_argument).type == BIN)
  144:     {
  145:         (*((integer8 *) (*s_objet_resultat).objet)) = 10;
  146:     }
  147:     else if ((*s_objet_argument).type == FCH)
  148:     {
  149:         (*((integer8 *) (*s_objet_resultat).objet)) = 11;
  150:     }
  151:     else if ((*s_objet_argument).type == SLB)
  152:     {
  153:         (*((integer8 *) (*s_objet_resultat).objet)) = 12;
  154:     }
  155:     else if ((*s_objet_argument).type == SCK)
  156:     {
  157:         (*((integer8 *) (*s_objet_resultat).objet)) = 13;
  158:     }
  159:     else if ((*s_objet_argument).type == PRC)
  160:     {
  161:         (*((integer8 *) (*s_objet_resultat).objet)) = 14;
  162:     }
  163:     else if ((*s_objet_argument).type == FCT)
  164:     {
  165:         (*((integer8 *) (*s_objet_resultat).objet)) = 15;
  166:     }
  167:     else if ((*s_objet_argument).type == TBL)
  168:     {
  169:         (*((integer8 *) (*s_objet_resultat).objet)) = 16;
  170:     }
  171:     else
  172:     {
  173:         /*
  174:          * Les autres types de données sont des types internes
  175:          */
  176: 
  177:         liberation(s_etat_processus, s_objet_argument);
  178: 
  179:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  180:         return;
  181:     }   
  182: 
  183:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  184:             s_objet_resultat) == d_erreur)
  185:     {
  186:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  187:         return;
  188:     }
  189: 
  190:     liberation(s_etat_processus, s_objet_argument);
  191: 
  192:     return;
  193: }
  194: 
  195: 
  196: /*
  197: ================================================================================
  198:   Fonction 'then'
  199: ================================================================================
  200:   Entrées : structure processus
  201: --------------------------------------------------------------------------------
  202:   Sorties :
  203: --------------------------------------------------------------------------------
  204:   Effets de bord : néant
  205: ================================================================================
  206: */
  207: 
  208: void
  209: instruction_then(struct_processus *s_etat_processus)
  210: {
  211:     logical1                        condition;
  212:     logical1                        drapeau_fin;
  213:     logical1                        execution;
  214: 
  215:     struct_liste_chainee            *s_registre;
  216: 
  217:     struct_liste_pile_systeme       *l_element_courant;
  218: 
  219:     struct_objet                    *s_objet;
  220: 
  221:     unsigned char                   *instruction_majuscule;
  222:     unsigned char                   *tampon;
  223: 
  224:     unsigned long                   niveau;
  225: 
  226:     void                            (*fonction)();
  227: 
  228:     (*s_etat_processus).erreur_execution = d_ex;
  229: 
  230:     if ((*s_etat_processus).affichage_arguments == 'Y')
  231:     {
  232:         printf("\n  THEN ");
  233: 
  234:         if ((*s_etat_processus).langue == 'F')
  235:         {
  236:             printf("(structure de contrôle)\n\n");
  237:             printf("  Utilisation :\n\n");
  238:         }
  239:         else
  240:         {
  241:             printf("(control statement)\n\n");
  242:             printf("  Usage:\n\n");
  243:         }
  244: 
  245:         printf("    IF(ERR)\n");
  246:         printf("        (expression test 1)\n");
  247:         printf("    THEN\n");
  248:         printf("        (expression 1)\n");
  249:         printf("    [ELSEIF\n");
  250:         printf("        (expression test 2)\n");
  251:         printf("    THEN\n");
  252:         printf("        (expression 2)]\n");
  253:         printf("    ...\n");
  254:         printf("    [ELSE\n");
  255:         printf("        (expression n)]\n");
  256:         printf("    END\n\n");
  257: 
  258:         printf("    SELECT (expression test)\n");
  259:         printf("        CASE (clause 1) THEN (expression 1) END\n");
  260:         printf("        CASE (clause 2) THEN (expression 2) END\n");
  261:         printf("        ...\n");
  262:         printf("        CASE (clause n) THEN (expression n) END\n");
  263:         printf("    DEFAULT\n");
  264:         printf("        (expression)\n");
  265:         printf("    END\n\n");
  266: 
  267:         printf("    SELECT (expression test)\n");
  268:         printf("        CASE (clause 1) THEN (expression 1) END\n");
  269:         printf("        (expression)\n");
  270:         printf("        CASE (clause 2) THEN (expression 2) END\n");
  271:         printf("    END\n");
  272: 
  273:         return;
  274:     }
  275:     else if ((*s_etat_processus).test_instruction == 'Y')
  276:     {
  277:         (*s_etat_processus).nombre_arguments = -1;
  278:         return;
  279:     }
  280: 
  281:     if (((*(*s_etat_processus).l_base_pile_systeme).clause != 'I') &&
  282:         ((*(*s_etat_processus).l_base_pile_systeme).clause != 'T') &&
  283:         ((*(*s_etat_processus).l_base_pile_systeme).clause != 'R') &&
  284:         ((*(*s_etat_processus).l_base_pile_systeme).clause != 'X') &&
  285:         ((*(*s_etat_processus).l_base_pile_systeme).clause != 'C') &&
  286:         ((*(*s_etat_processus).l_base_pile_systeme).clause != 'K'))
  287:     {
  288:         (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_condition;
  289:         return;
  290:     }
  291: 
  292:     /*
  293:      * Traitement des erreurs
  294:      */
  295: 
  296:     if (((*(*s_etat_processus).l_base_pile_systeme).clause == 'R') ||
  297:             ((*(*s_etat_processus).l_base_pile_systeme).clause == 'X'))
  298:     {
  299:         if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
  300:         {
  301:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  302:             return;
  303:         }
  304: 
  305:         if ((*(*s_etat_processus).l_base_pile_systeme).clause == 'R')
  306:         {
  307: 
  308:             /*
  309:              * Erreur à traiter : on saute jusques au ELSE ou au END
  310:              * correspondant.
  311:              */
  312: 
  313:             (*((integer8 *) (*s_objet).objet)) = 0;
  314:         }
  315:         else
  316:         {
  317:             (*((integer8 *) (*s_objet).objet)) = -1;
  318:         }
  319: 
  320:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  321:                 s_objet) == d_erreur)
  322:         {
  323:             return;
  324:         }
  325: 
  326:         (*s_etat_processus).arret_si_exception = (*(*s_etat_processus)
  327:                 .l_base_pile_systeme).arret_si_exception;
  328:     }
  329: 
  330:     /*
  331:      * Traitement standard de l'instruction 'THEN'
  332:      */
  333: 
  334:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  335:     {
  336:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  337:         {
  338:             return;
  339:         }
  340:     }
  341: 
  342:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  343:             &s_objet) == d_erreur)
  344:     {
  345:         return;
  346:     }
  347: 
  348:     if (((*s_objet).type == INT) ||
  349:             ((*s_objet).type == REL))
  350:     {
  351:         if ((*s_objet).type == INT)
  352:         {
  353:             condition = ((*((integer8 *) (*s_objet).objet)) == 0)
  354:                     ? d_faux : d_vrai;
  355:         }
  356:         else
  357:         {
  358:             condition = ((*((real8 *) (*s_objet).objet)) == 0)
  359:                     ? d_faux : d_vrai;
  360:         }
  361: 
  362:         if (condition == d_vrai)
  363:         {
  364: 
  365:             /*
  366:              * condition == d_vrai : exécution de ce qui se trouve entre
  367:              * THEN et ELSE ou END.
  368:              */
  369: 
  370:             if (((*(*s_etat_processus).l_base_pile_systeme).clause ==
  371:                     'I') || ((*(*s_etat_processus).l_base_pile_systeme).clause
  372:                     == 'R'))
  373:             {
  374:                 (*(*s_etat_processus).l_base_pile_systeme).clause = 'T';
  375:             }
  376:             else
  377:             {
  378:                 if ((*s_etat_processus).l_base_pile_systeme == NULL)
  379:                 {
  380:                     (*s_etat_processus).erreur_systeme = d_es_pile_vide;
  381:                     return;
  382:                 }
  383: 
  384:                 l_element_courant = (*(*s_etat_processus).l_base_pile_systeme)
  385:                         .suivant;
  386: 
  387:                 while(l_element_courant != NULL)
  388:                 {
  389:                     if ((*l_element_courant).clause == 'K')
  390:                     {
  391:                         (*l_element_courant).clause = 'Q';
  392:                         break;
  393:                     }
  394: 
  395:                     l_element_courant = (*l_element_courant).suivant;
  396:                 }
  397:             }
  398:         }
  399:         else
  400:         {
  401:             /*
  402:              * condition == d_faux : saut à END ou exécution de ce qui se
  403:              * trouve entre ELSE et END
  404:              */
  405: 
  406:             if ((*(*s_etat_processus).l_base_pile_systeme).clause != 'T')
  407:             {
  408:                 /*
  409:                  * Traitement de ELSEIF
  410:                  */
  411: 
  412:                 if (((*(*s_etat_processus).l_base_pile_systeme).clause !=
  413:                         'K') && ((*(*s_etat_processus).l_base_pile_systeme)
  414:                         .clause != 'C'))
  415:                 {
  416:                     (*(*s_etat_processus).l_base_pile_systeme).clause = 'E';
  417:                 }
  418:             }
  419: 
  420:             niveau = 0;
  421:             drapeau_fin = d_faux;
  422: 
  423:             if ((*s_etat_processus).mode_execution_programme == 'Y')
  424:             {
  425:                 tampon = (*s_etat_processus).instruction_courante;
  426: 
  427:                 do
  428:                 {
  429:                     if (recherche_instruction_suivante(s_etat_processus)
  430:                             == d_erreur)
  431:                     {
  432:                         liberation(s_etat_processus, s_objet);
  433: 
  434:                         if ((*s_etat_processus).instruction_courante != NULL)
  435:                         {
  436:                             free((*s_etat_processus).instruction_courante);
  437:                         }
  438: 
  439:                         (*s_etat_processus).instruction_courante = tampon;
  440:                         (*s_etat_processus).erreur_execution =
  441:                                 d_ex_erreur_traitement_condition;
  442:                         return;
  443:                     }
  444: 
  445:                     if ((instruction_majuscule = conversion_majuscule(
  446:                             (*s_etat_processus).instruction_courante)) == NULL)
  447:                     {
  448:                         liberation(s_etat_processus, s_objet);
  449: 
  450:                         free((*s_etat_processus).instruction_courante);
  451:                         (*s_etat_processus).instruction_courante = tampon;
  452:                         (*s_etat_processus).erreur_systeme =
  453:                                 d_es_allocation_memoire;
  454:                         return;
  455:                     }
  456: 
  457:                     if (niveau == 0)
  458:                     {
  459:                         if (((*(*s_etat_processus).l_base_pile_systeme)
  460:                                 .clause != 'K') && ((*(*s_etat_processus)
  461:                                 .l_base_pile_systeme) .clause != 'C'))
  462:                         {
  463: 
  464:                             /*
  465:                              * Traitement de IF/THEN/ELSEIF/THEN/ELSE/END
  466:                              */
  467: 
  468:                             if ((strcmp(instruction_majuscule, "END") == 0) ||
  469:                                     (strcmp(instruction_majuscule, "ELSE")
  470:                                     == 0) || (strcmp(instruction_majuscule,
  471:                                     "ELSEIF") == 0))
  472:                             {
  473:                                 (*s_etat_processus).position_courante
  474:                                         -= (strlen(instruction_majuscule) + 1);
  475:                                 drapeau_fin = d_vrai;
  476:                             }
  477:                             else
  478:                             {
  479:                                 drapeau_fin = d_faux;
  480:                             }
  481:                         }
  482:                         else
  483:                         {
  484:                             /*
  485:                              * Traitement de CASE/THEN/END
  486:                              */
  487: 
  488:                             if (strcmp(instruction_majuscule, "ELSE") == 0)
  489:                             {
  490:                                 liberation(s_etat_processus, s_objet);
  491: 
  492:                                 free((*s_etat_processus).instruction_courante);
  493:                                 free(instruction_majuscule);
  494: 
  495:                                 (*s_etat_processus).instruction_courante =
  496:                                         tampon;
  497:                                 (*s_etat_processus).erreur_execution =
  498:                                         d_ex_erreur_traitement_condition;
  499:                                 return;
  500:                             }
  501:                             else if (strcmp(instruction_majuscule, "END") == 0)
  502:                             {
  503:                                 instruction_end(s_etat_processus);
  504:                                 drapeau_fin = d_vrai;
  505:                             }
  506:                             else
  507:                             {
  508:                                 drapeau_fin = d_faux;
  509:                             }
  510:                         }
  511:                     }
  512:                     else
  513:                     {
  514:                         drapeau_fin = d_faux;
  515:                     }
  516: 
  517:                     if ((strcmp(instruction_majuscule, "CASE") == 0) ||
  518:                             (strcmp(instruction_majuscule, "DO") == 0) ||
  519:                             (strcmp(instruction_majuscule, "IF") == 0) ||
  520:                             (strcmp(instruction_majuscule, "IFERR") == 0) ||
  521:                             (strcmp(instruction_majuscule, "SELECT") == 0) ||
  522:                             (strcmp(instruction_majuscule, "WHILE") == 0))
  523:                     {
  524:                         niveau++;
  525:                     }
  526:                     else if (strcmp(instruction_majuscule, "END") == 0)
  527:                     {
  528:                         niveau--;
  529:                     }
  530: 
  531:                     free(instruction_majuscule);
  532:                     free((*s_etat_processus).instruction_courante);
  533:                 } while(drapeau_fin == d_faux);
  534: 
  535:                 (*s_etat_processus).instruction_courante = tampon;
  536:             }
  537:             else
  538:             {
  539:                 /*
  540:                  * Vérification du pointeur de prédiction de saut.
  541:                  */
  542: 
  543:                 if (pthread_mutex_lock(&((*(*(*s_etat_processus)
  544:                         .expression_courante).donnee).mutex)) != 0)
  545:                 {
  546:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  547:                     return;
  548:                 }
  549: 
  550:                 if ((*((struct_fonction *) (*(*(*s_etat_processus)
  551:                         .expression_courante).donnee).objet)).prediction_saut
  552:                         != NULL)
  553:                 {
  554:                     s_registre = (*s_etat_processus).expression_courante;
  555: 
  556:                     (*s_etat_processus).expression_courante =
  557:                             (struct_liste_chainee *)
  558:                             (*((struct_fonction *) (*(*(*s_etat_processus)
  559:                             .expression_courante).donnee).objet))
  560:                             .prediction_saut;
  561:                     fonction = (*((struct_fonction *)
  562:                             (*(*(*s_etat_processus).expression_courante)
  563:                             .donnee).objet)).fonction;
  564:                     execution = (*((struct_fonction *)
  565:                             (*(*s_registre).donnee).objet))
  566:                             .prediction_execution;
  567: 
  568:                     if (pthread_mutex_unlock(&((*(*s_registre).donnee).mutex))
  569:                             != 0)
  570:                     {
  571:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  572:                         return;
  573:                     }
  574: 
  575:                     if (execution == d_vrai)
  576:                     {
  577:                         fonction(s_etat_processus);
  578:                     }
  579:                 }
  580:                 else
  581:                 {
  582:                     if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
  583:                             .expression_courante).donnee).mutex)) != 0)
  584:                     {
  585:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  586:                         return;
  587:                     }
  588: 
  589:                     s_registre = (*s_etat_processus).expression_courante;
  590:                     execution = d_faux;
  591: 
  592:                     do
  593:                     {
  594:                         if (((*s_etat_processus).expression_courante =
  595:                                 (*(*s_etat_processus).expression_courante)
  596:                                 .suivant) == NULL)
  597:                         {
  598:                             liberation(s_etat_processus, s_objet);
  599:                             (*s_etat_processus).erreur_execution =
  600:                                     d_ex_erreur_traitement_condition;
  601:                             return;
  602:                         }
  603: 
  604:                         if ((*(*(*s_etat_processus).expression_courante)
  605:                                 .donnee).type == FCT)
  606:                         {
  607:                             fonction = (*((struct_fonction *)
  608:                                     (*(*(*s_etat_processus).expression_courante)
  609:                                     .donnee).objet)).fonction;
  610: 
  611:                             if (niveau == 0)
  612:                             {
  613:                                 if (((*(*s_etat_processus).l_base_pile_systeme)
  614:                                         .clause != 'K') &&
  615:                                         ((*(*s_etat_processus)
  616:                                         .l_base_pile_systeme).clause != 'C'))
  617:                                 {
  618:                                     /*
  619:                                      * Traitement de IF/THEN/ELSEIF/THEN/
  620:                                      * ELSE/END
  621:                                      */
  622: 
  623:                                     if ((fonction == instruction_end) ||
  624:                                             (fonction == instruction_else) ||
  625:                                             (fonction == instruction_elseif))
  626:                                     {
  627:                                         fonction(s_etat_processus);
  628:                                         execution = d_vrai;
  629:                                         drapeau_fin = d_vrai;
  630:                                     }
  631:                                     else
  632:                                     {
  633:                                         drapeau_fin = d_faux;
  634:                                     }
  635:                                 }
  636:                                 else
  637:                                 {
  638:                                     /*
  639:                                      * Traitement de CASE/THEN/END
  640:                                      */
  641: 
  642:                                     if (fonction == instruction_else)
  643:                                     {
  644:                                         liberation(s_etat_processus, s_objet);
  645: 
  646:                                         if ((drapeau_fin == d_faux) &&
  647:                                                 ((*s_etat_processus)
  648:                                                 .expression_courante != NULL))
  649:                                         {
  650:                                             (*s_etat_processus)
  651:                                                     .expression_courante
  652:                                                     = (*(*s_etat_processus)
  653:                                                     .expression_courante)
  654:                                                     .suivant;
  655:                                         }
  656: 
  657:                                         (*s_etat_processus).erreur_execution =
  658:                                             d_ex_erreur_traitement_condition;
  659:                                         return;
  660:                                     }
  661:                                     else if (fonction == instruction_end)
  662:                                     {
  663:                                         fonction(s_etat_processus);
  664:                                         execution = d_vrai;
  665:                                         drapeau_fin = d_vrai;
  666:                                     }
  667:                                     else
  668:                                     {
  669:                                         drapeau_fin = d_faux;
  670:                                     }
  671:                                 }
  672:                             }
  673:                             else
  674:                             {
  675:                                 drapeau_fin = d_faux;
  676:                             }
  677: 
  678:                             if ((fonction == instruction_case) ||
  679:                                     (fonction == instruction_do) ||
  680:                                     (fonction == instruction_if) ||
  681:                                     (fonction == instruction_iferr) ||
  682:                                     (fonction == instruction_select) ||
  683:                                     (fonction == instruction_while))
  684:                             {
  685:                                 niveau++;
  686:                             }
  687:                             else if (fonction == instruction_end)
  688:                             {
  689:                                 niveau--;
  690:                             }
  691:                         }
  692:                     } while(drapeau_fin == d_faux);
  693: 
  694:                     if (pthread_mutex_lock(&((*(*(*s_etat_processus)
  695:                             .expression_courante).donnee).mutex)) != 0)
  696:                     {
  697:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  698:                         return;
  699:                     }
  700: 
  701:                     (*((struct_fonction *) (*(*s_registre).donnee).objet))
  702:                             .prediction_saut = (*s_etat_processus)
  703:                             .expression_courante;
  704:                     (*((struct_fonction *) (*(*s_registre).donnee).objet))
  705:                             .prediction_execution = execution;
  706: 
  707:                     if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
  708:                             .expression_courante).donnee).mutex)) != 0)
  709:                     {
  710:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  711:                         return;
  712:                     }
  713:                 }
  714:             }
  715:         }
  716:     }
  717:     else
  718:     {
  719:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  720:         return;
  721:     }
  722: 
  723:     liberation(s_etat_processus, s_objet);
  724:     return;
  725: }
  726: 
  727: 
  728: /*
  729: ================================================================================
  730:   Fonction 'tan'
  731: ================================================================================
  732:   Entrées : pointeur sur une structure struct_processus
  733: --------------------------------------------------------------------------------
  734:   Sorties :
  735: --------------------------------------------------------------------------------
  736:   Effets de bord : néant
  737: ================================================================================
  738: */
  739: 
  740: void
  741: instruction_tan(struct_processus *s_etat_processus)
  742: {
  743:     real8                           angle;
  744: 
  745:     integer4                        erreur;
  746: 
  747:     struct_liste_chainee            *l_element_courant;
  748:     struct_liste_chainee            *l_element_precedent;
  749: 
  750:     struct_objet                    *s_copie_argument;
  751:     struct_objet                    *s_objet_argument;
  752:     struct_objet                    *s_objet_resultat;
  753: 
  754:     (*s_etat_processus).erreur_execution = d_ex;
  755: 
  756:     if ((*s_etat_processus).affichage_arguments == 'Y')
  757:     {
  758:         printf("\n  TAN ");
  759: 
  760:         if ((*s_etat_processus).langue == 'F')
  761:         {
  762:             printf("(tangente)\n\n");
  763:         }
  764:         else
  765:         {
  766:             printf("(tangent)\n\n");
  767:         }
  768: 
  769:         printf("    1: %s, %s\n", d_INT, d_REL);
  770:         printf("->  1: %s\n\n", d_REL);
  771: 
  772:         printf("    1: %s\n", d_CPL);
  773:         printf("->  1: %s\n\n", d_CPL);
  774: 
  775:         printf("    1: %s, %s\n", d_NOM, d_ALG);
  776:         printf("->  1: %s\n\n", d_ALG);
  777: 
  778:         printf("    1: %s\n", d_RPN);
  779:         printf("->  1: %s\n", d_RPN);
  780: 
  781:         return;
  782:     }
  783:     else if ((*s_etat_processus).test_instruction == 'Y')
  784:     {
  785:         (*s_etat_processus).nombre_arguments = 1;
  786:         return;
  787:     }
  788: 
  789:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  790:     {
  791:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  792:         {
  793:             return;
  794:         }
  795:     }
  796: 
  797:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  798:             &s_objet_argument) == d_erreur)
  799:     {
  800:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  801:         return;
  802:     }
  803: 
  804: /*
  805: --------------------------------------------------------------------------------
  806:   Tangente d'un entier ou d'un réel
  807: --------------------------------------------------------------------------------
  808: */
  809: 
  810:     if (((*s_objet_argument).type == INT) ||
  811:             ((*s_objet_argument).type == REL))
  812:     {
  813:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  814:         {
  815:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  816:             return;
  817:         }
  818: 
  819:         if ((*s_objet_argument).type == INT)
  820:         {
  821:             angle = (real8) (*((integer8 *) (*s_objet_argument).objet));
  822:         }
  823:         else
  824:         {
  825:             angle = (*((real8 *) (*s_objet_argument).objet));
  826:         }
  827: 
  828:         if (test_cfsf(s_etat_processus, 60) == d_faux)
  829:         {
  830:             conversion_degres_vers_radians(&angle);
  831:         }
  832: 
  833:         if ((cos(angle) == 0) && (test_cfsf(s_etat_processus, 59) == d_vrai))
  834:         {
  835:             liberation(s_etat_processus, s_objet_argument);
  836:             liberation(s_etat_processus, s_objet_resultat);
  837: 
  838:             (*s_etat_processus).exception = d_ep_division_par_zero;
  839:             return;
  840:         }
  841: 
  842:         (*((real8 *) (*s_objet_resultat).objet)) = tan(angle);
  843:     }
  844: 
  845: /*
  846: --------------------------------------------------------------------------------
  847:   Tangente d'un complexe
  848: --------------------------------------------------------------------------------
  849: */
  850: 
  851:     else if ((*s_objet_argument).type == CPL)
  852:     {
  853:         if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
  854:         {
  855:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  856:             return;
  857:         }
  858: 
  859:         f77tan_((struct_complexe16 *) (*s_objet_argument).objet,
  860:                 (struct_complexe16 *) (*s_objet_resultat).objet, &erreur);
  861: 
  862:         if (erreur != 0)
  863:         {
  864:             liberation(s_etat_processus, s_objet_argument);
  865:             liberation(s_etat_processus, s_objet_resultat);
  866: 
  867:             (*s_etat_processus).exception = d_ep_division_par_zero;
  868:             return;
  869:         }
  870:     }
  871: 
  872: /*
  873: --------------------------------------------------------------------------------
  874:   Tangente d'un nom
  875: --------------------------------------------------------------------------------
  876: */
  877: 
  878:     else if ((*s_objet_argument).type == NOM)
  879:     {
  880:         if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
  881:         {
  882:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  883:             return;
  884:         }
  885: 
  886:         if (((*s_objet_resultat).objet =
  887:                 allocation_maillon(s_etat_processus)) == NULL)
  888:         {
  889:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  890:             return;
  891:         }
  892: 
  893:         l_element_courant = (*s_objet_resultat).objet;
  894: 
  895:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  896:                 == NULL)
  897:         {
  898:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  899:             return;
  900:         }
  901: 
  902:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  903:                 .nombre_arguments = 0;
  904:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  905:                 .fonction = instruction_vers_niveau_superieur;
  906: 
  907:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  908:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  909:         {
  910:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  911:             return;
  912:         }
  913: 
  914:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  915:                 .nom_fonction, "<<");
  916: 
  917:         if (((*l_element_courant).suivant =
  918:                 allocation_maillon(s_etat_processus)) == NULL)
  919:         {
  920:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  921:             return;
  922:         }
  923: 
  924:         l_element_courant = (*l_element_courant).suivant;
  925:         (*l_element_courant).donnee = s_objet_argument;
  926: 
  927:         if (((*l_element_courant).suivant =
  928:                 allocation_maillon(s_etat_processus)) == NULL)
  929:         {
  930:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  931:             return;
  932:         }
  933: 
  934:         l_element_courant = (*l_element_courant).suivant;
  935: 
  936:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  937:                 == NULL)
  938:         {
  939:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  940:             return;
  941:         }
  942: 
  943:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  944:                 .nombre_arguments = 1;
  945:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  946:                 .fonction = instruction_tan;
  947: 
  948:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  949:                 .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
  950:         {
  951:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  952:             return;
  953:         }
  954: 
  955:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  956:                 .nom_fonction, "TAN");
  957: 
  958:         if (((*l_element_courant).suivant =
  959:                 allocation_maillon(s_etat_processus)) == NULL)
  960:         {
  961:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  962:             return;
  963:         }
  964: 
  965:         l_element_courant = (*l_element_courant).suivant;
  966: 
  967:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
  968:                 == NULL)
  969:         {
  970:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  971:             return;
  972:         }
  973: 
  974:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  975:                 .nombre_arguments = 0;
  976:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  977:                 .fonction = instruction_vers_niveau_inferieur;
  978: 
  979:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  980:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
  981:         {
  982:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  983:             return;
  984:         }
  985: 
  986:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
  987:                 .nom_fonction, ">>");
  988: 
  989:         (*l_element_courant).suivant = NULL;
  990:         s_objet_argument = NULL;
  991:     }
  992: 
  993: /*
  994: --------------------------------------------------------------------------------
  995:   Tangente d'une expression
  996: --------------------------------------------------------------------------------
  997: */
  998: 
  999:     else if (((*s_objet_argument).type == ALG) ||
 1000:             ((*s_objet_argument).type == RPN))
 1001:     {
 1002:         if ((s_copie_argument = copie_objet(s_etat_processus, s_objet_argument,
 1003:                 'N')) == NULL)
 1004:         {
 1005:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1006:             return;
 1007:         }
 1008: 
 1009:         l_element_courant = (struct_liste_chainee *)
 1010:                 (*s_copie_argument).objet;
 1011:         l_element_precedent = l_element_courant;
 1012: 
 1013:         while((*l_element_courant).suivant != NULL)
 1014:         {
 1015:             l_element_precedent = l_element_courant;
 1016:             l_element_courant = (*l_element_courant).suivant;
 1017:         }
 1018: 
 1019:         if (((*l_element_precedent).suivant =
 1020:                 allocation_maillon(s_etat_processus)) == NULL)
 1021:         {
 1022:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1023:             return;
 1024:         }
 1025: 
 1026:         if (((*(*l_element_precedent).suivant).donnee =
 1027:                 allocation(s_etat_processus, FCT)) == NULL)
 1028:         {
 1029:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1030:             return;
 1031:         }
 1032: 
 1033:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1034:                 .donnee).objet)).nombre_arguments = 1;
 1035:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1036:                 .donnee).objet)).fonction = instruction_tan;
 1037: 
 1038:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 1039:                 .suivant).donnee).objet)).nom_fonction =
 1040:                 malloc(4 * sizeof(unsigned char))) == NULL)
 1041:         {
 1042:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1043:             return;
 1044:         }
 1045: 
 1046:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 1047:                 .suivant).donnee).objet)).nom_fonction, "TAN");
 1048: 
 1049:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1050: 
 1051:         s_objet_resultat = s_copie_argument;
 1052:     }
 1053: 
 1054: /*
 1055: --------------------------------------------------------------------------------
 1056:   Réalisation impossible de la fonction tangente
 1057: --------------------------------------------------------------------------------
 1058: */
 1059: 
 1060:     else
 1061:     {
 1062:         liberation(s_etat_processus, s_objet_argument);
 1063: 
 1064:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1065:         return;
 1066:     }
 1067: 
 1068:     liberation(s_etat_processus, s_objet_argument);
 1069: 
 1070:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1071:             s_objet_resultat) == d_erreur)
 1072:     {
 1073:         return;
 1074:     }
 1075: 
 1076:     return;
 1077: }
 1078: 
 1079: 
 1080: /*
 1081: ================================================================================
 1082:   Fonction 'tanh'
 1083: ================================================================================
 1084:   Entrées : pointeur sur une structure struct_processus
 1085: --------------------------------------------------------------------------------
 1086:   Sorties :
 1087: --------------------------------------------------------------------------------
 1088:   Effets de bord : néant
 1089: ================================================================================
 1090: */
 1091: 
 1092: void
 1093: instruction_tanh(struct_processus *s_etat_processus)
 1094: {
 1095:     real8                           argument;
 1096: 
 1097:     integer4                        erreur;
 1098: 
 1099:     struct_liste_chainee            *l_element_courant;
 1100:     struct_liste_chainee            *l_element_precedent;
 1101: 
 1102:     struct_objet                    *s_copie_argument;
 1103:     struct_objet                    *s_objet_argument;
 1104:     struct_objet                    *s_objet_resultat;
 1105: 
 1106:     (*s_etat_processus).erreur_execution = d_ex;
 1107: 
 1108:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1109:     {
 1110:         printf("\n  TANH ");
 1111: 
 1112:         if ((*s_etat_processus).langue == 'F')
 1113:         {
 1114:             printf("(tangente hyperbolique)\n\n");
 1115:         }
 1116:         else
 1117:         {
 1118:             printf("(hyperbolic tangent)\n\n");
 1119:         }
 1120: 
 1121:         printf("    1: %s, %s\n", d_INT, d_REL);
 1122:         printf("->  1: %s\n\n", d_INT);
 1123: 
 1124:         printf("    1: %s\n", d_CPL);
 1125:         printf("->  1: %s\n\n", d_CPL);
 1126: 
 1127:         printf("    1: %s, %s\n", d_NOM, d_ALG);
 1128:         printf("->  1: %s\n\n", d_ALG);
 1129: 
 1130:         printf("    1: %s\n", d_RPN);
 1131:         printf("->  1: %s\n", d_RPN);
 1132: 
 1133:         return;
 1134:     }
 1135:     else if ((*s_etat_processus).test_instruction == 'Y')
 1136:     {
 1137:         (*s_etat_processus).nombre_arguments = 1;
 1138:         return;
 1139:     }
 1140: 
 1141:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1142:     {
 1143:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1144:         {
 1145:             return;
 1146:         }
 1147:     }
 1148: 
 1149:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1150:             &s_objet_argument) == d_erreur)
 1151:     {
 1152:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1153:         return;
 1154:     }
 1155: 
 1156: /*
 1157: --------------------------------------------------------------------------------
 1158:   Tangente hyperbolique d'un entier ou d'un réel
 1159: --------------------------------------------------------------------------------
 1160: */
 1161: 
 1162:     if (((*s_objet_argument).type == INT) ||
 1163:             ((*s_objet_argument).type == REL))
 1164:     {
 1165:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
 1166:         {
 1167:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1168:             return;
 1169:         }
 1170: 
 1171:         if ((*s_objet_argument).type == INT)
 1172:         {
 1173:             argument = (real8) (*((integer8 *) (*s_objet_argument).objet));
 1174:         }
 1175:         else
 1176:         {
 1177:             argument = (*((real8 *) (*s_objet_argument).objet));
 1178:         }
 1179: 
 1180:         (*((real8 *) (*s_objet_resultat).objet)) = tanh(argument);
 1181:     }
 1182: 
 1183: /*
 1184: --------------------------------------------------------------------------------
 1185:   Tangente hyperbolique d'un complexe
 1186: --------------------------------------------------------------------------------
 1187: */
 1188: 
 1189:     else if ((*s_objet_argument).type == CPL)
 1190:     {
 1191:         if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
 1192:         {
 1193:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1194:             return;
 1195:         }
 1196: 
 1197:         f77tanh_((struct_complexe16 *) (*s_objet_argument).objet,
 1198:                 (struct_complexe16 *) (*s_objet_resultat).objet, &erreur);
 1199: 
 1200:         if (erreur != 0)
 1201:         {
 1202:             liberation(s_etat_processus, s_objet_argument);
 1203:             liberation(s_etat_processus, s_objet_resultat);
 1204: 
 1205:             (*s_etat_processus).exception = d_ep_division_par_zero;
 1206:             return;
 1207:         }
 1208:     }
 1209: 
 1210: /*
 1211: --------------------------------------------------------------------------------
 1212:   Tangente hyperbolique d'un nom
 1213: --------------------------------------------------------------------------------
 1214: */
 1215: 
 1216:     else if ((*s_objet_argument).type == NOM)
 1217:     {
 1218:         if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
 1219:         {
 1220:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1221:             return;
 1222:         }
 1223: 
 1224:         if (((*s_objet_resultat).objet =
 1225:                 allocation_maillon(s_etat_processus)) == NULL)
 1226:         {
 1227:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1228:             return;
 1229:         }
 1230: 
 1231:         l_element_courant = (*s_objet_resultat).objet;
 1232: 
 1233:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1234:                 == NULL)
 1235:         {
 1236:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1237:             return;
 1238:         }
 1239: 
 1240:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1241:                 .nombre_arguments = 0;
 1242:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1243:                 .fonction = instruction_vers_niveau_superieur;
 1244: 
 1245:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1246:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1247:         {
 1248:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1249:             return;
 1250:         }
 1251: 
 1252:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1253:                 .nom_fonction, "<<");
 1254: 
 1255:         if (((*l_element_courant).suivant =
 1256:                 allocation_maillon(s_etat_processus)) == NULL)
 1257:         {
 1258:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1259:             return;
 1260:         }
 1261: 
 1262:         l_element_courant = (*l_element_courant).suivant;
 1263:         (*l_element_courant).donnee = s_objet_argument;
 1264: 
 1265:         if (((*l_element_courant).suivant =
 1266:                 allocation_maillon(s_etat_processus)) == NULL)
 1267:         {
 1268:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1269:             return;
 1270:         }
 1271: 
 1272:         l_element_courant = (*l_element_courant).suivant;
 1273: 
 1274:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1275:                 == NULL)
 1276:         {
 1277:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1278:             return;
 1279:         }
 1280: 
 1281:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1282:                 .nombre_arguments = 1;
 1283:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1284:                 .fonction = instruction_tanh;
 1285: 
 1286:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1287:                 .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
 1288:         {
 1289:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1290:             return;
 1291:         }
 1292: 
 1293:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1294:                 .nom_fonction, "TANH");
 1295: 
 1296:         if (((*l_element_courant).suivant =
 1297:                 allocation_maillon(s_etat_processus)) == NULL)
 1298:         {
 1299:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1300:             return;
 1301:         }
 1302: 
 1303:         l_element_courant = (*l_element_courant).suivant;
 1304: 
 1305:         if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
 1306:                 == NULL)
 1307:         {
 1308:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1309:             return;
 1310:         }
 1311: 
 1312:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1313:                 .nombre_arguments = 0;
 1314:         (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1315:                 .fonction = instruction_vers_niveau_inferieur;
 1316: 
 1317:         if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1318:                 .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
 1319:         {
 1320:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1321:             return;
 1322:         }
 1323: 
 1324:         strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
 1325:                 .nom_fonction, ">>");
 1326: 
 1327:         (*l_element_courant).suivant = NULL;
 1328:         s_objet_argument = NULL;
 1329:     }
 1330: 
 1331: /*
 1332: --------------------------------------------------------------------------------
 1333:   Tangente hyperbolique d'une expression
 1334: --------------------------------------------------------------------------------
 1335: */
 1336: 
 1337:     else if (((*s_objet_argument).type == ALG) ||
 1338:             ((*s_objet_argument).type == RPN))
 1339:     {
 1340:         if ((s_copie_argument = copie_objet(s_etat_processus, s_objet_argument,
 1341:                 'N')) == NULL)
 1342:         {
 1343:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1344:             return;
 1345:         }
 1346: 
 1347:         l_element_courant = (struct_liste_chainee *)
 1348:                 (*s_copie_argument).objet;
 1349:         l_element_precedent = l_element_courant;
 1350: 
 1351:         while((*l_element_courant).suivant != NULL)
 1352:         {
 1353:             l_element_precedent = l_element_courant;
 1354:             l_element_courant = (*l_element_courant).suivant;
 1355:         }
 1356: 
 1357:         if (((*l_element_precedent).suivant =
 1358:                 allocation_maillon(s_etat_processus)) == NULL)
 1359:         {
 1360:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1361:             return;
 1362:         }
 1363: 
 1364:         if (((*(*l_element_precedent).suivant).donnee =
 1365:                 allocation(s_etat_processus, FCT)) == NULL)
 1366:         {
 1367:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1368:             return;
 1369:         }
 1370: 
 1371:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1372:                 .donnee).objet)).nombre_arguments = 1;
 1373:         (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
 1374:                 .donnee).objet)).fonction = instruction_tanh;
 1375: 
 1376:         if (((*((struct_fonction *) (*(*(*l_element_precedent)
 1377:                 .suivant).donnee).objet)).nom_fonction =
 1378:                 malloc(5 * sizeof(unsigned char))) == NULL)
 1379:         {
 1380:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1381:             return;
 1382:         }
 1383: 
 1384:         strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
 1385:                 .suivant).donnee).objet)).nom_fonction, "TANH");
 1386: 
 1387:         (*(*l_element_precedent).suivant).suivant = l_element_courant;
 1388: 
 1389:         s_objet_resultat = s_copie_argument;
 1390:     }
 1391: 
 1392: /*
 1393: --------------------------------------------------------------------------------
 1394:   Réalisation impossible de la fonction tangente hyperbolique
 1395: --------------------------------------------------------------------------------
 1396: */
 1397: 
 1398:     else
 1399:     {
 1400:         liberation(s_etat_processus, s_objet_argument);
 1401: 
 1402:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1403:         return;
 1404:     }
 1405: 
 1406:     liberation(s_etat_processus, s_objet_argument);
 1407: 
 1408:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1409:             s_objet_resultat) == d_erreur)
 1410:     {
 1411:         return;
 1412:     }
 1413: 
 1414:     return;
 1415: }
 1416: 
 1417: 
 1418: /*
 1419: ================================================================================
 1420:   Fonction 'true'
 1421: ================================================================================
 1422:   Entrées : structure processus
 1423: --------------------------------------------------------------------------------
 1424:   Sorties :
 1425: --------------------------------------------------------------------------------
 1426:   Effets de bord : néant
 1427: ================================================================================
 1428: */
 1429: 
 1430: void
 1431: instruction_true(struct_processus *s_etat_processus)
 1432: {
 1433:     struct_objet                    *s_objet;
 1434: 
 1435:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1436:     {
 1437:         printf("\n  TRUE ");
 1438: 
 1439:         if ((*s_etat_processus).langue == 'F')
 1440:         {
 1441:             printf("(valeur vraie)\n\n");
 1442:         }
 1443:         else
 1444:         {
 1445:             printf("(true value)\n\n");
 1446:         }
 1447: 
 1448:         printf("->  1: %s\n", d_INT);
 1449: 
 1450:         return;
 1451:     }
 1452:     else if ((*s_etat_processus).test_instruction == 'Y')
 1453:     {
 1454:         (*s_etat_processus).nombre_arguments = -1;
 1455:         return;
 1456:     }
 1457: 
 1458:     if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
 1459:     {
 1460:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1461:         return;
 1462:     }
 1463: 
 1464:     (*((integer8 *) (*s_objet).objet)) = -1;
 1465: 
 1466:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1467:             s_objet) == d_erreur)
 1468:     {
 1469:         return;
 1470:     }
 1471: 
 1472:     return;
 1473: }
 1474: 
 1475: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>