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

1.1       bertrand    1: /*
                      2: ================================================================================
1.4       bertrand    3:   RPL/2 (R) version 4.0.12
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 'delete'
                     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_delete(struct_processus *s_etat_processus)
                     40: {
                     41:    file                        *fichier;
                     42: 
                     43:    logical1                    erreur;
                     44:    logical1                    existence;
                     45:    logical1                    ouverture;
                     46: 
                     47:    struct_objet                *s_objet_argument;
                     48: 
                     49:    struct flock                lock;
                     50: 
                     51:    struct stat                 requete;
                     52: 
1.5     ! bertrand   53:    unsigned char               *nom;
        !            54: 
1.1       bertrand   55:    unsigned long               unite;
                     56: 
                     57:    (*s_etat_processus).erreur_execution = d_ex;
                     58: 
                     59:    if ((*s_etat_processus).affichage_arguments == 'Y')
                     60:    {
                     61:        printf("\n  DELETE ");
                     62: 
                     63:        if ((*s_etat_processus).langue == 'F')
                     64:        {
                     65:            printf("(effacement d'un fichier)\n\n");
                     66:        }
                     67:        else
                     68:        {
                     69:            printf("(delete a file)\n\n");
                     70:        }
                     71: 
                     72:        printf("    1: %s\n", d_CHN);
                     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, 1) == d_erreur)
                     85:        {
                     86:            return;
                     87:        }
                     88:    }
                     89: 
                     90:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                     91:            &s_objet_argument) == d_erreur)
                     92:    {
                     93:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                     94:        return;
                     95:    }
                     96: 
                     97:    if ((*s_objet_argument).type == CHN)
                     98:    {
1.5     ! bertrand   99:        if ((nom = transliteration(s_etat_processus,
        !           100:                (unsigned char *) (*s_objet_argument).objet,
        !           101:                d_locale, "UTF-8")) == NULL)
        !           102:        {
        !           103:            liberation(s_etat_processus, s_objet_argument);
        !           104:            return;
        !           105:        }
        !           106: 
        !           107:        if (stat(nom, &requete) != 0)
1.1       bertrand  108:        {
                    109:            liberation(s_etat_processus, s_objet_argument);
1.5     ! bertrand  110:            free(nom);
1.1       bertrand  111: 
                    112:            (*s_etat_processus).erreur_execution =
                    113:                    d_ex_erreur_acces_fichier;
                    114:            return;
                    115:        }
                    116: 
                    117:        if (S_ISREG(requete.st_mode)) // Fichier régulier
                    118:        {
1.5     ! bertrand  119:            if ((fichier = fopen(nom, "r+")) == NULL)
1.1       bertrand  120:            {
                    121:                liberation(s_etat_processus, s_objet_argument);
1.5     ! bertrand  122:                free(nom);
1.1       bertrand  123: 
                    124:                (*s_etat_processus).erreur_execution =
                    125:                        d_ex_erreur_acces_fichier;
                    126:                return;
                    127:            }
                    128: 
                    129:            lock.l_type = F_WRLCK;
                    130:            lock.l_whence = SEEK_SET;
                    131:            lock.l_start = 0;
                    132:            lock.l_len = 0;
                    133:            lock.l_pid = getpid();
                    134: 
                    135:            if (fcntl(fileno(fichier), F_GETLK, &lock) == -1)
                    136:            {
1.5     ! bertrand  137:                free(nom);
        !           138: 
1.1       bertrand  139:                if (fclose(fichier) != 0)
                    140:                {
                    141:                    liberation(s_etat_processus, s_objet_argument);
                    142: 
                    143:                    (*s_etat_processus).erreur_execution =
                    144:                            d_ex_erreur_acces_fichier;
                    145:                    return;
                    146:                }
                    147: 
                    148:                liberation(s_etat_processus, s_objet_argument);
                    149: 
                    150:                (*s_etat_processus).erreur_execution =
                    151:                        d_ex_erreur_acces_fichier;
                    152:                return;
                    153:            }
                    154: 
                    155:            if (lock.l_type != F_UNLCK)
                    156:            {
                    157:                liberation(s_etat_processus, s_objet_argument);
1.5     ! bertrand  158:                free(nom);
1.1       bertrand  159: 
                    160:                (*s_etat_processus).erreur_execution =
                    161:                        d_ex_erreur_acces_fichier;
                    162:                return;
                    163:            }
                    164: 
1.5     ! bertrand  165:            erreur = caracteristiques_fichier(s_etat_processus, nom,
1.1       bertrand  166:                    &existence, &ouverture, &unite);
                    167: 
                    168:            if ((erreur != d_absence_erreur) || (ouverture == d_vrai))
                    169:            {
                    170:                liberation(s_etat_processus, s_objet_argument);
1.5     ! bertrand  171:                free(nom);
1.1       bertrand  172: 
                    173:                (*s_etat_processus).erreur_execution =
                    174:                        d_ex_erreur_acces_fichier;
                    175:                return;
                    176:            }
                    177: 
1.5     ! bertrand  178:            if (destruction_fichier(nom) == d_erreur)
1.1       bertrand  179:            {
                    180:                liberation(s_etat_processus, s_objet_argument);
1.5     ! bertrand  181:                free(nom);
1.1       bertrand  182: 
                    183:                (*s_etat_processus).erreur_execution =
                    184:                        d_ex_erreur_acces_fichier;
                    185:                return;
                    186:            }
                    187:        }
                    188:        else // Socket
                    189:        {
1.5     ! bertrand  190:            if (unlink(nom) != 0)
1.1       bertrand  191:            {
                    192:                liberation(s_etat_processus, s_objet_argument);
1.5     ! bertrand  193:                free(nom);
1.1       bertrand  194: 
                    195:                (*s_etat_processus).erreur_execution =
                    196:                        d_ex_erreur_acces_fichier;
                    197:                return;
                    198:            }
                    199:        }
1.5     ! bertrand  200: 
        !           201:        free(nom);
1.1       bertrand  202:    }
                    203:    else
                    204:    {
                    205:        liberation(s_etat_processus, s_objet_argument);
                    206: 
                    207:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    208:        return;
                    209:    }
                    210: 
                    211:    liberation(s_etat_processus, s_objet_argument);
                    212: 
                    213:    return;
                    214: }
                    215: 
                    216: 
                    217: /*
                    218: ================================================================================
                    219:   Fonction 'date'
                    220: ================================================================================
                    221:   Entrées : pointeur sur une structure struct_processus
                    222: --------------------------------------------------------------------------------
                    223:   Sorties :
                    224: --------------------------------------------------------------------------------
                    225:   Effets de bord : néant
                    226: ================================================================================
                    227: */
                    228: 
                    229: void
                    230: instruction_date(struct_processus *s_etat_processus)
                    231: {
                    232:    struct_objet            *s_objet;
                    233: 
                    234:    struct timeval          horodatage;
                    235: 
                    236:    (*s_etat_processus).erreur_execution = d_ex;
                    237: 
                    238:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    239:    {
                    240:        printf("\n  DATE ");
                    241: 
                    242:        if ((*s_etat_processus).langue == 'F')
                    243:        {
                    244:            printf("(information sur la date et l'heure)\n\n");
                    245:        }
                    246:        else
                    247:        {
                    248:            printf("(date and time)\n\n");
                    249:        }
                    250: 
                    251:        printf("->  1: %s\n", d_LST);
                    252: 
                    253:        return;
                    254:    }
                    255:    else if ((*s_etat_processus).test_instruction == 'Y')
                    256:    {
                    257:        (*s_etat_processus).nombre_arguments = -1;
                    258:        return;
                    259:    }
                    260: 
                    261:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    262:    {
                    263:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                    264:        {
                    265:            return;
                    266:        }
                    267:    }
                    268: 
                    269:    gettimeofday(&horodatage, NULL);
                    270: 
                    271:    if ((s_objet = formateur_date(s_etat_processus, &horodatage)) == NULL)
                    272:    {
                    273:        return;
                    274:    }
                    275: 
                    276:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    277:            s_objet) == d_erreur)
                    278:    {
                    279:        return;
                    280:    }
                    281: 
                    282:    return;
                    283: }
                    284: 
                    285: 
                    286: /*
                    287: ================================================================================
                    288:   Fonction 'drws'
                    289: ================================================================================
                    290:   Entrées : pointeur sur une structure struct_processus
                    291: --------------------------------------------------------------------------------
                    292:   Sorties :
                    293: --------------------------------------------------------------------------------
                    294:   Effets de bord : néant
                    295: ================================================================================
                    296: */
                    297: 
                    298: void
                    299: instruction_drws(struct_processus *s_etat_processus)
                    300: {
                    301:    file                        *fichier;
                    302: 
                    303:    int                         dimensions;
                    304: 
                    305:    logical1                    presence_variable;
                    306:    logical1                    matrice_entiere;
                    307: 
                    308:    long                        i;
                    309: 
                    310:    struct_objet                *s_objet_statistique;
                    311: 
                    312:    unsigned char               *nom_fichier;
                    313: 
                    314:    unsigned long               j;
                    315: 
                    316:    struct_fichier_graphique    *l_fichier_courant;
                    317:    struct_fichier_graphique    *l_fichier_precedent;
                    318: 
                    319:    (*s_etat_processus).erreur_execution = d_ex;
                    320: 
                    321:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    322:    {
                    323:        printf("\n  DRWS ");
                    324: 
                    325:        if ((*s_etat_processus).langue == 'F')
                    326:        {
                    327:            printf("(affiche une série statistique)\n\n");
                    328:            printf("  Aucun argument\n");
                    329:        }
                    330:        else
                    331:        {
                    332:            printf("(draw statistical data)\n\n");
                    333:            printf("  No argument\n");
                    334:        }
                    335: 
                    336:        return;
                    337:    }
                    338:    else if ((*s_etat_processus).test_instruction == 'Y')
                    339:    {
                    340:        (*s_etat_processus).nombre_arguments = -1;
                    341:        return;
                    342:    }
                    343: 
                    344:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    345:    {
                    346:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                    347:        {
                    348:            return;
                    349:        }
                    350:    }
                    351: 
                    352:    /*
                    353:     * Vérification de la présence de la matrice statistique
                    354:     */
                    355: 
                    356:    if (recherche_variable(s_etat_processus, ds_sdat) == d_faux)
                    357:    {
                    358:        /*
                    359:         * Aucune variable ds_sdat n'existe.
                    360:         */
                    361: 
                    362:        (*s_etat_processus).erreur_execution = d_ex_absence_observations;
                    363:        (*s_etat_processus).erreur_systeme = d_es;
                    364: 
                    365:        return;
                    366:    }
                    367: 
                    368:    i = (*s_etat_processus).position_variable_courante;
                    369:    presence_variable = d_faux;
                    370: 
                    371:    while(i >= 0)
                    372:    {
                    373:        if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
                    374:                ds_sdat) == 0) && ((*s_etat_processus)
                    375:                .s_liste_variables[i].niveau == 1))
                    376:        {
                    377:            presence_variable = d_vrai;
                    378:            break;
                    379:        }
                    380: 
                    381:        i--;
                    382:    }
                    383: 
                    384:    if (presence_variable == d_faux)
                    385:    {
                    386:        (*s_etat_processus).erreur_execution = d_ex_absence_observations;
                    387:        return;
                    388:    }
                    389: 
                    390:    if ((s_objet_statistique = (*s_etat_processus).s_liste_variables[i].objet)
                    391:            == NULL)
                    392:    {
                    393:        (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
                    394:        return;
                    395:    }
                    396: 
                    397:    if ((*s_objet_statistique).type == MIN)
                    398:    {
                    399:        matrice_entiere = d_vrai;
                    400:    }
                    401:    else if ((*s_objet_statistique).type == MRL)
                    402:    {
                    403:        matrice_entiere = d_faux;
                    404:    }
                    405:    else
                    406:    {
                    407:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    408:        return;
                    409:    }
                    410: 
                    411:    /*
                    412:     * Création du fichier graphique temporaire
                    413:     */
                    414: 
                    415:    if ((nom_fichier = creation_nom_fichier(s_etat_processus,
                    416:            (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
                    417:    {
                    418:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    419:        return;
                    420:    }
                    421: 
                    422:    if ((fichier = fopen(nom_fichier, "w+")) == NULL)
                    423:    {
                    424:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    425:        return;
                    426:    }
                    427: 
                    428:    switch((*((struct_matrice *) (*s_objet_statistique).objet)).nombre_colonnes)
                    429:    {
                    430: 
                    431:    /*
                    432:     * Une seule colonne
                    433:     */
                    434: 
                    435:        case 1 :
                    436:        {
                    437:            dimensions = 2;
                    438: 
                    439:            for(j = 0; j < (*((struct_matrice *) (*s_objet_statistique).objet))
                    440:                    .nombre_lignes; j++)
                    441:            {
                    442:                if (matrice_entiere == d_vrai)
                    443:                {
                    444:                    if (fprintf(fichier, "%f %f\n", (double) j, (double)
                    445:                            ((integer8 **) (*((struct_matrice *)
                    446:                            (*s_objet_statistique).objet)).tableau)[j][0]) < 0)
                    447:                    {
                    448:                        (*s_etat_processus).erreur_systeme =
                    449:                                d_es_erreur_fichier;
                    450:                        return;
                    451:                    }
                    452:                }
                    453:                else
                    454:                {
                    455:                    if (fprintf(fichier, "%f %f\n", (double) j, (double)
                    456:                            ((real8 **) (*((struct_matrice *)
                    457:                            (*s_objet_statistique).objet)).tableau)[j][0]) < 0)
                    458:                    {
                    459:                        (*s_etat_processus).erreur_systeme =
                    460:                                d_es_erreur_fichier;
                    461:                        return;
                    462:                    }
                    463:                }
                    464:            }
                    465: 
                    466:            break;
                    467:        }
                    468: 
                    469:    /*
                    470:     * Deux colonnes ou plus
                    471:     */
                    472: 
                    473:        default :
                    474:        {
                    475:            dimensions = 2;
                    476: 
                    477:            if (((*s_etat_processus).colonne_statistique_1 < 1) ||
                    478:                    ((*s_etat_processus).colonne_statistique_2 < 1) ||
                    479:                    ((*s_etat_processus).colonne_statistique_1 > (signed long)
                    480:                    (*((struct_matrice *) (*s_objet_statistique).objet))
                    481:                    .nombre_colonnes) ||
                    482:                    ((*s_etat_processus).colonne_statistique_2 > (signed long)
                    483:                    (*((struct_matrice *) (*s_objet_statistique).objet))
                    484:                    .nombre_colonnes))
                    485:            {
                    486:                if (fclose(fichier) != 0)
                    487:                {
                    488:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    489:                    return;
                    490:                }
                    491: 
                    492:                if (destruction_fichier(nom_fichier) == d_erreur)
                    493:                {
                    494:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    495:                    return;
                    496:                }
                    497: 
                    498:                free(nom_fichier);
                    499: 
                    500:                (*s_etat_processus).erreur_execution =
                    501:                        d_ex_observations_inexistantes;
                    502:                return;
                    503:            }
                    504: 
                    505:            for(j = 0; j < (*((struct_matrice *) (*s_objet_statistique).objet))
                    506:                    .nombre_lignes; j++)
                    507:            {
                    508:                if (matrice_entiere == d_vrai)
                    509:                {
                    510:                    if (fprintf(fichier, "%f %f\n", (double) ((integer8 **)
                    511:                            (*((struct_matrice *) (*s_objet_statistique).objet))
                    512:                            .tableau)[j][(*s_etat_processus)
                    513:                            .colonne_statistique_1 - 1], (double) ((integer8 **)
                    514:                            (*((struct_matrice *) (*s_objet_statistique).objet))
                    515:                            .tableau)[j][(*s_etat_processus)
                    516:                            .colonne_statistique_2 - 1]) < 0)
                    517:                    {
                    518:                        (*s_etat_processus).erreur_systeme =
                    519:                                d_es_erreur_fichier;
                    520:                        return;
                    521:                    }
                    522:                }
                    523:                else
                    524:                {
                    525:                    if (fprintf(fichier, "%f %f\n", (double) ((real8 **)
                    526:                            (*((struct_matrice *) (*s_objet_statistique).objet))
                    527:                            .tableau)[j][(*s_etat_processus)
                    528:                            .colonne_statistique_1 - 1], (double) ((real8 **)
                    529:                            (*((struct_matrice *) (*s_objet_statistique).objet))
                    530:                            .tableau)[j][(*s_etat_processus)
                    531:                            .colonne_statistique_2 - 1]) < 0)
                    532:                    {
                    533:                        (*s_etat_processus).erreur_systeme =
                    534:                                d_es_erreur_fichier;
                    535:                        return;
                    536:                    }
                    537:                }
                    538:            }
                    539: 
                    540:            break;
                    541:        }
                    542:    }
                    543: 
                    544:    /*
                    545:     * Fermeture du fichier graphique
                    546:     */
                    547: 
                    548:    if (fclose(fichier) != 0)
                    549:    {
                    550:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    551:        return;
                    552:    }
                    553: 
                    554:    /*
                    555:     * Chaînage du fichier temporaire à la liste des fichiers graphiques
                    556:     */
                    557: 
                    558:    l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
                    559: 
                    560:    if (l_fichier_courant == NULL)
                    561:    {
                    562:        if (((*s_etat_processus).fichiers_graphiques = malloc(
                    563:                sizeof(struct_fichier_graphique))) == NULL)
                    564:        {
                    565:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    566:            return;
                    567:        }
                    568: 
                    569:        (*(*s_etat_processus).fichiers_graphiques).suivant = NULL;
                    570:        (*(*s_etat_processus).fichiers_graphiques).nom = nom_fichier;
                    571:        (*(*s_etat_processus).fichiers_graphiques).legende = NULL;
                    572:        (*(*s_etat_processus).fichiers_graphiques).dimensions = dimensions;
                    573:        (*(*s_etat_processus).fichiers_graphiques).presence_axes = d_faux;
                    574:        (*(*s_etat_processus).fichiers_graphiques).systeme_axes =
                    575:                (*s_etat_processus).systeme_axes;
                    576:        strcpy((*(*s_etat_processus).fichiers_graphiques).type,
                    577:                (*s_etat_processus).type_trace_sigma);
                    578:    }
                    579:    else
                    580:    {
                    581:        while(l_fichier_courant != NULL)
                    582:        {
                    583:            if ((*l_fichier_courant).dimensions != dimensions)
                    584:            {
                    585:                (*s_etat_processus).erreur_execution =
                    586:                        d_ex_dimensions_differentes;
                    587:                return;
                    588:            }
                    589: 
                    590:            l_fichier_precedent = l_fichier_courant;
                    591:            l_fichier_courant = (*l_fichier_courant).suivant;
                    592:        }
                    593: 
                    594:        l_fichier_courant = l_fichier_precedent;
                    595: 
                    596:        if (((*l_fichier_courant).suivant = malloc(
                    597:                sizeof(struct_fichier_graphique))) == NULL)
                    598:        {
                    599:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    600:            return;
                    601:        }
                    602: 
                    603:        l_fichier_courant = (*l_fichier_courant).suivant;
                    604: 
                    605:        (*l_fichier_courant).suivant = NULL;
                    606:        (*l_fichier_courant).nom = nom_fichier;
                    607:        (*l_fichier_courant).legende = NULL;
                    608:        (*l_fichier_courant).dimensions = dimensions;
                    609:        (*l_fichier_courant).presence_axes = d_faux;
                    610:        (*l_fichier_courant).systeme_axes = (*s_etat_processus).systeme_axes;
                    611:        strcpy((*l_fichier_courant).type, (*s_etat_processus).type_trace_sigma);
                    612:    }
                    613: 
                    614:    /*
                    615:     * Affichage du graphique
                    616:     */
                    617: 
                    618:    appel_gnuplot(s_etat_processus, 'N');
                    619:    (*s_etat_processus).erreur_execution = d_ex;
                    620:    (*s_etat_processus).exception = d_ep;
                    621: 
                    622:    return;
                    623: }
                    624: 
                    625: 
                    626: /*
                    627: ================================================================================
                    628:   Fonction 'decr'
                    629: ================================================================================
                    630:   Entrées :
                    631: --------------------------------------------------------------------------------
                    632:   Sorties :
                    633: --------------------------------------------------------------------------------
                    634:   Effets de bord : néant
                    635: ================================================================================
                    636: */
                    637: 
                    638: void
                    639: instruction_decr(struct_processus *s_etat_processus)
                    640: {
                    641:    logical1                    variable_partagee;
                    642: 
                    643:    struct_objet                *s_copie_argument;
                    644:    struct_objet                *s_objet_argument;
                    645: 
                    646:    (*s_etat_processus).erreur_execution = d_ex;
                    647: 
                    648:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    649:    {
                    650:        printf("\n  DECR ");
                    651: 
                    652:        if ((*s_etat_processus).langue == 'F')
                    653:        {
                    654:            printf("(décrémentation)\n\n");
                    655:        }
                    656:        else
                    657:        {
                    658:            printf("(decrementation)\n\n");
                    659:        }
                    660: 
                    661:        printf("    1: %s\n", d_INT);
                    662:        printf("->  1: %s\n\n", d_INT);
                    663: 
                    664:        printf("    1: %s\n", d_NOM);
                    665: 
                    666:        return;
                    667:    }
                    668:    else if ((*s_etat_processus).test_instruction == 'Y')
                    669:    {
                    670:        (*s_etat_processus).nombre_arguments = -1;
                    671:        return;
                    672:    }
                    673: 
                    674:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    675:    {
                    676:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    677:        {
                    678:            return;
                    679:        }
                    680:    }
                    681: 
                    682:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    683:            &s_objet_argument) == d_erreur)
                    684:    {
                    685:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    686:        return;
                    687:    }
                    688: 
                    689:    if ((*s_objet_argument).type == INT)
                    690:    {
                    691:        if ((s_copie_argument = copie_objet(s_etat_processus,
                    692:                s_objet_argument, 'O')) == NULL)
                    693:        {
                    694:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    695:            return;
                    696:        }
                    697: 
                    698:        liberation(s_etat_processus, s_objet_argument);
                    699:        s_objet_argument = s_copie_argument;
                    700: 
                    701:        (*((integer8 *) (*s_objet_argument).objet))--;
                    702: 
                    703:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    704:                s_objet_argument) == d_erreur)
                    705:        {
                    706:            return;
                    707:        }
                    708:    }
                    709:    else if ((*s_objet_argument).type == NOM)
                    710:    {
                    711:        if (recherche_variable(s_etat_processus, (*((struct_nom *)
                    712:                (*s_objet_argument).objet)).nom) == d_faux)
                    713:        {
                    714:            (*s_etat_processus).erreur_systeme = d_es;
                    715:            (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
                    716: 
                    717:            return;
                    718:        }
                    719: 
                    720:        liberation(s_etat_processus, s_objet_argument);
                    721: 
                    722:        if ((*s_etat_processus).s_liste_variables
                    723:                [(*s_etat_processus).position_variable_courante]
                    724:                .variable_verrouillee == d_vrai)
                    725:        {
                    726:            (*s_etat_processus).erreur_execution =
                    727:                    d_ex_variable_verrouillee;
                    728:            return;
                    729:        }
                    730: 
                    731:        if ((*s_etat_processus).s_liste_variables
                    732:                [(*s_etat_processus).position_variable_courante].objet
                    733:                == NULL)
                    734:        {
                    735:            if (pthread_mutex_lock(&((*(*s_etat_processus)
                    736:                    .s_liste_variables_partagees).mutex)) != 0)
                    737:            {
                    738:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    739:                return;
                    740:            }
                    741: 
                    742:            if (recherche_variable_partagee(s_etat_processus,
                    743:                    (*s_etat_processus).s_liste_variables
                    744:                    [(*s_etat_processus).position_variable_courante].nom,
                    745:                    (*s_etat_processus).s_liste_variables
                    746:                    [(*s_etat_processus).position_variable_courante]
                    747:                    .variable_partagee, (*s_etat_processus).s_liste_variables
                    748:                    [(*s_etat_processus).position_variable_courante]
                    749:                    .origine) == d_faux)
                    750:            {
                    751:                (*s_etat_processus).erreur_systeme = d_es;
                    752:                (*s_etat_processus).erreur_execution =
                    753:                        d_ex_variable_non_definie;
                    754: 
                    755:                return;
                    756:            }
                    757: 
                    758:            s_objet_argument = (*(*s_etat_processus)
                    759:                    .s_liste_variables_partagees).table
                    760:                    [(*(*s_etat_processus).s_liste_variables_partagees)
                    761:                    .position_variable].objet;
                    762:            variable_partagee = d_vrai;
                    763:        }
                    764:        else
                    765:        {
                    766:            s_objet_argument = (*s_etat_processus).s_liste_variables
                    767:                    [(*s_etat_processus).position_variable_courante].objet;
                    768:            variable_partagee = d_faux;
                    769:        }
                    770: 
                    771:        if ((s_copie_argument = copie_objet(s_etat_processus,
                    772:                s_objet_argument, 'O')) == NULL)
                    773:        {
                    774:            if (variable_partagee == d_vrai)
                    775:            {
                    776:                if (pthread_mutex_unlock(&((*(*s_etat_processus)
                    777:                        .s_liste_variables_partagees).mutex)) != 0)
                    778:                {
                    779:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    780:                    return;
                    781:                }
                    782:            }
                    783: 
                    784:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    785:            return;
                    786:        }
                    787: 
                    788:        liberation(s_etat_processus, s_objet_argument);
                    789: 
                    790:        if (variable_partagee == d_vrai)
                    791:        {
                    792:            (*s_etat_processus).s_liste_variables[(*s_etat_processus)
                    793:                    .position_variable_courante].objet = NULL;
                    794:            (*(*s_etat_processus)
                    795:                    .s_liste_variables_partagees).table
                    796:                    [(*(*s_etat_processus).s_liste_variables_partagees)
                    797:                    .position_variable].objet = s_copie_argument;
                    798:        }
                    799:        else
                    800:        {
                    801:            (*s_etat_processus).s_liste_variables[(*s_etat_processus)
                    802:                    .position_variable_courante].objet = s_copie_argument;
                    803:        }
                    804: 
                    805:        if ((*s_copie_argument).type == INT)
                    806:        {
                    807:            (*((integer8 *) (*s_copie_argument).objet))--;
                    808: 
                    809:            if (variable_partagee == d_vrai)
                    810:            {
                    811:                if (pthread_mutex_unlock(&((*(*s_etat_processus)
                    812:                        .s_liste_variables_partagees).mutex)) != 0)
                    813:                {
                    814:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    815:                    return;
                    816:                }
                    817:            }
                    818:        }
                    819:        else
                    820:        {
                    821:            if (variable_partagee == d_vrai)
                    822:            {
                    823:                if (pthread_mutex_unlock(&((*(*s_etat_processus)
                    824:                        .s_liste_variables_partagees).mutex)) != 0)
                    825:                {
                    826:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    827:                    return;
                    828:                }
                    829:            }
                    830: 
                    831:            (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    832:            return;
                    833:        }
                    834:    }
                    835:    else
                    836:    {
                    837:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    838: 
                    839:        liberation(s_etat_processus, s_objet_argument);
                    840:        return;
                    841:    }
                    842: 
                    843:    return;
                    844: }
                    845: 
                    846: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>