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

CVSweb interface <joel.bertrand@systella.fr>