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

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

CVSweb interface <joel.bertrand@systella.fr>