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

1.1     ! bertrand    1: /*
        !             2: ================================================================================
        !             3:   RPL/2 (R) version 4.0.9
        !             4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
        !             5: 
        !             6:   This file is part of RPL/2.
        !             7: 
        !             8:   RPL/2 is free software; you can redistribute it and/or modify it
        !             9:   under the terms of the CeCILL V2 License as published by the french
        !            10:   CEA, CNRS and INRIA.
        !            11:  
        !            12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
        !            13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
        !            14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
        !            15:   for more details.
        !            16:  
        !            17:   You should have received a copy of the CeCILL License
        !            18:   along with RPL/2. If not, write to info@cecill.info.
        !            19: ================================================================================
        !            20: */
        !            21: 
        !            22: 
        !            23: #include "rpl.conv.h"
        !            24: 
        !            25: 
        !            26: /*
        !            27: ================================================================================
        !            28:   Routine de chainage du programme (lecture du fichier puis constitution
        !            29:   de la chaine executable)
        !            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;
        !            52:    logical1                ouverture;
        !            53:    logical1                presence_chaine;
        !            54: 
        !            55:    long                    i;
        !            56:    long                    nombre_caracteres_source;
        !            57: 
        !            58:    unsigned char           *commande;
        !            59:    unsigned char           *instructions = "sed -e '1,1s/^#!/\\/\\//g' %s | "
        !            60:                                    "%s/bin/%s | "
        !            61:                                    "%s/bin/rpliconv `%s/bin/rplfile "
        !            62:                                    "-m %s/share/rplfiles -i %s | awk "
        !            63:                                    "'{ print $3; }' | awk -F= "
        !            64:                                    "'{ if ($2 != \"\") printf(\"-f %%s\", "
        !            65:                                    "$2); }'` -t `locale charmap`//IGNORE > %s";
        !            66: 
        !            67:    unsigned long           unite_fichier;
        !            68: 
        !            69:    if ((*s_etat_processus).debug == d_vrai)
        !            70:        if (((*s_etat_processus).type_debug & d_debug_analyse) != 0)
        !            71:    {
        !            72:        printf("\n");
        !            73: 
        !            74:        if ((*s_etat_processus).langue == 'F')
        !            75:        {
        !            76:            printf("[%d] Appel au préprocesseur\n", (int) getpid());
        !            77:        }
        !            78:        else
        !            79:        {
        !            80:            printf("[%d] Preprocessing\n", (int) getpid());
        !            81:        }
        !            82: 
        !            83:        fflush(stdout);
        !            84:    }
        !            85: 
        !            86:    erreur = caracteristiques_fichier(s_etat_processus,
        !            87:            (*s_etat_processus).nom_fichier_source, &existence,
        !            88:            &ouverture, &unite_fichier);
        !            89: 
        !            90:    erreur_os = d_absence_erreur;
        !            91: 
        !            92:    if ((existence == d_vrai) && (erreur == 0))
        !            93:    {
        !            94:        if ((nom_fichier_temporaire = creation_nom_fichier(
        !            95:                s_etat_processus, (*s_etat_processus)
        !            96:                .chemin_fichiers_temporaires)) == NULL)
        !            97:        {
        !            98:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !            99:            return(d_erreur);
        !           100:        }
        !           101: 
        !           102:        if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) +
        !           103:                (2 * strlen((*s_etat_processus).nom_fichier_source)) +
        !           104:                (4 * strlen(d_exec_path)) +
        !           105:                strlen(nom_fichier_temporaire) + strlen(instructions) - 11) *
        !           106:                sizeof(unsigned char))) == NULL)
        !           107:        {
        !           108:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           109: 
        !           110:            free(nom_fichier_temporaire);
        !           111:            return(d_erreur);
        !           112:        }
        !           113: 
        !           114:        sprintf(commande, instructions, (*s_etat_processus).nom_fichier_source,
        !           115:                d_exec_path, ds_preprocesseur, d_exec_path, d_exec_path,
        !           116:                d_exec_path, (*s_etat_processus).nom_fichier_source,
        !           117:                nom_fichier_temporaire);
        !           118: 
        !           119:        if ((f_source = popen(commande, "r")) == NULL)
        !           120:        {
        !           121:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !           122: 
        !           123:            free(nom_fichier_temporaire);
        !           124:            return(d_erreur);
        !           125:        }
        !           126: 
        !           127:        if (pclose(f_source) != EXIT_SUCCESS)
        !           128:        {
        !           129:            (*s_etat_processus).erreur_systeme = d_es_processus;
        !           130: 
        !           131:            free(nom_fichier_temporaire);
        !           132:            return(d_erreur);
        !           133:        }
        !           134: 
        !           135:        free(commande);
        !           136: 
        !           137:        if ((f_source = fopen(nom_fichier_temporaire, "r")) == NULL)
        !           138:        {
        !           139:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           140: 
        !           141:            if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
        !           142:            {
        !           143:                free(nom_fichier_temporaire);
        !           144:                return(d_erreur);
        !           145:            }
        !           146: 
        !           147:            free(nom_fichier_temporaire);
        !           148:            return(d_erreur);
        !           149:        }
        !           150: 
        !           151:        nombre_caracteres_source = 0;
        !           152: 
        !           153:        while(getc(f_source) != EOF)
        !           154:        {
        !           155:            nombre_caracteres_source++;
        !           156:        }
        !           157: 
        !           158:        (*s_etat_processus).definitions_chainees = (unsigned char *)
        !           159:                malloc((nombre_caracteres_source + 1) * sizeof(unsigned char));
        !           160:        
        !           161:        if ((*s_etat_processus).definitions_chainees == NULL)
        !           162:        {
        !           163:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           164: 
        !           165:            if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
        !           166:            {
        !           167:                free(nom_fichier_temporaire);
        !           168:                return(d_erreur);
        !           169:            }
        !           170: 
        !           171:            return(d_erreur);
        !           172:        }
        !           173:        else
        !           174:        {
        !           175:            rewind(f_source);
        !           176:            presence_chaine = d_faux;
        !           177: 
        !           178:            i = 0;
        !           179:            drapeau_fin = d_faux;
        !           180: 
        !           181:            while(drapeau_fin == d_faux)
        !           182:            {
        !           183:                if ((caractere = getc(f_source)) != EOF)
        !           184:                {
        !           185:                    if ((caractere == d_code_retour_chariot) ||
        !           186:                            (caractere == d_code_tabulation) ||
        !           187:                            ((caractere == d_code_espace) &&
        !           188:                            (presence_chaine == d_faux)))
        !           189:                    {
        !           190:                        do
        !           191:                        {
        !           192:                            caractere = getc(f_source);
        !           193:                        } while(((caractere == d_code_retour_chariot) ||
        !           194:                                (caractere == d_code_tabulation) ||
        !           195:                                ((caractere == d_code_espace) &&
        !           196:                                (presence_chaine == d_faux))) &&
        !           197:                                (caractere != EOF));
        !           198: 
        !           199:                        if (caractere != EOF)
        !           200:                        {
        !           201:                            ((*s_etat_processus).definitions_chainees)[i++] =
        !           202:                                    d_code_espace;
        !           203:                        }
        !           204:                        else
        !           205:                        {
        !           206:                            drapeau_fin = d_vrai;
        !           207:                        }
        !           208:                    }
        !           209: 
        !           210:                    if ((((*s_etat_processus).definitions_chainees)[i] =
        !           211:                            caractere) == '\"')
        !           212:                    {
        !           213:                        if (i > 0)
        !           214:                        {
        !           215:                            if (((*s_etat_processus).definitions_chainees)
        !           216:                                    [i - 1] != '\\')
        !           217:                            {
        !           218:                                presence_chaine = (presence_chaine == d_faux)
        !           219:                                        ? d_vrai : d_faux;
        !           220:                            }
        !           221:                        }
        !           222: 
        !           223:                        i++;
        !           224:                    }
        !           225:                    else
        !           226:                    {
        !           227:                        i++;
        !           228:                    }
        !           229:                }
        !           230:                else
        !           231:                {
        !           232:                    drapeau_fin = d_vrai;
        !           233:                }
        !           234:            }
        !           235: 
        !           236:            if ((caractere == EOF) && (i > 0))
        !           237:            {
        !           238:                i--;
        !           239:            }
        !           240: 
        !           241:            ((*s_etat_processus).definitions_chainees)[i] = d_code_fin_chaine;
        !           242: 
        !           243:            erreur_os = d_absence_erreur;
        !           244:        }
        !           245: 
        !           246:        (*s_etat_processus).longueur_definitions_chainees =
        !           247:                strlen((*s_etat_processus).definitions_chainees);
        !           248: 
        !           249:        if (fclose(f_source) != 0)
        !           250:        {
        !           251:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           252: 
        !           253:            if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
        !           254:            {
        !           255:                free(nom_fichier_temporaire);
        !           256:                return(d_erreur);
        !           257:            }
        !           258: 
        !           259:            free(nom_fichier_temporaire);
        !           260:            return(d_erreur);
        !           261:        }
        !           262: 
        !           263:        if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
        !           264:        {
        !           265:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           266: 
        !           267:            free(nom_fichier_temporaire);
        !           268:            return(d_erreur);
        !           269:        }
        !           270: 
        !           271:        free(nom_fichier_temporaire);
        !           272:    }
        !           273:    else
        !           274:    {
        !           275:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
        !           276:        erreur_os = d_erreur;
        !           277:    }
        !           278: 
        !           279:    if (((*s_etat_processus).definitions_chainees =
        !           280:            realloc((*s_etat_processus).definitions_chainees,
        !           281:            ((*s_etat_processus).longueur_definitions_chainees + 1) *
        !           282:            sizeof(unsigned char))) == NULL)
        !           283:    {
        !           284:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           285:        return(d_erreur);
        !           286:    }
        !           287: 
        !           288:    return(erreur_os);
        !           289: }
        !           290: 
        !           291: 
        !           292: /*
        !           293: ================================================================================
        !           294:   Routine de compactage d'une chaîne de caractères
        !           295:   Tous les espaces et les retours à ligne surnuméraires sont enlevés.
        !           296: ================================================================================
        !           297:   Entrées: structure processus
        !           298: --------------------------------------------------------------------------------
        !           299:   Sortie: drapeau d'erreur
        !           300: --------------------------------------------------------------------------------
        !           301:   Effets de bord: néant
        !           302: ================================================================================
        !           303: */
        !           304: 
        !           305: unsigned char *
        !           306: compactage(unsigned char *chaine)
        !           307: {
        !           308:    logical1        drapeau_fin;
        !           309:    logical1        presence_chaine;
        !           310: 
        !           311:    unsigned char   caractere;
        !           312:    unsigned char   *ptr_ecriture;
        !           313:    unsigned char   *ptr_lecture;
        !           314: 
        !           315:    if (chaine == NULL)
        !           316:    {
        !           317:        return(NULL);
        !           318:    }
        !           319: 
        !           320:    presence_chaine = d_faux;
        !           321: 
        !           322:    drapeau_fin = d_faux;
        !           323:    ptr_lecture = chaine;
        !           324:    ptr_ecriture = chaine;
        !           325: 
        !           326:    while(drapeau_fin == d_faux)
        !           327:    {
        !           328:        if ((caractere = (*ptr_lecture++)) != d_code_fin_chaine)
        !           329:        {
        !           330:            if ((caractere == d_code_retour_chariot) ||
        !           331:                    (caractere == d_code_tabulation) ||
        !           332:                    ((caractere == d_code_espace) &&
        !           333:                    (presence_chaine == d_faux)))
        !           334:            {
        !           335:                do
        !           336:                {
        !           337:                    caractere = (*ptr_lecture++);
        !           338:                } while(((caractere == d_code_retour_chariot) ||
        !           339:                        (caractere == d_code_tabulation) ||
        !           340:                        ((caractere == d_code_espace) &&
        !           341:                        (presence_chaine == d_faux))) &&
        !           342:                        (caractere != d_code_fin_chaine));
        !           343: 
        !           344:                if (caractere != d_code_fin_chaine)
        !           345:                {
        !           346:                    (*ptr_ecriture++) = d_code_espace;
        !           347:                }
        !           348:                else
        !           349:                {
        !           350:                    drapeau_fin = d_vrai;
        !           351:                }
        !           352:            }
        !           353: 
        !           354:            if (((*ptr_ecriture++) = caractere) == '\"')
        !           355:            {
        !           356:                presence_chaine = (presence_chaine == d_faux)
        !           357:                        ? d_vrai : d_faux;
        !           358:            }
        !           359:        }
        !           360:        else
        !           361:        {
        !           362:            drapeau_fin = d_vrai;
        !           363:        }
        !           364:    }
        !           365: 
        !           366:    (*ptr_ecriture) = d_code_fin_chaine;
        !           367: 
        !           368:    return(realloc(chaine, (strlen(chaine) + 1) * sizeof(unsigned char)));
        !           369: }
        !           370: 
        !           371: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>