Annotation of rpl/src/transliteration.c, revision 1.104

1.1       bertrand    1: /*
                      2: ================================================================================
1.104   ! bertrand    3:   RPL/2 (R) version 4.1.33
        !             4:   Copyright (C) 1989-2021 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.14      bertrand   23: #include "rpl-conv.h"
                     24: #include "tex-conv.h"
1.5       bertrand   25: 
1.1       bertrand   26: #include <stdarg.h>
1.5       bertrand   27: 
1.1       bertrand   28: #undef fprintf
                     29: #undef printf
                     30: 
                     31: 
                     32: /*
                     33: ================================================================================
                     34:   Fonction de translitération
                     35: ================================================================================
                     36:   Entrées :
                     37: --------------------------------------------------------------------------------
                     38:   Sorties :
                     39: --------------------------------------------------------------------------------
                     40:   Effets de bord : néant
                     41: ================================================================================
                     42: */
                     43: 
                     44: unsigned char *
                     45: transliteration(struct_processus *s_etat_processus,
                     46:        unsigned char *chaine_entree,
                     47:        unsigned char *codage_entree,
                     48:        unsigned char *codage_sortie)
                     49: {
                     50:    unsigned char       *codage_sortie_transliteral;
                     51:    unsigned char       *tampon;
                     52: 
                     53:    if ((codage_sortie_transliteral = malloc((strlen(codage_sortie)
                     54:            + strlen("//TRANSLIT") + 1) * sizeof(unsigned char))) == NULL)
                     55:    {
                     56:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                     57:        return(NULL);
                     58:    }
                     59: 
                     60:    sprintf(codage_sortie_transliteral, "%s//TRANSLIT", codage_sortie);
                     61: 
                     62:    tampon = reencodage(s_etat_processus, chaine_entree,
                     63:            codage_entree, codage_sortie_transliteral);
                     64:    free(codage_sortie_transliteral);
                     65: 
                     66:    return(tampon);
                     67: }
                     68: 
                     69: 
                     70: unsigned char *
                     71: reencodage(struct_processus *s_etat_processus,
                     72:        unsigned char *chaine_entree,
                     73:        unsigned char *codage_entree,
                     74:        unsigned char *codage_sortie)
                     75: {
                     76: #  define              d_LONGUEUR  1024
                     77: 
                     78:    iconv_t             transcodage;
                     79: 
                     80:    size_t              ios;
                     81:    size_t              longueur_entree;
                     82:    size_t              longueur_sortie;
                     83: 
                     84:    unsigned char       *buffer_entree;
                     85:    unsigned char       *buffer_sortie;
                     86:    unsigned char       *chaine_sortie;
                     87:    unsigned char       *pointeur;
                     88:    unsigned char       *tampon;
                     89: 
                     90:    if ((transcodage = iconv_open(codage_sortie, codage_entree)) ==
                     91:            (iconv_t) -1)
                     92:    {
1.59      bertrand   93:        // On affiche une erreur ici car la fonction d'affichage
                     94:        // de l'erreur utilise la macro printf() donc une
                     95:        // opération de translitération qui échouera elle aussi.
                     96:        // Le positionnement de l'erreur permet de sortir du programme.
                     97: 
                     98:        if ((*s_etat_processus).langue == 'F')
                     99:        {
                    100:            fprintf(stderr, "+++Erreur : Erreur de transcodage\n");
                    101:        }
                    102:        else
                    103:        {
                    104:            fprintf(stderr, "+++Error : Transcodage error\n");
                    105:        }
                    106: 
1.1       bertrand  107:        (*s_etat_processus).erreur_execution = d_ex_erreur_transcodage;
                    108:        return(NULL);
                    109:    }
                    110: 
                    111:    buffer_entree = chaine_entree;
                    112:    longueur_entree = strlen(chaine_entree);
                    113: 
                    114:    if ((chaine_sortie = malloc(sizeof(unsigned char))) == NULL)
                    115:    {
                    116:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    117:        return(NULL);
                    118:    }
                    119: 
                    120:    chaine_sortie[0] = d_code_fin_chaine;
                    121: 
1.39      bertrand  122:    if ((buffer_sortie = malloc((d_LONGUEUR + 1) * sizeof(unsigned char)))
                    123:            == NULL)
1.1       bertrand  124:    {
                    125:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    126:        return(NULL);
                    127:    }
                    128: 
                    129:    do
                    130:    {
                    131:        longueur_sortie = d_LONGUEUR;
                    132:        pointeur = buffer_sortie;
                    133: 
1.100     bertrand  134:        if ((ios = iconv(transcodage,
                    135: #      if defined(Linux)
                    136:                (char **)
                    137: #      elif defined(NetBSD)
                    138:                (const char **)
                    139: #      else
                    140:                (char **)
                    141: #      endif
                    142:                &buffer_entree,
1.1       bertrand  143:                &longueur_entree, (char **) &pointeur, &longueur_sortie))
                    144:                == (size_t) -1)
                    145:        {
1.65      bertrand  146:            // On autorise les erreurs EINVAL si le caractère suivant est non
                    147:            // nul : la séquence d'entrée est continue sur le bloc suivant.
                    148: 
                    149:            if (errno == EINVAL)
                    150:            {
                    151:                if ((*(buffer_entree + 1)) == d_code_fin_chaine)
                    152:                {
                    153:                    free(buffer_sortie);
                    154:                    free(chaine_sortie);
                    155: 
                    156:                    // On affiche une erreur ici car la fonction d'affichage
                    157:                    // de l'erreur utilise la macro printf() donc une
                    158:                    // opération de translitération qui échouera elle aussi.
                    159:                    // Le positionnement de l'erreur permet de sortir du
                    160:                    // programme.
                    161: 
                    162:                    if ((*s_etat_processus).langue == 'F')
                    163:                    {
                    164:                        fprintf(stderr, "+++Erreur : Erreur de transcodage\n");
                    165:                    }
                    166:                    else
                    167:                    {
                    168:                        fprintf(stderr, "+++Error : Transcodage error\n");
                    169:                    }
                    170: 
                    171:                    (*s_etat_processus).erreur_execution =
                    172:                            d_ex_erreur_transcodage;
                    173:                    return(NULL);
                    174:                }
                    175:            }
                    176: 
                    177:            // Si la séquence d'entrée est invalide, on reçoit une erreur
                    178:            // EILSEQ.
                    179:            else if (errno == EILSEQ)
1.1       bertrand  180:            {
                    181:                free(buffer_sortie);
1.3       bertrand  182:                free(chaine_sortie);
                    183: 
1.59      bertrand  184:                // On affiche une erreur ici car la fonction d'affichage
                    185:                // de l'erreur utilise la macro printf() donc une
                    186:                // opération de translitération qui échouera elle aussi.
                    187:                // Le positionnement de l'erreur permet de sortir du programme.
                    188: 
                    189:                if ((*s_etat_processus).langue == 'F')
                    190:                {
                    191:                    fprintf(stderr, "+++Erreur : Erreur de transcodage\n");
                    192:                }
                    193:                else
                    194:                {
                    195:                    fprintf(stderr, "+++Error : Transcodage error\n");
                    196:                }
                    197: 
1.1       bertrand  198:                (*s_etat_processus).erreur_execution = d_ex_erreur_transcodage;
                    199:                return(NULL);
                    200:            }
                    201:        }
                    202: 
1.38      bertrand  203:        tampon = chaine_sortie;
1.1       bertrand  204:        (*pointeur) = d_code_fin_chaine;
                    205: 
                    206:        if ((chaine_sortie = malloc((strlen(tampon) + strlen(buffer_sortie) + 1)
                    207:                * sizeof(unsigned char))) == NULL)
                    208:        {
                    209:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    210:            return(NULL);
                    211:        }
                    212: 
                    213:        sprintf(chaine_sortie, "%s%s", tampon, buffer_sortie);
                    214:        free(tampon);
                    215:    } while((*buffer_entree) != d_code_fin_chaine);
                    216: 
                    217:    free(buffer_sortie);
                    218:    iconv_close(transcodage);
                    219: 
                    220:    return(chaine_sortie);
                    221: }
                    222: 
                    223: 
                    224: /*
                    225: ================================================================================
                    226:   Fonctions spécifiques
                    227: ================================================================================
                    228:   Entrées :
                    229: --------------------------------------------------------------------------------
1.26      bertrand  230:   Sorties :
1.1       bertrand  231: --------------------------------------------------------------------------------
                    232:   Effets de bord : néant
                    233: ================================================================================
                    234: */
                    235: 
                    236: void
                    237: localisation_courante(struct_processus *s_etat_processus)
                    238: {
                    239:    char                        **arguments;
                    240: 
                    241:    int                         ios;
                    242:    int                         pipes_entree[2];
                    243:    int                         pipes_erreur[2];
                    244:    int                         pipes_sortie[2];
                    245:    int                         status;
                    246: 
1.69      bertrand  247:    integer8                    i;
                    248:    integer8                    longueur_lecture;
                    249:    integer8                    nombre_arguments;
                    250:    integer8                    nombre_iterations;
                    251:    integer8                    pointeur;
                    252: 
1.1       bertrand  253: 
                    254:    pid_t                       pid;
                    255: 
                    256:    unsigned char               *tampon;
                    257: 
                    258:    if ((arguments = malloc(3 * sizeof(char **))) == NULL)
                    259:    {
                    260:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    261:        return;
                    262:    }
                    263: 
                    264:    if ((arguments[0] = malloc((strlen("locale") + 1) * sizeof(char))) == NULL)
                    265:    {
                    266:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    267:        return;
                    268:    }
                    269: 
                    270:    if ((arguments[1] = malloc((strlen("charmap") + 1) * sizeof(char))) == NULL)
                    271:    {
                    272:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    273:        return;
                    274:    }
                    275: 
                    276:    strcpy(arguments[0], "locale");
                    277:    strcpy(arguments[1], "charmap");
                    278:    arguments[2] = NULL;
                    279: 
                    280:    nombre_arguments = 2;
                    281: 
                    282:    if (pipe(pipes_entree) != 0)
                    283:    {
                    284:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    285:        return;
                    286:    }
                    287:        
                    288:    if (pipe(pipes_sortie) != 0)
                    289:    {
                    290:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    291:        return;
                    292:    }
                    293: 
                    294:    if (pipe(pipes_erreur) != 0)
                    295:    {
                    296:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    297:        return;
                    298:    }
                    299: 
                    300:    verrouillage_threads_concurrents(s_etat_processus);
                    301:    pid = fork();
                    302: 
                    303:    if (pid < 0)
                    304:    {
                    305:        if (close(pipes_entree[0]) != 0)
                    306:        {
                    307:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    308:            return;
                    309:        }
                    310: 
                    311:        if (close(pipes_entree[1]) != 0)
                    312:        {
                    313:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    314:            return;
                    315:        }
                    316: 
                    317:        if (close(pipes_sortie[0]) != 0)
                    318:        {
                    319:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    320:            return;
                    321:        }
                    322: 
                    323:        if (close(pipes_sortie[1]) != 0)
                    324:        {
                    325:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    326:            return;
                    327:        }
                    328: 
                    329:        if (close(pipes_erreur[0]) != 0)
                    330:        {
                    331:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    332:            return;
                    333:        }
                    334: 
                    335:        if (close(pipes_erreur[1]) != 0)
                    336:        {
                    337:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    338:            return;
                    339:        }
                    340: 
                    341:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    342:        return;
                    343:    }
                    344:    else if (pid == 0)
                    345:    {
                    346:        if (close(pipes_entree[1]) != 0)
                    347:        {
                    348:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    349:            return;
                    350:        }
                    351: 
                    352:        if (close(pipes_sortie[0]) != 0)
                    353:        {
                    354:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    355:            return;
                    356:        }
                    357: 
                    358:        if (close(pipes_erreur[0]) != 0)
                    359:        {
                    360:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    361:            return;
                    362:        }
                    363: 
                    364:        if (pipes_entree[0] != STDIN_FILENO)
                    365:        {
                    366:            if (dup2(pipes_entree[0], STDIN_FILENO) == -1)
                    367:            {
                    368:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    369:                return;
                    370:            }
                    371:        }
                    372: 
                    373:        if (pipes_sortie[1] != STDOUT_FILENO)
                    374:        {
                    375:            if (dup2(pipes_sortie[1], STDOUT_FILENO) == -1)
                    376:            {
                    377:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    378:                return;
                    379:            }
                    380:        }
                    381: 
                    382:        if (pipes_sortie[1] != STDERR_FILENO)
                    383:        {
                    384:            if (dup2(pipes_sortie[1], STDERR_FILENO) == -1)
                    385:            {
                    386:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    387:                return;
                    388:            }
                    389:        }
                    390: 
                    391:        if (nombre_arguments != 0)
                    392:        {
                    393:            execvp(arguments[0], arguments);
                    394:        }
                    395:        else
                    396:        {
                    397:            exit(EXIT_SUCCESS);
                    398:        }
                    399: 
                    400:        /*
                    401:         * L'appel système execvp() a généré une erreur et n'a pu exécuter
                    402:         * argument[0] (fichier non exécutable ou inexistant).
                    403:         */
                    404: 
                    405:        close(pipes_entree[0]);
                    406:        close(pipes_sortie[1]);
                    407: 
                    408:        for(i = 0; i < nombre_arguments; i++)
                    409:        {
                    410:            free(arguments[i]);
                    411:        }
                    412: 
                    413:        free(arguments);
                    414:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    415: 
                    416:        /*
                    417:         * Envoi d'une erreur dans le pipe idoine. On ne regarde pas
                    418:         * le nombre d'octets écrits car l'erreur ne pourra de toute
                    419:         * façon pas être traitée.
                    420:         */
                    421: 
                    422:        write_atomic(s_etat_processus, pipes_erreur[1], " ", 1);
                    423:        close(pipes_erreur[1]);
                    424: 
                    425:        exit(EXIT_SUCCESS);
                    426:    }
                    427:    else
                    428:    {
1.88      bertrand  429:        deverrouillage_threads_concurrents(s_etat_processus);
                    430: 
1.1       bertrand  431:        if (close(pipes_entree[0]) != 0)
                    432:        {
                    433:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    434:            return;
                    435:        }
                    436: 
                    437:        if (close(pipes_sortie[1]) != 0)
                    438:        {
                    439:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    440:            return;
                    441:        }
                    442: 
                    443:        if (close(pipes_erreur[1]) != 0)
                    444:        {
                    445:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    446:            return;
                    447:        }
                    448: 
                    449:        if (close(pipes_entree[1]) != 0)
                    450:        {
                    451:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    452:            return;
                    453:        }
                    454: 
                    455:        do
                    456:        {
                    457:            if (kill(pid, 0) != 0)
                    458:            {
                    459:                break;
                    460:            }
                    461: 
                    462:            /*
                    463:             * Récupération de la valeur de retour du processus détaché
                    464:             */
                    465: 
1.44      bertrand  466: #          ifndef SEMAPHORES_NOMMES
                    467:                if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    468: #          else
                    469:                if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    470: #          endif
1.1       bertrand  471:            {
                    472:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    473:                return;
                    474:            }
                    475: 
1.89      bertrand  476:            while(waitpid(pid, &status, 0) == -1)
1.1       bertrand  477:            {
1.89      bertrand  478:                if (errno != EINTR)
1.1       bertrand  479:                {
1.89      bertrand  480: #                  ifndef SEMAPHORES_NOMMES
1.90      bertrand  481:                        while(sem_wait(&((*s_etat_processus).semaphore_fork))
1.89      bertrand  482:                                != 0)
                    483: #                  else
                    484:                        while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    485: #                  endif
1.43      bertrand  486:                    {
1.89      bertrand  487:                        if (errno != EINTR)
                    488:                        {
                    489:                            (*s_etat_processus).erreur_systeme = d_es_processus;
                    490:                            return;
                    491:                        }
1.43      bertrand  492:                    }
1.89      bertrand  493: 
                    494:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    495:                    return;
1.1       bertrand  496:                }
                    497:            }
                    498: 
1.44      bertrand  499: #          ifndef SEMAPHORES_NOMMES
                    500:                while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    501: #          else
                    502:                while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    503: #          endif
1.1       bertrand  504:            {
1.43      bertrand  505:                if (errno != EINTR)
                    506:                {
                    507:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    508:                    return;
                    509:                }
1.1       bertrand  510:            }
                    511:        } while((!WIFEXITED(status)) && (!WIFSIGNALED(status)));
                    512: 
                    513:        longueur_lecture = 256;
                    514:        pointeur = 0;
                    515:        nombre_iterations = 1;
                    516: 
1.69      bertrand  517:        if ((tampon = malloc(((size_t) (longueur_lecture + 1)) *
1.1       bertrand  518:                sizeof(unsigned char))) == NULL)
                    519:        {
                    520:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    521:            return;
                    522:        }
                    523: 
1.18      bertrand  524:        tampon[0] = d_code_fin_chaine;
                    525: 
1.44      bertrand  526: #      ifndef SEMAPHORES_NOMMES
                    527:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    528: #      else
                    529:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    530: #      endif
1.1       bertrand  531:        {
                    532:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    533:            return;
                    534:        }
                    535: 
1.69      bertrand  536:        while((ios = (int) read_atomic(s_etat_processus,
1.1       bertrand  537:                pipes_sortie[0], &(tampon[pointeur]),
1.69      bertrand  538:                (size_t) longueur_lecture)) > 0)
1.1       bertrand  539:        {
1.44      bertrand  540: #          ifndef SEMAPHORES_NOMMES
                    541:                while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    542: #          else
                    543:                while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    544: #          endif
1.1       bertrand  545:            {
1.43      bertrand  546:                if (errno != EINTR)
                    547:                {
                    548:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    549:                    return;
                    550:                }
1.1       bertrand  551:            }
                    552: 
                    553:            tampon[pointeur + ios] = d_code_fin_chaine;
                    554:            pointeur += longueur_lecture;
                    555:            nombre_iterations++;
                    556: 
                    557:            if ((tampon = realloc(tampon,
1.69      bertrand  558:                    ((size_t) ((nombre_iterations * longueur_lecture) + 1)) *
1.1       bertrand  559:                    sizeof(unsigned char))) == NULL)
                    560:            {
                    561:                (*s_etat_processus).erreur_systeme =
                    562:                        d_es_allocation_memoire;
                    563:                return;
                    564:            }
                    565: 
1.44      bertrand  566: #          ifndef SEMAPHORES_NOMMES
                    567:                if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    568: #          else
                    569:                if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    570: #          endif
1.1       bertrand  571:            {
                    572:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    573:                return;
                    574:            }
                    575:        }
                    576: 
1.44      bertrand  577: #      ifndef SEMAPHORES_NOMMES
                    578:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    579: #      else
                    580:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    581: #      endif
1.1       bertrand  582:        {
1.43      bertrand  583:            if (errno != EINTR)
                    584:            {
                    585:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    586:                return;
                    587:            }
1.1       bertrand  588:        }
                    589: 
                    590:        if (strlen(tampon) == 0)
                    591:        {
                    592:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    593:            return;
                    594:        }
                    595: 
                    596:        tampon[strlen(tampon) - 1] = d_code_fin_chaine;
                    597: 
                    598:        if (ios == -1)
                    599:        {
                    600:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    601:            return;
                    602:        }
                    603: 
                    604:        if (close(pipes_sortie[0]) != 0)
                    605:        {
                    606:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    607:            return;
                    608:        }
                    609: 
1.17      bertrand  610:        if (strlen(tampon) > 0)
                    611:        {
                    612:            (*s_etat_processus).localisation = tampon;
                    613:        }
                    614:        else
                    615:        {
                    616:            free(tampon);
                    617: 
                    618:            if (((*s_etat_processus).localisation = malloc((strlen(d_locale)
                    619:                    + 1) * sizeof(unsigned char))) == NULL)
                    620:            {
                    621:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    622:                return;
                    623:            }
                    624: 
                    625:            strcpy((*s_etat_processus).localisation, d_locale);
                    626:        }
1.1       bertrand  627: 
                    628:        for(i = 0; i < nombre_arguments; i++)
                    629:        {
                    630:            free(arguments[i]);
                    631:        }
                    632: 
                    633:        free(arguments);
                    634: 
1.44      bertrand  635: #      ifndef SEMAPHORES_NOMMES
                    636:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    637: #      else
                    638:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    639: #      endif
1.1       bertrand  640:        {
                    641:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    642:            return;
                    643:        }
                    644: 
                    645:        if (read_atomic(s_etat_processus, pipes_erreur[0], tampon, 1) > 0)
                    646:        {
                    647:            // Le processus fils renvoie une erreur.
                    648: 
1.18      bertrand  649:            free(tampon);
                    650: 
                    651:            if (((*s_etat_processus).localisation = malloc((strlen(d_locale)
                    652:                    + 1) * sizeof(unsigned char))) == NULL)
1.1       bertrand  653:            {
1.18      bertrand  654:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    655:                return;
1.1       bertrand  656:            }
                    657: 
1.18      bertrand  658:            strcpy((*s_etat_processus).localisation, d_locale);
1.1       bertrand  659:        }
                    660: 
1.44      bertrand  661: #      ifndef SEMAPHORES_NOMMES
                    662:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    663: #      else
                    664:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    665: #      endif
1.1       bertrand  666:        {
1.43      bertrand  667:            if (errno != EINTR)
                    668:            {
                    669:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    670:                return;
                    671:            }
1.1       bertrand  672:        }
                    673: 
                    674:        if (close(pipes_erreur[0]) != 0)
                    675:        {
                    676:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    677:            return;
                    678:        }
                    679:    }
                    680: 
                    681:    return;
                    682: }
                    683: 
                    684: 
                    685: int
                    686: transliterated_fprintf(struct_processus *s_etat_processus, file *flux,
                    687:        const char *format, ...)
                    688: {
                    689:    int             ios;
1.5       bertrand  690: 
                    691:    unsigned char   *tampon;
1.1       bertrand  692:    unsigned char   *tampon2;
1.5       bertrand  693: 
1.1       bertrand  694:    va_list         arguments;
                    695: 
                    696:    va_start(arguments, format);
                    697: 
1.17      bertrand  698: #  ifdef OS2
                    699:    unsigned char       *ptr_e;;
                    700:    unsigned char       *ptr_l;;
                    701:    unsigned char       *tampon3;
                    702: 
                    703:    unsigned long       i;
                    704: #  endif
                    705: 
1.79      bertrand  706:    if (valsprintf(s_etat_processus, &tampon, format, arguments) < 0)
1.1       bertrand  707:    {
                    708:        va_end(arguments);
                    709: 
                    710:        if (s_etat_processus != NULL)
                    711:        {
                    712:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    713:        }
                    714: 
                    715:        return(-1);
                    716:    }
                    717: 
                    718:    va_end(arguments);
                    719: 
                    720:    if (s_etat_processus != NULL)
                    721:    {
                    722:        if ((tampon2 = transliteration(s_etat_processus, tampon,
                    723:                d_locale, (*s_etat_processus).localisation)) == NULL)
                    724:        {
                    725:            free(tampon);
                    726:            return(-1);
                    727:        }
                    728: 
                    729:        free(tampon);
                    730:    }
                    731:    else
                    732:    {
                    733:        tampon2 = tampon;
                    734:    }
                    735: 
1.17      bertrand  736: #  ifdef OS2
1.46      bertrand  737:    if ((flux == stderr) || (flux == stdout))
1.23      bertrand  738:    {
                    739:        i = 0;
                    740:        ptr_l = tampon2;
1.17      bertrand  741: 
1.23      bertrand  742:        while((*ptr_l) != d_code_fin_chaine)
1.17      bertrand  743:        {
1.23      bertrand  744:            if ((*ptr_l) == '\n')
                    745:            {
                    746:                i++;
                    747:            }
                    748: 
                    749:            ptr_l++;
1.17      bertrand  750:        }
                    751: 
1.23      bertrand  752:        if ((tampon3 = malloc((strlen(tampon2) + i + 1) *
                    753:                sizeof(unsigned char))) == NULL)
                    754:        {
                    755:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1.46      bertrand  756:            return(-1);
1.23      bertrand  757:        }
1.17      bertrand  758: 
1.23      bertrand  759:        ptr_e = tampon3;
                    760:        ptr_l = tampon2;
1.17      bertrand  761: 
1.23      bertrand  762:        while((*ptr_l) != d_code_fin_chaine)
                    763:        {
                    764:            (*ptr_e) = (*ptr_l);
1.17      bertrand  765: 
1.23      bertrand  766:            if ((*ptr_l) == '\n')
                    767:            {
                    768:                (*(++ptr_e)) = '\r';
                    769:                ptr_e++;
                    770:                ptr_l++;
                    771:            }
                    772:            else
                    773:            {
                    774:                ptr_e++;
                    775:                ptr_l++;
                    776:            }
1.17      bertrand  777:        }
                    778: 
1.23      bertrand  779:        (*ptr_e) = d_code_fin_chaine;
1.17      bertrand  780: 
1.23      bertrand  781:        free(tampon2);
                    782:        tampon2 = tampon3;
                    783:    }
1.17      bertrand  784: #  endif
                    785: 
1.1       bertrand  786: #  ifdef SunOS
                    787:    while((ios = fprintf(flux, "%s", tampon2)) < 0)
                    788:    {
                    789:        if ((errno != EINTR) && (errno != 0))
                    790:        {
                    791:            break;
                    792:        }
                    793:    }
                    794: #  else
                    795:    ios = fprintf(flux, "%s", tampon2);
                    796: #  endif
                    797: 
                    798:    free(tampon2);
                    799: 
                    800:    return(ios);
                    801: }
                    802: 
