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

CVSweb interface <joel.bertrand@systella.fr>