Annotation of rpl/src/instructions_s8.c, revision 1.71

1.1       bertrand    1: /*
                      2: ================================================================================
1.71    ! bertrand    3:   RPL/2 (R) version 4.1.23
1.67      bertrand    4:   Copyright (C) 1989-2015 Dr. BERTRAND Joël
1.1       bertrand    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: 
1.15      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   24: 
                     25: 
                     26: /*
                     27: ================================================================================
                     28:   Fonction 'splash'
                     29: ================================================================================
                     30:   Entrées :
                     31: --------------------------------------------------------------------------------
                     32:   Sorties :
                     33: --------------------------------------------------------------------------------
                     34:   Effets de bord : néant
                     35: ================================================================================
                     36: */
                     37: 
                     38: void
                     39: instruction_splash(struct_processus *s_etat_processus)
                     40: {
                     41:    real8                       attente;
                     42: 
                     43:    struct_objet                *s_objet;
                     44: 
                     45:    (*s_etat_processus).erreur_execution = d_ex;
                     46: 
                     47:    if ((*s_etat_processus).affichage_arguments == 'Y')
                     48:    {
                     49:        printf("\n  SPLASH ");
                     50: 
                     51:        if ((*s_etat_processus).langue == 'F')
                     52:        {
                     53:            printf("(écran RPL/2)\n\n");
                     54:        }
                     55:        else
                     56:        {
                     57:            printf("(RPL/2 splash screen)\n\n");
                     58:        }
                     59: 
                     60:        printf("    1: %s, %s\n", d_INT, d_REL);
                     61: 
                     62:        return;
                     63:    }
                     64:    else if ((*s_etat_processus).test_instruction == 'Y')
                     65:    {
                     66:        (*s_etat_processus).nombre_arguments = -1;
                     67:        return;
                     68:    }
                     69:    
                     70:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                     71:    {
                     72:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                     73:        {
                     74:            return;
                     75:        }
                     76:    }
                     77: 
                     78:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                     79:            &s_objet) == d_erreur)
                     80:    {
                     81:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                     82:        return;
                     83:    }
                     84: 
                     85:    if (((*s_objet).type == INT) ||
                     86:            ((*s_objet).type == REL))
                     87:    {
                     88:        if ((*s_objet).type == INT)
                     89:        {
                     90:            attente = (real8) (*((integer8 *) (*s_objet).objet));
                     91:        }
                     92:        else
                     93:        {
                     94:            attente = (*((real8 *) (*s_objet).objet));
                     95:        }
                     96: 
                     97:        if (attente < 0)
                     98:        {
                     99:            liberation(s_etat_processus, s_objet);
                    100: 
                    101:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    102:            return;
                    103:        }
                    104: 
1.57      bertrand  105:        encart(s_etat_processus, (integer8) (attente * 1E6));
1.1       bertrand  106:    }
                    107:    else
                    108:    {
                    109:        liberation(s_etat_processus, s_objet);
                    110: 
                    111:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    112:        return;
                    113:    }
                    114: 
                    115:    liberation(s_etat_processus, s_objet);
                    116: 
                    117:    return;
                    118: }
                    119: 
                    120: 
                    121: /*
                    122: ================================================================================
                    123:   Fonction 'send'
                    124: ================================================================================
                    125:   Entrées :
                    126: --------------------------------------------------------------------------------
                    127:   Sorties :
                    128: --------------------------------------------------------------------------------
                    129:   Effets de bord : néant
                    130: ================================================================================
                    131: */
                    132: 
                    133: void
                    134: instruction_send(struct_processus *s_etat_processus)
                    135: {
                    136:    sig_atomic_t                registre;
                    137: 
                    138:    ssize_t                     longueur_ecriture;
                    139: 
                    140:    struct_objet                *s_objet;
                    141: 
                    142:    struct timespec             attente;
                    143: 
1.59      bertrand  144:    unsigned char               caractere;
1.1       bertrand  145:    unsigned char               tampon;
                    146: 
                    147:    (*s_etat_processus).erreur_execution = d_ex;
                    148: 
                    149:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    150:    {
                    151:        printf("\n  SEND ");
                    152: 
                    153:        if ((*s_etat_processus).langue == 'F')
                    154:        {
                    155:            printf("(envoi de données au processus père)\n\n");
                    156:        }
                    157:        else
                    158:        {
                    159:            printf("(send data to parent process)\n\n");
                    160:        }
                    161: 
                    162:        printf("    1: %s, %s, %s, %s, %s, %s,\n"
                    163:                "       %s, %s, %s, %s, %s,\n"
                    164:                "       %s, %s, %s, %s, %s\n",
                    165:                d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
                    166:                d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_TAB);
                    167: 
                    168:        return;
                    169:    }
                    170:    else if ((*s_etat_processus).test_instruction == 'Y')
                    171:    {
                    172:        (*s_etat_processus).nombre_arguments = -1;
                    173:        return;
                    174:    }
                    175:    
                    176:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    177:    {
                    178:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    179:        {
                    180:            return;
                    181:        }
                    182:    }
                    183: 
                    184:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    185:            &s_objet) == d_erreur)
                    186:    {
                    187:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    188:        return;
                    189:    }
                    190: 
                    191:    if ((*s_etat_processus).presence_pipes == d_faux)
                    192:    {
                    193:        liberation(s_etat_processus, s_objet);
                    194: 
                    195:        (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
                    196:        return;
                    197:    }
                    198: 
                    199:    if (((*s_objet).type != INT) &&
                    200:            ((*s_objet).type != REL) &&
                    201:            ((*s_objet).type != CPL) &&
                    202:            ((*s_objet).type != VIN) &&
                    203:            ((*s_objet).type != VRL) &&
                    204:            ((*s_objet).type != VCX) &&
                    205:            ((*s_objet).type != MIN) &&
                    206:            ((*s_objet).type != MRL) &&
                    207:            ((*s_objet).type != MCX) &&
                    208:            ((*s_objet).type != BIN) &&
                    209:            ((*s_objet).type != NOM) &&
                    210:            ((*s_objet).type != CHN) &&
                    211:            ((*s_objet).type != LST) &&
                    212:            ((*s_objet).type != ALG) &&
                    213:            ((*s_objet).type != RPN) &&
                    214:            ((*s_objet).type != TBL))
                    215:    {
                    216:        liberation(s_etat_processus, s_objet);
                    217: 
                    218:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    219:        return;
                    220:    }
                    221: 
                    222:    /*
                    223:     * On signale au processus père qu'il y a un objet de plus
                    224:     * dans le pipe de données.
                    225:     */
                    226: 
                    227:    registre = (*s_etat_processus).var_volatile_traitement_retarde_stop;
                    228:    (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
                    229: 
                    230:    if ((*s_etat_processus).processus_detache == d_vrai)
                    231:    {
                    232:        if ((*s_etat_processus).profilage == d_vrai)
                    233:        {
                    234:            profilage(s_etat_processus, "Interprocess communications (SEND)");
                    235: 
                    236:            if ((*s_etat_processus).erreur_systeme != d_es)
                    237:            {
                    238:                return;
                    239:            }
                    240:        }
                    241: 
1.38      bertrand  242: #      ifndef SEMAPHORES_NOMMES
                    243:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    244: #      else
                    245:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    246: #      endif
1.1       bertrand  247:        {
                    248:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    249:            return;
                    250:        }
                    251: 
1.59      bertrand  252:        caractere = 1;
1.1       bertrand  253: 
                    254:        attente.tv_sec = 0;
                    255:        attente.tv_nsec = GRANULARITE_us * 1000;
                    256: 
                    257:        while((longueur_ecriture = write_atomic(s_etat_processus,
1.59      bertrand  258:                (*s_etat_processus).pipe_nombre_elements_attente,
                    259:                &caractere, sizeof(caractere))) != sizeof(caractere))
1.1       bertrand  260:        {
1.38      bertrand  261: #          ifndef SEMAPHORES_NOMMES
                    262:                while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    263: #          else
                    264:                while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    265: #          endif
1.1       bertrand  266:            {
1.37      bertrand  267:                if (errno != EINTR)
                    268:                {
                    269:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    270:                    return;
                    271:                }
1.1       bertrand  272:            }
                    273: 
                    274:            if (longueur_ecriture == -1)
                    275:            {
                    276:                if ((*s_etat_processus).profilage == d_vrai)
                    277:                {
                    278:                    profilage(s_etat_processus, NULL);
                    279:                }
                    280: 
                    281:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    282:                return;
                    283:            }
                    284: 
                    285:            nanosleep(&attente, NULL);
                    286:            INCR_GRANULARITE(attente.tv_nsec);
                    287: 
1.38      bertrand  288: #          ifndef SEMAPHORES_NOMMES
                    289:                if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    290: #          else
                    291:                if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    292: #          endif
1.1       bertrand  293:            {
                    294:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    295:                return;
                    296:            }
1.35      bertrand  297: 
                    298:            scrutation_interruptions(s_etat_processus);
1.1       bertrand  299:        }
                    300: 
1.38      bertrand  301: #      ifndef SEMAPHORES_NOMMES
                    302:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    303: #      else
                    304:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    305: #      endif
1.1       bertrand  306:        {
1.37      bertrand  307:            if (errno != EINTR)
                    308:            {
                    309:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    310:                return;
                    311:            }
1.1       bertrand  312:        }
                    313:    }
                    314:    else
                    315:    {
                    316:        if ((*s_etat_processus).profilage == d_vrai)
                    317:        {
                    318:            profilage(s_etat_processus, "Interthread communications (SEND)");
                    319: 
                    320:            if ((*s_etat_processus).erreur_systeme != d_es)
                    321:            {
                    322:                return;
                    323:            }
                    324:        }
                    325: 
                    326:        attente.tv_sec = 0;
                    327:        attente.tv_nsec = GRANULARITE_us * 1000;
                    328: 
1.38      bertrand  329: #      ifndef SEMAPHORES_NOMMES
                    330:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    331: #      else
                    332:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    333: #      endif
1.1       bertrand  334:        {
                    335:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    336:            return;
                    337:        }
                    338: 
1.59      bertrand  339:        caractere = 1;
1.1       bertrand  340: 
                    341:        attente.tv_sec = 0;
                    342:        attente.tv_nsec = GRANULARITE_us * 1000;
                    343: 
                    344:        while((longueur_ecriture = write_atomic(s_etat_processus,
1.59      bertrand  345:                (*s_etat_processus).pipe_nombre_elements_attente,
                    346:                &caractere, sizeof(caractere))) != sizeof(caractere))
1.1       bertrand  347:        {
1.38      bertrand  348: #          ifndef SEMAPHORES_NOMMES
                    349:                while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    350: #          else
                    351:                while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    352: #          endif
1.1       bertrand  353:            {
1.37      bertrand  354:                if (errno != EINTR)
                    355:                {
                    356:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    357:                    return;
                    358:                }
1.1       bertrand  359:            }
                    360: 
                    361:            if (longueur_ecriture == -1)
                    362:            {
                    363:                if ((*s_etat_processus).profilage == d_vrai)
                    364:                {
                    365:                    profilage(s_etat_processus, NULL);
                    366:                }
                    367: 
                    368:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    369:                return;
                    370:            }
                    371: 
                    372:            nanosleep(&attente, NULL);
                    373:            INCR_GRANULARITE(attente.tv_nsec);
                    374: 
1.38      bertrand  375: #          ifndef SEMAPHORES_NOMMES
                    376:                if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    377: #          else
                    378:                if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    379: #          endif
1.7       bertrand  380:            {
                    381:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    382:                return;
                    383:            }
1.35      bertrand  384: 
                    385:            scrutation_interruptions(s_etat_processus);
1.1       bertrand  386:        }
                    387: 
1.38      bertrand  388: #      ifndef SEMAPHORES_NOMMES
                    389:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    390: #      else
                    391:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    392: #      endif
1.1       bertrand  393:        {
1.34      bertrand  394:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    395:            return;
1.1       bertrand  396:        }
                    397:    }
                    398: 
                    399:    (*s_etat_processus).nombre_objets_envoyes_non_lus++;
                    400: 
                    401:    attente.tv_sec = 0;
                    402:    attente.tv_nsec = GRANULARITE_us * 1000;
                    403: 
1.38      bertrand  404: #  ifndef SEMAPHORES_NOMMES
                    405:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    406: #  else
                    407:        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    408: #  endif
1.7       bertrand  409:    {
                    410:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    411:        return;
                    412:    }
1.1       bertrand  413: 
                    414:    while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement,
                    415:            &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
                    416:    {
1.38      bertrand  417: #      ifndef SEMAPHORES_NOMMES
                    418:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    419: #      else
                    420:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    421: #      endif
1.1       bertrand  422:        {
1.37      bertrand  423:            if (errno != EINTR)
                    424:            {
                    425:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    426:                return;
                    427:            }
1.1       bertrand  428:        }
                    429: 
                    430:        nanosleep(&attente, NULL);
                    431:        INCR_GRANULARITE(attente.tv_nsec);
                    432: 
1.38      bertrand  433: #      ifndef SEMAPHORES_NOMMES
                    434:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    435: #      else
                    436:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    437: #      endif
1.1       bertrand  438:        {
                    439:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    440:            return;
                    441:        }
1.35      bertrand  442: 
                    443:        scrutation_interruptions(s_etat_processus);
1.1       bertrand  444:    }
                    445: 
1.38      bertrand  446: #  ifndef SEMAPHORES_NOMMES
                    447:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    448: #  else
                    449:        while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    450: #  endif
1.1       bertrand  451:    {
1.37      bertrand  452:        if (errno != EINTR)
                    453:        {
                    454:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    455:            return;
                    456:        }
1.1       bertrand  457:    }
                    458: 
                    459:    // ecriture_pipe() ne peut être interrompu par un signal.
                    460: 
1.38      bertrand  461: #  ifndef SEMAPHORES_NOMMES
                    462:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    463: #  else
                    464:        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    465: #  endif
1.1       bertrand  466:    {
                    467:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    468:        return;
                    469:    }
                    470: 
                    471:    if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees,
                    472:            s_objet) == d_erreur)
                    473:    {
1.38      bertrand  474: #      ifndef SEMAPHORES_NOMMES
                    475:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    476: #      else
                    477:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    478: #      endif
1.1       bertrand  479:        {
1.37      bertrand  480:            if (errno != EINTR)
                    481:            {
                    482:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    483:                return;
                    484:            }
1.1       bertrand  485:        }
                    486: 
                    487:        if ((*s_etat_processus).profilage == d_vrai)
                    488:        {
                    489:            profilage(s_etat_processus, NULL);
                    490:        }
                    491: 
                    492:        liberation(s_etat_processus, s_objet);
                    493:        return;
                    494:    }
                    495: 
