Annotation of rpl/src/chainage.c, revision 1.19

1.1       bertrand    1: /*
                      2: ================================================================================
1.18      bertrand    3:   RPL/2 (R) version 4.0.19
1.1       bertrand    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
                      5: 
                      6:   This file is part of RPL/2.
                      7: 
                      8:   RPL/2 is free software; you can redistribute it and/or modify it
                      9:   under the terms of the CeCILL V2 License as published by the french
                     10:   CEA, CNRS and INRIA.
                     11:  
                     12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
                     13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
                     14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
                     15:   for more details.
                     16:  
                     17:   You should have received a copy of the CeCILL License
                     18:   along with RPL/2. If not, write to info@cecill.info.
                     19: ================================================================================
                     20: */
                     21: 
                     22: 
1.15      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   24: 
                     25: 
                     26: /*
                     27: ================================================================================
1.8       bertrand   28:   Routine de chaînage du programme (lecture du fichier puis constitution
                     29:   de la chaîne exécutable)
1.1       bertrand   30: ================================================================================
                     31:   Entrées: structure processus
                     32: --------------------------------------------------------------------------------
                     33:   Sortie: drapeau d'erreur
                     34: --------------------------------------------------------------------------------
                     35:   Effets de bord: néant
                     36: ================================================================================
                     37: */
                     38: 
                     39: logical1
                     40: chainage(struct_processus *s_etat_processus)
                     41: {
                     42:    char                    *nom_fichier_temporaire;
                     43: 
                     44:    file                    *f_source;
                     45: 
                     46:    int                     caractere;
                     47:    int                     erreur;
                     48:    int                     erreur_os;
                     49: 
                     50:    logical1                drapeau_fin;
                     51:    logical1                existence;
1.19    ! bertrand   52:    logical1                initialisation;
1.1       bertrand   53:    logical1                ouverture;
                     54:    logical1                presence_chaine;
                     55: 
                     56:    long                    i;
                     57:    long                    nombre_caracteres_source;
                     58: 
                     59:    unsigned char           *commande;
1.6       bertrand   60:    unsigned char           *executable_candidat;
1.17      bertrand   61: 
                     62: #  ifndef OS2
1.19    ! bertrand   63:    unsigned char           *instructions = "%s/bin/%s %s | "
1.1       bertrand   64:                                    "%s/bin/rpliconv `%s/bin/rplfile "
                     65:                                    "-m %s/share/rplfiles -i %s | awk "
                     66:                                    "'{ print $3; }' | awk -F= "
                     67:                                    "'{ if ($2 != \"\") printf(\"-f %%s\", "
1.10      bertrand   68:                                    "$2); }'` -t %s//IGNORE > %s";
1.17      bertrand   69: #  else
                     70:    unsigned char           *instructions = "sh -c \""
1.19    ! bertrand   71:                                    "%s/bin/%s %s | "
1.17      bertrand   72:                                    "%s/bin/rpliconv `%s/bin/rplfile "
                     73:                                    "-m %s/share/rplfiles -i %s | awk "
                     74:                                    "'{ print $3; }' | awk -F= "
                     75:                                    "'{ if ($2 != \\\"\\\") "
                     76:                                    "printf(\\\"-f %%s\\\", "
                     77:                                    "$2); }'` -t %s//IGNORE\" > %s";
                     78: #  endif
1.1       bertrand   79: 
                     80:    unsigned long           unite_fichier;
                     81: 
                     82:    if ((*s_etat_processus).debug == d_vrai)
                     83:        if (((*s_etat_processus).type_debug & d_debug_analyse) != 0)
                     84:    {
                     85:        printf("\n");
                     86: 
                     87:        if ((*s_etat_processus).langue == 'F')
                     88:        {
                     89:            printf("[%d] Appel au préprocesseur\n", (int) getpid());
                     90:        }
                     91:        else
                     92:        {
                     93:            printf("[%d] Preprocessing\n", (int) getpid());
                     94:        }
                     95: 
                     96:        fflush(stdout);
                     97:    }
                     98: 
                     99:    erreur = caracteristiques_fichier(s_etat_processus,
                    100:            (*s_etat_processus).nom_fichier_source, &existence,
                    101:            &ouverture, &unite_fichier);
                    102: 
                    103:    erreur_os = d_absence_erreur;
                    104: 
                    105:    if ((existence == d_vrai) && (erreur == 0))
                    106:    {
                    107:        if ((nom_fichier_temporaire = creation_nom_fichier(
                    108:                s_etat_processus, (*s_etat_processus)
                    109:                .chemin_fichiers_temporaires)) == NULL)
                    110:        {
                    111:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    112:            return(d_erreur);
                    113:        }
                    114: 
1.6       bertrand  115:        // Avant d'exécuter la commande, on teste les sommes de hashage
                    116:        // des utilitaires de la famille RPL/2.
                    117: 
1.5       bertrand  118:        if ((*s_etat_processus).rpl_home == NULL)
1.1       bertrand  119:        {
1.5       bertrand  120:            if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) +
                    121:                    (2 * strlen((*s_etat_processus).nom_fichier_source)) +
1.10      bertrand  122:                    (4 * strlen(d_exec_path)) + strlen(d_locale) +
                    123:                    strlen(nom_fichier_temporaire) + strlen(instructions) - 13)
1.5       bertrand  124:                    * sizeof(unsigned char))) == NULL)
                    125:            {
                    126:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    127: 
                    128:                free(nom_fichier_temporaire);
                    129:                return(d_erreur);
                    130:            }
