Annotation of rpl/src/instructions_h1.c, revision 1.1

1.1     ! bertrand    1: /*
        !             2: ================================================================================
        !             3:   RPL/2 (R) version 4.0.9
        !             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>