1.38      bertrand  496: #  ifndef SEMAPHORES_NOMMES
                    497:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    498: #  else
                    499:        while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    500: #  endif
1.1       bertrand  501:    {
1.37      bertrand  502:        if (errno != EINTR)
                    503:        {
                    504:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    505:            return;
                    506:        }
1.1       bertrand  507:    }
                    508: 
                    509:    if ((*s_etat_processus).profilage == d_vrai)
                    510:    {
                    511:        profilage(s_etat_processus, NULL);
                    512:    }
                    513: 
                    514:    if (registre == 0)
                    515:    {
                    516:        if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
                    517:        {
                    518:            (*s_etat_processus).var_volatile_requete_arret = -1;
                    519:        }
                    520: 
                    521:        (*s_etat_processus).var_volatile_traitement_retarde_stop = registre;
                    522:    }
                    523: 
                    524:    liberation(s_etat_processus, s_objet);
                    525:    return;
                    526: }
                    527: 
                    528: 
                    529: /*
                    530: ================================================================================
                    531:   Fonction 'sqlquery'
                    532: ================================================================================
                    533:   Entrées :
                    534: --------------------------------------------------------------------------------
                    535:   Sorties :
                    536: --------------------------------------------------------------------------------
                    537:   Effets de bord : néant
                    538: ================================================================================
                    539: */
                    540: 
                    541: void
                    542: instruction_sqlquery(struct_processus *s_etat_processus)
                    543: {
                    544:    logical1                        connexion_permanente;
                    545: 
                    546:    struct_objet                    *s_copie_1;
                    547:    struct_objet                    *s_objet_1;
                    548:    struct_objet                    *s_copie_2;
                    549:    struct_objet                    *s_objet_2;
                    550: 
                    551:    unsigned char                   *tampon;
                    552: 
                    553:    (*s_etat_processus).erreur_execution = d_ex;
                    554: 
                    555:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    556:    {
                    557:        printf("\n  SQLQUERY ");
                    558: 
                    559:        if ((*s_etat_processus).langue == 'F')
                    560:        {
                    561:            printf("(requête SQL)\n\n");
                    562:        }
                    563:        else
                    564:        {
                    565:            printf("(SQL query)\n\n");
                    566:        }
                    567: 
                    568:        printf("    2: %s\n", d_CHN);
                    569:        printf("    1: %s\n", d_LST);
                    570:        printf("->  1: %s\n\n", d_LST);
                    571: 
                    572:        printf("    2: %s\n", d_CHN);
                    573:        printf("    1: %s\n", d_SQL);
                    574:        printf("->  1: %s\n\n", d_LST);
                    575: 
                    576:        if ((*s_etat_processus).langue == 'F')
                    577:        {
                    578:            printf("  Utilisation :\n\n");
                    579:        }
                    580:        else
                    581:        {
                    582:            printf("  Usage:\n\n");
                    583:        }
                    584: 
                    585:        printf("    \"select * from table\"\n");
                    586:        printf("          { \"mysql\" \"server\" \"database\" "
                    587:                "\"user\" \"password\" } SQLQUERY\n");
                    588:        printf("    \"select field from table\"\n");
                    589:        printf("          { \"postgresql:iso-8859-1\" \"server\" "
                    590:                "\"database\" \"user\" \"password\" port }\n");
                    591:        printf("          SQLQUERY\n");
1.53      bertrand  592:        printf("    \"select * from table\"\n");
                    593:        printf("          { \"sqlite\" \"file\" } SQLQUERY\n");
1.1       bertrand  594: 
                    595:        return;
                    596:    }
                    597:    else if ((*s_etat_processus).test_instruction == 'Y')
                    598:    {
                    599:        (*s_etat_processus).nombre_arguments = -1;
                    600:        return;
                    601:    }
                    602:    
                    603:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    604:    {
                    605:        if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
                    606:        {
                    607:            return;
                    608:        }
                    609:    }
                    610: 
                    611:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    612:            &s_objet_1) == d_erreur)
                    613:    {
                    614:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    615:        return;
                    616:    }
                    617: 
                    618:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    619:            &s_objet_2) == d_erreur)
                    620:    {
                    621:        liberation(s_etat_processus, s_objet_1);
                    622: 
                    623:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    624:        return;
                    625:    }
                    626: 
                    627:    if ((*s_objet_1).type == LST)
                    628:    {
                    629:        connexion_permanente = d_faux;
                    630: 
                    631:        s_copie_1 = s_objet_1;
                    632: 
                    633:        if ((s_objet_1 = parametres_sql(s_etat_processus, s_copie_1)) == NULL)
                    634:        {
                    635:            liberation(s_etat_processus, s_copie_1);
                    636:            liberation(s_etat_processus, s_objet_2);
                    637:            return;
                    638:        }
                    639: 
1.45      bertrand  640:        if ((*s_etat_processus).erreur_execution ==
                    641:                d_ex_instruction_indisponible)
                    642:        {
                    643:            liberation(s_etat_processus, s_objet_1);
                    644:            liberation(s_etat_processus, s_objet_2);
                    645:            liberation(s_etat_processus, s_copie_1);
                    646: 
                    647:            return;
                    648:        }
                    649: 
1.1       bertrand  650:        liberation(s_etat_processus, s_copie_1);
                    651:    }
                    652:    else
                    653:    {
                    654:        if ((*s_objet_1).type == SQL)
                    655:        {
                    656:            if (((*((struct_connecteur_sql *) (*s_objet_1).objet)).pid !=
                    657:                    getpid()) || (pthread_equal((*((struct_connecteur_sql *)
                    658:                    (*s_objet_1).objet)).tid, pthread_self()) == 0))
                    659:            {
                    660:                (*s_etat_processus).erreur_execution =
                    661:                        d_ex_fichier_hors_contexte;
                    662: 
                    663:                liberation(s_etat_processus, s_objet_1);
                    664:                liberation(s_etat_processus, s_objet_2);
                    665:                return;
                    666:            }
                    667:        }
                    668: 
                    669:        connexion_permanente = d_vrai;
                    670:    }
                    671: 
                    672:    if (((*s_objet_1).type == SQL) && ((*s_objet_2).type == CHN))
                    673:    {
                    674:        if ((*((struct_connecteur_sql *) (*s_objet_1).objet)).locale != NULL)
                    675:        {
                    676:            /*
                    677:             * Transcodage de la commande SQL
                    678:             */
                    679: 
                    680:            if ((s_copie_2 = copie_objet(s_etat_processus, s_objet_2, 'O'))
                    681:                    == NULL)
                    682:            {
                    683:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    684:                return;
                    685:            }
                    686: 
                    687:            liberation(s_etat_processus, s_objet_2);
                    688:            s_objet_2 = s_copie_2;
                    689: 
                    690:            tampon = (*s_objet_2).objet;
                    691: 
                    692:            if (((*s_objet_2).objet = transliteration(s_etat_processus, tampon,
                    693:                    (*((struct_connecteur_sql *) (*s_objet_1).objet)).locale,
                    694:                    d_locale)) == NULL)
                    695:            {
                    696:                return;
                    697:            }
                    698: 
                    699:            free(tampon);
                    700:        }
                    701: 
                    702:        /*
                    703:         * Pilote MySQL
                    704:         */
                    705: 
                    706:        if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
                    707:                "MYSQL") == 0)
                    708:        {
                    709: #          ifdef MYSQL_SUPPORT
                    710: 
1.40      bertrand  711:            unsigned int                i;
                    712:            unsigned int                nombre_colonnes;
                    713: 
                    714:            logical1                    presence_resultat;
                    715: 
                    716:            MYSQL_RES                   *resultat_mysql;
                    717:            MYSQL_ROW                   ligne;
                    718: 
                    719:            struct_objet                *s_objet_resultat;
                    720: 
                    721:            struct_liste_chainee        *l_element_courant;
                    722:            struct_liste_chainee        *l_element_courant_ligne;
1.1       bertrand  723: 
                    724:            if (mysql_real_query((*((struct_connecteur_sql *) (*s_objet_1)
                    725:                    .objet)).descripteur.mysql, (unsigned char *) (*s_objet_2)
                    726:                    .objet, strlen((unsigned char *) (*s_objet_2).objet)) != 0)
                    727:            {
                    728:                if (connexion_permanente == d_faux)
                    729:                {
                    730:                    mysql_close((*((struct_connecteur_sql *) (*s_objet_1)
                    731:                            .objet)).descripteur.mysql);
                    732:                }
                    733: 
                    734:                liberation(s_etat_processus, s_objet_1);
                    735:                liberation(s_etat_processus, s_objet_2);
                    736: 
                    737:                (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                    738:                return;
                    739:            }
                    740: 
                    741:            if ((resultat_mysql = mysql_store_result(
                    742:                    (*((struct_connecteur_sql *) (*s_objet_1).objet))
                    743:                    .descripteur.mysql)) == NULL)
                    744:            {
                    745:                // La requête ne renvoie rien (exemple : INSERT)
                    746:                presence_resultat = d_faux;
                    747:                nombre_colonnes = 0;
                    748:            }
                    749:            else
                    750:            {
                    751:                // La requête renvoie une ou plusieurs valeurs.
                    752:                presence_resultat = d_vrai;
                    753:                nombre_colonnes = mysql_field_count((*((struct_connecteur_sql *)
                    754:                        (*s_objet_1).objet)).descripteur.mysql);
                    755:            }
                    756: 
                    757:            if ((s_objet_resultat = allocation(s_etat_processus, LST))
                    758:                    == NULL)
                    759:            {
                    760:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    761:                return;
                    762:            }
                    763: 
                    764:            (*s_objet_resultat).objet = NULL;
                    765:            l_element_courant = (*s_objet_resultat).objet;
                    766: 
                    767:            while(((presence_resultat == d_vrai) ?
                    768:                    (ligne = mysql_fetch_row(resultat_mysql)) : NULL) != NULL)
                    769:            {
                    770:                unsigned long           *longueurs;
                    771: 
                    772:                longueurs = mysql_fetch_lengths(resultat_mysql);
                    773: 
                    774:                if (l_element_courant == NULL)
                    775:                {
                    776:                    if (((*s_objet_resultat).objet =
                    777:                            allocation_maillon(s_etat_processus)) == NULL)
                    778:                    {
                    779:                        (*s_etat_processus).erreur_systeme =
                    780:                                d_es_allocation_memoire;
                    781:                        return;
                    782:                    }
                    783: 
                    784:                    l_element_courant = (struct_liste_chainee *)
                    785:                            (*s_objet_resultat).objet;
                    786:                }
                    787:                else
                    788:                {
                    789:                    if (((*l_element_courant).suivant =
                    790:                            allocation_maillon(s_etat_processus)) == NULL)
                    791:                    {
                    792:                        (*s_etat_processus).erreur_systeme =
                    793:                                d_es_allocation_memoire;
                    794:                        return;
                    795:                    }
                    796: 
                    797:                    l_element_courant = (*l_element_courant).suivant;
                    798:                }
                    799: 
                    800:                (*l_element_courant).suivant = NULL;
                    801: 
                    802:                if (((*l_element_courant).donnee = allocation(s_etat_processus,
                    803:                        LST)) == NULL)
                    804:                {
                    805:                    (*s_etat_processus).erreur_systeme =
                    806:                            d_es_allocation_memoire;
                    807:                    return;
                    808:                }
                    809: 
                    810:                (*(*l_element_courant).donnee).objet = NULL;
                    811:                l_element_courant_ligne = NULL;
                    812: 
                    813:                for(i = 0; i < nombre_colonnes; i++)
                    814:                {
                    815:                    if (l_element_courant_ligne == NULL)
                    816:                    {
                    817:                        if (((*(*l_element_courant).donnee).objet =
                    818:                                allocation_maillon(s_etat_processus)) == NULL)
                    819:                        {
                    820:                            (*s_etat_processus).erreur_systeme =
                    821:                                    d_es_allocation_memoire;
                    822:                            return;
                    823:                        }
                    824: 
                    825:                        l_element_courant_ligne = (struct_liste_chainee *)
                    826:                                (*(*l_element_courant).donnee).objet;
                    827:                    }
                    828:                    else
                    829:                    {
                    830:                        if (((*l_element_courant_ligne).suivant =
                    831:                                allocation_maillon(s_etat_processus)) == NULL)
                    832:                        {
                    833:                            (*s_etat_processus).erreur_systeme =
                    834:                                    d_es_allocation_memoire;
                    835:                            return;
                    836:                        }
                    837: 
                    838:                        l_element_courant_ligne =
                    839:                                (*l_element_courant_ligne).suivant;
                    840:                    }
                    841: 
                    842:                    (*l_element_courant_ligne).suivant = NULL;
                    843: 
                    844:                    if (((*l_element_courant_ligne).donnee =
                    845:                            allocation(s_etat_processus, CHN)) == NULL)
                    846:                    {
                    847:                        (*s_etat_processus).erreur_systeme =
                    848:                                d_es_allocation_memoire;
                    849:                        return;
                    850:                    }
                    851: 
                    852:                    if (ligne[i] == NULL)
                    853:                    {
                    854:                        if (((*(*l_element_courant_ligne).donnee).objet =
                    855:                                malloc(5 * sizeof(unsigned char))) == NULL)
                    856:                        {
                    857:                            (*s_etat_processus).erreur_systeme =
                    858:                                    d_es_allocation_memoire;
                    859:                            return;
                    860:                        }
                    861: 
                    862:                        strcpy((unsigned char *) (*(*l_element_courant_ligne)
                    863:                                .donnee).objet, "NULL");
                    864:                    }
                    865:                    else
                    866:                    {
                    867:                        if (((*(*l_element_courant_ligne).donnee).objet =
                    868:                                malloc((longueurs[i] + 1) *
                    869:                                sizeof(unsigned char))) == NULL)
                    870:                        {
                    871:                            (*s_etat_processus).erreur_systeme =
                    872:                                    d_es_allocation_memoire;
                    873:                            return;
                    874:                        }
                    875: 
                    876:                        strcpy((unsigned char *) (*(*l_element_courant_ligne)
                    877:                                .donnee).objet, ligne[i]);
                    878:                    }
                    879:                }
                    880:            }
                    881: 
                    882:            mysql_free_result(resultat_mysql);
                    883: 
                    884:            if (connexion_permanente == d_faux)
                    885:            {
                    886:                mysql_close((*((struct_connecteur_sql *) (*s_objet_1).objet))
                    887:                        .descripteur.mysql);
                    888:            }
                    889: 
                    890:            if (presence_resultat == d_vrai)
                    891:            {
                    892:                if (empilement(s_etat_processus,
                    893:                        &((*s_etat_processus).l_base_pile),
                    894:                        s_objet_resultat) == d_erreur)
                    895:                {
                    896:                    return;
                    897:                }
                    898:            }
                    899: 
                    900: #          else
                    901: 
                    902:            if ((*s_etat_processus).langue == 'F')
                    903:            {
                    904:                printf("+++Attention : Support de MySQL non compilé !\n");
                    905:            }
                    906:            else
                    907:            {
                    908:                printf("+++Warning : MySQL support not available !\n");
                    909:            }
                    910: 
                    911:            fflush(stdout);
                    912: #          endif
                    913:        }
                    914: 
                    915:        /*
                    916:         * Pilote PostgreSQL
                    917:         */
                    918: 
                    919:        else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
                    920:                "POSTGRESQL") == 0)
                    921:        {
                    922: #          ifdef POSTGRESQL_SUPPORT
                    923: 
1.57      bertrand  924:            int                         i;
                    925:            int                         j;
                    926:            int                         nombre_colonnes;
                    927:            int                         nombre_lignes;
1.40      bertrand  928: 
                    929:            logical1                    presence_resultat;
                    930: 
                    931:            PGresult                    *resultat_postgresql;
                    932: 
                    933:            struct_objet                *s_objet_resultat;
                    934: 
                    935:            struct_liste_chainee        *l_element_courant;
                    936:            struct_liste_chainee        *l_element_courant_ligne;
1.1       bertrand  937: 
                    938:            if (PQstatus((*((struct_connecteur_sql *) (*s_objet_1).objet))
                    939:                    .descripteur.postgresql) != CONNECTION_OK)
                    940:            {
                    941:                if (connexion_permanente == d_faux)
                    942:                {
                    943:                    PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
                    944:                            .descripteur.postgresql);
                    945:                }
                    946: 
                    947:                liberation(s_etat_processus, s_objet_1);
                    948:                liberation(s_etat_processus, s_objet_2);
                    949: 
                    950:                (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                    951:                return;
                    952:            }
                    953: 
                    954:            resultat_postgresql = PQexec((*((struct_connecteur_sql *)
                    955:                    (*s_objet_1).objet)).descripteur.postgresql,
                    956:                    (unsigned char *) (*s_objet_2).objet);
                    957:            presence_resultat = d_faux;
                    958: 
                    959:            switch(PQresultStatus(resultat_postgresql))
                    960:            {
                    961:                case PGRES_COMMAND_OK :
                    962:                { // Commande qui ne renvoit rien
                    963:                    if ((s_objet_resultat = allocation(s_etat_processus, LST))
                    964:                            == NULL)
                    965:                    {
                    966:                        (*s_etat_processus).erreur_systeme =
                    967:                                d_es_allocation_memoire;
                    968:                        return;
                    969:                    }
                    970: 
                    971:                    (*s_objet_resultat).objet = NULL;
                    972:                    l_element_courant = (*s_objet_resultat).objet;
                    973:                    presence_resultat = d_vrai;
                    974: 
                    975:                    break;
                    976:                }
                    977: 
                    978:                case PGRES_TUPLES_OK :
                    979:                { // Commande renvoyant des données
                    980:                    if ((s_objet_resultat = allocation(s_etat_processus, LST))
                    981:                            == NULL)
                    982:                    {
                    983:                        (*s_etat_processus).erreur_systeme =
                    984:                                d_es_allocation_memoire;
                    985:                        return;
                    986:                    }
                    987: 
                    988:                    (*s_objet_resultat).objet = NULL;
                    989:                    l_element_courant = (*s_objet_resultat).objet;
                    990:                    presence_resultat = d_vrai;
                    991: 
                    992:                    nombre_colonnes = PQnfields(resultat_postgresql);
                    993:                    nombre_lignes = PQntuples(resultat_postgresql);
                    994: 
                    995:                    for(i = 0; i < nombre_lignes; i++)
                    996:                    {
                    997:                        // Chaînage d'un nouveau maillon de la liste résultat
                    998: 
                    999:                        if (l_element_courant == NULL)
                   1000:                        {
                   1001:                            if (((*s_objet_resultat).objet =
                   1002:                                    allocation_maillon(s_etat_processus))
                   1003:                                    == NULL)
                   1004:                            {
                   1005:                                (*s_etat_processus).erreur_systeme =
                   1006:                                        d_es_allocation_memoire;
                   1007:                                return;
                   1008:                            }
                   1009: 
                   1010:                            l_element_courant = (struct_liste_chainee *)
                   1011:                                    (*s_objet_resultat).objet;
                   1012:                        }
                   1013:                        else
                   1014:                        {
                   1015:                            if (((*l_element_courant).suivant =
                   1016:                                    allocation_maillon(s_etat_processus))
                   1017:                                    == NULL)
                   1018:                            {
                   1019:                                (*s_etat_processus).erreur_systeme =
                   1020:                                        d_es_allocation_memoire;
                   1021:                                return;
                   1022:                            }
                   1023: 
                   1024:                            l_element_courant = (*l_element_courant).suivant;
                   1025:                        }
                   1026: 
                   1027:                        (*l_element_courant).suivant = NULL;
                   1028: 
                   1029:                        // Création de la liste fille
                   1030: 
                   1031:                        if (((*l_element_courant).donnee =
                   1032:                                allocation(s_etat_processus, LST)) == NULL)
                   1033:                        {
                   1034:                            (*s_etat_processus).erreur_systeme =
                   1035:                                    d_es_allocation_memoire;
                   1036:                            return;
                   1037:                        }
                   1038: 
                   1039:                        (*(*l_element_courant).donnee).objet = NULL;
                   1040:                        l_element_courant_ligne = NULL;
                   1041: 
                   1042:                        for(j = 0; j < nombre_colonnes; j++)
                   1043:                        {
                   1044:                            if (l_element_courant_ligne == NULL)
                   1045:                            {
                   1046:                                if (((*(*l_element_courant).donnee).objet =
                   1047:                                        allocation_maillon(s_etat_processus))
                   1048:                                        == NULL)
                   1049:                                {
                   1050:                                    (*s_etat_processus).erreur_systeme =
                   1051:                                            d_es_allocation_memoire;
                   1052:                                    return;
                   1053:                                }
                   1054: 
                   1055:                                l_element_courant_ligne =
                   1056:                                        (struct_liste_chainee *)
                   1057:                                        (*(*l_element_courant).donnee).objet;
                   1058:                            }
                   1059:                            else
                   1060:                            {
                   1061:                                if (((*l_element_courant_ligne).suivant =
                   1062:                                        allocation_maillon(s_etat_processus))
                   1063:                                        == NULL)
                   1064:                                {
                   1065:                                    l_element_courant_ligne =
                   1066:                                            (*l_element_courant_ligne).suivant;
                   1067:                                }
                   1068: 
                   1069:                                l_element_courant_ligne =
                   1070:                                        (*l_element_courant_ligne).suivant;
                   1071:                            }
                   1072: 
                   1073:                            (*l_element_courant_ligne).suivant = NULL;
                   1074: 
                   1075:                            if (((*l_element_courant_ligne).donnee =
                   1076:                                    allocation(s_etat_processus, CHN))
                   1077:                                    == NULL)
                   1078:                            {
                   1079:                                (*s_etat_processus).erreur_systeme =
                   1080:                                        d_es_allocation_memoire;
                   1081:                                return;
                   1082:                            }
                   1083: 
                   1084:                            if (PQgetisnull(resultat_postgresql, i, j) != 0)
                   1085:                            {
                   1086:                                if (((*(*l_element_courant_ligne).donnee).objet
                   1087:                                        = malloc(5 * sizeof(unsigned char)))
                   1088:                                        == NULL)
                   1089:                                {
                   1090:                                    (*s_etat_processus).erreur_systeme =
                   1091:                                            d_es_allocation_memoire;
                   1092:                                    return;
                   1093:                                }
                   1094: 
                   1095:                                strcpy((unsigned char *)
                   1096:                                        (*(*l_element_courant_ligne).donnee)
                   1097:                                        .objet, "NULL");
                   1098:                            }
                   1099:                            else
                   1100:                            {
                   1101:                                if (((*(*l_element_courant_ligne).donnee).objet
1.57      bertrand 1102:                                        = malloc(((size_t) (PQgetlength(
                   1103:                                        resultat_postgresql, i, j) + 1)) *
1.1       bertrand 1104:                                        sizeof(unsigned char))) == NULL)
                   1105:                                {
                   1106:                                    (*s_etat_processus).erreur_systeme =
                   1107:                                            d_es_allocation_memoire;
                   1108:                                    return;
                   1109:                                }
                   1110: 
                   1111:                                strcpy((unsigned char *)
                   1112:                                        (*(*l_element_courant_ligne).donnee)
                   1113:                                        .objet, PQgetvalue(resultat_postgresql,
                   1114:                                        i, j));
                   1115:                            }
                   1116:                        }
                   1117:                    }
                   1118: 
                   1119:                    break;
                   1120:                }
                   1121: 
                   1122:                case PGRES_EMPTY_QUERY :
                   1123:                case PGRES_COPY_OUT :
                   1124:                case PGRES_COPY_IN :
                   1125:                case PGRES_BAD_RESPONSE :
                   1126:                case PGRES_NONFATAL_ERROR :
                   1127:                case PGRES_FATAL_ERROR :
                   1128:                default :
                   1129:                {
                   1130:                    printf("%s\n", PQresultErrorMessage(resultat_postgresql));
                   1131:                    PQclear(resultat_postgresql);
                   1132: 
                   1133:                    if (connexion_permanente == d_faux)
                   1134:                    {
                   1135:                        PQfinish((*((struct_connecteur_sql *) (*s_objet_1)
                   1136:                                .objet)).descripteur.postgresql);
                   1137:                    }
                   1138: 
                   1139:                    liberation(s_etat_processus, s_objet_1);
                   1140:                    liberation(s_etat_processus, s_objet_2);
                   1141:  
                   1142:                    (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                   1143: 
                   1144:                    return;
                   1145:                    break;
                   1146:                }
                   1147:            }
                   1148: 
                   1149:            PQclear(resultat_postgresql);
                   1150: 
                   1151:            if (connexion_permanente == d_faux)
                   1152:            {
                   1153:                PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
                   1154:                        .descripteur.postgresql);
                   1155:            }
                   1156: 
                   1157:            if (presence_resultat == d_vrai)
                   1158:            {
                   1159:                if (empilement(s_etat_processus, &((*s_etat_processus)
                   1160:                        .l_base_pile), s_objet_resultat) == d_erreur)
                   1161:                {
                   1162:                    return;
                   1163:                }
                   1164:            }
                   1165: 
                   1166: #          else
                   1167: 
                   1168:            if ((*s_etat_processus).langue == 'F')
                   1169:            {
                   1170:                printf("+++Attention : Support de PostgreSQL non compilé !\n");
                   1171:            }
                   1172:            else
                   1173:            {
                   1174:                printf("+++Warning : PostgreSQL support not available !\n");
                   1175:            }
                   1176: 
                   1177:            fflush(stdout);
                   1178: #          endif
                   1179:        }
