Annotation of rpl/src/instructions_g4.c, revision 1.5

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

CVSweb interface <joel.bertrand@systella.fr>