1.1       bertrand  131: 
1.5       bertrand  132:            sprintf(commande, instructions,
1.19    ! bertrand  133:                    d_exec_path, ds_preprocesseur,
1.5       bertrand  134:                    (*s_etat_processus).nom_fichier_source,
1.19    ! bertrand  135:                    d_exec_path, d_exec_path,
1.5       bertrand  136:                    d_exec_path, (*s_etat_processus).nom_fichier_source,
1.10      bertrand  137:                    d_locale, nom_fichier_temporaire);
1.6       bertrand  138: 
                    139:            if (alsprintf(&executable_candidat, "%s/bin/rpliconv",
                    140:                    d_exec_path) < 0)
                    141:            {
                    142:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    143:                return(d_erreur);
                    144:            }
                    145: 
                    146:            if (controle(s_etat_processus, executable_candidat, "md5",
                    147:                    rpliconv_md5) != d_vrai)
                    148:            {
                    149:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    150:                return(d_erreur);
                    151:            }
                    152: 
                    153:            if (controle(s_etat_processus, executable_candidat, "sha1",
                    154:                    rpliconv_sha1) != d_vrai)
                    155:            {
                    156:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    157:                return(d_erreur);
                    158:            }
                    159: 
                    160:            free(executable_candidat);
                    161: 
                    162:            if (alsprintf(&executable_candidat, "%s/bin/rplfile",
                    163:                    d_exec_path) < 0)
                    164:            {
                    165:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    166:                return(d_erreur);
                    167:            }
                    168: 
                    169:            if (controle(s_etat_processus, executable_candidat, "md5",
                    170:                    rplfile_md5) != d_vrai)
                    171:            {
                    172:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    173:                return(d_erreur);
                    174:            }
                    175: 
                    176:            if (controle(s_etat_processus, executable_candidat, "sha1",
                    177:                    rplfile_sha1) != d_vrai)
                    178:            {
                    179:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    180:                return(d_erreur);
                    181:            }
                    182: 
                    183:            free(executable_candidat);
                    184: 
                    185:            if (alsprintf(&executable_candidat, "%s/bin/rplpp",
                    186:                    d_exec_path) < 0)
                    187:            {
                    188:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    189:                return(d_erreur);
                    190:            }
                    191: 
                    192:            if (controle(s_etat_processus, executable_candidat, "md5",
                    193:                    rplpp_md5) != d_vrai)
                    194:            {
                    195:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    196:                return(d_erreur);
                    197:            }
                    198: 
                    199:            if (controle(s_etat_processus, executable_candidat, "sha1",
                    200:                    rplpp_sha1) != d_vrai)
                    201:            {
                    202:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    203:                return(d_erreur);
                    204:            }
                    205: 
                    206:            free(executable_candidat);