1.53      bertrand 1180:        else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
                   1181:                "SQLITE") == 0)
                   1182:        {
                   1183:            const char                  *queue;
                   1184:            const unsigned char         *resultat;
                   1185: 
1.57      bertrand 1186:            int                         i;
1.53      bertrand 1187:            int                         ios;
1.57      bertrand 1188:            int                         nombre_colonnes;
1.53      bertrand 1189: 
                   1190:            logical1                    presence_resultat;
                   1191: 
                   1192:            sqlite3_stmt                *ppStmt;
                   1193: 
                   1194:            struct_liste_chainee        *l_element_courant;
                   1195:            struct_liste_chainee        *l_element_courant_ligne;
                   1196: 
                   1197:            struct_objet                *s_objet_resultat;
                   1198: 
1.54      bertrand 1199:            struct timespec             attente;
                   1200: 
1.53      bertrand 1201:            if (sqlite3_prepare_v2((*((struct_connecteur_sql *)
                   1202:                    (*s_objet_1).objet)).descripteur.sqlite,
                   1203:                    (unsigned char *) (*s_objet_2).objet,
1.57      bertrand 1204:                    (int) strlen((unsigned char *) (*s_objet_2).objet),
1.53      bertrand 1205:                    &ppStmt, &queue) != SQLITE_OK)
                   1206:            {
                   1207:                if (connexion_permanente == d_faux)
                   1208:                {
                   1209:                    sqlite3_close((*((struct_connecteur_sql *)
                   1210:                            (*s_objet_1).objet)).descripteur.sqlite);
                   1211:                }
                   1212: 
                   1213:                liberation(s_etat_processus, s_objet_1);
                   1214:                liberation(s_etat_processus, s_objet_2);
                   1215: 
                   1216:                (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                   1217:                return;
                   1218:            }
                   1219: 
                   1220:            presence_resultat = d_faux;
                   1221:            s_objet_resultat = NULL;
                   1222:            l_element_courant = NULL;
                   1223: 
1.54      bertrand 1224:            attente.tv_sec = 0;
                   1225:            attente.tv_nsec = GRANULARITE_us * 1000;
                   1226: 
1.53      bertrand 1227:            do
                   1228:            {
                   1229:                switch(ios = sqlite3_step(ppStmt))
                   1230:                {
                   1231:                    case SQLITE_ROW:
                   1232:                    {
                   1233:                        if (s_objet_resultat == NULL)
                   1234:                        {
                   1235:                            if ((s_objet_resultat =
                   1236:                                    allocation(s_etat_processus, LST)) == NULL)
                   1237:                            {
                   1238:                                (*s_etat_processus).erreur_systeme =
                   1239:                                        d_es_allocation_memoire;
                   1240:                                return;
                   1241:                            }
                   1242: 
                   1243:                            presence_resultat = d_vrai;
                   1244: 
                   1245:                            // Création d'une liste vide
                   1246: 
                   1247:                            (*s_objet_resultat).objet = NULL;
                   1248:                            l_element_courant = (*s_objet_resultat).objet;
                   1249:                        }
                   1250: 
                   1251:                        // Ajout d'une liste au bout de la liste
                   1252:                        // contenant les lignes
                   1253: 
                   1254:                        if (l_element_courant == NULL)
                   1255:                        {
                   1256:                            if (((*s_objet_resultat).objet =
                   1257:                                    allocation_maillon(s_etat_processus))
                   1258:                                    == NULL)
                   1259:                            {
                   1260:                                (*s_etat_processus).erreur_systeme =
                   1261:                                        d_es_allocation_memoire;
                   1262:                            }
                   1263: 
                   1264:                            l_element_courant = (struct_liste_chainee *)
                   1265:                                    (*s_objet_resultat).objet;
                   1266:                        }
                   1267:                        else
                   1268:                        {
                   1269:                            if (((*l_element_courant).suivant =
                   1270:                                    allocation_maillon(s_etat_processus))
                   1271:                                    == NULL)
                   1272:                            {
                   1273:                                (*s_etat_processus).erreur_systeme =
                   1274:                                        d_es_allocation_memoire;
                   1275:                                return;
                   1276:                            }
                   1277: 
                   1278:                            l_element_courant = (*l_element_courant).suivant;
                   1279:                        }
                   1280: 
                   1281:                        (*l_element_courant).suivant = NULL;
                   1282: 
                   1283:                        // Création de la liste fille
                   1284: 
                   1285:                        if (((*l_element_courant).donnee =
                   1286:                                allocation(s_etat_processus, LST)) == NULL)
                   1287:                        {
                   1288:                            (*s_etat_processus).erreur_systeme =
                   1289:                                    d_es_allocation_memoire;
                   1290:                            return;
                   1291:                        }
                   1292: 
                   1293:                        (*(*l_element_courant).donnee).objet = NULL;
                   1294: 
                   1295:                        // Lecture de la ligne
                   1296: 
                   1297:                        nombre_colonnes = sqlite3_data_count(ppStmt);
                   1298:                        l_element_courant_ligne = NULL;
                   1299: 
                   1300:                        for(i = 0; i < nombre_colonnes; i++)
                   1301:                        {
                   1302:                            if (l_element_courant_ligne == NULL)
                   1303:                            {
                   1304:                                if (((*(*l_element_courant).donnee).objet =
                   1305:                                        allocation_maillon(s_etat_processus))
                   1306:                                        == NULL)
                   1307:                                {
                   1308:                                    (*s_etat_processus).erreur_systeme =
                   1309:                                            d_es_allocation_memoire;
                   1310:                                    return;
                   1311:                                }
                   1312: 
                   1313:                                l_element_courant_ligne =
                   1314:                                        (struct_liste_chainee *)
                   1315:                                        (*(*l_element_courant).donnee).objet;
                   1316:                            }
                   1317:                            else
                   1318:                            {
                   1319:                                if (((*l_element_courant_ligne).suivant =
                   1320:                                        allocation_maillon(s_etat_processus))
                   1321:                                        == NULL)
                   1322:                                {
                   1323:                                    l_element_courant_ligne =
                   1324:                                            (*l_element_courant_ligne).suivant;
                   1325:                                }
                   1326: 
                   1327:                                l_element_courant_ligne =
                   1328:                                        (*l_element_courant_ligne).suivant;
                   1329:                            }
                   1330: 
                   1331:                            (*l_element_courant_ligne).suivant = NULL;
                   1332: 
                   1333:                            if (((*l_element_courant_ligne).donnee =
                   1334:                                    allocation(s_etat_processus, CHN))
                   1335:                                    == NULL)
                   1336:                            {
                   1337:                                (*s_etat_processus).erreur_systeme =
                   1338:                                        d_es_allocation_memoire;
                   1339:                                return;
                   1340:                            }
                   1341: 
                   1342:                            if (sqlite3_column_type(ppStmt, i) == SQLITE_NULL)
                   1343:                            {
                   1344:                                if (((*(*l_element_courant_ligne).donnee).objet
                   1345:                                        = malloc(5 * sizeof(unsigned char)))
                   1346:                                        == NULL)
                   1347:                                {
                   1348:                                    (*s_etat_processus).erreur_systeme =
                   1349:                                            d_es_allocation_memoire;
                   1350:                                    return;
                   1351:                                }
                   1352: 
                   1353:                                strcpy((unsigned char *)
                   1354:                                        (*(*l_element_courant_ligne).donnee)
                   1355:                                        .objet, "NULL");
                   1356:                            }
                   1357:                            else
                   1358:                            {
                   1359:                                if ((resultat = sqlite3_column_text(ppStmt, i))
                   1360:                                        == NULL)
                   1361:                                {
                   1362:                                    (*s_etat_processus).erreur_systeme =
                   1363:                                            d_es_allocation_memoire;
                   1364:                                    return;
                   1365:                                }
                   1366: 
                   1367:                                if (((*(*l_element_courant_ligne).donnee).objet
                   1368:                                        = malloc((strlen(resultat) + 1 ) *
                   1369:                                        sizeof(unsigned char))) == NULL)
                   1370:                                {
                   1371:                                    (*s_etat_processus).erreur_systeme =
                   1372:                                            d_es_allocation_memoire;
                   1373:                                    return;
                   1374:                                }
                   1375: 
                   1376:                                strcpy((unsigned char *)
                   1377:                                        (*(*l_element_courant_ligne).donnee)
                   1378:                                        .objet, resultat);
                   1379:                            }
                   1380:                        }
                   1381: 
                   1382:                        break;
                   1383:                    }
                   1384: 
                   1385:                    case SQLITE_DONE:
                   1386:                    {
                   1387:                        // Fin de la lecture des données
                   1388:                        break;
                   1389:                    }
                   1390: 
1.54      bertrand 1391:                    case SQLITE_BUSY:
                   1392:                    case SQLITE_LOCKED:
                   1393:                    {
                   1394:                        nanosleep(&attente, NULL);
                   1395:                        INCR_GRANULARITE(attente.tv_nsec);
                   1396:                        break;
                   1397:                    }
                   1398: 
1.53      bertrand 1399:                    default:
                   1400:                    {
                   1401:                        (*s_etat_processus).erreur_systeme =
                   1402:                                d_es_erreur_fichier;
                   1403:                        return;
                   1404:                    }
                   1405:                }
                   1406:            } while(ios != SQLITE_DONE);
                   1407: 
                   1408:            if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   1409:            {
                   1410:                (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                   1411:                return;
                   1412:            }
                   1413: 
                   1414:            if (connexion_permanente == d_faux)
                   1415:            {
                   1416:                sqlite3_close((*((struct_connecteur_sql *) (*s_objet_1).objet))
                   1417:                        .descripteur.sqlite);
                   1418:            }
                   1419: 
                   1420:            if (presence_resultat == d_vrai)
                   1421:            {
                   1422:                if (empilement(s_etat_processus, &((*s_etat_processus)
                   1423:                        .l_base_pile), s_objet_resultat) == d_erreur)
                   1424:                {
                   1425:                    return;
                   1426:                }
                   1427:            }
                   1428:        }
1.1       bertrand 1429:        else
                   1430:        {
                   1431:            liberation(s_etat_processus, s_objet_1);
                   1432:            liberation(s_etat_processus, s_objet_2);
                   1433: 
                   1434:            (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
                   1435:            return;
                   1436:        }
                   1437:    }
                   1438:    else
                   1439:    {
                   1440:        liberation(s_etat_processus, s_objet_1);
                   1441:        liberation(s_etat_processus, s_objet_2);
                   1442: 
                   1443:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1444:        return;
                   1445:    }
                   1446: 
                   1447:    liberation(s_etat_processus, s_objet_1);
                   1448:    liberation(s_etat_processus, s_objet_2);
                   1449: 
                   1450:    return;
                   1451: }
                   1452: 
                   1453: 
                   1454: /*
                   1455: ================================================================================
                   1456:   Fonction 'stop'
                   1457: ================================================================================
                   1458:   Entrées :
                   1459: --------------------------------------------------------------------------------
                   1460:   Sorties :
                   1461: --------------------------------------------------------------------------------
                   1462:   Effets de bord : néant
                   1463: ================================================================================
                   1464: */
                   1465: 
                   1466: void
                   1467: instruction_stop(struct_processus *s_etat_processus)
                   1468: {
                   1469:    struct_liste_chainee        *l_element_courant;
                   1470: 
                   1471:    struct_objet                *s_objet;
                   1472: 
                   1473:    (*s_etat_processus).erreur_execution = d_ex;
                   1474: 
                   1475:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1476:    {
                   1477:        printf("\n  STOP ");
                   1478: 
                   1479:        if ((*s_etat_processus).langue == 'F')
                   1480:        {
                   1481:            printf("(arrêt d'un processus)\n\n");
                   1482:        }
                   1483:        else
                   1484:        {
                   1485:            printf("(kill process)\n\n");
                   1486:        }
                   1487: 
                   1488:        printf("    1: %s\n", d_PRC);
                   1489: 
                   1490:        return;
                   1491:    }
                   1492:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1493:    {
                   1494:        (*s_etat_processus).nombre_arguments = -1;
                   1495:        return;
                   1496:    }
                   1497:    
                   1498:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1499:    {
                   1500:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1501:        {
                   1502:            return;
                   1503:        }
                   1504:    }
                   1505: 
                   1506:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1507:            &s_objet) == d_erreur)
                   1508:    {
                   1509:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1510:        return;
                   1511:    }
                   1512: 
                   1513:    if ((*s_objet).type == PRC)
                   1514:    {
                   1515:        if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
                   1516:                .processus_detache == d_vrai)
                   1517:        {
1.33      bertrand 1518:            envoi_signal_processus((*(*((struct_processus_fils *)
                   1519:                    (*s_objet).objet)).thread).pid, rpl_sigstop);
1.1       bertrand 1520:        }
                   1521:        else
                   1522:        {
1.60      bertrand 1523:            if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus))
                   1524:                    != 0)
