Annotation of rpl/src/instructions_e4.c, revision 1.50

1.1       bertrand    1: /*
                      2: ================================================================================
1.49      bertrand    3:   RPL/2 (R) version 4.1.19
1.47      bertrand    4:   Copyright (C) 1989-2014 Dr. BERTRAND Joël
1.1       bertrand    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: 
1.12      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   24: 
                     25: 
                     26: /*
                     27: ================================================================================
                     28:   Fonction 'exsub'
                     29: ================================================================================
                     30:   Entrées :
                     31: --------------------------------------------------------------------------------
                     32:   Sorties :
                     33: --------------------------------------------------------------------------------
                     34:   Effets de bord : néant
                     35: ================================================================================
                     36: */
                     37: 
                     38: void
                     39: instruction_exsub(struct_processus *s_etat_processus)
                     40: {
                     41:    integer8                        position;
                     42: 
                     43:    struct_liste_chainee            *l_element_courant;
                     44:    struct_liste_chainee            *ptr_1;
                     45:    struct_liste_chainee            *ptr_2;
                     46:    struct_liste_chainee            *ptr_3;
                     47: 
                     48:    struct_objet                    *s_copie_argument_1;
                     49:    struct_objet                    *s_copie_argument_4;
                     50:    struct_objet                    *s_objet_argument_1;
                     51:    struct_objet                    *s_objet_argument_2;
                     52:    struct_objet                    *s_objet_argument_3;
                     53:    struct_objet                    *s_objet_argument_4;
                     54: 
                     55:    unsigned char                   *registre_definitions_chainees;
                     56:    unsigned char                   *registre_instruction_courante;
                     57: 
1.42      bertrand   58:    integer8                        position_courante;
1.1       bertrand   59: 
                     60:    (*s_etat_processus).erreur_execution = d_ex;
                     61: 
                     62:    if ((*s_etat_processus).affichage_arguments == 'Y')
                     63:    {
                     64:        printf("\n  EXSUB ");
                     65: 
                     66:        if ((*s_etat_processus).langue == 'F')
                     67:        {
                     68:            printf("(substitution d'expression)\n\n");
                     69:        }
                     70:        else
                     71:        {
                     72:            printf("(expression substitution)\n\n");
                     73:        }
                     74: 
                     75:        printf("    4: %s\n", d_RPN);
                     76:        printf("    3: %s\n", d_INT);
                     77:        printf("    2: %s\n", d_INT);
                     78:        printf("    1: %s\n", d_LST);
                     79:        printf("->  1: %s\n", d_RPN);
                     80: 
                     81:        return;
                     82:    }
                     83:    else if ((*s_etat_processus).test_instruction == 'Y')
                     84:    {
1.8       bertrand   85:        (*s_etat_processus).nombre_arguments = -1;
1.1       bertrand   86:        return;
                     87:    }
                     88: 
                     89:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                     90:    {
                     91:        if (empilement_pile_last(s_etat_processus, 4) == d_erreur)
                     92:        {
                     93:            return;
                     94:        }
                     95:    }
                     96: 
                     97:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                     98:            &s_objet_argument_1) == d_erreur)
                     99:    {
                    100:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    101:        return;
                    102:    }
                    103: 
                    104:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    105:            &s_objet_argument_2) == d_erreur)
                    106:    {
                    107:        liberation(s_etat_processus, s_objet_argument_1);
                    108: 
                    109:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    110:        return;
                    111:    }
                    112: 
                    113:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    114:            &s_objet_argument_3) == d_erreur)
                    115:    {
                    116:        liberation(s_etat_processus, s_objet_argument_1);
                    117:        liberation(s_etat_processus, s_objet_argument_2);
                    118: 
                    119:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    120:        return;
                    121:    }
                    122: 
                    123:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    124:            &s_objet_argument_4) == d_erreur)
                    125:    {
                    126:        liberation(s_etat_processus, s_objet_argument_1);
                    127:        liberation(s_etat_processus, s_objet_argument_2);
                    128:        liberation(s_etat_processus, s_objet_argument_3);
                    129: 
                    130:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    131:        return;
                    132:    }
                    133: 
                    134:    if (((*s_objet_argument_1).type == LST) &&
                    135:            ((*s_objet_argument_2).type == INT) &&
                    136:            ((*s_objet_argument_3).type == INT) &&
                    137:            ((*s_objet_argument_4).type == RPN))
                    138:    {
                    139:        if ((*((integer8 *) (*s_objet_argument_3).objet)) <= 0)
                    140:        {
                    141:            liberation(s_etat_processus, s_objet_argument_1);
                    142:            liberation(s_etat_processus, s_objet_argument_2);
                    143:            liberation(s_etat_processus, s_objet_argument_3);
                    144:            liberation(s_etat_processus, s_objet_argument_4);
                    145: 
                    146:            (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
                    147:            return;
                    148:        }
                    149: 
                    150:        if ((*((integer8 *) (*s_objet_argument_3).objet)) >
                    151:                (*((integer8 *) (*s_objet_argument_2).objet)))
                    152:        {
                    153:            liberation(s_etat_processus, s_objet_argument_1);
                    154:            liberation(s_etat_processus, s_objet_argument_2);
                    155:            liberation(s_etat_processus, s_objet_argument_3);
                    156:            liberation(s_etat_processus, s_objet_argument_4);
                    157: 
                    158:            (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
                    159:            return;
                    160:        }
                    161: 
                    162:        if ((s_copie_argument_1 = copie_objet(s_etat_processus,
                    163:                s_objet_argument_1, 'N')) == NULL)
                    164:        {
                    165:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    166:            return;
                    167:        }
                    168: 
                    169:        liberation(s_etat_processus, s_objet_argument_1);
                    170:        s_objet_argument_1 = s_copie_argument_1;
                    171: 
                    172:        if ((s_copie_argument_4 = copie_objet(s_etat_processus,
                    173:                s_objet_argument_4, 'N')) == NULL)
                    174:        {
                    175:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    176:            return;
                    177:        }
                    178: 
                    179:        liberation(s_etat_processus, s_objet_argument_4);
                    180:        s_objet_argument_4 = s_copie_argument_4;
                    181: 
                    182:        l_element_courant = (*s_objet_argument_4).objet;
                    183:        position = 1;
                    184: 
                    185:        /*
                    186:         * ptr_1 : premier élément à substituer
                    187:         * ptr_2 : dernier élément à substituer
                    188:         */
                    189: 
                    190:        ptr_1 = NULL;
                    191:        ptr_2 = NULL;
                    192: 
                    193:        while(l_element_courant != NULL)
                    194:        {
                    195:            if (position == (*((integer8 *) (*s_objet_argument_3).objet)))
                    196:            {
                    197:                ptr_1 = l_element_courant;
                    198:            }
                    199: 
                    200:            if (position == (*((integer8 *) (*s_objet_argument_2).objet)))
                    201:            {
                    202:                ptr_2 = (*l_element_courant).suivant;
                    203:                (*l_element_courant).suivant = NULL;
                    204:                break;
                    205:            }
                    206: 
                    207:            position++;
                    208:            l_element_courant = (*l_element_courant).suivant;
                    209:        }
                    210: 
                    211:        if (l_element_courant != NULL)
                    212:        {   
                    213:            /*
                    214:             * Substitution
                    215:             */
                    216: 
                    217:            /*
                    218:             * ptr_3 : objet de substitution
                    219:             * ptr_1 : contient maintenant l'objet allant être substitué
                    220:             * et terminé par un NULL donc libérable par liberation().
                    221:             */
                    222: 
                    223:            ptr_3 = (*s_objet_argument_1).objet;
                    224:            (*s_objet_argument_1).objet = ptr_1;
                    225: 
                    226:            l_element_courant = (*s_objet_argument_4).objet;
                    227: 
                    228:            if (l_element_courant == NULL)
                    229:            {
                    230:                (*s_objet_argument_4).objet = ptr_3;
                    231: 
                    232:                if ((*s_objet_argument_4).objet == NULL)
                    233:                {
                    234:                    (*s_objet_argument_4).objet = ptr_2;
                    235:                }
                    236:                else
                    237:                {
                    238:                    l_element_courant = (*s_objet_argument_4).objet;
                    239: 
                    240:                    while((*l_element_courant).suivant != NULL)
                    241:                    {
                    242:                        l_element_courant = (*l_element_courant).suivant;
                    243:                    }
                    244: 
                    245:                    (*l_element_courant).suivant = ptr_2;
                    246:                }
                    247:            }
                    248:            else
                    249:            {
                    250:                if ((*((integer8 *) (*s_objet_argument_3).objet)) == 1)
                    251:                {
                    252:                    (*s_objet_argument_4).objet = ptr_3;
                    253:                    l_element_courant = (*s_objet_argument_4).objet;
                    254:                }
                    255:                else
                    256:                {
                    257:                    position = 1;
                    258: 
                    259:                    while((*l_element_courant).suivant != NULL)
                    260:                    {
                    261:                        position++;
                    262: 
                    263:                        if (position == (*((integer8 *) (*s_objet_argument_3)
                    264:                                .objet)))
                    265:                        {
                    266:                            break;
                    267:                        }
                    268: 
                    269:                        l_element_courant = (*l_element_courant).suivant;
                    270:                    }
                    271: 
                    272:                    (*l_element_courant).suivant = ptr_3;
                    273:                }
                    274: 
                    275:                if ((*l_element_courant).suivant == NULL)
                    276:                {
                    277:                    (*l_element_courant).suivant = ptr_2;
                    278:                }
                    279:                else
                    280:                {
                    281:                    while((*l_element_courant).suivant != NULL)
                    282:                    {
                    283:                        l_element_courant = (*l_element_courant).suivant;
                    284:                    }
                    285: 
                    286:                    (*l_element_courant).suivant = ptr_2;
                    287:                }
                    288:            }
                    289: 
                    290:            /*
                    291:             * Analyse de l'objet résultant de la substitution
                    292:             */
                    293: 
                    294:            // Recherche de la présence d'un '<<' initial
                    295: 
                    296:            l_element_courant = (*s_objet_argument_4).objet;
                    297: 
                    298:            while(l_element_courant != NULL)
                    299:            {
                    300:                if ((*(*l_element_courant).donnee).type == FCT)
                    301:                {
                    302:                    if (strcmp((*((struct_fonction *) (*(*l_element_courant)
                    303:                            .donnee).objet)).nom_fonction, "<<") == 0)
                    304:                    {
                    305:                        break;
                    306:                    }
                    307:                }
                    308: 
                    309:                l_element_courant = (*l_element_courant).suivant;
                    310:            }
                    311: 
                    312:            if (l_element_courant != (*s_objet_argument_4).objet)
                    313:            {
                    314:                liberation(s_etat_processus, s_objet_argument_1);
                    315:                liberation(s_etat_processus, s_objet_argument_2);
                    316:                liberation(s_etat_processus, s_objet_argument_3);
                    317:                liberation(s_etat_processus, s_objet_argument_4);
                    318: 
                    319:                (*s_etat_processus).erreur_execution =
                    320:                        d_ex_argument_invalide;
                    321:                return;
                    322:            }
                    323: 
                    324:            // Analyse syntaxique
                    325: 
                    326:            position_courante = (*s_etat_processus).position_courante;
                    327:            registre_definitions_chainees = (*s_etat_processus)
                    328:                    .definitions_chainees;
                    329:            registre_instruction_courante = (*s_etat_processus)
                    330:                    .instruction_courante;
                    331: 
                    332:            if (((*s_etat_processus).definitions_chainees =
                    333:                    formateur(s_etat_processus, 0, s_objet_argument_4))
                    334:                    == NULL)
                    335:            {
                    336:                (*s_etat_processus).erreur_systeme =
                    337:                        d_es_allocation_memoire;
                    338:                return;
                    339:            }
                    340: 
                    341:            if (analyse_syntaxique(s_etat_processus) == d_erreur)
                    342:            {
                    343:                free((*s_etat_processus).definitions_chainees);
                    344: 
                    345:                (*s_etat_processus).definitions_chainees =
                    346:                        registre_definitions_chainees;
                    347:                (*s_etat_processus).instruction_courante =
                    348:                        registre_instruction_courante;
                    349:                (*s_etat_processus).position_courante =
                    350:                        position_courante;
                    351: 
                    352:                liberation(s_etat_processus, s_objet_argument_1);
                    353:                liberation(s_etat_processus, s_objet_argument_2);
                    354:                liberation(s_etat_processus, s_objet_argument_3);
                    355:                liberation(s_etat_processus, s_objet_argument_4);
                    356: 
                    357:                (*s_etat_processus).erreur_execution =
                    358:                        d_ex_argument_invalide;
                    359:                return;
                    360:            }
                    361: 
                    362:            free((*s_etat_processus).definitions_chainees);
                    363: 
                    364:            (*s_etat_processus).definitions_chainees =
                    365:                    registre_definitions_chainees;
                    366:            (*s_etat_processus).instruction_courante =
                    367:                    registre_instruction_courante;
                    368:            (*s_etat_processus).position_courante =
                    369:                    position_courante;
                    370:        }
                    371:        else
                    372:        {
                    373:            liberation(s_etat_processus, s_objet_argument_1);
                    374:            liberation(s_etat_processus, s_objet_argument_2);
                    375:            liberation(s_etat_processus, s_objet_argument_3);
                    376:            liberation(s_etat_processus, s_objet_argument_4);
                    377: 
                    378:            (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
                    379:            return;
                    380:        }
                    381:    }
                    382:    else
                    383:    {
                    384:        liberation(s_etat_processus, s_objet_argument_1);
                    385:        liberation(s_etat_processus, s_objet_argument_2);
                    386:        liberation(s_etat_processus, s_objet_argument_3);
                    387:        liberation(s_etat_processus, s_objet_argument_4);
                    388: 
                    389:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    390:        return;
                    391:    }
                    392: 
                    393:    liberation(s_etat_processus, s_objet_argument_1);
                    394:    liberation(s_etat_processus, s_objet_argument_2);
                    395:    liberation(s_etat_processus, s_objet_argument_3);
                    396: 
                    397:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    398:            s_objet_argument_4) == d_erreur)
                    399:    {
                    400:        return;
                    401:    }
                    402: 
                    403:    return;
                    404: }
                    405: 
                    406: 
                    407: /*
                    408: ================================================================================
                    409:   Fonction 'exget'
                    410: ================================================================================
                    411:   Entrées :
                    412: --------------------------------------------------------------------------------
                    413:   Sorties :
                    414: --------------------------------------------------------------------------------
                    415:   Effets de bord : néant
                    416: ================================================================================
                    417: */
                    418: 
                    419: void
                    420: instruction_exget(struct_processus *s_etat_processus)
                    421: {
                    422:    struct_liste_chainee            *l_element_courant;
                    423:    struct_liste_chainee            *l_element_suivant;
                    424: 
                    425:    struct_objet                    *s_copie_argument_3;
                    426:    struct_objet                    *s_objet_argument_1;
                    427:    struct_objet                    *s_objet_argument_2;
                    428:    struct_objet                    *s_objet_argument_3;
                    429: 
                    430:    signed long                     position;
                    431: 
                    432:    (*s_etat_processus).erreur_execution = d_ex;
                    433: 
                    434:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    435:    {
                    436:        printf("\n  EXGET ");
                    437: 
                    438:        if ((*s_etat_processus).langue == 'F')
                    439:        {
                    440:            printf("(extraction d'une expression)\n\n");
                    441:        }
                    442:        else
                    443:        {
                    444:            printf("(get expression)\n\n");
                    445:        }
                    446: 
                    447:        printf("    3: %s\n", d_RPN);
                    448:        printf("    2: %s\n", d_INT);
                    449:        printf("    1: %s\n", d_INT);
                    450:        printf("->  1: %s\n", d_LST);
                    451: 
                    452:        return;
                    453:    }
                    454:    else if ((*s_etat_processus).test_instruction == 'Y')
                    455:    {
1.8       bertrand  456:        (*s_etat_processus).nombre_arguments = -1;
1.1       bertrand  457:        return;
                    458:    }
                    459: 
                    460:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    461:    {
                    462:        if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
                    463:        {
                    464:            return;
                    465:        }
                    466:    }
                    467: 
                    468:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    469:            &s_objet_argument_1) == d_erreur)
                    470:    {
                    471:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    472:        return;
                    473:    }
                    474: 
                    475:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    476:            &s_objet_argument_2) == d_erreur)
                    477:    {
                    478:        liberation(s_etat_processus, s_objet_argument_1);
                    479: 
                    480:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    481:        return;
                    482:    }
                    483: 
                    484:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    485:            &s_objet_argument_3) == d_erreur)
                    486:    {
                    487:        liberation(s_etat_processus, s_objet_argument_1);
                    488:        liberation(s_etat_processus, s_objet_argument_2);
                    489: 
                    490:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    491:        return;
                    492:    }
                    493: 
                    494:    if (((*s_objet_argument_1).type == INT) &&
                    495:            ((*s_objet_argument_2).type == INT) &&
                    496:            ((*s_objet_argument_3).type == RPN))
                    497:    {
                    498:        if ((s_copie_argument_3 = copie_objet(s_etat_processus,
                    499:                s_objet_argument_3, 'N')) == NULL)
                    500:        {
                    501:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    502:            return;
                    503:        }
                    504: 
                    505:        liberation(s_etat_processus, s_objet_argument_3);
                    506:        s_objet_argument_3 = s_copie_argument_3;
                    507: 
                    508:        if ((*((integer8 *) (*s_objet_argument_2).objet)) <= 0)
                    509:        {
                    510:            liberation(s_etat_processus, s_objet_argument_1);
                    511:            liberation(s_etat_processus, s_objet_argument_2);
                    512:            liberation(s_etat_processus, s_objet_argument_3);
                    513: 
                    514:            (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
                    515:            return;
                    516:        }
                    517: 
                    518:        if ((*((integer8 *) (*s_objet_argument_2).objet)) >
                    519:                (*((integer8 *) (*s_objet_argument_1).objet)))
                    520:        {
                    521:            liberation(s_etat_processus, s_objet_argument_1);
                    522:            liberation(s_etat_processus, s_objet_argument_2);
                    523:            liberation(s_etat_processus, s_objet_argument_3);
                    524: 
                    525:            (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
                    526:            return;
                    527:        }
                    528: 
                    529:        (*s_objet_argument_3).type = LST;
                    530:        l_element_courant = (*s_objet_argument_3).objet;
                    531:        position = 1;
                    532: 
                    533:        while(l_element_courant != NULL)
                    534:        {
                    535:            if (position == (*((integer8 *) (*s_objet_argument_2).objet)))
                    536:            {
                    537:                (*s_objet_argument_3).objet = l_element_courant;
                    538:                break;
                    539:            }
                    540: 
                    541:            l_element_suivant = (*l_element_courant).suivant;
                    542:            liberation(s_etat_processus, (*l_element_courant).donnee);
                    543:            free(l_element_courant);
                    544:            l_element_courant = l_element_suivant;
                    545: 
                    546:            position++;
                    547:        }
                    548: 
                    549:        if (position != (*((integer8 *) (*s_objet_argument_2).objet)))
                    550:        {
                    551:            liberation(s_etat_processus, s_objet_argument_1);
                    552:            liberation(s_etat_processus, s_objet_argument_2);
                    553:            liberation(s_etat_processus, s_objet_argument_3);
                    554: 
                    555:            (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
                    556:            return;
                    557:        }
                    558: 
                    559:        while(l_element_courant != NULL)
                    560:        {
                    561:            l_element_suivant = (*l_element_courant).suivant;
                    562: 
                    563:            if (position == (*((integer8 *) (*s_objet_argument_1).objet)))
                    564:            {
                    565:                (*l_element_courant).suivant = NULL;
                    566:                l_element_courant = l_element_suivant;
                    567: 
                    568:                while(l_element_courant != NULL)
                    569:                {
                    570:                    l_element_suivant = (*l_element_courant).suivant;
                    571:                    liberation(s_etat_processus, (*l_element_courant).donnee);
                    572:                    free(l_element_courant);
                    573:                    l_element_courant = l_element_suivant;
                    574:                }
                    575: 
                    576:                break;
                    577:            }
                    578: 
                    579:            l_element_courant = l_element_suivant;
                    580:            position++;
                    581:        }
                    582: 
                    583:        if (position != (*((integer8 *) (*s_objet_argument_1).objet)))
                    584:        {
                    585:            liberation(s_etat_processus, s_objet_argument_1);
                    586:            liberation(s_etat_processus, s_objet_argument_2);
                    587:            liberation(s_etat_processus, s_objet_argument_3);
                    588: 
                    589:            (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
                    590:            return;
                    591:        }
                    592: 
                    593:        /*
                    594:         * Vérification de la cohérence de l'expression. Nous ne devons avoir
                    595:         * ni '<<' ni '>>.
                    596:         */
                    597: 
                    598:        l_element_courant = (*s_objet_argument_3).objet;
                    599: 
                    600:        while(l_element_courant != NULL)
                    601:        {
                    602:            if ((*(*l_element_courant).donnee).type == FCT)
                    603:            {
                    604:                if ((strcmp((*((struct_fonction *) (*(*l_element_courant)
                    605:                        .donnee).objet)).nom_fonction, "<<") == 0) ||
                    606:                        (strcmp((*((struct_fonction *) (*(*l_element_courant)
                    607:                        .donnee).objet)).nom_fonction, ">>") == 0))
                    608:                {
                    609:                    liberation(s_etat_processus, s_objet_argument_1);
                    610:                    liberation(s_etat_processus, s_objet_argument_2);
                    611:                    liberation(s_etat_processus, s_objet_argument_3);
                    612: 
                    613:                    (*s_etat_processus).erreur_execution =
                    614:                            d_ex_argument_invalide;
                    615:                    return;
                    616:                }
                    617:            }
                    618: 
                    619:            l_element_courant = (*l_element_courant).suivant;
                    620:        }
                    621:    }
                    622:    else
                    623:    {
                    624:        liberation(s_etat_processus, s_objet_argument_1);
                    625:        liberation(s_etat_processus, s_objet_argument_2);
                    626:        liberation(s_etat_processus, s_objet_argument_3);
                    627: 
                    628:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    629:        return;
                    630:    }
                    631: 
                    632:    liberation(s_etat_processus, s_objet_argument_1);
                    633:    liberation(s_etat_processus, s_objet_argument_2);
                    634: 
                    635:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    636:            s_objet_argument_3) == d_erreur)
                    637:    {
                    638:        return;
                    639:    }
                    640: 
                    641:    return;
                    642: }
                    643: 
1.50    ! bertrand  644: 
        !           645: /*
        !           646: ================================================================================
        !           647:   Fonction 'eqv'
        !           648: ================================================================================
        !           649:   Entrées : pointeur sur une structure struct_processus
        !           650: --------------------------------------------------------------------------------
        !           651:   Sorties :
        !           652: --------------------------------------------------------------------------------
        !           653:   Effets de bord : néant
        !           654: ================================================================================
        !           655: */
        !           656: 
        !           657: void
        !           658: instruction_eqv(struct_processus *s_etat_processus)
        !           659: {
        !           660:    struct_liste_chainee        *l_element_courant;
        !           661:    struct_liste_chainee        *l_element_precedent;
        !           662: 
        !           663:    struct_objet                *s_copie_argument_1;
        !           664:    struct_objet                *s_copie_argument_2;
        !           665:    struct_objet                *s_objet_argument_1;
        !           666:    struct_objet                *s_objet_argument_2;
        !           667:    struct_objet                *s_objet_resultat;
        !           668: 
        !           669:    integer8                    nombre_elements;
        !           670: 
        !           671:    (*s_etat_processus).erreur_execution = d_ex;
        !           672: 
        !           673:    if ((*s_etat_processus).affichage_arguments == 'Y')
        !           674:    {
        !           675:        printf("\n  EQV ");
        !           676: 
        !           677:        if ((*s_etat_processus).langue == 'F')
        !           678:        {
        !           679:            printf("(opérateur equivalence)\n\n");
        !           680:        }
        !           681:        else
        !           682:        {
        !           683:            printf("(equivalence operator)\n\n");
        !           684:        }
        !           685: 
        !           686:        printf("    2: %s, %s\n", d_INT, d_REL);
        !           687:        printf("    1: %s, %s\n", d_INT, d_REL);
        !           688:        printf("->  1: %s\n\n", d_INT);
        !           689: 
        !           690:        printf("    2: %s\n", d_BIN);
        !           691:        printf("    1: %s\n", d_BIN);
        !           692:        printf("->  1: %s\n\n", d_BIN);
        !           693: 
        !           694:        printf("    2: %s\n", d_NOM);
        !           695:        printf("    1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
        !           696:        printf("->  1: %s\n\n", d_ALG);
        !           697: 
        !           698:        printf("    2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
        !           699:        printf("    1: %s\n", d_NOM);
        !           700:        printf("->  1: %s\n\n", d_ALG);
        !           701: 
        !           702:        printf("    2: %s\n", d_ALG);
        !           703:        printf("    1: %s\n", d_ALG);
        !           704:        printf("->  1: %s\n\n", d_ALG);
        !           705: 
        !           706:        printf("    2: %s\n", d_RPN);
        !           707:        printf("    1: %s\n", d_RPN);
        !           708:        printf("->  1: %s\n", d_RPN);
        !           709: 
        !           710:        return;
        !           711:    }
        !           712:    else if ((*s_etat_processus).test_instruction == 'Y')
        !           713:    {
        !           714:        (*s_etat_processus).nombre_arguments = 0;
        !           715:        return;
        !           716:    }
        !           717:    
        !           718:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
        !           719:    {
        !           720:        if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
        !           721:        {
        !           722:            return;
        !           723:        }
        !           724:    }
        !           725: 
        !           726:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
        !           727:            &s_objet_argument_1) == d_erreur)
        !           728:    {
        !           729:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
        !           730:        return;
        !           731:    }
        !           732: 
        !           733:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
        !           734:            &s_objet_argument_2) == d_erreur)
        !           735:    {
        !           736:        liberation(s_etat_processus, s_objet_argument_1);
        !           737: 
        !           738:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
        !           739:        return;
        !           740:    }
        !           741: 
        !           742: /*
        !           743: --------------------------------------------------------------------------------
        !           744:   EQV logique
        !           745: --------------------------------------------------------------------------------
        !           746: */
        !           747: 
        !           748:    if ((((*s_objet_argument_1).type == INT) ||
        !           749:            ((*s_objet_argument_1).type == REL)) &&
        !           750:            (((*s_objet_argument_2).type == INT) ||
        !           751:            ((*s_objet_argument_2).type == REL)))
        !           752:    {
        !           753:        if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
        !           754:        {
        !           755:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           756:            return;
        !           757:        }
        !           758: 
        !           759:        if ((*s_objet_argument_1).type == INT)
        !           760:        {
        !           761:            if ((*s_objet_argument_2).type == INT)
        !           762:            {
        !           763:                if ((((*((integer8 *) (*s_objet_argument_1).objet)) == 0) &&
        !           764:                        ((*((integer8 *) (*s_objet_argument_2).objet)) == 0))
        !           765:                        || (((*((integer8 *) (*s_objet_argument_1).objet))
        !           766:                        != 0) && ((*((integer8 *) (*s_objet_argument_2).objet))
        !           767:                        != 0)))
        !           768:                {
        !           769:                    (*((integer8 *) (*s_objet_resultat).objet)) = -1;
        !           770:                }
        !           771:                else
        !           772:                {
        !           773:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
        !           774:                }
        !           775:            }
        !           776:            else
        !           777:            {
        !           778:                if ((((*((integer8 *) (*s_objet_argument_1).objet)) == 0) &&
        !           779:                        ((*((real8 *) (*s_objet_argument_2).objet)) == 0))
        !           780:                        || (((*((integer8 *) (*s_objet_argument_1).objet))
        !           781:                        != 0) && ((*((real8 *) (*s_objet_argument_2).objet))
        !           782:                        != 0)))
        !           783:                {
        !           784:                    (*((integer8 *) (*s_objet_resultat).objet)) = -1;
        !           785:                }
        !           786:                else
        !           787:                {
        !           788:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
        !           789:                }
        !           790:            }
        !           791:        }
        !           792:        else
        !           793:        {
        !           794:            if ((*s_objet_argument_2).type == INT)
        !           795:            {
        !           796:                if ((((*((real8 *) (*s_objet_argument_1).objet)) == 0) &&
        !           797:                        ((*((integer8 *) (*s_objet_argument_2).objet)) == 0))
        !           798:                        || (((*((real8 *) (*s_objet_argument_1).objet))
        !           799:                        != 0) && ((*((integer8 *) (*s_objet_argument_2).objet))
        !           800:                        != 0)))
        !           801:                {
        !           802:                    (*((integer8 *) (*s_objet_resultat).objet)) = -1;
        !           803:                }
        !           804:                else
        !           805:                {
        !           806:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
        !           807:                }
        !           808:            }
        !           809:            else
        !           810:            {
        !           811:                if ((((*((real8 *) (*s_objet_argument_1).objet)) == 0) &&
        !           812:                        ((*((real8 *) (*s_objet_argument_2).objet)) == 0))
        !           813:                        || (((*((real8 *) (*s_objet_argument_1).objet))
        !           814:                        != 0) && ((*((real8 *) (*s_objet_argument_2).objet))
        !           815:                        != 0)))
        !           816:                {
        !           817:                    (*((integer8 *) (*s_objet_resultat).objet)) = -1;
        !           818:                }
        !           819:                else
        !           820:                {
        !           821:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
        !           822:                }
        !           823:            }
        !           824:        }
        !           825:    }
        !           826: 
        !           827: /*
        !           828: --------------------------------------------------------------------------------
        !           829:   EQV binaire
        !           830: --------------------------------------------------------------------------------
        !           831: */
        !           832: 
        !           833:    else if (((*s_objet_argument_1).type == BIN) &&
        !           834:            ((*s_objet_argument_2).type == BIN))
        !           835:    {
        !           836:        if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL)
        !           837:        {
        !           838:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           839:            return;
        !           840:        }
        !           841: 
        !           842:        (*((logical8 *) (*s_objet_resultat).objet)) = 
        !           843:                ~((*((logical8 *) (*s_objet_argument_1).objet)) ^
        !           844:                (*((logical8 *) (*s_objet_argument_2).objet)));
        !           845:    }
        !           846: 
        !           847: /*
        !           848: --------------------------------------------------------------------------------
        !           849:    EQV entre des arguments complexes
        !           850: --------------------------------------------------------------------------------
        !           851: */
        !           852: 
        !           853:    /*
        !           854:     * Nom ou valeur numérique / Nom ou valeur numérique
        !           855:     */
        !           856: 
        !           857:    else if ((((*s_objet_argument_1).type == NOM) &&
        !           858:            (((*s_objet_argument_2).type == NOM) ||
        !           859:            ((*s_objet_argument_2).type == INT) ||
        !           860:            ((*s_objet_argument_2).type == REL))) ||
        !           861:            (((*s_objet_argument_2).type == NOM) &&
        !           862:            (((*s_objet_argument_1).type == INT) ||
        !           863:            ((*s_objet_argument_1).type == REL))))
        !           864:    {
        !           865:        if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
        !           866:        {
        !           867:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           868:            return;
        !           869:        }
        !           870: 
        !           871:        if (((*s_objet_resultat).objet =
        !           872:                allocation_maillon(s_etat_processus)) == NULL)
        !           873:        {
        !           874:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           875:            return;
        !           876:        }
        !           877: 
        !           878:        l_element_courant = (*s_objet_resultat).objet;
        !           879: 
        !           880:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           881:                == NULL)
        !           882:        {
        !           883:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           884:            return;
        !           885:        }
        !           886: 
        !           887:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           888:                .nombre_arguments = 0;
        !           889:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           890:                .fonction = instruction_vers_niveau_superieur;
        !           891: 
        !           892:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           893:                .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
        !           894:        {
        !           895:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           896:            return;
        !           897:        }
        !           898: 
        !           899:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           900:                .nom_fonction, "<<");
        !           901: 
        !           902:        if (((*l_element_courant).suivant =
        !           903:                allocation_maillon(s_etat_processus)) == NULL)
        !           904:        {
        !           905:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           906:            return;
        !           907:        }
        !           908: 
        !           909:        l_element_courant = (*l_element_courant).suivant;
        !           910:        (*l_element_courant).donnee = s_objet_argument_2;
        !           911: 
        !           912:        if (((*l_element_courant).suivant =
        !           913:                allocation_maillon(s_etat_processus)) == NULL)
        !           914:        {
        !           915:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           916:            return;
        !           917:        }
        !           918: 
        !           919:        l_element_courant = (*l_element_courant).suivant;
        !           920:        (*l_element_courant).donnee = s_objet_argument_1;
        !           921: 
        !           922:        if (((*l_element_courant).suivant =
        !           923:                allocation_maillon(s_etat_processus)) == NULL)
        !           924:        {
        !           925:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           926:            return;
        !           927:        }
        !           928: 
        !           929:        l_element_courant = (*l_element_courant).suivant;
        !           930: 
        !           931:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           932:                == NULL)
        !           933:        {
        !           934:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           935:            return;
        !           936:        }
        !           937: 
        !           938:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           939:                .nombre_arguments = 0;
        !           940:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           941:                .fonction = instruction_xor;
        !           942: 
        !           943:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           944:                .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
        !           945:        {
        !           946:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           947:            return;
        !           948:        }
        !           949: 
        !           950:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           951:                .nom_fonction, "EQV");
        !           952: 
        !           953:        if (((*l_element_courant).suivant =
        !           954:                allocation_maillon(s_etat_processus)) == NULL)
        !           955:        {
        !           956:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           957:            return;
        !           958:        }
        !           959: 
        !           960:        l_element_courant = (*l_element_courant).suivant;
        !           961: 
        !           962:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           963:                == NULL)
        !           964:        {
        !           965:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           966:            return;
        !           967:        }
        !           968: 
        !           969:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           970:                .nombre_arguments = 0;
        !           971:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           972:                .fonction = instruction_vers_niveau_inferieur;
        !           973: 
        !           974:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           975:                .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
        !           976:        {
        !           977:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           978:            return;
        !           979:        }
        !           980: 
        !           981:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           982:                .nom_fonction, ">>");
        !           983: 
        !           984:        (*l_element_courant).suivant = NULL;
        !           985: 
        !           986:        s_objet_argument_1 = NULL;
        !           987:        s_objet_argument_2 = NULL;
        !           988:    }
        !           989: 
        !           990:    /*
        !           991:     * Nom ou valeur numérique / Expression
        !           992:     */
        !           993: 
        !           994:    else if ((((*s_objet_argument_1).type == ALG) ||
        !           995:            ((*s_objet_argument_1).type == RPN)) &&
        !           996:            (((*s_objet_argument_2).type == NOM) ||
        !           997:            ((*s_objet_argument_2).type == INT) ||
        !           998:            ((*s_objet_argument_2).type == REL)))
        !           999:    {
        !          1000:        nombre_elements = 0;
        !          1001:        l_element_courant = (struct_liste_chainee *)
        !          1002:                (*s_objet_argument_1).objet;
        !          1003: 
        !          1004:        while(l_element_courant != NULL)
        !          1005:        {
        !          1006:            nombre_elements++;
        !          1007:            l_element_courant = (*l_element_courant).suivant;
        !          1008:        }
        !          1009: 
        !          1010:        if (nombre_elements == 2)
        !          1011:        {
        !          1012:            liberation(s_etat_processus, s_objet_argument_1);
        !          1013:            liberation(s_etat_processus, s_objet_argument_2);
        !          1014: 
        !          1015:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
        !          1016:            return;
        !          1017:        }
        !          1018: 
        !          1019:        if ((s_objet_resultat = copie_objet(s_etat_processus,
        !          1020:                s_objet_argument_1, 'N')) == NULL)
        !          1021:        {
        !          1022:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1023:            return;
        !          1024:        }
        !          1025: 
        !          1026:        l_element_courant = (struct_liste_chainee *)
        !          1027:                (*s_objet_resultat).objet;
        !          1028:        l_element_precedent = l_element_courant;
        !          1029:        l_element_courant = (*l_element_courant).suivant;
        !          1030: 
        !          1031:        if (((*l_element_precedent).suivant = (struct_liste_chainee *)
        !          1032:                allocation_maillon(s_etat_processus)) == NULL)
        !          1033:        {
        !          1034:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1035:            return;
        !          1036:        }
        !          1037: 
        !          1038:        (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
        !          1039:        (*(*l_element_precedent).suivant).suivant = l_element_courant;
        !          1040: 
        !          1041:        while((*l_element_courant).suivant != NULL)
        !          1042:        {
        !          1043:            l_element_precedent = l_element_courant;
        !          1044:            l_element_courant = (*l_element_courant).suivant;
        !          1045:        }
        !          1046: 
        !          1047:        if (((*l_element_precedent).suivant =
        !          1048:                allocation_maillon(s_etat_processus)) == NULL)
        !          1049:        {
        !          1050:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1051:            return;
        !          1052:        }
        !          1053: 
        !          1054:        if (((*(*l_element_precedent).suivant).donnee =
        !          1055:                allocation(s_etat_processus, FCT)) == NULL)
        !          1056:        {
        !          1057:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1058:            return;
        !          1059:        }
        !          1060: 
        !          1061:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !          1062:                .donnee).objet)).nombre_arguments = 0;
        !          1063:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !          1064:                .donnee).objet)).fonction = instruction_xor;
        !          1065: 
        !          1066:        if (((*((struct_fonction *) (*(*(*l_element_precedent)
        !          1067:                .suivant).donnee).objet)).nom_fonction =
        !          1068:                malloc(4 * sizeof(unsigned char))) == NULL)
        !          1069:        {
        !          1070:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1071:            return;
        !          1072:        }
        !          1073: 
        !          1074:        strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
        !          1075:                .suivant).donnee).objet)).nom_fonction, "EQV");
        !          1076: 
        !          1077:        (*(*l_element_precedent).suivant).suivant = l_element_courant;
        !          1078: 
        !          1079:        s_objet_argument_2 = NULL;
        !          1080:    }
        !          1081: 
        !          1082:    /*
        !          1083:     * Expression / Nom ou valeur numérique
        !          1084:     */
        !          1085: 
        !          1086:    else if ((((*s_objet_argument_1).type == NOM) ||
        !          1087:            ((*s_objet_argument_1).type == INT) ||
        !          1088:            ((*s_objet_argument_1).type == REL)) &&
        !          1089:            (((*s_objet_argument_2).type == ALG) ||
        !          1090:            ((*s_objet_argument_2).type == RPN)))
        !          1091:    {
        !          1092:        nombre_elements = 0;
        !          1093:        l_element_courant = (struct_liste_chainee *)
        !          1094:                (*s_objet_argument_2).objet;
        !          1095: 
        !          1096:        while(l_element_courant != NULL)
        !          1097:        {
        !          1098:            nombre_elements++;
        !          1099:            l_element_courant = (*l_element_courant).suivant;
        !          1100:        }
        !          1101: 
        !          1102:        if (nombre_elements == 2)
        !          1103:        {
        !          1104:            liberation(s_etat_processus, s_objet_argument_1);
        !          1105:            liberation(s_etat_processus, s_objet_argument_2);
        !          1106: 
        !          1107:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
        !          1108:            return;
        !          1109:        }
        !          1110: 
        !          1111:        if ((s_objet_resultat = copie_objet(s_etat_processus,
        !          1112:                s_objet_argument_2, 'N')) == NULL)
        !          1113:        {
        !          1114:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1115:            return;
        !          1116:        }
        !          1117: 
        !          1118:        l_element_courant = (struct_liste_chainee *)
        !          1119:                (*s_objet_resultat).objet;
        !          1120:        l_element_precedent = l_element_courant;
        !          1121: 
        !          1122:        while((*l_element_courant).suivant != NULL)
        !          1123:        {
        !          1124:            l_element_precedent = l_element_courant;
        !          1125:            l_element_courant = (*l_element_courant).suivant;
        !          1126:        }
        !          1127: 
        !          1128:        if (((*l_element_precedent).suivant =
        !          1129:                allocation_maillon(s_etat_processus)) == NULL)
        !          1130:        {
        !          1131:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1132:            return;
        !          1133:        }
        !          1134: 
        !          1135:        (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
        !          1136:        l_element_precedent = (*l_element_precedent).suivant;
        !          1137: 
        !          1138:        if (((*l_element_precedent).suivant =
        !          1139:                allocation_maillon(s_etat_processus)) == NULL)
        !          1140:        {
        !          1141:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1142:            return;
        !          1143:        }
        !          1144: 
        !          1145:        if (((*(*l_element_precedent).suivant).donnee =
        !          1146:                allocation(s_etat_processus, FCT)) == NULL)
        !          1147:        {
        !          1148:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1149:            return;
        !          1150:        }
        !          1151: 
        !          1152:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !          1153:                .donnee).objet)).nombre_arguments = 0;
        !          1154:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !          1155:                .donnee).objet)).fonction = instruction_xor;
        !          1156: 
        !          1157:        if (((*((struct_fonction *) (*(*(*l_element_precedent)
        !          1158:                .suivant).donnee).objet)).nom_fonction =
        !          1159:                malloc(4 * sizeof(unsigned char))) == NULL)
        !          1160:        {
        !          1161:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1162:            return;
        !          1163:        }
        !          1164: 
        !          1165:        strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
        !          1166:                .suivant).donnee).objet)).nom_fonction, "EQV");
        !          1167: 
        !          1168:        (*(*l_element_precedent).suivant).suivant = l_element_courant;
        !          1169: 
        !          1170:        s_objet_argument_1 = NULL;
        !          1171:    }
        !          1172: 
        !          1173:    /*
        !          1174:     * Expression / Expression
        !          1175:     */
        !          1176: 
        !          1177:    else if ((((*s_objet_argument_1).type == ALG) &&
        !          1178:            ((*s_objet_argument_2).type == ALG)) ||
        !          1179:            (((*s_objet_argument_1).type == RPN) &&
        !          1180:            ((*s_objet_argument_2).type == RPN)))
        !          1181:    {
        !          1182:        nombre_elements = 0;
        !          1183:        l_element_courant = (struct_liste_chainee *)
        !          1184:                (*s_objet_argument_1).objet;
        !          1185: 
        !          1186:        while(l_element_courant != NULL)
        !          1187:        {
        !          1188:            nombre_elements++;
        !          1189:            l_element_courant = (*l_element_courant).suivant;
        !          1190:        }
        !          1191: 
        !          1192:        if (nombre_elements == 2)
        !          1193:        {
        !          1194:            liberation(s_etat_processus, s_objet_argument_1);
        !          1195:            liberation(s_etat_processus, s_objet_argument_2);
        !          1196: 
        !          1197:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
        !          1198:            return;
        !          1199:        }
        !          1200: 
        !          1201:        nombre_elements = 0;
        !          1202:        l_element_courant = (struct_liste_chainee *)
        !          1203:                (*s_objet_argument_2).objet;
        !          1204: 
        !          1205:        while(l_element_courant != NULL)
        !          1206:        {
        !          1207:            nombre_elements++;
        !          1208:            l_element_courant = (*l_element_courant).suivant;
        !          1209:        }
        !          1210: 
        !          1211:        if (nombre_elements == 2)
        !          1212:        {
        !          1213:            liberation(s_etat_processus, s_objet_argument_1);
        !          1214:            liberation(s_etat_processus, s_objet_argument_2);
        !          1215: 
        !          1216:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
        !          1217:            return;
        !          1218:        }
        !          1219: 
        !          1220:        if ((s_copie_argument_1 = copie_objet(s_etat_processus,
        !          1221:                s_objet_argument_1, 'N')) == NULL)
        !          1222:        {
        !          1223:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1224:            return;
        !          1225:        }
        !          1226: 
        !          1227:        if ((s_copie_argument_2 = copie_objet(s_etat_processus,
        !          1228:                s_objet_argument_2, 'N')) == NULL)
        !          1229:        {
        !          1230:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1231:            return;
        !          1232:        }
        !          1233: 
        !          1234:        l_element_courant = (struct_liste_chainee *)
        !          1235:                (*s_copie_argument_1).objet;
        !          1236:        (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
        !          1237:                (*s_copie_argument_1).objet)).suivant;
        !          1238: 
        !          1239:        liberation(s_etat_processus, (*l_element_courant).donnee);
        !          1240:        free(l_element_courant);
        !          1241: 
        !          1242:        l_element_courant = (struct_liste_chainee *)
        !          1243:                (*s_copie_argument_2).objet;
        !          1244:        l_element_precedent = l_element_courant;
        !          1245:        s_objet_resultat = s_copie_argument_2;
        !          1246: 
        !          1247:        while((*l_element_courant).suivant != NULL)
        !          1248:        {
        !          1249:            l_element_precedent = l_element_courant;
        !          1250:            l_element_courant = (*l_element_courant).suivant;
        !          1251:        }
        !          1252: 
        !          1253:        liberation(s_etat_processus, (*l_element_courant).donnee);
        !          1254:        free(l_element_courant);
        !          1255: 
        !          1256:        (*l_element_precedent).suivant = (struct_liste_chainee *)
        !          1257:                (*s_copie_argument_1).objet;
        !          1258:        free(s_copie_argument_1);
        !          1259: 
        !          1260:        l_element_courant = (*l_element_precedent).suivant;
        !          1261:        while((*l_element_courant).suivant != NULL)
        !          1262:        {
        !          1263:            l_element_precedent = l_element_courant;
        !          1264:            l_element_courant = (*l_element_courant).suivant;
        !          1265:        }
        !          1266: 
        !          1267:        if (((*l_element_precedent).suivant =
        !          1268:                allocation_maillon(s_etat_processus)) == NULL)
        !          1269:        {
        !          1270:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1271:            return;
        !          1272:        }
        !          1273: 
        !          1274:        (*(*l_element_precedent).suivant).suivant = l_element_courant;
        !          1275:        l_element_courant = (*l_element_precedent).suivant;
        !          1276: 
        !          1277:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !          1278:                == NULL)
        !          1279:        {
        !          1280:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1281:            return;
        !          1282:        }
        !          1283: 
        !          1284:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !          1285:                .nombre_arguments = 0;
        !          1286:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !          1287:                .fonction = instruction_xor;
        !          1288: 
        !          1289:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !          1290:                .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
        !          1291:        {
        !          1292:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !          1293:            return;
        !          1294:        }
        !          1295: 
        !          1296:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !          1297:                .nom_fonction, "EQV");
        !          1298:    }
        !          1299: 
        !          1300: /*
        !          1301: --------------------------------------------------------------------------------
        !          1302:   EQV impossible
        !          1303: --------------------------------------------------------------------------------
        !          1304: */
        !          1305: 
        !          1306:    else
        !          1307:    {
        !          1308:        liberation(s_etat_processus, s_objet_argument_1);
        !          1309:        liberation(s_etat_processus, s_objet_argument_2);
        !          1310: 
        !          1311:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
        !          1312:        return;
        !          1313:    }
        !          1314: 
        !          1315:    liberation(s_etat_processus, s_objet_argument_1);
        !          1316:    liberation(s_etat_processus, s_objet_argument_2);
        !          1317: 
        !          1318:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
        !          1319:            s_objet_resultat) == d_erreur)
        !          1320:    {
        !          1321:        return;
        !          1322:    }
        !          1323: 
        !          1324:    return;
        !          1325: }
        !          1326: 
1.1       bertrand 1327: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>