File:  [local] / rpl / src / instructions_t1.c
Revision 1.12: download - view: text, annotated - select for diffs - revision graph
Tue Jul 13 09:39:14 2010 UTC (13 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Correction d'un problème induit par le dernier patch.

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

CVSweb interface <joel.bertrand@systella.fr>