1.1       bertrand 1525:            {
                   1526:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1527:                return;
                   1528:            }
                   1529: 
                   1530:            l_element_courant = (struct_liste_chainee *)
                   1531:                    (*s_etat_processus).l_base_pile_processus;
                   1532: 
                   1533:            while(l_element_courant != NULL)
                   1534:            {
                   1535:                if ((*(*((struct_processus_fils *) (*(*l_element_courant)
                   1536:                        .donnee).objet)).thread).processus_detache == d_faux)
                   1537:                {
                   1538:                    if ((pthread_equal((*(*((struct_processus_fils *)
1.9       bertrand 1539:                            (*(*l_element_courant).donnee).objet)).thread).tid,
1.1       bertrand 1540:                            (*(*((struct_processus_fils *)
                   1541:                            (*s_objet).objet)).thread).tid) != 0) &&
                   1542:                            ((*(*((struct_processus_fils *)
                   1543:                            (*(*l_element_courant).donnee).objet)).thread).pid
                   1544:                            == (*(*((struct_processus_fils *)
                   1545:                            (*s_objet).objet)).thread).pid))
                   1546:                    {
                   1547:                        break;
                   1548:                    }
                   1549:                }
                   1550: 
                   1551:                l_element_courant = (*l_element_courant).suivant;
                   1552:            }
                   1553: 
                   1554:            if (l_element_courant != NULL)
                   1555:            {
                   1556:                // Le champ thread_actif est un pointeur sur un champ de la
                   1557:                // structure s_argument_thread libéré par la fonction
                   1558:                // retrait_thread_surveillance().
                   1559: 
                   1560:                if ((*(*((struct_processus_fils *)
                   1561:                        (*s_objet).objet)).thread).thread_actif == d_vrai)
                   1562:                {
                   1563:                    if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
                   1564:                            (*s_objet).objet)).thread).mutex)) != 0)
                   1565:                    {
1.60      bertrand 1566:                        if (pthread_mutex_unlock(&((*s_etat_processus)
                   1567:                                .mutex_pile_processus)) != 0)
1.1       bertrand 1568:                        {
                   1569:                            (*s_etat_processus).erreur_systeme = d_es_processus;
                   1570:                            return;
                   1571:                        }
                   1572: 
                   1573:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   1574:                        return;
                   1575:                    }
                   1576: 
                   1577:                    if ((*(*((struct_processus_fils *)
                   1578:                            (*s_objet).objet)).thread).thread_actif == d_vrai)
                   1579:                    {
1.33      bertrand 1580:                        envoi_signal_thread((*(*((struct_processus_fils *)
                   1581:                                (*s_objet).objet)).thread).tid, rpl_sigstop);
1.1       bertrand 1582:                    }
                   1583: 
                   1584:                    if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
                   1585:                            (*s_objet).objet)).thread).mutex)) != 0)
                   1586:                    {
1.60      bertrand 1587:                        if (pthread_mutex_unlock(&((*s_etat_processus)
                   1588:                                .mutex_pile_processus)) != 0)
1.1       bertrand 1589:                        {
                   1590:                            (*s_etat_processus).erreur_systeme = d_es_processus;
                   1591:                            return;
                   1592:                        }
                   1593: 
                   1594:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   1595:                        return;
                   1596:                    }
                   1597:                }
                   1598:            }
                   1599: 
1.60      bertrand 1600:            if (pthread_mutex_unlock(&((*s_etat_processus)
                   1601:                    .mutex_pile_processus)) != 0)
1.1       bertrand 1602:            {
                   1603:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1604:                return;
                   1605:            }
                   1606:        }
                   1607:    }
                   1608:    else
                   1609:    {
                   1610:        liberation(s_etat_processus, s_objet);
                   1611: 
                   1612:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1613:        return;
                   1614:    }
                   1615: 
                   1616:    liberation(s_etat_processus, s_objet);
                   1617: 
                   1618:    return;
                   1619: }
                   1620: 
                   1621: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>