Annotation of rpl/src/instructions_l1.c, revision 1.9

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

CVSweb interface <joel.bertrand@systella.fr>