File:  [local] / rpl / src / instructions_h1.c
Revision 1.6: download - view: text, annotated - select for diffs - revision graph
Wed Apr 7 13:45:06 2010 UTC (14 years ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_14, HEAD
En route pour la 4.0.14 !

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.14
    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl.conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'hex'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_hex(struct_processus *s_etat_processus)
   40: {
   41:     (*s_etat_processus).erreur_execution = d_ex;
   42: 
   43:     if ((*s_etat_processus).affichage_arguments == 'Y')
   44:     {
   45:         printf("\n  HEX ");
   46: 
   47:         if ((*s_etat_processus).langue == 'F')
   48:         {
   49:             printf("(base hexadécimale)\n\n");
   50:             printf("  Aucun argument\n");
   51:         }
   52:         else
   53:         {
   54:             printf("(hexadecimal base)\n\n");
   55:             printf("  No argument\n");
   56:         }
   57: 
   58:         return;
   59:     }
   60:     else if ((*s_etat_processus).test_instruction == 'Y')
   61:     {
   62:         (*s_etat_processus).nombre_arguments = -1;
   63:         return;
   64:     }
   65: 
   66:     sf(s_etat_processus, 43);
   67:     sf(s_etat_processus, 44);
   68: 
   69:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   70:     {
   71:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
   72:         {
   73:             return;
   74:         }
   75:     }
   76: 
   77:     return;
   78: }
   79: 
   80: 
   81: /*
   82: ================================================================================
   83:   Fonction 'HMS->'
   84: ================================================================================
   85:   Entrées : structure processus
   86: --------------------------------------------------------------------------------
   87:   Sorties :
   88: --------------------------------------------------------------------------------
   89:   Effets de bord : néant
   90: ================================================================================
   91: */
   92: 
   93: void
   94: instruction_hms_fleche(struct_processus *s_etat_processus)
   95: {
   96:     struct_objet                    *s_copie;
   97:     struct_objet                    *s_objet;
   98: 
   99:     (*s_etat_processus).erreur_execution = d_ex;
  100: 
  101:     if ((*s_etat_processus).affichage_arguments == 'Y')
  102:     {
  103:         printf("\n  HMS-> ");
  104: 
  105:         if ((*s_etat_processus).langue == 'F')
  106:         {
  107:             printf("(conversion décimale)\n\n");
  108:         }
  109:         else
  110:         {
  111:             printf("(conversion from hours minutes seconds to decimal)\n\n");
  112:         }
  113: 
  114:         printf("    1: %s\n", d_INT);
  115:         printf("->  1: %s\n\n", d_INT);
  116: 
  117:         printf("    1: %s\n", d_REL);
  118:         printf("->  1: %s\n", d_REL);
  119: 
  120:         return;
  121:     }
  122:     else if ((*s_etat_processus).test_instruction == 'Y')
  123:     {
  124:         (*s_etat_processus).nombre_arguments = -1;
  125:         return;
  126:     }
  127: 
  128:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  129:     {
  130:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  131:         {
  132:             return;
  133:         }
  134:     }
  135: 
  136:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  137:             &s_objet) == d_erreur)
  138:     {
  139:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  140:         return;
  141:     }
  142: 
  143: /*
  144: --------------------------------------------------------------------------------
  145:   Argument entier
  146: --------------------------------------------------------------------------------*/
  147: 
  148:     if ((*s_objet).type == INT)
  149:     {
  150:         /*
  151:          * On ne fait rien...
  152:          */
  153:     }
  154: 
  155: /*
  156: --------------------------------------------------------------------------------
  157:   Argument réel
  158: --------------------------------------------------------------------------------
  159: */
  160: 
  161:     else if ((*s_objet).type == REL)
  162:     {
  163:         if ((s_copie = copie_objet(s_etat_processus, s_objet, 'O')) == NULL)
  164:         {
  165:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  166:             return;
  167:         }
  168: 
  169:         liberation(s_etat_processus, s_objet);
  170:         s_objet = s_copie;
  171: 
  172:         conversion_hms_vers_decimal((real8 *) (*s_objet).objet);
  173:     }
  174: 
  175: /*
  176: --------------------------------------------------------------------------------
  177:   Argument invalide
  178: --------------------------------------------------------------------------------
  179: */
  180: 
  181:     else
  182:     {
  183:         liberation(s_etat_processus, s_objet);
  184: 
  185:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  186:         return;
  187:     }
  188: 
  189:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  190:             s_objet) == d_erreur)
  191:     {
  192:         return;
  193:     }
  194: 
  195:     return;
  196: }
  197: 
  198: 
  199: /*
  200: ================================================================================
  201:   Fonction 'HMS+'
  202: ================================================================================
  203:   Entrées : structure processus
  204: --------------------------------------------------------------------------------
  205:   Sorties :
  206: --------------------------------------------------------------------------------
  207:   Effets de bord : néant
  208: ================================================================================
  209: */
  210: 
  211: void
  212: instruction_hms_plus(struct_processus *s_etat_processus)
  213: {
  214:     integer8                        tampon;
  215: 
  216:     struct_objet                    *s_objet_argument_1;
  217:     struct_objet                    *s_objet_argument_2;
  218:     struct_objet                    *s_objet_resultat;
  219: 
  220:     (*s_etat_processus).erreur_execution = d_ex;
  221: 
  222:     if ((*s_etat_processus).affichage_arguments == 'Y')
  223:     {
  224:         printf("\n  HMS+ ");
  225: 
  226:         if ((*s_etat_processus).langue == 'F')
  227:         {
  228:             printf("(addition sexadécimale)\n\n");
  229:         }
  230:         else
  231:         {
  232:             printf("(addition in hours minutes seconds format)\n\n");
  233:         }
  234: 
  235:         printf("    2: %s\n", d_INT);
  236:         printf("    1: %s\n", d_INT);
  237:         printf("->  1: %s, %s\n\n", d_INT, d_REL);
  238: 
  239:         printf("    2: %s, %s\n", d_INT, d_REL);
  240:         printf("    1: %s, %s\n", d_INT, d_REL);
  241:         printf("->  1: %s\n", d_REL);
  242: 
  243:         return;
  244:     }
  245:     else if ((*s_etat_processus).test_instruction == 'Y')
  246:     {
  247:         (*s_etat_processus).nombre_arguments = -1;
  248:         return;
  249:     }
  250: 
  251:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  252:     {
  253:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  254:         {
  255:             return;
  256:         }
  257:     }
  258: 
  259:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  260:             &s_objet_argument_1) == d_erreur)
  261:     {
  262:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  263:         return;
  264:     }
  265: 
  266:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  267:             &s_objet_argument_2) == d_erreur)
  268:     {
  269:         liberation(s_etat_processus, s_objet_argument_1);
  270:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  271:         return;
  272:     }
  273: 
  274: /*
  275: --------------------------------------------------------------------------------
  276:   Arguments entiers
  277: --------------------------------------------------------------------------------*/
  278: 
  279:     if (((*s_objet_argument_1).type == INT) &&
  280:             ((*s_objet_argument_2).type == INT))
  281:     {
  282:         if (depassement_addition((integer8 *) (*s_objet_argument_1).objet,
  283:                 (integer8 *) (*s_objet_argument_2).objet, &tampon) ==
  284:                 d_absence_erreur)
  285:         {
  286:             if ((s_objet_resultat = allocation(s_etat_processus, INT))
  287:                     == NULL)
  288:             {
  289:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  290:                 return;
  291:             }
  292: 
  293:             (*((integer8 *) (*s_objet_resultat).objet)) = tampon;
  294:         }
  295:         else
  296:         {
  297:             if ((s_objet_resultat = allocation(s_etat_processus, REL))
  298:                     == NULL)
  299:             {
  300:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  301:                 return;
  302:             }
  303: 
  304:             (*((real8 *) (*s_objet_resultat).objet)) = ((real8)
  305:                     (*((integer8 *) (*s_objet_argument_1).objet))) + ((real8)
  306:                     (*((integer8 *) (*s_objet_argument_2).objet)));
  307:         }
  308:     }
  309: 
  310: /*
  311: --------------------------------------------------------------------------------
  312:   Au moins un argument réel
  313: --------------------------------------------------------------------------------
  314: */
  315: 
  316:     else if (((*s_objet_argument_1).type == REL) &&
  317:             ((*s_objet_argument_2).type == INT))
  318:     {
  319:         conversion_hms_vers_decimal((real8 *) (*s_objet_argument_1).objet);
  320: 
  321:         if ((s_objet_resultat = allocation(s_etat_processus, REL))
  322:                 == NULL)
  323:         {
  324:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  325:             return;
  326:         }
  327: 
  328:         (*((real8 *) (*s_objet_resultat).objet)) = (*((integer8 *)
  329:                 (*s_objet_argument_2).objet)) + (*((real8 *)
  330:                 (*s_objet_argument_1).objet));
  331: 
  332:         conversion_decimal_vers_hms((real8 *) (*s_objet_resultat).objet);
  333:     }
  334:     else if (((*s_objet_argument_1).type == INT) &&
  335:             ((*s_objet_argument_2).type == REL))
  336:     {
  337:         conversion_hms_vers_decimal((real8 *) (*s_objet_argument_2).objet);
  338: 
  339:         if ((s_objet_resultat = allocation(s_etat_processus, REL))
  340:                 == NULL)
  341:         {
  342:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  343:             return;
  344:         }
  345: 
  346:         (*((real8 *) (*s_objet_resultat).objet)) = (*((real8 *)
  347:                 (*s_objet_argument_2).objet)) + (*((integer8 *)
  348:                 (*s_objet_argument_1).objet));
  349: 
  350:         conversion_decimal_vers_hms((real8 *) (*s_objet_resultat).objet);
  351:     }
  352:     else if (((*s_objet_argument_1).type == REL) &&
  353:             ((*s_objet_argument_2).type == REL))
  354:     {
  355:         conversion_hms_vers_decimal((real8 *) (*s_objet_argument_1).objet);
  356:         conversion_hms_vers_decimal((real8 *) (*s_objet_argument_2).objet);
  357: 
  358:         if ((s_objet_resultat = allocation(s_etat_processus, REL))
  359:                 == NULL)
  360:         {
  361:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  362:             return;
  363:         }
  364: 
  365:         (*((real8 *) (*s_objet_resultat).objet)) = (*((real8 *)
  366:                 (*s_objet_argument_2).objet)) + (*((real8 *)
  367:                 (*s_objet_argument_1).objet));
  368: 
  369:         conversion_decimal_vers_hms((real8 *) (*s_objet_resultat).objet);
  370:     }
  371: 
  372: /*
  373: --------------------------------------------------------------------------------
  374:   Argument invalide
  375: --------------------------------------------------------------------------------
  376: */
  377: 
  378:     else
  379:     {
  380:         liberation(s_etat_processus, s_objet_argument_1);
  381:         liberation(s_etat_processus, s_objet_argument_2);
  382: 
  383:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  384:         return;
  385:     }
  386: 
  387:     liberation(s_etat_processus, s_objet_argument_1);
  388:     liberation(s_etat_processus, s_objet_argument_2);
  389: 
  390:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  391:             s_objet_resultat) == d_erreur)
  392:     {
  393:         return;
  394:     }
  395: 
  396:     return;
  397: }
  398: 
  399: 
  400: /*
  401: ================================================================================
  402:   Fonction 'HMS-'
  403: ================================================================================
  404:   Entrées : structure processus
  405: --------------------------------------------------------------------------------
  406:   Sorties :
  407: --------------------------------------------------------------------------------
  408:   Effets de bord : néant
  409: ================================================================================
  410: */
  411: 
  412: void
  413: instruction_hms_moins(struct_processus *s_etat_processus)
  414: {
  415:     integer8                        tampon;
  416: 
  417:     struct_objet                    *s_objet_argument_1;
  418:     struct_objet                    *s_objet_argument_2;
  419:     struct_objet                    *s_objet_resultat;
  420: 
  421:     (*s_etat_processus).erreur_execution = d_ex;
  422: 
  423:     if ((*s_etat_processus).affichage_arguments == 'Y')
  424:     {
  425:         printf("\n  HMS- ");
  426: 
  427:         if ((*s_etat_processus).langue == 'F')
  428:         {
  429:             printf("(soustraction sexadécimale)\n\n");
  430:         }
  431:         else
  432:         {
  433:             printf("(substraction in hours minutes seconds format)\n\n");
  434:         }
  435: 
  436:         printf("    2: %s\n", d_INT);
  437:         printf("    1: %s\n", d_INT);
  438:         printf("->  1: %s, %s\n\n", d_INT, d_REL);
  439: 
  440:         printf("    2: %s, %s\n", d_INT, d_REL);
  441:         printf("    1: %s, %s\n", d_INT, d_REL);
  442:         printf("->  1: %s\n", d_REL);
  443: 
  444:         return;
  445:     }
  446:     else if ((*s_etat_processus).test_instruction == 'Y')
  447:     {
  448:         (*s_etat_processus).nombre_arguments = -1;
  449:         return;
  450:     }
  451: 
  452:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  453:     {
  454:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  455:         {
  456:             return;
  457:         }
  458:     }
  459: 
  460:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  461:             &s_objet_argument_1) == d_erreur)
  462:     {
  463:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  464:         return;
  465:     }
  466: 
  467:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  468:             &s_objet_argument_2) == d_erreur)
  469:     {
  470:         liberation(s_etat_processus, s_objet_argument_1);
  471:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  472:         return;
  473:     }
  474: 
  475: /*
  476: --------------------------------------------------------------------------------
  477:   Arguments entiers
  478: --------------------------------------------------------------------------------*/
  479: 
  480:     if (((*s_objet_argument_1).type == INT) &&
  481:             ((*s_objet_argument_2).type == INT))
  482:     {
  483:         (*((integer8 *) (*s_objet_argument_1).objet)) =
  484:                 -(*((integer8 *) (*s_objet_argument_1).objet));
  485: 
  486:         if (depassement_addition((integer8 *) (*s_objet_argument_1).objet,
  487:                 (integer8 *) (*s_objet_argument_2).objet, &tampon) ==
  488:                 d_absence_erreur)
  489:         {
  490:             if ((s_objet_resultat = allocation(s_etat_processus, INT))
  491:                     == NULL)
  492:             {
  493:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  494:                 return;
  495:             }
  496: 
  497:             (*((integer8 *) (*s_objet_resultat).objet)) = tampon;
  498:         }
  499:         else
  500:         {
  501:             if ((s_objet_resultat = allocation(s_etat_processus, REL))
  502:                     == NULL)
  503:             {
  504:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  505:                 return;
  506:             }
  507: 
  508:             (*((real8 *) (*s_objet_resultat).objet)) = ((real8)
  509:                     (*((integer8 *) (*s_objet_argument_1).objet))) + ((real8)
  510:                     (*((integer8 *) (*s_objet_argument_2).objet)));
  511:         }
  512:     }
  513: 
  514: /*
  515: --------------------------------------------------------------------------------
  516:   Au moins un argument réel
  517: --------------------------------------------------------------------------------
  518: */
  519: 
  520:     else if (((*s_objet_argument_1).type == REL) &&
  521:             ((*s_objet_argument_2).type == INT))
  522:     {
  523:         conversion_hms_vers_decimal((real8 *) (*s_objet_argument_1).objet);
  524: 
  525:         if ((s_objet_resultat = allocation(s_etat_processus, REL))
  526:                 == NULL)
  527:         {
  528:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  529:             return;
  530:         }
  531: 
  532:         (*((real8 *) (*s_objet_resultat).objet)) = (*((integer8 *)
  533:                 (*s_objet_argument_2).objet)) - (*((real8 *)
  534:                 (*s_objet_argument_1).objet));
  535: 
  536:         conversion_decimal_vers_hms((real8 *) (*s_objet_resultat).objet);
  537:     }
  538:     else if (((*s_objet_argument_1).type == INT) &&
  539:             ((*s_objet_argument_2).type == REL))
  540:     {
  541:         conversion_hms_vers_decimal((real8 *) (*s_objet_argument_2).objet);
  542: 
  543:         if ((s_objet_resultat = allocation(s_etat_processus, REL))
  544:                 == NULL)
  545:         {
  546:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  547:             return;
  548:         }
  549: 
  550:         (*((real8 *) (*s_objet_resultat).objet)) = (*((real8 *)
  551:                 (*s_objet_argument_2).objet)) - (*((integer8 *)
  552:                 (*s_objet_argument_1).objet));
  553: 
  554:         conversion_decimal_vers_hms((real8 *) (*s_objet_resultat).objet);
  555:     }
  556:     else if (((*s_objet_argument_1).type == REL) &&
  557:             ((*s_objet_argument_2).type == REL))
  558:     {
  559:         conversion_hms_vers_decimal((real8 *) (*s_objet_argument_1).objet);
  560:         conversion_hms_vers_decimal((real8 *) (*s_objet_argument_2).objet);
  561: 
  562:         if ((s_objet_resultat = allocation(s_etat_processus, REL))
  563:                 == NULL)
  564:         {
  565:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  566:             return;
  567:         }
  568: 
  569:         (*((real8 *) (*s_objet_resultat).objet)) = (*((real8 *)
  570:                 (*s_objet_argument_2).objet)) - (*((real8 *)
  571:                 (*s_objet_argument_1).objet));
  572: 
  573:         conversion_decimal_vers_hms((real8 *) (*s_objet_resultat).objet);
  574:     }
  575: 
  576: /*
  577: --------------------------------------------------------------------------------
  578:   Argument invalide
  579: --------------------------------------------------------------------------------
  580: */
  581: 
  582:     else
  583:     {
  584:         liberation(s_etat_processus, s_objet_argument_1);
  585:         liberation(s_etat_processus, s_objet_argument_2);
  586: 
  587:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  588:         return;
  589:     }
  590: 
  591:     liberation(s_etat_processus, s_objet_argument_1);
  592:     liberation(s_etat_processus, s_objet_argument_2);
  593: 
  594:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  595:             s_objet_resultat) == d_erreur)
  596:     {
  597:         return;
  598:     }
  599: 
  600:     return;
  601: }
  602: 
  603: 
  604: /*
  605: ================================================================================
  606:   Fonction 'halt'
  607: ================================================================================
  608:   Entrées :
  609: --------------------------------------------------------------------------------
  610:   Sorties :
  611: --------------------------------------------------------------------------------
  612:   Effets de bord : néant
  613: ================================================================================
  614: */
  615: 
  616: void
  617: instruction_halt(struct_processus *s_etat_processus)
  618: {
  619:     (*s_etat_processus).erreur_execution = d_ex;
  620: 
  621:     if ((*s_etat_processus).affichage_arguments == 'Y')
  622:     {
  623:         printf("\n  HALT ");
  624: 
  625:         if ((*s_etat_processus).langue == 'F')
  626:         {
  627:             printf("(arrêt du programme)\n\n");
  628:             printf("  Aucun argument\n");
  629:         }
  630:         else
  631:         {
  632:             printf("(program halt)\n\n");
  633:             printf("  No argument\n");
  634:         }
  635: 
  636:         return;
  637:     }
  638:     else if ((*s_etat_processus).test_instruction == 'Y')
  639:     {
  640:         (*s_etat_processus).nombre_arguments = -1;
  641:         return;
  642:     }
  643: 
  644:     (*s_etat_processus).debug_programme = d_vrai;
  645: 
  646:     return;
  647: }
  648: 
  649: 
  650: /*
  651: ================================================================================
  652:   Fonction 'histogram'
  653: ================================================================================
  654:   Entrées :
  655: --------------------------------------------------------------------------------
  656:   Sorties :
  657: --------------------------------------------------------------------------------
  658:   Effets de bord : néant
  659: ================================================================================
  660: */
  661: 
  662: void
  663: instruction_histogram(struct_processus *s_etat_processus)
  664: {
  665:     (*s_etat_processus).erreur_execution = d_ex;
  666: 
  667:     if ((*s_etat_processus).affichage_arguments == 'Y')
  668:     {
  669:         printf("\n  HISTOGRAM ");
  670: 
  671:         if ((*s_etat_processus).langue == 'F')
  672:         {
  673:             printf("(graphique statistique de type histogramme)\n\n");
  674:             printf("  Aucun argument\n");
  675:         }
  676:         else
  677:         {
  678:             printf("(histogram statistical graphic)\n\n");
  679:             printf("  No argument\n");
  680:         }
  681: 
  682:         return;
  683:     }
  684:     else if ((*s_etat_processus).test_instruction == 'Y')
  685:     {
  686:         (*s_etat_processus).nombre_arguments = -1;
  687:         return;
  688:     }
  689: 
  690:     strcpy((*s_etat_processus).type_trace_sigma, "HISTOGRAMME");
  691: 
  692:     return;
  693: }
  694: 
  695: 
  696: /*
  697: ================================================================================
  698:   Fonction 'help'
  699: ================================================================================
  700:   Entrées :
  701: --------------------------------------------------------------------------------
  702:   Sorties :
  703: --------------------------------------------------------------------------------
  704:   Effets de bord : néant
  705: ================================================================================
  706: */
  707: 
  708: void
  709: instruction_help(struct_processus *s_etat_processus)
  710: {
  711:     unsigned char           *fonction;
  712:     unsigned char           ligne[80 + 1];
  713:     unsigned char           *pointeur;
  714:     unsigned char           **ptr;
  715:     unsigned char           *registre;
  716: 
  717: #   undef COMPLETION
  718: #   include "completion.conv.h"
  719: #   include "usages.conv.h"
  720: 
  721:     if ((*s_etat_processus).test_instruction == 'Y')
  722:     {
  723:         (*s_etat_processus).nombre_arguments = -1;
  724:         return;
  725:     }
  726: 
  727:     (*s_etat_processus).erreur_execution = d_ex;
  728: 
  729:     printf("\n");
  730: 
  731:     if ((*s_etat_processus).langue == 'F')
  732:     {
  733:         printf("Liste alphabétique des fonctions intrinsèques :\n\n");
  734:     }
  735:     else
  736:     {
  737:         printf("Alphabetical list of intrinsic functions :\n\n");
  738:     }
  739: 
  740:     ptr = commandes;
  741:     *ligne = d_code_fin_chaine;
  742: 
  743:     while(*ptr != (unsigned char *) NULL)
  744:     {
  745:         if (strcmp((*ptr), COMPLETION_RC) == 0)
  746:         {
  747:             printf("%s\n\n", ligne);
  748:             *ligne = d_code_fin_chaine;
  749:         }
  750:         else if ((strlen(ligne) + strlen(*ptr) + 2) > 80)
  751:         {
  752:             printf("%s\n", ligne);
  753:             *ligne = d_code_fin_chaine;
  754:             strcpy(ligne, "    ");
  755:             strcat(ligne, *ptr);
  756: 
  757:             if (*(ptr + 1) != NULL)
  758:             {
  759:                 strcat(ligne, ", ");
  760:             }
  761:         }
  762:         else
  763:         {
  764:             if (*ligne == d_code_fin_chaine)
  765:             {
  766:                 strcat(ligne, "  ");
  767:             }
  768: 
  769:             strcat(ligne, *ptr);
  770: 
  771:             if (*(ptr + 1) != NULL)
  772:             {
  773:                 strcat(ligne, ", ");
  774:             }
  775:         }
  776: 
  777:         ptr++;
  778:     }
  779: 
  780:     if (strlen(ligne) != 0)
  781:     {
  782:         printf("%s\n", ligne);
  783:     }
  784: 
  785:     printf("\n");
  786: 
  787:     if ((*s_etat_processus).langue == 'F')
  788:     {
  789:         printf("Délimiteurs :\n\n");
  790:         printf("  aucun   : scalaire, nombre entier ou réel ;\n");
  791:         printf("  ( )     : nombre complexe ;\n");
  792:         printf("  #       : entier binaire ;\n");
  793:         printf("  << >>   : fonction utilisateur ou équation en notation "
  794:                 "polonaise inversée ;\n");
  795:         printf("  ' '     : équation en notation algébrique ou nom de "
  796:                 "variable ;\n");
  797:         printf("  [ ]     : vecteur ;\n");
  798:         printf("  [[ ]]   : matrice ;\n");
  799:         printf("  <[ ]>   : table ;\n");
  800:         printf("  \" \"     : chaîne de caractères ;\n");
  801:         printf("  { }     : liste ;\n");
  802:         printf("  /* */   : commentaire ;\n");
  803:         printf("  //      : commentaire allant jusqu'à la fin de la ligne."
  804:                 "\n\n");
  805:         printf("Fonctions classées par usage :\n");
  806:         printf("(les instructions écrites en majuscules sont insensibles à "
  807:                 "la casse)\n\n");
  808:     }
  809:     else
  810:     {
  811:         printf("Delimiters :\n\n");
  812:         printf("  none    : scalar, integer or real number ;\n");
  813:         printf("  ( )     : complex number ;\n");
  814:         printf("  #       : binary integer ;\n");
  815:         printf("  << >>   : user-defined function, or equation expressed in "
  816:                 "RPN ;\n");
  817:         printf("  ' '     : algebraic equation or variable name ;\n");
  818:         printf("  [ ]     : scalar vector ;\n");
  819:         printf("  [[ ]]   : scalar matrix ;\n");
  820:         printf("  <[ ]>   : table ;\n");
  821:         printf("  \" \"     : character string ;\n");
  822:         printf("  { }     : list ;\n");
  823:         printf("  /* */   : comment ;\n");
  824:         printf("  //      : comment running to the end of the line.\n\n");
  825:         printf("Functions ordre by usage :\n");
  826:         printf("(instructions written in upper case are case-unsensitive)\n\n");
  827:     }
  828: 
  829:     ptr = usages;
  830:     *ligne = d_code_fin_chaine;
  831: 
  832:     while(*ptr != (unsigned char *) NULL)
  833:     {
  834:         if (strcmp((*ptr), USAGES_RC) == 0)
  835:         {
  836:             printf("    %s\n\n", ligne);
  837:             *ligne = d_code_fin_chaine;
  838:         }
  839:         else if (strcmp((*ptr), USAGES_TITRE) == 0)
  840:         {
  841:             ptr++;
  842: 
  843:             if ((*s_etat_processus).langue == 'F')
  844:             {
  845:                 ptr++;
  846:                 printf("  %s\n", *ptr);
  847:             }
  848:             else
  849:             {
  850:                 printf("  %s\n", *ptr);
  851:                 ptr++;
  852:             }
  853:         }
  854:         else if ((strlen(ligne) + strlen(*ptr) + 2) > 76)
  855:         {
  856:             printf("    %s\n", ligne);
  857:             *ligne = d_code_fin_chaine;
  858:             strcat(ligne, *ptr);
  859: 
  860:             if (*(ptr + 1) != NULL)
  861:             {
  862:                 strcat(ligne, ", ");
  863:             }
  864:         }
  865:         else
  866:         {
  867:             strcat(ligne, *ptr);
  868: 
  869:             if (*(ptr + 1) != NULL)
  870:             {
  871:                 strcat(ligne, ", ");
  872:             }
  873:         }
  874: 
  875:         ptr++;
  876:     }
  877: 
  878:     if (strlen(ligne) != 0)
  879:     {
  880:         printf("    %s\n", ligne);
  881:     }
  882: 
  883:     printf("\n");
  884: 
  885:     if ((*s_etat_processus).langue == 'F')
  886:     {
  887:         printf("Processus asynchrones :\n");
  888:         printf("  CTRL+C : interruption de l'instruction en cours ;\n");
  889:         printf("  CTRL+D : en mode interactif, provque un ABORT ;\n");
  890:         printf("  CTRL+Z : en cours d'exécution, provoque un HALT "
  891:                 "asynchrone.\n\n");
  892: 
  893:         printf("Drapeaux (valeurs par défaut) :\n");
  894:         printf("  1 à 30  : drapeaux banalisés (désarmés)\n");
  895:         printf("  31      : pile LAST active (armé en mode interactif, "
  896:                 "désarmé sinon)\n");
  897:         printf("  32      : impression automatique (désarmé)\n");
  898:         printf("  33      : retour à la ligne automatique invalidé "
  899:                 "(désarmé)\n");
  900:         printf("  34      : réservé (désarmé)\n");
  901:         printf("  35      : évaluation symbolique des constantes (armé)\n");
  902:         printf("  36      : évaluation symbolique des fonctions (armé)\n");
  903:         printf("  37 à 42 : taille des entiers binaires, bit de poids faible "
  904:                 "en tête (armés)\n");
  905:         printf("  43 à 44 : base de numérotation binaire (désarmés)\n");
  906:         printf("  45      : affichage multiligne (armé)\n");
  907:         printf("  46 à 47 : réservés (désarmés)\n");
  908:         printf("  48      : virgule comme séparateur décimal (désarmé)\n");
  909:         printf("  49 à 50 : format des nombres (désarmés)\n");
  910:         printf("  51      : tonalité désactivée (désarmé)\n");
  911:         printf("  52      : mise à jour automatique des graphiques désactivée "
  912:                 "(désarmé)\n");
  913:         printf("  53 à 56 : nombre de chiffres décimaux, bit de poids fort "
  914:                 "en tête (désarmés)\n");
  915:         printf("  57 à 59 : réservés (désarmés)\n");
  916:         printf("  60      : radian et non degré comme unité angulaire "
  917:                 "(armé)\n");
  918:         printf("  61 à 64 : réservés (désarmés)\n");
  919:     }
  920:     else
  921:     {
  922:         printf("Hot keys :\n");
  923:         printf("  CTRL+C : interruption ;\n");
  924:         printf("  CTRL+D : ABORT (in interactive mode only) ;\n");
  925:         printf("  CTRL+Z : HALT.\n\n");
  926: 
  927:         printf("Flags (default values) :\n");
  928:         printf("  1 à 30  : user flags (cleared)\n");
  929:         printf("  31      : LAST stack enabled (set in interactive mode, "
  930:                 "cleared if not)\n");
  931:         printf("  32      : automatic printing (cleared)\n");
  932:         printf("  33      : automatic carriage return disabled "
  933:                 "(cleared)\n");
  934:         printf("  34      : reserved (cleared)\n");
  935:         printf("  35      : constant symbolic evaluation (set)\n");
  936:         printf("  36      : function symbolic evaluation (set)\n");
  937:         printf("  37 à 42 : size of binary integers, while starting with "
  938:                 "less significant bit (set)\n");
  939:         printf("  43 à 44 : binary integer basis (cleared)\n");
  940:         printf("  45      : multiline conversion (set)\n");
  941:         printf("  46 à 47 : reserved (cleared)\n");
  942:         printf("  48      : comma as decimal separator (cleared)\n");
  943:         printf("  49 à 50 : numbers format (cleared)\n");
  944:         printf("  51      : visual bell disabled (cleared)\n");
  945:         printf("  52      : graphic automatic redrawing disabled "
  946:                 "(cleared)\n");
  947:         printf("  53 à 56 : precision, while starting with "
  948:                 "less significant bit (cleared)\n");
  949:         printf("  57 à 59 : reserved (cleared)\n");
  950:         printf("  60      : radian mode instead of degree one (set)\n");
  951:         printf("  61 à 64 : reserved (cleared)\n");
  952:     }
  953: 
  954:     printf("\n");
  955: 
  956:     if ((*s_etat_processus).langue == 'F')
  957:     {
  958:         printf("Types d'arguments :\n\n");
  959:         printf("    %s              : entier (64 bits)\n", d_INT);
  960:         printf("    %s                 : réel (64 bits)\n", d_REL);
  961:         printf("    %s              : complexe (128 bits)\n", d_CPL);
  962:         printf("    %s          : vecteur entier\n", d_VIN);
  963:         printf("    %s             : vecteur réel\n", d_VRL);
  964:         printf("    %s          : vecteur complexe\n", d_VCX);
  965:         printf("    %s        : matrice entière\n", d_MIN);
  966:         printf("    %s           : matrice réelle\n", d_MRL);
  967:         printf("    %s        : matrice complexe\n", d_MCX);
  968:         printf("    %s          : table\n", d_TAB);
  969:         printf("    %s       : entier binaire\n", d_BIN);
  970:         printf("    %s               : nom\n", d_NOM);
  971:         printf("    %s             : chaîne de caractères\n", d_CHN);
  972:         printf("    %s             : liste\n", d_LST);
  973:         printf("    %s          : expression algébrique\n", d_ALG);
  974:         printf("    %s            : expression RPN\n", d_RPN);
  975:         printf("    %s   : descripteur de fichier\n", d_FCH);
  976:         printf("    %s : socket\n", d_SCK);
  977:         printf("    %s           : descripteur de bibliothèque\n", d_SLB);
  978:         printf("    %s           : processus\n", d_PRC);
  979:         printf("    %s        : connexion à une base de données SQL\n", d_SQL);
  980:         printf("    %s             : mutex\n", d_MTX);
  981:         printf("    %s  : sémaphore nommé\n", d_SPH);
  982:     }
  983:     else
  984:     {
  985:         printf("Types :\n\n");
  986:         printf("    %s              : integer (64 bits)\n", d_INT);
  987:         printf("    %s                 : real (64 bits)\n", d_REL);
  988:         printf("    %s              : complex (128 bits)\n", d_CPL);
  989:         printf("    %s          : integer vector\n", d_VIN);
  990:         printf("    %s             : real vector\n", d_VRL);
  991:         printf("    %s          : complex vector\n", d_VCX);
  992:         printf("    %s        : integer matrix\n", d_MIN);
  993:         printf("    %s           : real matrix\n", d_MRL);
  994:         printf("    %s        : complex matrix\n", d_MCX);
  995:         printf("    %s          : table\n", d_TAB);
  996:         printf("    %s       : binary integer\n", d_BIN);
  997:         printf("    %s               : name\n", d_NOM);
  998:         printf("    %s             : string of chars\n", d_CHN);
  999:         printf("    %s             : list\n", d_LST);
 1000:         printf("    %s          : algebraic expression\n", d_ALG);
 1001:         printf("    %s            : RPN expression\n", d_RPN);
 1002:         printf("    %s   : file descriptor\n", d_FCH);
 1003:         printf("    %s : socket\n", d_SCK);
 1004:         printf("    %s           : library descriptor\n", d_SLB);
 1005:         printf("    %s           : process\n", d_PRC);
 1006:         printf("    %s        : connection to SQL database\n", d_SQL);
 1007:         printf("    %s             : mutex\n", d_MTX);
 1008:         printf("    %s  : named semaphore\n", d_SPH);
 1009:     }
 1010: 
 1011:     /*
 1012:      * HELP ne doit pas être récursif sous peine de boucler indéfiniment
 1013:      * dans la fonction.
 1014:      */
 1015: 
 1016:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1017:     {
 1018:         return;
 1019:     }
 1020: 
 1021:     printf("\n");
 1022: 
 1023:     registre = (*s_etat_processus).instruction_courante;
 1024: 
 1025:     flockfile(stdin);
 1026:     flockfile(stdout);
 1027: 
 1028:     while((fonction = readline("HELP> ")) != NULL)
 1029:     {
 1030:         funlockfile(stdin);
 1031:         funlockfile(stdout);
 1032: 
 1033:         if (strcmp(fonction, "") == 0)
 1034:         {
 1035:             break;
 1036:         }
 1037: 
 1038:         /*
 1039:          * Élimination des blancs précédents l'instruction
 1040:          */
 1041: 
 1042:         pointeur = fonction;
 1043: 
 1044:         while(((*pointeur) == d_code_tabulation) ||
 1045:                 ((*pointeur) == d_code_espace))
 1046:         {
 1047:             pointeur++;
 1048:         }
 1049: 
 1050:         (*s_etat_processus).instruction_courante = pointeur;
 1051: 
 1052:         /*
 1053:          * Élimination des blancs et caractères suivant la première
 1054:          * instruction.
 1055:          */
 1056: 
 1057:         while(((*pointeur) != d_code_tabulation) &&
 1058:                 ((*pointeur) != d_code_espace) &&
 1059:                 ((*pointeur) != d_code_fin_chaine))
 1060:         {
 1061:             pointeur++;
 1062:         }
 1063: 
 1064:         (*pointeur) = d_code_fin_chaine;
 1065: 
 1066:         add_history(pointeur);
 1067:         stifle_history(ds_longueur_historique);
 1068: 
 1069:         (*s_etat_processus).test_instruction = 'Y';
 1070:         analyse(s_etat_processus, NULL);
 1071:         (*s_etat_processus).test_instruction = 'N';
 1072: 
 1073:         if ((*s_etat_processus).instruction_valide == 'Y')
 1074:         {
 1075:             (*s_etat_processus).affichage_arguments = 'Y';
 1076:             analyse(s_etat_processus, NULL);
 1077:             (*s_etat_processus).affichage_arguments = 'N';
 1078: 
 1079:             printf("\n");
 1080:         }
 1081:         else
 1082:         {
 1083:             if ((*s_etat_processus).langue == 'F')
 1084:             {
 1085:                 printf("Fonction inconnue.\n");
 1086:             }
 1087:             else
 1088:             {
 1089:                 printf("Unknown function\n");
 1090:             }
 1091:         }
 1092: 
 1093:         free(fonction);
 1094:         flockfile(stdin);
 1095:         flockfile(stdout);
 1096:     }
 1097: 
 1098:     funlockfile(stdin);
 1099:     funlockfile(stdout);
 1100: 
 1101:     if (fonction == NULL)
 1102:     {
 1103:         printf("\n");
 1104:     }
 1105: 
 1106:     (*s_etat_processus).instruction_courante = registre;
 1107: 
 1108:     /*
 1109:      * Évite l'empilement de 'HELP()' dans la pile opérationnelle dans le
 1110:      * cas où la dernière commande entrée à l'invite "HELP> " n'existe pas.
 1111:      */
 1112: 
 1113:     (*s_etat_processus).instruction_valide = 'Y';
 1114: 
 1115:     return;
 1116: }
 1117: 
 1118: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>