1.1       bertrand  207:        }
1.5       bertrand  208:        else
                    209:        {
                    210:            if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) +
                    211:                    (2 * strlen((*s_etat_processus).nom_fichier_source)) +
                    212:                    (4 * strlen((*s_etat_processus).rpl_home)) +
                    213:                    strlen(nom_fichier_temporaire) + strlen(instructions) - 11)
                    214:                    * sizeof(unsigned char))) == NULL)
                    215:            {
                    216:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    217: 
                    218:                free(nom_fichier_temporaire);
                    219:                return(d_erreur);
                    220:            }
1.1       bertrand  221: 
1.5       bertrand  222:            sprintf(commande, instructions,
                    223:                    (*s_etat_processus).nom_fichier_source,
                    224:                    (*s_etat_processus).rpl_home, ds_preprocesseur,
                    225:                    (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home,
                    226:                    (*s_etat_processus).rpl_home,
                    227:                    (*s_etat_processus).nom_fichier_source,
                    228:                    nom_fichier_temporaire);
1.6       bertrand  229: 
                    230:            if (alsprintf(&executable_candidat, "%s/bin/rpliconv",
                    231:                    (*s_etat_processus).rpl_home) < 0)
                    232:            {
                    233:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    234:                return(d_erreur);
                    235:            }
                    236: 
                    237:            if (controle(s_etat_processus, executable_candidat, "md5",
                    238:                    rpliconv_md5) != d_vrai)
                    239:            {
                    240:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    241:                return(d_erreur);
                    242:            }
                    243: 
                    244:            if (controle(s_etat_processus, executable_candidat, "sha1",
                    245:                    rpliconv_sha1) != d_vrai)
                    246:            {
                    247:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    248:                return(d_erreur);
                    249:            }
                    250: 
                    251:            free(executable_candidat);
                    252: 
                    253:            if (alsprintf(&executable_candidat, "%s/bin/rplfile",
                    254:                    (*s_etat_processus).rpl_home) < 0)
                    255:            {
                    256:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    257:                return(d_erreur);
                    258:            }
                    259: 
                    260:            if (controle(s_etat_processus, executable_candidat, "md5",
                    261:                    rplfile_md5) != d_vrai)
                    262:            {
                    263:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    264:                return(d_erreur);
                    265:            }
                    266: 
                    267:            if (controle(s_etat_processus, executable_candidat, "sha1",
                    268:                    rplfile_sha1) != d_vrai)
                    269:            {
                    270:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    271:                return(d_erreur);
                    272:            }
                    273: 
                    274:            free(executable_candidat);
                    275: 
                    276:            if (alsprintf(&executable_candidat, "%s/bin/rplpp",
                    277:                    (*s_etat_processus).rpl_home) < 0)
                    278:            {
                    279:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    280:                return(d_erreur);
                    281:            }
                    282: 
                    283:            if (controle(s_etat_processus, executable_candidat, "md5",
                    284:                    rplpp_md5) != d_vrai)
                    285:            {
                    286:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    287:                return(d_erreur);
                    288:            }
                    289: 
                    290:            if (controle(s_etat_processus, executable_candidat, "sha1",
                    291:                    rplpp_sha1) != d_vrai)
                    292:            {
                    293:                (*s_etat_processus).erreur_systeme = d_es_somme_controle;
                    294:                return(d_erreur);
                    295:            }
                    296: 
                    297:            free(executable_candidat);
1.5       bertrand  298:        }
1.1       bertrand  299: 
                    300:        if ((f_source = popen(commande, "r")) == NULL)
                    301:        {
                    302:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    303: 
                    304:            free(nom_fichier_temporaire);
                    305:            return(d_erreur);
                    306:        }
                    307: 
                    308:        if (pclose(f_source) != EXIT_SUCCESS)
                    309:        {
                    310:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    311: 
                    312:            free(nom_fichier_temporaire);
                    313:            return(d_erreur);
                    314:        }
                    315: 
                    316:        free(commande);
                    317: 
                    318:        if ((f_source = fopen(nom_fichier_temporaire, "r")) == NULL)
                    319:        {
                    320:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    321: 
                    322:            if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
                    323:            {
                    324:                free(nom_fichier_temporaire);
                    325:                return(d_erreur);
                    326:            }
                    327: 
                    328:            free(nom_fichier_temporaire);
                    329:            return(d_erreur);
                    330:        }
                    331: 
                    332:        nombre_caracteres_source = 0;
                    333: 
                    334:        while(getc(f_source) != EOF)
                    335:        {
                    336:            nombre_caracteres_source++;
                    337:        }
                    338: 
                    339:        (*s_etat_processus).definitions_chainees = (unsigned char *)
                    340:                malloc((nombre_caracteres_source + 1) * sizeof(unsigned char));
                    341:        
                    342:        if ((*s_etat_processus).definitions_chainees == NULL)
                    343:        {
                    344:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    345: 
                    346:            if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
                    347:            {
                    348:                free(nom_fichier_temporaire);
                    349:                return(d_erreur);
                    350:            }
                    351: 
                    352:            return(d_erreur);
                    353:        }
                    354:        else
                    355:        {
                    356:            rewind(f_source);
                    357:            presence_chaine = d_faux;
                    358: 
                    359:            i = 0;
                    360:            drapeau_fin = d_faux;
1.19    ! bertrand  361:            initialisation = d_vrai;
        !           362: 
        !           363:            /*
        !           364:             * Élimination du sharp-bang si nécessaire et des caractères
        !           365:             * inutiles. Conversion de caractères.
        !           366:             */
1.1       bertrand  367: 
                    368:            while(drapeau_fin == d_faux)
                    369:            {
                    370:                if ((caractere = getc(f_source)) != EOF)
                    371:                {
1.19    ! bertrand  372:                    if (initialisation == d_vrai)
        !           373:                    {
        !           374:                        if (caractere == '#')
        !           375:                        {
        !           376:                            if ((caractere = getc(f_source)) != EOF)
        !           377:                            {
        !           378:                                if (caractere == '!')
        !           379:                                {
        !           380:                                    do
        !           381:                                    {
        !           382:                                        caractere = getc(f_source);
        !           383:                                    } while((caractere != EOF) &&
        !           384:                                            (caractere !=
        !           385:                                            d_code_retour_chariot));
        !           386:                                }
        !           387:                                else
        !           388:                                {
        !           389:                                    rewind(f_source);
        !           390:                                    caractere = getc(f_source);
        !           391:                                }
        !           392:                            }
        !           393:                        }
        !           394: 
        !           395:                        initialisation = d_faux;
        !           396:                    }
        !           397: 
1.1       bertrand  398:                    if ((caractere == d_code_retour_chariot) ||
                    399:                            (caractere == d_code_tabulation) ||
                    400:                            ((caractere == d_code_espace) &&
                    401:                            (presence_chaine == d_faux)))
                    402:                    {
                    403:                        do
                    404:                        {
                    405:                            caractere = getc(f_source);
                    406:                        } while(((caractere == d_code_retour_chariot) ||
                    407:                                (caractere == d_code_tabulation) ||
                    408:                                ((caractere == d_code_espace) &&
                    409:                                (presence_chaine == d_faux))) &&
                    410:                                (caractere != EOF));
                    411: 
                    412:                        if (caractere != EOF)
                    413:                        {
                    414:                            ((*s_etat_processus).definitions_chainees)[i++] =
                    415:                                    d_code_espace;
                    416:                        }
                    417:                        else
                    418:                        {
                    419:                            drapeau_fin = d_vrai;
                    420:                        }
                    421:                    }
                    422: 
                    423:                    if ((((*s_etat_processus).definitions_chainees)[i] =
                    424:                            caractere) == '\"')
                    425:                    {
                    426:                        if (i > 0)
                    427:                        {
                    428:                            if (((*s_etat_processus).definitions_chainees)
                    429:                                    [i - 1] != '\\')
                    430:                            {
                    431:                                presence_chaine = (presence_chaine == d_faux)
                    432:                                        ? d_vrai : d_faux;
                    433:                            }
                    434:                        }
                    435: 
                    436:                        i++;
                    437:                    }
                    438:                    else
                    439:                    {
                    440:                        i++;
                    441:                    }
                    442:                }
                    443:                else
                    444:                {
                    445:                    drapeau_fin = d_vrai;
                    446:                }
                    447:            }
                    448: 
                    449:            if ((caractere == EOF) && (i > 0))
                    450:            {
                    451:                i--;
                    452:            }
                    453: 
                    454:            ((*s_etat_processus).definitions_chainees)[i] = d_code_fin_chaine;
                    455: 
                    456:            erreur_os = d_absence_erreur;
                    457:        }
                    458: 
                    459:        (*s_etat_processus).longueur_definitions_chainees =
                    460:                strlen((*s_etat_processus).definitions_chainees);
                    461: 
                    462:        if (fclose(f_source) != 0)
                    463:        {
                    464:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    465: 
                    466:            if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
                    467:            {
                    468:                free(nom_fichier_temporaire);
                    469:                return(d_erreur);
                    470:            }
                    471: 
                    472:            free(nom_fichier_temporaire);
                    473:            return(d_erreur);
                    474:        }
                    475: 
                    476:        if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
                    477:        {
                    478:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    479: 
                    480:            free(nom_fichier_temporaire);
                    481:            return(d_erreur);
                    482:        }
                    483: 
                    484:        free(nom_fichier_temporaire);
                    485:    }
                    486:    else
                    487:    {
                    488:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    489:        erreur_os = d_erreur;
                    490:    }
                    491: 
                    492:    if (((*s_etat_processus).definitions_chainees =
                    493:            realloc((*s_etat_processus).definitions_chainees,
                    494:            ((*s_etat_processus).longueur_definitions_chainees + 1) *
                    495:            sizeof(unsigned char))) == NULL)
                    496:    {
                    497:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    498:        return(d_erreur);
                    499:    }
                    500: 
                    501:    return(erreur_os);
                    502: }
                    503: 
                    504: 
                    505: /*
                    506: ================================================================================
                    507:   Routine de compactage d'une chaîne de caractères
                    508:   Tous les espaces et les retours à ligne surnuméraires sont enlevés.
                    509: ================================================================================
                    510:   Entrées: structure processus
                    511: --------------------------------------------------------------------------------
                    512:   Sortie: drapeau d'erreur
                    513: --------------------------------------------------------------------------------
                    514:   Effets de bord: néant
                    515: ================================================================================
                    516: */
                    517: 
                    518: unsigned char *
                    519: compactage(unsigned char *chaine)
                    520: {
                    521:    logical1        drapeau_fin;
                    522:    logical1        presence_chaine;
                    523: 
                    524:    unsigned char   caractere;
                    525:    unsigned char   *ptr_ecriture;
                    526:    unsigned char   *ptr_lecture;
                    527: 
                    528:    if (chaine == NULL)
                    529:    {
                    530:        return(NULL);
                    531:    }
                    532: 
                    533:    presence_chaine = d_faux;
                    534: 
                    535:    drapeau_fin = d_faux;
                    536:    ptr_lecture = chaine;
                    537:    ptr_ecriture = chaine;
                    538: 
                    539:    while(drapeau_fin == d_faux)
                    540:    {
                    541:        if ((caractere = (*ptr_lecture++)) != d_code_fin_chaine)
                    542:        {
                    543:            if ((caractere == d_code_retour_chariot) ||
                    544:                    (caractere == d_code_tabulation) ||
                    545:                    ((caractere == d_code_espace) &&
                    546:                    (presence_chaine == d_faux)))
                    547:            {
                    548:                do
                    549:                {
                    550:                    caractere = (*ptr_lecture++);
                    551:                } while(((caractere == d_code_retour_chariot) ||
                    552:                        (caractere == d_code_tabulation) ||
                    553:                        ((caractere == d_code_espace) &&
                    554:                        (presence_chaine == d_faux))) &&
                    555:                        (caractere != d_code_fin_chaine));
                    556: 
                    557:                if (caractere != d_code_fin_chaine)
                    558:                {
                    559:                    (*ptr_ecriture++) = d_code_espace;
                    560:                }
                    561:                else
                    562:                {
                    563:                    drapeau_fin = d_vrai;
                    564:                }
                    565:            }
                    566: 
                    567:            if (((*ptr_ecriture++) = caractere) == '\"')
                    568:            {
                    569:                presence_chaine = (presence_chaine == d_faux)
                    570:                        ? d_vrai : d_faux;
                    571:            }
                    572:        }
                    573:        else
                    574:        {
                    575:            drapeau_fin = d_vrai;
                    576:        }
                    577:    }
                    578: 
                    579:    (*ptr_ecriture) = d_code_fin_chaine;
                    580: 
                    581:    return(realloc(chaine, (strlen(chaine) + 1) * sizeof(unsigned char)));
                    582: }
                    583: 
                    584: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>