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

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: {
1.6     ! bertrand   41:    const char                  *queue;
        !            42: 
1.1       bertrand   43:    file                        *fichier;
                     44: 
1.6     ! bertrand   45:    integer8                    lecture_i64;
        !            46: 
1.1       bertrand   47:    logical1                    erreur;
                     48:    logical1                    existence;
                     49:    logical1                    ouverture;
                     50: 
1.6     ! bertrand   51:    sqlite3_stmt                *ppStmt;
        !            52: 
        !            53:    struct_descripteur_fichier  *descripteur;
        !            54: 
1.1       bertrand   55:    struct_objet                *s_objet_argument;
1.6     ! bertrand   56:    struct_objet                *s_objet_indice;
1.1       bertrand   57: 
                     58:    struct flock                lock;
                     59: 
                     60:    struct stat                 requete;
                     61: 
1.6     ! bertrand   62:    unsigned char               *commande;
1.5       bertrand   63:    unsigned char               *nom;
1.6     ! bertrand   64:    unsigned char               *utf8;
1.5       bertrand   65: 
1.1       bertrand   66:    unsigned long               unite;
                     67: 
                     68:    (*s_etat_processus).erreur_execution = d_ex;
                     69: 
                     70:    if ((*s_etat_processus).affichage_arguments == 'Y')
                     71:    {
                     72:        printf("\n  DELETE ");
                     73: 
                     74:        if ((*s_etat_processus).langue == 'F')
                     75:        {
1.6     ! bertrand   76:            printf("(effacement d'un fichier ou d'un enregistrement)\n\n");
1.1       bertrand   77:        }
                     78:        else
                     79:        {
1.6     ! bertrand   80:            printf("(delete file or record)\n\n");
1.1       bertrand   81:        }
                     82: 
1.6     ! bertrand   83:        printf("    1: %s\n\n", d_CHN);
1.1       bertrand   84: 
1.6     ! bertrand   85:        printf("    2: %s, %s\n", d_CHN, d_INT);
        !            86:        printf("    1: %s\n", d_FCH);
1.1       bertrand   87:        return;
                     88:    }
                     89:    else if ((*s_etat_processus).test_instruction == 'Y')
                     90:    {
                     91:        (*s_etat_processus).nombre_arguments = -1;
                     92:        return;
                     93:    }
                     94: 
                     95:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                     96:    {
1.6     ! bertrand   97:        if ((*s_etat_processus).l_base_pile == NULL)
1.1       bertrand   98:        {
1.6     ! bertrand   99:            (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1.1       bertrand  100:            return;
                    101:        }
1.6     ! bertrand  102: 
        !           103:        if ((*(*(*s_etat_processus).l_base_pile).donnee).type == FCH)
        !           104:        {
        !           105:            if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
        !           106:            {
        !           107:                return;
        !           108:            }
        !           109:        }
        !           110:        else
        !           111:        {
        !           112:            if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
        !           113:            {
        !           114:                return;
        !           115:            }
        !           116:        }
1.1       bertrand  117:    }
                    118: 
                    119:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    120:            &s_objet_argument) == d_erreur)
                    121:    {
                    122:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    123:        return;
                    124:    }
                    125: 
                    126:    if ((*s_objet_argument).type == CHN)
                    127:    {
1.5       bertrand  128:        if ((nom = transliteration(s_etat_processus,
                    129:                (unsigned char *) (*s_objet_argument).objet,
                    130:                d_locale, "UTF-8")) == NULL)
                    131:        {
                    132:            liberation(s_etat_processus, s_objet_argument);
                    133:            return;
                    134:        }
                    135: 
                    136:        if (stat(nom, &requete) != 0)
1.1       bertrand  137:        {
                    138:            liberation(s_etat_processus, s_objet_argument);
1.5       bertrand  139:            free(nom);
1.1       bertrand  140: 
                    141:            (*s_etat_processus).erreur_execution =
                    142:                    d_ex_erreur_acces_fichier;
                    143:            return;
                    144:        }
                    145: 
                    146:        if (S_ISREG(requete.st_mode)) // Fichier régulier
                    147:        {
1.5       bertrand  148:            if ((fichier = fopen(nom, "r+")) == NULL)
1.1       bertrand  149:            {
                    150:                liberation(s_etat_processus, s_objet_argument);
1.5       bertrand  151:                free(nom);
1.1       bertrand  152: 
                    153:                (*s_etat_processus).erreur_execution =
                    154:                        d_ex_erreur_acces_fichier;
                    155:                return;
                    156:            }
                    157: 
                    158:            lock.l_type = F_WRLCK;
                    159:            lock.l_whence = SEEK_SET;
                    160:            lock.l_start = 0;
                    161:            lock.l_len = 0;
                    162:            lock.l_pid = getpid();
                    163: 
                    164:            if (fcntl(fileno(fichier), F_GETLK, &lock) == -1)
                    165:            {
1.5       bertrand  166:                free(nom);
                    167: 
1.1       bertrand  168:                if (fclose(fichier) != 0)
                    169:                {
                    170:                    liberation(s_etat_processus, s_objet_argument);
                    171: 
                    172:                    (*s_etat_processus).erreur_execution =
                    173:                            d_ex_erreur_acces_fichier;
                    174:                    return;
                    175:                }
                    176: 
                    177:                liberation(s_etat_processus, s_objet_argument);
                    178: 
                    179:                (*s_etat_processus).erreur_execution =
                    180:                        d_ex_erreur_acces_fichier;
                    181:                return;
                    182:            }
                    183: 
                    184:            if (lock.l_type != F_UNLCK)
                    185:            {
                    186:                liberation(s_etat_processus, s_objet_argument);
1.5       bertrand  187:                free(nom);
1.1       bertrand  188: 
                    189:                (*s_etat_processus).erreur_execution =
                    190:                        d_ex_erreur_acces_fichier;
                    191:                return;
                    192:            }
                    193: 
1.5       bertrand  194:            erreur = caracteristiques_fichier(s_etat_processus, nom,
1.1       bertrand  195:                    &existence, &ouverture, &unite);
                    196: 
                    197:            if ((erreur != d_absence_erreur) || (ouverture == d_vrai))
                    198:            {
                    199:                liberation(s_etat_processus, s_objet_argument);
1.5       bertrand  200:                free(nom);
1.1       bertrand  201: 
                    202:                (*s_etat_processus).erreur_execution =
                    203:                        d_ex_erreur_acces_fichier;
                    204:                return;
                    205:            }
                    206: 
1.5       bertrand  207:            if (destruction_fichier(nom) == d_erreur)
1.1       bertrand  208:            {
                    209:                liberation(s_etat_processus, s_objet_argument);
1.5       bertrand  210:                free(nom);
1.1       bertrand  211: 
                    212:                (*s_etat_processus).erreur_execution =
                    213:                        d_ex_erreur_acces_fichier;
                    214:                return;
                    215:            }
                    216:        }
                    217:        else // Socket
                    218:        {
1.5       bertrand  219:            if (unlink(nom) != 0)
1.1       bertrand  220:            {
                    221:                liberation(s_etat_processus, s_objet_argument);
1.5       bertrand  222:                free(nom);
1.1       bertrand  223: 
                    224:                (*s_etat_processus).erreur_execution =
                    225:                        d_ex_erreur_acces_fichier;
                    226:                return;
                    227:            }
                    228:        }
1.5       bertrand  229: 
                    230:        free(nom);
1.1       bertrand  231:    }
1.6     ! bertrand  232:    else if ((*s_objet_argument).type == FCH)
        !           233:    {
        !           234:        if ((descripteur = descripteur_fichier(s_etat_processus,
        !           235:                (struct_fichier *) (*s_objet_argument).objet)) == NULL)
        !           236:        {
        !           237:            return;
        !           238:        }
        !           239: 
        !           240:        /*
        !           241:         * Vérification des verrous
        !           242:         */
        !           243: 
        !           244:        lock.l_type = F_RDLCK;
        !           245:        lock.l_whence = SEEK_SET;
        !           246:        lock.l_start = 0;
        !           247:        lock.l_len = 0;
        !           248:        lock.l_pid = getpid();
        !           249: 
        !           250:        if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock)
        !           251:                == -1)
        !           252:        {
        !           253:            liberation(s_etat_processus, s_objet_argument);
        !           254: 
        !           255:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           256:            return;
        !           257:        }
        !           258: 
        !           259:        if (lock.l_type != F_UNLCK)
        !           260:        {
        !           261:            liberation(s_etat_processus, s_objet_argument);
        !           262: 
        !           263:            (*s_etat_processus).erreur_execution =
        !           264:                    d_ex_fichier_verrouille;
        !           265:            return;
        !           266:        }
        !           267: 
        !           268:        if ((*((struct_fichier *) (*s_objet_argument).objet))
        !           269:                .protection == 'R')
        !           270:        {
        !           271:            liberation(s_etat_processus, s_objet_argument);
        !           272: 
        !           273:            (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
        !           274:            return;
        !           275:        }
        !           276: 
        !           277:        if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire == 'N')
        !           278:        {
        !           279:            if ((*((struct_fichier *) (*s_objet_argument).objet)).acces
        !           280:                    == 'S')
        !           281:            {
        !           282:                liberation(s_etat_processus, s_objet_argument);
        !           283: 
        !           284:                (*s_etat_processus).erreur_execution = d_ex_erreur_type_fichier;
        !           285:                return;
        !           286:            }
        !           287:            else if ((*((struct_fichier *) (*s_objet_argument).objet)).acces
        !           288:                    == 'D')
        !           289:            {
        !           290:                BUG(((*descripteur).type == 'C'), uprintf("Bad filtype !\n"));
        !           291: 
        !           292:                if (depilement(s_etat_processus, &((*s_etat_processus)
        !           293:                        .l_base_pile), &s_objet_indice) == d_erreur)
        !           294:                {
        !           295:                    (*s_etat_processus).erreur_execution = d_ex_manque_argument;
        !           296:                    return;
        !           297:                }
        !           298: 
        !           299:                if ((*s_objet_indice).type != INT)
        !           300:                {
        !           301:                    liberation(s_etat_processus, s_objet_argument);
        !           302:                    liberation(s_etat_processus, s_objet_indice);
        !           303: 
        !           304:                    (*s_etat_processus).erreur_execution =
        !           305:                            d_ex_erreur_type_argument;
        !           306:                    return;
        !           307:                }
        !           308: 
        !           309:                if (alsprintf(&commande, "select count(*) from data where "
        !           310:                        "id = %lld", (*((integer8 *) (*s_objet_indice).objet)))
        !           311:                        < 0)
        !           312:                {
        !           313:                    (*s_etat_processus).erreur_systeme =
        !           314:                            d_es_allocation_memoire;
        !           315:                    return;
        !           316:                }
        !           317: 
        !           318:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
        !           319:                        commande, strlen(commande), &ppStmt, &queue)
        !           320:                        != SQLITE_OK)
        !           321:                {
        !           322:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           323:                    return;
        !           324:                }
        !           325: 
        !           326:                if (sqlite3_step(ppStmt) != SQLITE_ROW)
        !           327:                {
        !           328:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           329:                    return;
        !           330:                }
        !           331: 
        !           332:                lecture_i64 = sqlite3_column_int64(ppStmt, 0);
        !           333: 
        !           334:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
        !           335:                {
        !           336:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           337:                    return;
        !           338:                }
        !           339: 
        !           340:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
        !           341:                {
        !           342:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           343:                    return;
        !           344:                }
        !           345: 
        !           346:                free(commande);
        !           347: 
        !           348:                if (lecture_i64 == 0)
        !           349:                {
        !           350:                    liberation(s_etat_processus, s_objet_argument);
        !           351:                    liberation(s_etat_processus, s_objet_indice);
        !           352: 
        !           353:                    (*s_etat_processus).erreur_execution =
        !           354:                            d_ex_enregistrement_inexistant;
        !           355:                    return;
        !           356:                }
        !           357: 
        !           358:                if (alsprintf(&commande, "delete from data where id = %lld",
        !           359:                        (*((integer8 *) (*s_objet_indice).objet))) < 0)
        !           360:                {
        !           361:                    (*s_etat_processus).erreur_systeme =
        !           362:                            d_es_allocation_memoire;
        !           363:                    return;
        !           364:                }
        !           365: 
        !           366:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
        !           367:                        commande, strlen(commande), &ppStmt, &queue)
        !           368:                        != SQLITE_OK)
        !           369:                {
        !           370:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           371:                    return;
        !           372:                }
        !           373: 
        !           374:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
        !           375:                {
        !           376:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           377:                    return;
        !           378:                }
        !           379: 
        !           380:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
        !           381:                {
        !           382:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           383:                    return;
        !           384:                }
        !           385: 
        !           386:                free(commande);
        !           387:                liberation(s_etat_processus, s_objet_indice);
        !           388:            }
        !           389:            else
        !           390:            {
        !           391:                BUG(((*descripteur).type == 'C'), uprintf("Bad filtype !\n"));
        !           392: 
        !           393:                if (depilement(s_etat_processus, &((*s_etat_processus)
        !           394:                        .l_base_pile), &s_objet_indice) == d_erreur)
        !           395:                {
        !           396:                    (*s_etat_processus).erreur_execution = d_ex_manque_argument;
        !           397:                    return;
        !           398:                }
        !           399: 
        !           400:                if ((*s_objet_indice).type != CHN)
        !           401:                {
        !           402:                    liberation(s_etat_processus, s_objet_argument);
        !           403:                    liberation(s_etat_processus, s_objet_indice);
        !           404: 
        !           405:                    (*s_etat_processus).erreur_execution =
        !           406:                            d_ex_erreur_type_argument;
        !           407:                    return;
        !           408:                }
        !           409: 
        !           410:                // Récupération de l'identifiant de la clef
        !           411: 
        !           412:                if ((utf8 = transliteration(s_etat_processus,
        !           413:                        (unsigned char *) (*s_objet_indice).objet, d_locale,
        !           414:                        "UTF-8")) == NULL)
        !           415:                {
        !           416:                    liberation(s_etat_processus, s_objet_argument);
        !           417:                    liberation(s_etat_processus, s_objet_indice);
        !           418: 
        !           419:                    return;
        !           420:                }
        !           421: 
        !           422:                if (alsprintf(&commande, "select id from key where key = "
        !           423:                        "'{ \"%s\" }'", utf8) < 0)
        !           424:                {
        !           425:                    (*s_etat_processus).erreur_systeme =
        !           426:                            d_es_allocation_memoire;
        !           427:                    return;
        !           428:                }
        !           429: 
        !           430:                free(utf8);
        !           431: 
        !           432:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
        !           433:                        commande, strlen(commande), &ppStmt, &queue)
        !           434:                        != SQLITE_OK)
        !           435:                {
        !           436:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           437:                    return;
        !           438:                }
        !           439: 
        !           440:                switch(sqlite3_step(ppStmt))
        !           441:                {
        !           442:                    case SQLITE_ROW:
        !           443:                    {
        !           444:                        // Correspondance
        !           445:                        break;
        !           446:                    }
        !           447: 
        !           448:                    case SQLITE_DONE:
        !           449:                    {
        !           450:                        // Aucune correspondance
        !           451:                        if (sqlite3_finalize(ppStmt) != SQLITE_OK)
        !           452:                        {
        !           453:                            (*s_etat_processus).erreur_systeme =
        !           454:                                    d_es_erreur_fichier;
        !           455:                            return;
        !           456:                        }
        !           457: 
        !           458:                        free(commande);
        !           459: 
        !           460:                        liberation(s_etat_processus, s_objet_argument);
        !           461:                        liberation(s_etat_processus, s_objet_indice);
        !           462: 
        !           463:                        (*s_etat_processus).erreur_execution =
        !           464:                                d_ex_enregistrement_inexistant;
        !           465:                        return;
        !           466:                    }
        !           467: 
        !           468:                    default:
        !           469:                    {
        !           470:                        (*s_etat_processus).erreur_systeme =
        !           471:                                d_es_erreur_fichier;
        !           472:                        return;
        !           473:                    }
        !           474:                }
        !           475: 
        !           476:                if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
        !           477:                {
        !           478:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           479:                    return;
        !           480:                }
        !           481: 
        !           482:                lecture_i64 = sqlite3_column_int64(ppStmt, 0);
        !           483: 
        !           484:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
        !           485:                {
        !           486:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           487:                    return;
        !           488:                }
        !           489: 
        !           490:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
        !           491:                {
        !           492:                    (*s_etat_processus).erreur_systeme =
        !           493:                            d_es_erreur_fichier;
        !           494:                    return;
        !           495:                }
        !           496: 
        !           497:                free(commande);
        !           498: 
        !           499:                if (alsprintf(&commande, "delete from data where key_id = %lld",
        !           500:                        lecture_i64) < 0)
        !           501:                {
        !           502:                    (*s_etat_processus).erreur_systeme =
        !           503:                            d_es_allocation_memoire;
        !           504:                    return;
        !           505:                }
        !           506: 
        !           507:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
        !           508:                        commande, strlen(commande), &ppStmt, &queue)
        !           509:                        != SQLITE_OK)
        !           510:                {
        !           511:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           512:                    return;
        !           513:                }
        !           514: 
        !           515:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
        !           516:                {
        !           517:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           518:                    return;
        !           519:                }
        !           520: 
        !           521:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
        !           522:                {
        !           523:                    (*s_etat_processus).erreur_systeme =
        !           524:                            d_es_erreur_fichier;
        !           525:                    return;
        !           526:                }
        !           527: 
        !           528:                free(commande);
        !           529: 
        !           530:                if (alsprintf(&commande, "delete from key where id = %lld",
        !           531:                        lecture_i64) < 0)
        !           532:                {
        !           533:                    (*s_etat_processus).erreur_systeme =
        !           534:                            d_es_allocation_memoire;
        !           535:                    return;
        !           536:                }
        !           537: 
        !           538:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
        !           539:                        commande, strlen(commande), &ppStmt, &queue)
        !           540:                        != SQLITE_OK)
        !           541:                {
        !           542:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           543:                    return;
        !           544:                }
        !           545: 
        !           546:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
        !           547:                {
        !           548:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           549:                    return;
        !           550:                }
        !           551: 
        !           552:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
        !           553:                {
        !           554:                    (*s_etat_processus).erreur_systeme =
        !           555:                            d_es_erreur_fichier;
        !           556:                    return;
        !           557:                }
        !           558: 
        !           559:                free(commande);
        !           560:                liberation(s_etat_processus, s_objet_indice);
        !           561:            }
        !           562:        }
        !           563:        else // Fichiers non formatés
        !           564:        {
        !           565:        }
        !           566:    }
