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

1.1     ! bertrand    1: /*
        !             2: ================================================================================
        !             3:   RPL/2 (R) version 4.0.9
        !             4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
        !             5: 
        !             6:   This file is part of RPL/2.
        !             7: 
        !             8:   RPL/2 is free software; you can redistribute it and/or modify it
        !             9:   under the terms of the CeCILL V2 License as published by the french
        !            10:   CEA, CNRS and INRIA.
        !            11:  
        !            12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
        !            13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
        !            14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
        !            15:   for more details.
        !            16:  
        !            17:   You should have received a copy of the CeCILL License
        !            18:   along with RPL/2. If not, write to info@cecill.info.
        !            19: ================================================================================
        !            20: */
        !            21: 
        !            22: 
        !            23: #include "rpl.conv.h"
        !            24: 
        !            25: 
        !            26: /*
        !            27: ================================================================================
        !            28:   Fonction 'xor'
        !            29: ================================================================================
        !            30:   Entrées : pointeur sur une structure struct_processus
        !            31: --------------------------------------------------------------------------------
        !            32:   Sorties :
        !            33: --------------------------------------------------------------------------------
        !            34:   Effets de bord : néant
        !            35: ================================================================================
        !            36: */
        !            37: 
        !            38: void
        !            39: instruction_xor(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_argument_1;
        !            45:    struct_objet                *s_copie_argument_2;
        !            46:    struct_objet                *s_objet_argument_1;
        !            47:    struct_objet                *s_objet_argument_2;
        !            48:    struct_objet                *s_objet_resultat;
        !            49: 
        !            50:    unsigned long               nombre_elements;
        !            51: 
        !            52:    (*s_etat_processus).erreur_execution = d_ex;
        !            53: 
        !            54:    if ((*s_etat_processus).affichage_arguments == 'Y')
        !            55:    {
        !            56:        printf("\n  XOR ");
        !            57: 
        !            58:        if ((*s_etat_processus).langue == 'F')
        !            59:        {
        !            60:            printf("(opérateur ou exclusif)\n\n");
        !            61:        }
        !            62:        else
        !            63:        {
        !            64:            printf("(exclusive or operator)\n\n");
        !            65:        }
        !            66: 
        !            67:        printf("    2: %s, %s\n", d_INT, d_REL);
        !            68:        printf("    1: %s, %s\n", d_INT, d_REL);
        !            69:        printf("->  1: %s\n\n", d_INT);
        !            70: 
        !            71:        printf("    2: %s\n", d_BIN);
        !            72:        printf("    1: %s\n", d_BIN);
        !            73:        printf("->  1: %s\n\n", d_BIN);
        !            74: 
        !            75:        printf("    2: %s\n", d_NOM);
        !            76:        printf("    1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
        !            77:        printf("->  1: %s\n\n", d_ALG);
        !            78: 
        !            79:        printf("    2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
        !            80:        printf("    1: %s\n", d_NOM);
        !            81:        printf("->  1: %s\n\n", d_ALG);
        !            82: 
        !            83:        printf("    2: %s\n", d_ALG);
        !            84:        printf("    1: %s\n", d_ALG);
        !            85:        printf("->  1: %s\n\n", d_ALG);
        !            86: 
        !            87:        printf("    2: %s\n", d_RPN);
        !            88:        printf("    1: %s\n", d_RPN);
        !            89:        printf("->  1: %s\n", d_RPN);
        !            90: 
        !            91:        return;
        !            92:    }
        !            93:    else if ((*s_etat_processus).test_instruction == 'Y')
        !            94:    {
        !            95:        (*s_etat_processus).nombre_arguments = 0;
        !            96:        return;
        !            97:    }
        !            98:    
        !            99:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
        !           100:    {
        !           101:        if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
        !           102:        {
        !           103:            return;
        !           104:        }
        !           105:    }
        !           106: 
        !           107:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
        !           108:            &s_objet_argument_1) == d_erreur)
        !           109:    {
        !           110:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
        !           111:        return;
        !           112:    }
        !           113: 
        !           114:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
        !           115:            &s_objet_argument_2) == d_erreur)
        !           116:    {
        !           117:        liberation(s_etat_processus, s_objet_argument_1);
        !           118: 
        !           119:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
        !           120:        return;
        !           121:    }
        !           122: 
        !           123: /*
        !           124: --------------------------------------------------------------------------------
        !           125:   XOR logique
        !           126: --------------------------------------------------------------------------------
        !           127: */
        !           128: 
        !           129:    if ((((*s_objet_argument_1).type == INT) ||
        !           130:            ((*s_objet_argument_1).type == REL)) &&
        !           131:            (((*s_objet_argument_2).type == INT) ||
        !           132:            ((*s_objet_argument_2).type == REL)))
        !           133:    {
        !           134:        if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
        !           135:        {
        !           136:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           137:            return;
        !           138:        }
        !           139: 
        !           140:        if ((*s_objet_argument_1).type == INT)
        !           141:        {
        !           142:            if ((*s_objet_argument_2).type == INT)
        !           143:            {
        !           144:                if ((((*((integer8 *) (*s_objet_argument_1).objet)) == 0) &&
        !           145:                        ((*((integer8 *) (*s_objet_argument_2).objet)) != 0))
        !           146:                        || (((*((integer8 *) (*s_objet_argument_1).objet))
        !           147:                        != 0) && ((*((integer8 *) (*s_objet_argument_2).objet))
        !           148:                        != 0)))
        !           149:                {
        !           150:                    (*((integer8 *) (*s_objet_resultat).objet)) = -1;
        !           151:                }
        !           152:                else
        !           153:                {
        !           154:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
        !           155:                }
        !           156:            }
        !           157:            else
        !           158:            {
        !           159:                if ((((*((integer8 *) (*s_objet_argument_1).objet)) == 0) &&
        !           160:                        ((*((real8 *) (*s_objet_argument_2).objet)) != 0))
        !           161:                        || (((*((integer8 *) (*s_objet_argument_1).objet))
        !           162:                        != 0) && ((*((real8 *) (*s_objet_argument_2).objet))
        !           163:                        != 0)))
        !           164:                {
        !           165:                    (*((integer8 *) (*s_objet_resultat).objet)) = -1;
        !           166:                }
        !           167:                else
        !           168:                {
        !           169:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
        !           170:                }
        !           171:            }
        !           172:        }
        !           173:        else
        !           174:        {
        !           175:            if ((*s_objet_argument_2).type == INT)
        !           176:            {
        !           177:                if ((((*((real8 *) (*s_objet_argument_1).objet)) == 0) &&
        !           178:                        ((*((integer8 *) (*s_objet_argument_2).objet)) != 0))
        !           179:                        || (((*((real8 *) (*s_objet_argument_1).objet))
        !           180:                        != 0) && ((*((integer8 *) (*s_objet_argument_2).objet))
        !           181:                        != 0)))
        !           182:                {
        !           183:                    (*((integer8 *) (*s_objet_resultat).objet)) = -1;
        !           184:                }
        !           185:                else
        !           186:                {
        !           187:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
        !           188:                }
        !           189:            }
        !           190:            else
        !           191:            {
        !           192:                if ((((*((real8 *) (*s_objet_argument_1).objet)) == 0) &&
        !           193:                        ((*((real8 *) (*s_objet_argument_2).objet)) != 0))
        !           194:                        || (((*((real8 *) (*s_objet_argument_1).objet))
        !           195:                        != 0) && ((*((real8 *) (*s_objet_argument_2).objet))
        !           196:                        != 0)))
        !           197:                {
        !           198:                    (*((integer8 *) (*s_objet_resultat).objet)) = -1;
        !           199:                }
        !           200:                else
        !           201:                {
        !           202:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
        !           203:                }
        !           204:            }
        !           205:        }
        !           206:    }
        !           207: 
        !           208: /*
        !           209: --------------------------------------------------------------------------------
        !           210:   XOR binaire
        !           211: --------------------------------------------------------------------------------
        !           212: */
        !           213: 
        !           214:    else if (((*s_objet_argument_1).type == BIN) &&
        !           215:            ((*s_objet_argument_2).type == BIN))
        !           216:    {
        !           217:        if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL)
        !           218:        {
        !           219:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           220:            return;
        !           221:        }
        !           222: 
        !           223:        (*((logical8 *) (*s_objet_resultat).objet)) = 
        !           224:                (*((logical8 *) (*s_objet_argument_1).objet)) ^
        !           225:                (*((logical8 *) (*s_objet_argument_2).objet));
        !           226:    }
        !           227: 
        !           228: /*
        !           229: --------------------------------------------------------------------------------
        !           230:    XOR entre des arguments complexes
        !           231: --------------------------------------------------------------------------------
        !           232: */
        !           233: 
        !           234:    /*
        !           235:     * Nom ou valeur numérique / Nom ou valeur numérique
        !           236:     */
        !           237: 
        !           238:    else if ((((*s_objet_argument_1).type == NOM) &&
        !           239:            (((*s_objet_argument_2).type == NOM) ||
        !           240:            ((*s_objet_argument_2).type == INT) ||
        !           241:            ((*s_objet_argument_2).type == REL))) ||
        !           242:            (((*s_objet_argument_2).type == NOM) &&
        !           243:            (((*s_objet_argument_1).type == INT) ||
        !           244:            ((*s_objet_argument_1).type == REL))))
        !           245:    {
        !           246:        if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
        !           247:        {
        !           248:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           249:            return;
        !           250:        }
        !           251: 
        !           252:        if (((*s_objet_resultat).objet =
        !           253:                allocation_maillon(s_etat_processus)) == NULL)
        !           254:        {
        !           255:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           256:            return;
        !           257:        }
        !           258: 
        !           259:        l_element_courant = (*s_objet_resultat).objet;
        !           260: 
        !           261:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           262:                == NULL)
        !           263:        {
        !           264:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           265:            return;
        !           266:        }
        !           267: 
        !           268:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           269:                .nombre_arguments = 0;
        !           270:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           271:                .fonction = instruction_vers_niveau_superieur;
        !           272: 
        !           273:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           274:                .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
        !           275:        {
        !           276:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           277:            return;
        !           278:        }
        !           279: 
        !           280:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           281:                .nom_fonction, "<<");
        !           282: 
        !           283:        if (((*l_element_courant).suivant =
        !           284:                allocation_maillon(s_etat_processus)) == NULL)
        !           285:        {
        !           286:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           287:            return;
        !           288:        }
        !           289: 
        !           290:        l_element_courant = (*l_element_courant).suivant;
        !           291:        (*l_element_courant).donnee = s_objet_argument_2;
        !           292: 
        !           293:        if (((*l_element_courant).suivant =
        !           294:                allocation_maillon(s_etat_processus)) == NULL)
        !           295:        {
        !           296:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           297:            return;
        !           298:        }
        !           299: 
        !           300:        l_element_courant = (*l_element_courant).suivant;
        !           301:        (*l_element_courant).donnee = s_objet_argument_1;
        !           302: 
        !           303:        if (((*l_element_courant).suivant =
        !           304:                allocation_maillon(s_etat_processus)) == NULL)
        !           305:        {
        !           306:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           307:            return;
        !           308:        }
        !           309: 
        !           310:        l_element_courant = (*l_element_courant).suivant;
        !           311: 
        !           312:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           313:                == NULL)
        !           314:        {
        !           315:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           316:            return;
        !           317:        }
        !           318: 
        !           319:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           320:                .nombre_arguments = 0;
        !           321:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           322:                .fonction = instruction_xor;
        !           323: 
        !           324:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           325:                .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
        !           326:        {
        !           327:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           328:            return;
        !           329:        }
        !           330: 
        !           331:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           332:                .nom_fonction, "XOR");
        !           333: 
        !           334:        if (((*l_element_courant).suivant =
        !           335:                allocation_maillon(s_etat_processus)) == NULL)
        !           336:        {
        !           337:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           338:            return;
        !           339:        }
        !           340: 
        !           341:        l_element_courant = (*l_element_courant).suivant;
        !           342: 
        !           343:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           344:                == NULL)
        !           345:        {
        !           346:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           347:            return;
        !           348:        }
        !           349: 
        !           350:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           351:                .nombre_arguments = 0;
        !           352:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           353:                .fonction = instruction_vers_niveau_inferieur;
        !           354: 
        !           355:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           356:                .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
        !           357:        {
        !           358:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           359:            return;
        !           360:        }
        !           361: 
        !           362:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           363:                .nom_fonction, ">>");
        !           364: 
        !           365:        (*l_element_courant).suivant = NULL;
        !           366: 
        !           367:        s_objet_argument_1 = NULL;
        !           368:        s_objet_argument_2 = NULL;
        !           369:    }
        !           370: 
        !           371:    /*
        !           372:     * Nom ou valeur numérique / Expression
        !           373:     */
        !           374: 
        !           375:    else if ((((*s_objet_argument_1).type == ALG) ||
        !           376:            ((*s_objet_argument_1).type == RPN)) &&
        !           377:            (((*s_objet_argument_2).type == NOM) ||
        !           378:            ((*s_objet_argument_2).type == INT) ||
        !           379:            ((*s_objet_argument_2).type == REL)))
        !           380:    {
        !           381:        nombre_elements = 0;
        !           382:        l_element_courant = (struct_liste_chainee *)
        !           383:                (*s_objet_argument_1).objet;
        !           384: 
        !           385:        while(l_element_courant != NULL)
        !           386:        {
        !           387:            nombre_elements++;
        !           388:            l_element_courant = (*l_element_courant).suivant;
        !           389:        }
        !           390: 
        !           391:        if (nombre_elements == 2)
        !           392:        {
        !           393:            liberation(s_etat_processus, s_objet_argument_1);
        !           394:            liberation(s_etat_processus, s_objet_argument_2);
        !           395: 
        !           396:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
        !           397:            return;
        !           398:        }
        !           399: 
        !           400:        if ((s_objet_resultat = copie_objet(s_etat_processus,
        !           401:                s_objet_argument_1, 'N')) == NULL)
        !           402:        {
        !           403:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           404:            return;
        !           405:        }
        !           406: 
        !           407:        l_element_courant = (struct_liste_chainee *)
        !           408:                (*s_objet_resultat).objet;
        !           409:        l_element_precedent = l_element_courant;
        !           410:        l_element_courant = (*l_element_courant).suivant;
        !           411: 
        !           412:        if (((*l_element_precedent).suivant = (struct_liste_chainee *)
        !           413:                allocation_maillon(s_etat_processus)) == NULL)
        !           414:        {
        !           415:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           416:            return;
        !           417:        }
        !           418: 
        !           419:        (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
        !           420:        (*(*l_element_precedent).suivant).suivant = l_element_courant;
        !           421: 
        !           422:        while((*l_element_courant).suivant != NULL)
        !           423:        {
        !           424:            l_element_precedent = l_element_courant;
        !           425:            l_element_courant = (*l_element_courant).suivant;
        !           426:        }
        !           427: 
        !           428:        if (((*l_element_precedent).suivant =
        !           429:                allocation_maillon(s_etat_processus)) == NULL)
        !           430:        {
        !           431:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           432:            return;
        !           433:        }
        !           434: 
        !           435:        if (((*(*l_element_precedent).suivant).donnee =
        !           436:                allocation(s_etat_processus, FCT)) == NULL)
        !           437:        {
        !           438:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           439:            return;
        !           440:        }
        !           441: 
        !           442:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !           443:                .donnee).objet)).nombre_arguments = 0;
        !           444:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !           445:                .donnee).objet)).fonction = instruction_xor;
        !           446: 
        !           447:        if (((*((struct_fonction *) (*(*(*l_element_precedent)
        !           448:                .suivant).donnee).objet)).nom_fonction =
        !           449:                malloc(4 * sizeof(unsigned char))) == NULL)
        !           450:        {
        !           451:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           452:            return;
        !           453:        }
        !           454: 
        !           455:        strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
        !           456:                .suivant).donnee).objet)).nom_fonction, "XOR");
        !           457: 
        !           458:        (*(*l_element_precedent).suivant).suivant = l_element_courant;
        !           459: 
        !           460:        s_objet_argument_2 = NULL;
        !           461:    }
        !           462: 
        !           463:    /*
        !           464:     * Expression / Nom ou valeur numérique
        !           465:     */
        !           466: 
        !           467:    else if ((((*s_objet_argument_1).type == NOM) ||
        !           468:            ((*s_objet_argument_1).type == INT) ||
        !           469:            ((*s_objet_argument_1).type == REL)) &&
        !           470:            (((*s_objet_argument_2).type == ALG) ||
        !           471:            ((*s_objet_argument_2).type == RPN)))
        !           472:    {
        !           473:        nombre_elements = 0;
        !           474:        l_element_courant = (struct_liste_chainee *)
        !           475:                (*s_objet_argument_2).objet;
        !           476: 
        !           477:        while(l_element_courant != NULL)
        !           478:        {
        !           479:            nombre_elements++;
        !           480:            l_element_courant = (*l_element_courant).suivant;
        !           481:        }
        !           482: 
        !           483:        if (nombre_elements == 2)
        !           484:        {
        !           485:            liberation(s_etat_processus, s_objet_argument_1);
        !           486:            liberation(s_etat_processus, s_objet_argument_2);
        !           487: 
        !           488:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
        !           489:            return;
        !           490:        }
        !           491: 
        !           492:        if ((s_objet_resultat = copie_objet(s_etat_processus,
        !           493:                s_objet_argument_2, 'N')) == NULL)
        !           494:        {
        !           495:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           496:            return;
        !           497:        }
        !           498: 
        !           499:        l_element_courant = (struct_liste_chainee *)
        !           500:                (*s_objet_resultat).objet;
        !           501:        l_element_precedent = l_element_courant;
        !           502: 
        !           503:        while((*l_element_courant).suivant != NULL)
        !           504:        {
        !           505:            l_element_precedent = l_element_courant;
        !           506:            l_element_courant = (*l_element_courant).suivant;
        !           507:        }
        !           508: 
        !           509:        if (((*l_element_precedent).suivant =
        !           510:                allocation_maillon(s_etat_processus)) == NULL)
        !           511:        {
        !           512:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           513:            return;
        !           514:        }
        !           515: 
        !           516:        (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
        !           517:        l_element_precedent = (*l_element_precedent).suivant;
        !           518: 
        !           519:        if (((*l_element_precedent).suivant =
        !           520:                allocation_maillon(s_etat_processus)) == NULL)
        !           521:        {
        !           522:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           523:            return;
        !           524:        }
        !           525: 
        !           526:        if (((*(*l_element_precedent).suivant).donnee =
        !           527:                allocation(s_etat_processus, FCT)) == NULL)
        !           528:        {
        !           529:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           530:            return;
        !           531:        }
        !           532: 
        !           533:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !           534:                .donnee).objet)).nombre_arguments = 0;
        !           535:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !           536:                .donnee).objet)).fonction = instruction_xor;
        !           537: 
        !           538:        if (((*((struct_fonction *) (*(*(*l_element_precedent)
        !           539:                .suivant).donnee).objet)).nom_fonction =
        !           540:                malloc(4 * sizeof(unsigned char))) == NULL)
        !           541:        {
        !           542:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           543:            return;
        !           544:        }
        !           545: 
        !           546:        strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
        !           547:                .suivant).donnee).objet)).nom_fonction, "XOR");
        !           548: 
        !           549:        (*(*l_element_precedent).suivant).suivant = l_element_courant;
        !           550: 
        !           551:        s_objet_argument_1 = NULL;
        !           552:    }
        !           553: 
        !           554:    /*
        !           555:     * Expression / Expression
        !           556:     */
        !           557: 
        !           558:    else if ((((*s_objet_argument_1).type == ALG) &&
        !           559:            ((*s_objet_argument_2).type == ALG)) ||
        !           560:            (((*s_objet_argument_1).type == RPN) &&
        !           561:            ((*s_objet_argument_2).type == RPN)))
        !           562:    {
        !           563:        nombre_elements = 0;
        !           564:        l_element_courant = (struct_liste_chainee *)
        !           565:                (*s_objet_argument_1).objet;
        !           566: 
        !           567:        while(l_element_courant != NULL)
        !           568:        {
        !           569:            nombre_elements++;
        !           570:            l_element_courant = (*l_element_courant).suivant;
        !           571:        }
        !           572: 
        !           573:        if (nombre_elements == 2)
        !           574:        {
        !           575:            liberation(s_etat_processus, s_objet_argument_1);
        !           576:            liberation(s_etat_processus, s_objet_argument_2);
        !           577: 
        !           578:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
        !           579:            return;
        !           580:        }
        !           581: 
        !           582:        nombre_elements = 0;
        !           583:        l_element_courant = (struct_liste_chainee *)
        !           584:                (*s_objet_argument_2).objet;
        !           585: 
        !           586:        while(l_element_courant != NULL)
        !           587:        {
        !           588:            nombre_elements++;
        !           589:            l_element_courant = (*l_element_courant).suivant;
        !           590:        }
        !           591: 
        !           592:        if (nombre_elements == 2)
        !           593:        {
        !           594:            liberation(s_etat_processus, s_objet_argument_1);
        !           595:            liberation(s_etat_processus, s_objet_argument_2);
        !           596: 
        !           597:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
        !           598:            return;
        !           599:        }
        !           600: 
        !           601:        if ((s_copie_argument_1 = copie_objet(s_etat_processus,
        !           602:                s_objet_argument_1, 'N')) == NULL)
        !           603:        {
        !           604:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           605:            return;
        !           606:        }
        !           607: 
        !           608:        if ((s_copie_argument_2 = copie_objet(s_etat_processus,
        !           609:                s_objet_argument_2, 'N')) == NULL)
        !           610:        {
        !           611:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           612:            return;
        !           613:        }
        !           614: 
        !           615:        l_element_courant = (struct_liste_chainee *)
        !           616:                (*s_copie_argument_1).objet;
        !           617:        (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
        !           618:                (*s_copie_argument_1).objet)).suivant;
        !           619: 
        !           620:        liberation(s_etat_processus, (*l_element_courant).donnee);
        !           621:        free(l_element_courant);
        !           622: 
        !           623:        l_element_courant = (struct_liste_chainee *)
        !           624:                (*s_copie_argument_2).objet;
        !           625:        l_element_precedent = l_element_courant;
        !           626:        s_objet_resultat = s_copie_argument_2;
        !           627: 
        !           628:        while((*l_element_courant).suivant != NULL)
        !           629:        {
        !           630:            l_element_precedent = l_element_courant;
        !           631:            l_element_courant = (*l_element_courant).suivant;
        !           632:        }
        !           633: 
        !           634:        liberation(s_etat_processus, (*l_element_courant).donnee);
        !           635:        free(l_element_courant);
        !           636: 
        !           637:        (*l_element_precedent).suivant = (struct_liste_chainee *)
        !           638:                (*s_copie_argument_1).objet;
        !           639:        free(s_copie_argument_1);
        !           640: 
        !           641:        l_element_courant = (*l_element_precedent).suivant;
        !           642:        while((*l_element_courant).suivant != NULL)
        !           643:        {
        !           644:            l_element_precedent = l_element_courant;
        !           645:            l_element_courant = (*l_element_courant).suivant;
        !           646:        }
        !           647: 
        !           648:        if (((*l_element_precedent).suivant =
        !           649:                allocation_maillon(s_etat_processus)) == NULL)
        !           650:        {
        !           651:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           652:            return;
        !           653:        }
        !           654: 
        !           655:        (*(*l_element_precedent).suivant).suivant = l_element_courant;
        !           656:        l_element_courant = (*l_element_precedent).suivant;
        !           657: 
        !           658:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           659:                == NULL)
        !           660:        {
        !           661:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           662:            return;
        !           663:        }
        !           664: 
        !           665:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           666:                .nombre_arguments = 0;
        !           667:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           668:                .fonction = instruction_xor;
        !           669: 
        !           670:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           671:                .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
        !           672:        {
        !           673:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           674:            return;
        !           675:        }
        !           676: 
        !           677:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           678:                .nom_fonction, "XOR");
        !           679:    }
        !           680: 
        !           681: /*
        !           682: --------------------------------------------------------------------------------
        !           683:   XOR impossible
        !           684: --------------------------------------------------------------------------------
        !           685: */
        !           686: 
        !           687:    else
        !           688:    {
        !           689:        liberation(s_etat_processus, s_objet_argument_1);
        !           690:        liberation(s_etat_processus, s_objet_argument_2);
        !           691: 
        !           692:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
        !           693:        return;
        !           694:    }
        !           695: 
        !           696:    liberation(s_etat_processus, s_objet_argument_1);
        !           697:    liberation(s_etat_processus, s_objet_argument_2);
        !           698: 
        !           699:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
        !           700:            s_objet_resultat) == d_erreur)
        !           701:    {
        !           702:        return;
        !           703:    }
        !           704: 
        !           705:    return;
        !           706: }
        !           707: 
        !           708: 
        !           709: /*
        !           710: ================================================================================
        !           711:   Fonction 'xpon'
        !           712: ================================================================================
        !           713:   Entrées :
        !           714: --------------------------------------------------------------------------------
        !           715:   Sorties :
        !           716: --------------------------------------------------------------------------------
        !           717:   Effets de bord : néant
        !           718: ================================================================================
        !           719: */
        !           720: 
        !           721: void
        !           722: instruction_xpon(struct_processus *s_etat_processus)
        !           723: {
        !           724:    struct_liste_chainee                *l_element_courant;
        !           725:    struct_liste_chainee                *l_element_precedent;
        !           726: 
        !           727:    struct_objet                        *s_copie_argument;
        !           728:    struct_objet                        *s_objet_argument;
        !           729:    struct_objet                        *s_objet_resultat;
        !           730: 
        !           731:    (*s_etat_processus).erreur_execution = d_ex;
        !           732: 
        !           733:    if ((*s_etat_processus).affichage_arguments == 'Y')
        !           734:    {
        !           735:        printf("\n  XPON ");
        !           736: 
        !           737:        if ((*s_etat_processus).langue == 'F')
        !           738:        {
        !           739:            printf("(exposant)\n\n");
        !           740:        }
        !           741:        else
        !           742:        {
        !           743:            printf("(exponant)\n\n");
        !           744:        }
        !           745: 
        !           746:        printf("    1: %s, %s\n", d_INT, d_REL);
        !           747:        printf("->  1: %s\n\n", d_INT);
        !           748: 
        !           749:        printf("    1: %s, %s\n", d_NOM, d_ALG);
        !           750:        printf("->  1: %s\n\n", d_ALG);
        !           751: 
        !           752:        printf("    1: %s\n", d_RPN);
        !           753:        printf("->  1: %s\n", d_RPN);
        !           754: 
        !           755:        return;
        !           756:    }
        !           757:    else if ((*s_etat_processus).test_instruction == 'Y')
        !           758:    {
        !           759:        (*s_etat_processus).nombre_arguments = 1;
        !           760:        return;
        !           761:    }
        !           762:    
        !           763:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
        !           764:    {
        !           765:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
        !           766:        {
        !           767:            return;
        !           768:        }
        !           769:    }
        !           770: 
        !           771:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
        !           772:            &s_objet_argument) == d_erreur)
        !           773:    {
        !           774:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
        !           775:        return;
        !           776:    }
        !           777: 
        !           778: /*
        !           779: --------------------------------------------------------------------------------
        !           780:   Exposant d'un entier
        !           781: --------------------------------------------------------------------------------
        !           782: */
        !           783: 
        !           784:    if ((*s_objet_argument).type == INT)
        !           785:    {
        !           786:        if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
        !           787:        {
        !           788:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           789:            return;
        !           790:        }
        !           791: 
        !           792:        (*((integer8 *) (*s_objet_resultat).objet)) = (integer8)
        !           793:                floor(log10((*((integer8 *) (*s_objet_argument).objet))));
        !           794:    }
        !           795: 
        !           796: /*
        !           797: --------------------------------------------------------------------------------
        !           798:   Exposant d'un réel
        !           799: --------------------------------------------------------------------------------
        !           800: */
        !           801: 
        !           802:    else if ((*s_objet_argument).type == REL)
        !           803:    {
        !           804:        if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
        !           805:        {
        !           806:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           807:            return;
        !           808:        }
        !           809: 
        !           810:        (*((integer8 *) (*s_objet_resultat).objet)) = (integer8)
        !           811:                floor(log10((*((real8 *) (*s_objet_argument).objet))));
        !           812:    }
        !           813: 
        !           814: /*
        !           815: --------------------------------------------------------------------------------
        !           816:   Exposant d'un nom
        !           817: --------------------------------------------------------------------------------
        !           818: */
        !           819: 
        !           820:    else if ((*s_objet_argument).type == NOM)
        !           821:    {
        !           822:        if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
        !           823:        {
        !           824:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           825:            return;
        !           826:        }
        !           827: 
        !           828:        if (((*s_objet_resultat).objet =
        !           829:                allocation_maillon(s_etat_processus)) == NULL)
        !           830:        {
        !           831:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           832:            return;
        !           833:        }
        !           834: 
        !           835:        l_element_courant = (*s_objet_resultat).objet;
        !           836: 
        !           837:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           838:                == NULL)
        !           839:        {
        !           840:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           841:            return;
        !           842:        }
        !           843: 
        !           844:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           845:                .nombre_arguments = 0;
        !           846:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           847:                .fonction = instruction_vers_niveau_superieur;
        !           848: 
        !           849:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           850:                .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
        !           851:        {
        !           852:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           853:            return;
        !           854:        }
        !           855: 
        !           856:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           857:                .nom_fonction, "<<");
        !           858: 
        !           859:        if (((*l_element_courant).suivant =
        !           860:                allocation_maillon(s_etat_processus)) == NULL)
        !           861:        {
        !           862:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           863:            return;
        !           864:        }
        !           865: 
        !           866:        l_element_courant = (*l_element_courant).suivant;
        !           867:        (*l_element_courant).donnee = s_objet_argument;
        !           868: 
        !           869:        if (((*l_element_courant).suivant =
        !           870:                allocation_maillon(s_etat_processus)) == NULL)
        !           871:        {
        !           872:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           873:            return;
        !           874:        }
        !           875: 
        !           876:        l_element_courant = (*l_element_courant).suivant;
        !           877: 
        !           878:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           879:                == NULL)
        !           880:        {
        !           881:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           882:            return;
        !           883:        }
        !           884: 
        !           885:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           886:                .nombre_arguments = 1;
        !           887:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           888:                .fonction = instruction_xpon;
        !           889: 
        !           890:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           891:                .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
        !           892:        {
        !           893:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           894:            return;
        !           895:        }
        !           896: 
        !           897:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           898:                .nom_fonction, "XPON");
        !           899: 
        !           900:        if (((*l_element_courant).suivant =
        !           901:                allocation_maillon(s_etat_processus)) == NULL)
        !           902:        {
        !           903:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           904:            return;
        !           905:        }
        !           906: 
        !           907:        l_element_courant = (*l_element_courant).suivant;
        !           908: 
        !           909:        if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
        !           910:                == NULL)
        !           911:        {
        !           912:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           913:            return;
        !           914:        }
        !           915: 
        !           916:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           917:                .nombre_arguments = 0;
        !           918:        (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           919:                .fonction = instruction_vers_niveau_inferieur;
        !           920: 
        !           921:        if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           922:                .nom_fonction = malloc(3 *
        !           923:                sizeof(unsigned char))) == NULL)
        !           924:        {
        !           925:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           926:            return;
        !           927:        }
        !           928: 
        !           929:        strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
        !           930:                .nom_fonction, ">>");
        !           931: 
        !           932:        (*l_element_courant).suivant = NULL;
        !           933:        s_objet_argument = NULL;
        !           934:    }
        !           935: 
        !           936: /*
        !           937: --------------------------------------------------------------------------------
        !           938:   Exposant d'une expression
        !           939: --------------------------------------------------------------------------------
        !           940: */
        !           941: 
        !           942:    else if (((*s_objet_argument).type == ALG) ||
        !           943:            ((*s_objet_argument).type == RPN))
        !           944:    {
        !           945:        if ((s_copie_argument = copie_objet(s_etat_processus, s_objet_argument,
        !           946:                'N')) == NULL)
        !           947:        {
        !           948:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           949:            return;
        !           950:        }
        !           951: 
        !           952:        l_element_courant = (struct_liste_chainee *)
        !           953:                (*s_copie_argument).objet;
        !           954:        l_element_precedent = l_element_courant;
        !           955: 
        !           956:        while((*l_element_courant).suivant != NULL)
        !           957:        {
        !           958:            l_element_precedent = l_element_courant;
        !           959:            l_element_courant = (*l_element_courant).suivant;
        !           960:        }
        !           961: 
        !           962:        if (((*l_element_precedent).suivant =
        !           963:                allocation_maillon(s_etat_processus)) == NULL)
        !           964:        {
        !           965:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           966:            return;
        !           967:        }
        !           968: 
        !           969:        if (((*(*l_element_precedent).suivant).donnee =
        !           970:                allocation(s_etat_processus, FCT)) == NULL)
        !           971:        {
        !           972:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           973:            return;
        !           974:        }
        !           975: 
        !           976:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !           977:                .donnee).objet)).nombre_arguments = 1;
        !           978:        (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
        !           979:                .donnee).objet)).fonction = instruction_xpon;
        !           980: 
        !           981:        if (((*((struct_fonction *) (*(*(*l_element_precedent)
        !           982:                .suivant).donnee).objet)).nom_fonction =
        !           983:                malloc(5 * sizeof(unsigned char))) == NULL)
        !           984:        {
        !           985:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           986:            return;
        !           987:        }
        !           988: 
        !           989:        strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
        !           990:                .suivant).donnee).objet)).nom_fonction, "XPON");
        !           991: 
        !           992:        (*(*l_element_precedent).suivant).suivant = l_element_courant;
        !           993: 
        !           994:        s_objet_resultat = s_copie_argument;
        !           995:    }
        !           996: 
        !           997: /*
        !           998: --------------------------------------------------------------------------------
        !           999:   Fonction exposant impossible à réaliser
        !          1000: --------------------------------------------------------------------------------
        !          1001: */
        !          1002: 
        !          1003:    else
        !          1004:    {
        !          1005:        liberation(s_etat_processus, s_objet_argument);
        !          1006: 
        !          1007:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
        !          1008:        return;
        !          1009:    }
        !          1010: 
        !          1011:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
        !          1012:            s_objet_resultat) == d_erreur)
        !          1013:    {
        !          1014:        return;
        !          1015:    }
        !          1016: 
        !          1017:    liberation(s_etat_processus, s_objet_argument);
        !          1018: 
        !          1019:    return;
        !          1020: }
        !          1021: 
        !          1022: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>