1.5       bertrand  803: 
                    804: int
1.79      bertrand  805: std_fprintf(file *flux, const char *format, ...)
                    806: {
                    807:    int             ios;
                    808: 
                    809:    va_list         arguments;
                    810: 
                    811:    va_start(arguments, format);
                    812:    ios = vfprintf(flux, format, arguments);
                    813:    va_end(arguments);
                    814: 
1.81      bertrand  815:    // Pas de parenthèses pour ne pas appeler la macro.
                    816:    return ios;
1.79      bertrand  817: }
                    818: 
                    819: 
                    820: int
1.5       bertrand  821: tex_fprintf(struct_processus *s_etat_processus,
                    822:        file *flux, const char *format, ...)
                    823: {
                    824:    int             ios;
                    825: 
                    826:    unsigned char   *tampon;
                    827:    unsigned char   *tampon2;
                    828: 
                    829:    va_list         arguments;
                    830: 
                    831:    va_start(arguments, format);
                    832: 
1.79      bertrand  833:    if (valsprintf(s_etat_processus, &tampon, format, arguments) < 0)
1.5       bertrand  834:    {
                    835:        va_end(arguments);
                    836: 
                    837:        if (s_etat_processus != NULL)
                    838:        {
                    839:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    840:        }
                    841: 
                    842:        return(-1);
                    843:    }
                    844: 
                    845:    va_end(arguments);
                    846: 
                    847:    if ((tampon2 = transliteration(s_etat_processus, tampon,
                    848:            d_locale, ds_tex_encodage_3)) == NULL)
                    849:    {
                    850:        free(tampon);
                    851:        return(-1);
                    852:    }
                    853: 
                    854:    free(tampon);
                    855: 
                    856: #  ifdef SunOS
                    857:    while((ios = fprintf(flux, "%s", tampon2)) < 0)
                    858:    {
                    859:        if ((errno != EINTR) && (errno != 0))
                    860:        {
                    861:            break;
                    862:        }
                    863:    }
                    864: #  else
                    865:    ios = fprintf(flux, "%s", tampon2);
                    866: #  endif
                    867: 
                    868:    free(tampon2);
                    869: 
                    870:    return(ios);
                    871: }
                    872: 