1.1       bertrand  567:    else
                    568:    {
                    569:        liberation(s_etat_processus, s_objet_argument);
                    570: 
                    571:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    572:        return;
                    573:    }
                    574: 
                    575:    liberation(s_etat_processus, s_objet_argument);
                    576: 
                    577:    return;
                    578: }
                    579: 
                    580: 
                    581: /*
                    582: ================================================================================
                    583:   Fonction 'date'
                    584: ================================================================================
                    585:   Entrées : pointeur sur une structure struct_processus
                    586: --------------------------------------------------------------------------------
                    587:   Sorties :
                    588: --------------------------------------------------------------------------------
                    589:   Effets de bord : néant
                    590: ================================================================================
                    591: */
                    592: 
                    593: void
                    594: instruction_date(struct_processus *s_etat_processus)
                    595: {
                    596:    struct_objet            *s_objet;
                    597: 
                    598:    struct timeval          horodatage;
                    599: 
                    600:    (*s_etat_processus).erreur_execution = d_ex;
                    601: 
                    602:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    603:    {
                    604:        printf("\n  DATE ");
                    605: 
                    606:        if ((*s_etat_processus).langue == 'F')
                    607:        {
                    608:            printf("(information sur la date et l'heure)\n\n");
                    609:        }
                    610:        else
                    611:        {
                    612:            printf("(date and time)\n\n");
                    613:        }
                    614: 
                    615:        printf("->  1: %s\n", d_LST);
                    616: 
                    617:        return;
                    618:    }
                    619:    else if ((*s_etat_processus).test_instruction == 'Y')
                    620:    {
                    621:        (*s_etat_processus).nombre_arguments = -1;
                    622:        return;
                    623:    }
                    624: 
                    625:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    626:    {
                    627:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                    628:        {
                    629:            return;
                    630:        }
                    631:    }
                    632: 
                    633:    gettimeofday(&horodatage, NULL);
                    634: 
                    635:    if ((s_objet = formateur_date(s_etat_processus, &horodatage)) == NULL)
                    636:    {
                    637:        return;
                    638:    }
                    639: 
                    640:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    641:            s_objet) == d_erreur)
                    642:    {
                    643:        return;
                    644:    }
                    645: 
                    646:    return;
                    647: }
                    648: 
                    649: 
                    650: /*
                    651: ================================================================================
                    652:   Fonction 'drws'
                    653: ================================================================================
                    654:   Entrées : pointeur sur une structure struct_processus
                    655: --------------------------------------------------------------------------------
                    656:   Sorties :
                    657: --------------------------------------------------------------------------------
                    658:   Effets de bord : néant
                    659: ================================================================================
                    660: */
                    661: 
                    662: void
                    663: instruction_drws(struct_processus *s_etat_processus)
                    664: {
                    665:    file                        *fichier;
                    666: 
                    667:    int                         dimensions;
                    668: 
                    669:    logical1                    presence_variable;
                    670:    logical1                    matrice_entiere;
                    671: 
                    672:    long                        i;
                    673: 
                    674:    struct_objet                *s_objet_statistique;
                    675: 
                    676:    unsigned char               *nom_fichier;
                    677: 
                    678:    unsigned long               j;
                    679: 
                    680:    struct_fichier_graphique    *l_fichier_courant;
                    681:    struct_fichier_graphique    *l_fichier_precedent;
                    682: 
                    683:    (*s_etat_processus).erreur_execution = d_ex;
                    684: 
                    685:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    686:    {
                    687:        printf("\n  DRWS ");
                    688: 
                    689:        if ((*s_etat_processus).langue == 'F')
                    690:        {
                    691:            printf("(affiche une série statistique)\n\n");
                    692:            printf("  Aucun argument\n");
                    693:        }
                    694:        else
                    695:        {
                    696:            printf("(draw statistical data)\n\n");
                    697:            printf("  No argument\n");
                    698:        }
                    699: 
                    700:        return;
                    701:    }
                    702:    else if ((*s_etat_processus).test_instruction == 'Y')
                    703:    {
                    704:        (*s_etat_processus).nombre_arguments = -1;
                    705:        return;
                    706:    }
                    707: 
                    708:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    709:    {
                    710:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                    711:        {
                    712:            return;
                    713:        }
                    714:    }
                    715: 
                    716:    /*
                    717:     * Vérification de la présence de la matrice statistique
                    718:     */
                    719: 
                    720:    if (recherche_variable(s_etat_processus, ds_sdat) == d_faux)
                    721:    {
                    722:        /*
                    723:         * Aucune variable ds_sdat n'existe.
                    724:         */
                    725: 
                    726:        (*s_etat_processus).erreur_execution = d_ex_absence_observations;
                    727:        (*s_etat_processus).erreur_systeme = d_es;
                    728: 
                    729:        return;
                    730:    }
                    731: 
                    732:    i = (*s_etat_processus).position_variable_courante;
                    733:    presence_variable = d_faux;
                    734: 
                    735:    while(i >= 0)
                    736:    {
                    737:        if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
                    738:                ds_sdat) == 0) && ((*s_etat_processus)
                    739:                .s_liste_variables[i].niveau == 1))
                    740:        {
                    741:            presence_variable = d_vrai;
                    742:            break;
                    743:        }
                    744: 
                    745:        i--;
                    746:    }
                    747: 
                    748:    if (presence_variable == d_faux)
                    749:    {
                    750:        (*s_etat_processus).erreur_execution = d_ex_absence_observations;
                    751:        return;
                    752:    }
                    753: 
                    754:    if ((s_objet_statistique = (*s_etat_processus).s_liste_variables[i].objet)
                    755:            == NULL)
                    756:    {
                    757:        (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
                    758:        return;
                    759:    }
                    760: 
                    761:    if ((*s_objet_statistique).type == MIN)
                    762:    {
                    763:        matrice_entiere = d_vrai;
                    764:    }
                    765:    else if ((*s_objet_statistique).type == MRL)
                    766:    {
                    767:        matrice_entiere = d_faux;
                    768:    }
                    769:    else
                    770:    {
                    771:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    772:        return;
                    773:    }
                    774: 
                    775:    /*
                    776:     * Création du fichier graphique temporaire
                    777:     */
                    778: 
                    779:    if ((nom_fichier = creation_nom_fichier(s_etat_processus,
                    780:            (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
                    781:    {
                    782:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    783:        return;
                    784:    }
                    785: 
                    786:    if ((fichier = fopen(nom_fichier, "w+")) == NULL)
                    787:    {
                    788:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    789:        return;
                    790:    }
                    791: 
                    792:    switch((*((struct_matrice *) (*s_objet_statistique).objet)).nombre_colonnes)
                    793:    {
                    794: 
                    795:    /*
                    796:     * Une seule colonne
                    797:     */
                    798: 
                    799:        case 1 :
                    800:        {
                    801:            dimensions = 2;
                    802: 
                    803:            for(j = 0; j < (*((struct_matrice *) (*s_objet_statistique).objet))
                    804:                    .nombre_lignes; j++)
                    805:            {
                    806:                if (matrice_entiere == d_vrai)
                    807:                {
                    808:                    if (fprintf(fichier, "%f %f\n", (double) j, (double)
                    809:                            ((integer8 **) (*((struct_matrice *)
                    810:                            (*s_objet_statistique).objet)).tableau)[j][0]) < 0)
                    811:                    {
                    812:                        (*s_etat_processus).erreur_systeme =
                    813:                                d_es_erreur_fichier;
                    814:                        return;
                    815:                    }
                    816:                }
                    817:                else
                    818:                {
                    819:                    if (fprintf(fichier, "%f %f\n", (double) j, (double)
                    820:                            ((real8 **) (*((struct_matrice *)
                    821:                            (*s_objet_statistique).objet)).tableau)[j][0]) < 0)
                    822:                    {
                    823:                        (*s_etat_processus).erreur_systeme =
                    824:                                d_es_erreur_fichier;
                    825:                        return;
                    826:                    }
                    827:                }
                    828:            }
                    829: 
                    830:            break;
                    831:        }
                    832: 
                    833:    /*
                    834:     * Deux colonnes ou plus
                    835:     */
                    836: 
                    837:        default :
                    838:        {
                    839:            dimensions = 2;
                    840: 
                    841:            if (((*s_etat_processus).colonne_statistique_1 < 1) ||
                    842:                    ((*s_etat_processus).colonne_statistique_2 < 1) ||
                    843:                    ((*s_etat_processus).colonne_statistique_1 > (signed long)
                    844:                    (*((struct_matrice *) (*s_objet_statistique).objet))
                    845:                    .nombre_colonnes) ||
                    846:                    ((*s_etat_processus).colonne_statistique_2 > (signed long)
                    847:                    (*((struct_matrice *) (*s_objet_statistique).objet))
                    848:                    .nombre_colonnes))
                    849:            {
                    850:                if (fclose(fichier) != 0)
                    851:                {
                    852:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    853:                    return;
                    854:                }
                    855: 
                    856:                if (destruction_fichier(nom_fichier) == d_erreur)
                    857:                {
                    858:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    859:                    return;
                    860:                }
                    861: 
                    862:                free(nom_fichier);
                    863: 
                    864:                (*s_etat_processus).erreur_execution =
                    865:                        d_ex_observations_inexistantes;
                    866:                return;
                    867:            }
                    868: 
                    869:            for(j = 0; j < (*((struct_matrice *) (*s_objet_statistique).objet))
                    870:                    .nombre_lignes; j++)
                    871:            {
                    872:                if (matrice_entiere == d_vrai)
                    873:                {
                    874:                    if (fprintf(fichier, "%f %f\n", (double) ((integer8 **)
                    875:                            (*((struct_matrice *) (*s_objet_statistique).objet))
                    876:                            .tableau)[j][(*s_etat_processus)
                    877:                            .colonne_statistique_1 - 1], (double) ((integer8 **)
                    878:                            (*((struct_matrice *) (*s_objet_statistique).objet))
                    879:                            .tableau)[j][(*s_etat_processus)
                    880:                            .colonne_statistique_2 - 1]) < 0)
                    881:                    {
                    882:                        (*s_etat_processus).erreur_systeme =
                    883:                                d_es_erreur_fichier;
                    884:                        return;
                    885:                    }
                    886:                }
                    887:                else
                    888:                {
                    889:                    if (fprintf(fichier, "%f %f\n", (double) ((real8 **)
                    890:                            (*((struct_matrice *) (*s_objet_statistique).objet))
                    891:                            .tableau)[j][(*s_etat_processus)
                    892:                            .colonne_statistique_1 - 1], (double) ((real8 **)
                    893:                            (*((struct_matrice *) (*s_objet_statistique).objet))
                    894:                            .tableau)[j][(*s_etat_processus)
                    895:                            .colonne_statistique_2 - 1]) < 0)
                    896:                    {
                    897:                        (*s_etat_processus).erreur_systeme =
                    898:                                d_es_erreur_fichier;
                    899:                        return;
                    900:                    }
                    901:                }
                    902:            }
                    903: 
                    904:            break;
                    905:        }
                    906:    }
                    907: 
                    908:    /*
                    909:     * Fermeture du fichier graphique
                    910:     */
                    911: 
                    912:    if (fclose(fichier) != 0)
                    913:    {
                    914:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    915:        return;
                    916:    }
                    917: 
                    918:    /*
                    919:     * Chaînage du fichier temporaire à la liste des fichiers graphiques
                    920:     */
                    921: 
                    922:    l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
                    923: 
                    924:    if (l_fichier_courant == NULL)
                    925:    {
                    926:        if (((*s_etat_processus).fichiers_graphiques = malloc(
                    927:                sizeof(struct_fichier_graphique))) == NULL)
                    928:        {
                    929:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    930:            return;
                    931:        }
                    932: 
                    933:        (*(*s_etat_processus).fichiers_graphiques).suivant = NULL;
                    934:        (*(*s_etat_processus).fichiers_graphiques).nom = nom_fichier;
                    935:        (*(*s_etat_processus).fichiers_graphiques).legende = NULL;
                    936:        (*(*s_etat_processus).fichiers_graphiques).dimensions = dimensions;
                    937:        (*(*s_etat_processus).fichiers_graphiques).presence_axes = d_faux;
                    938:        (*(*s_etat_processus).fichiers_graphiques).systeme_axes =
                    939:                (*s_etat_processus).systeme_axes;
                    940:        strcpy((*(*s_etat_processus).fichiers_graphiques).type,
                    941:                (*s_etat_processus).type_trace_sigma);
                    942:    }
                    943:    else
                    944:    {
                    945:        while(l_fichier_courant != NULL)
                    946:        {
                    947:            if ((*l_fichier_courant).dimensions != dimensions)
                    948:            {
                    949:                (*s_etat_processus).erreur_execution =
                    950:                        d_ex_dimensions_differentes;
                    951:                return;
                    952:            }
                    953: 
                    954:            l_fichier_precedent = l_fichier_courant;
                    955:            l_fichier_courant = (*l_fichier_courant).suivant;
                    956:        }
                    957: 
                    958:        l_fichier_courant = l_fichier_precedent;
                    959: 
                    960:        if (((*l_fichier_courant).suivant = malloc(
                    961:                sizeof(struct_fichier_graphique))) == NULL)
                    962:        {
                    963:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    964:            return;
                    965:        }
                    966: 
                    967:        l_fichier_courant = (*l_fichier_courant).suivant;
                    968: 
                    969:        (*l_fichier_courant).suivant = NULL;
                    970:        (*l_fichier_courant).nom = nom_fichier;
                    971:        (*l_fichier_courant).legende = NULL;
                    972:        (*l_fichier_courant).dimensions = dimensions;
                    973:        (*l_fichier_courant).presence_axes = d_faux;
                    974:        (*l_fichier_courant).systeme_axes = (*s_etat_processus).systeme_axes;
                    975:        strcpy((*l_fichier_courant).type, (*s_etat_processus).type_trace_sigma);
                    976:    }
                    977: 
                    978:    /*
                    979:     * Affichage du graphique
                    980:     */
                    981: 
                    982:    appel_gnuplot(s_etat_processus, 'N');
                    983:    (*s_etat_processus).erreur_execution = d_ex;
                    984:    (*s_etat_processus).exception = d_ep;
                    985: 
                    986:    return;
                    987: }
                    988: 
                    989: 
                    990: /*
                    991: ================================================================================
                    992:   Fonction 'decr'
                    993: ================================================================================
                    994:   Entrées :
                    995: --------------------------------------------------------------------------------
                    996:   Sorties :
                    997: --------------------------------------------------------------------------------
                    998:   Effets de bord : néant
                    999: ================================================================================
                   1000: */
                   1001: 
                   1002: void
                   1003: instruction_decr(struct_processus *s_etat_processus)
                   1004: {
                   1005:    logical1                    variable_partagee;
                   1006: 
                   1007:    struct_objet                *s_copie_argument;
                   1008:    struct_objet                *s_objet_argument;
                   1009: 
                   1010:    (*s_etat_processus).erreur_execution = d_ex;
                   1011: 
                   1012:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1013:    {
                   1014:        printf("\n  DECR ");
                   1015: 
                   1016:        if ((*s_etat_processus).langue == 'F')
                   1017:        {
                   1018:            printf("(décrémentation)\n\n");
                   1019:        }
                   1020:        else
                   1021:        {
                   1022:            printf("(decrementation)\n\n");
                   1023:        }
                   1024: 
                   1025:        printf("    1: %s\n", d_INT);
                   1026:        printf("->  1: %s\n\n", d_INT);
                   1027: 
                   1028:        printf("    1: %s\n", d_NOM);
                   1029: 
                   1030:        return;
                   1031:    }
                   1032:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1033:    {
                   1034:        (*s_etat_processus).nombre_arguments = -1;
                   1035:        return;
                   1036:    }
                   1037: 
                   1038:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1039:    {
                   1040:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1041:        {
                   1042:            return;
                   1043:        }
                   1044:    }
                   1045: 
                   1046:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1047:            &s_objet_argument) == d_erreur)
                   1048:    {
                   1049:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1050:        return;
                   1051:    }
                   1052: 
                   1053:    if ((*s_objet_argument).type == INT)
                   1054:    {
                   1055:        if ((s_copie_argument = copie_objet(s_etat_processus,
                   1056:                s_objet_argument, 'O')) == NULL)
                   1057:        {
                   1058:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1059:            return;
                   1060:        }
                   1061: 
                   1062:        liberation(s_etat_processus, s_objet_argument);
                   1063:        s_objet_argument = s_copie_argument;
                   1064: 
                   1065:        (*((integer8 *) (*s_objet_argument).objet))--;
                   1066: 
                   1067:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1068:                s_objet_argument) == d_erreur)
                   1069:        {
                   1070:            return;
                   1071:        }
                   1072:    }
                   1073:    else if ((*s_objet_argument).type == NOM)
                   1074:    {
                   1075:        if (recherche_variable(s_etat_processus, (*((struct_nom *)
                   1076:                (*s_objet_argument).objet)).nom) == d_faux)
                   1077:        {
                   1078:            (*s_etat_processus).erreur_systeme = d_es;
                   1079:            (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
                   1080: 
                   1081:            return;
                   1082:        }
                   1083: 
                   1084:        liberation(s_etat_processus, s_objet_argument);
                   1085: 
                   1086:        if ((*s_etat_processus).s_liste_variables
                   1087:                [(*s_etat_processus).position_variable_courante]
                   1088:                .variable_verrouillee == d_vrai)
                   1089:        {
                   1090:            (*s_etat_processus).erreur_execution =
                   1091:                    d_ex_variable_verrouillee;
                   1092:            return;
                   1093:        }
                   1094: 
                   1095:        if ((*s_etat_processus).s_liste_variables
                   1096:                [(*s_etat_processus).position_variable_courante].objet
                   1097:                == NULL)
                   1098:        {
                   1099:            if (pthread_mutex_lock(&((*(*s_etat_processus)
                   1100:                    .s_liste_variables_partagees).mutex)) != 0)
                   1101:            {
                   1102:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1103:                return;
                   1104:            }
                   1105: 
                   1106:            if (recherche_variable_partagee(s_etat_processus,
                   1107:                    (*s_etat_processus).s_liste_variables
                   1108:                    [(*s_etat_processus).position_variable_courante].nom,
                   1109:                    (*s_etat_processus).s_liste_variables
                   1110:                    [(*s_etat_processus).position_variable_courante]
                   1111:                    .variable_partagee, (*s_etat_processus).s_liste_variables
                   1112:                    [(*s_etat_processus).position_variable_courante]
                   1113:                    .origine) == d_faux)
                   1114:            {
                   1115:                (*s_etat_processus).erreur_systeme = d_es;
                   1116:                (*s_etat_processus).erreur_execution =
                   1117:                        d_ex_variable_non_definie;
                   1118: 
                   1119:                return;
                   1120:            }
                   1121: 
                   1122:            s_objet_argument = (*(*s_etat_processus)
                   1123:                    .s_liste_variables_partagees).table
                   1124:                    [(*(*s_etat_processus).s_liste_variables_partagees)
                   1125:                    .position_variable].objet;
                   1126:            variable_partagee = d_vrai;
                   1127:        }
                   1128:        else
                   1129:        {
                   1130:            s_objet_argument = (*s_etat_processus).s_liste_variables
                   1131:                    [(*s_etat_processus).position_variable_courante].objet;
                   1132:            variable_partagee = d_faux;
                   1133:        }
                   1134: 
                   1135:        if ((s_copie_argument = copie_objet(s_etat_processus,
                   1136:                s_objet_argument, 'O')) == NULL)
                   1137:        {
                   1138:            if (variable_partagee == d_vrai)
                   1139:            {
                   1140:                if (pthread_mutex_unlock(&((*(*s_etat_processus)
                   1141:                        .s_liste_variables_partagees).mutex)) != 0)
                   1142:                {
                   1143:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   1144:                    return;
                   1145:                }
                   1146:            }
                   1147: 
                   1148:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1149:            return;
                   1150:        }
                   1151: 
                   1152:        liberation(s_etat_processus, s_objet_argument);
                   1153: 
                   1154:        if (variable_partagee == d_vrai)
                   1155:        {
                   1156:            (*s_etat_processus).s_liste_variables[(*s_etat_processus)
                   1157:                    .position_variable_courante].objet = NULL;
                   1158:            (*(*s_etat_processus)
                   1159:                    .s_liste_variables_partagees).table
                   1160:                    [(*(*s_etat_processus).s_liste_variables_partagees)
                   1161:                    .position_variable].objet = s_copie_argument;
                   1162:        }
                   1163:        else
                   1164:        {
                   1165:            (*s_etat_processus).s_liste_variables[(*s_etat_processus)
                   1166:                    .position_variable_courante].objet = s_copie_argument;
                   1167:        }
                   1168: 
                   1169:        if ((*s_copie_argument).type == INT)
                   1170:        {
                   1171:            (*((integer8 *) (*s_copie_argument).objet))--;
                   1172: 
                   1173:            if (variable_partagee == d_vrai)
                   1174:            {
                   1175:                if (pthread_mutex_unlock(&((*(*s_etat_processus)
                   1176:                        .s_liste_variables_partagees).mutex)) != 0)
                   1177:                {
                   1178:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   1179:                    return;
                   1180:                }
                   1181:            }
                   1182:        }
                   1183:        else
                   1184:        {
                   1185:            if (variable_partagee == d_vrai)
                   1186:            {
                   1187:                if (pthread_mutex_unlock(&((*(*s_etat_processus)
                   1188:                        .s_liste_variables_partagees).mutex)) != 0)
                   1189:                {
                   1190:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   1191:                    return;
                   1192:                }
                   1193:            }
                   1194: 
                   1195:            (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1196:            return;
                   1197:        }
                   1198:    }
                   1199:    else
                   1200:    {
                   1201:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1202: 
                   1203:        liberation(s_etat_processus, s_objet_argument);
                   1204:        return;
                   1205:    }
                   1206: 
                   1207:    return;
                   1208: }
                   1209: 
                   1210: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>