1.21      bertrand  873: #undef readline
1.19      bertrand  874: 
                    875: unsigned char *
1.79      bertrand  876: readline_wrapper(struct_processus *s_etat_processus, unsigned char *invite)
1.19      bertrand  877: {
1.79      bertrand  878:    unsigned char       *rpl_chaine;
                    879:    unsigned char       *sys_chaine;
                    880: 
                    881:    association_etat_processus_readline(s_etat_processus);
                    882:    sys_chaine = readline(invite);
1.19      bertrand  883: 
1.79      bertrand  884: #  ifdef OS2
1.19      bertrand  885:    printf("\r");
1.79      bertrand  886: #  endif
                    887: 
                    888:    if (sys_chaine == NULL)
                    889:    {
                    890:        return(NULL);
                    891:    }
                    892: 
1.103     bertrand  893:    if ((rpl_chaine = malloc((strlen(sys_chaine) + 1) *
                    894:            sizeof(unsigned char))) == NULL)
1.79      bertrand  895:    {
                    896:        sys_free(sys_chaine);
                    897:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    898:        return(NULL);
                    899:    }
                    900: 
                    901:    strcpy(rpl_chaine, sys_chaine);
                    902:    sys_free(sys_chaine);
1.19      bertrand  903: 
1.79      bertrand  904:    return(rpl_chaine);
1.19      bertrand  905: }
                    906: 
                    907: 
1.1       bertrand  908: #define fprintf NULL
                    909: #define printf NULL
                    910: 
                    911: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>