File:  [local] / rpl / src / chainage.c
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Thu Mar 4 17:42:46 2010 UTC (14 years, 2 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Ajout du fichier controle.c.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.12
    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 ((*s_etat_processus).rpl_home == NULL)
  103:         {
  104:             if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) +
  105:                     (2 * strlen((*s_etat_processus).nom_fichier_source)) +
  106:                     (4 * strlen(d_exec_path)) +
  107:                     strlen(nom_fichier_temporaire) + strlen(instructions) - 11)
  108:                     * sizeof(unsigned char))) == NULL)
  109:             {
  110:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  111: 
  112:                 free(nom_fichier_temporaire);
  113:                 return(d_erreur);
  114:             }
  115: 
  116:             sprintf(commande, instructions,
  117:                     (*s_etat_processus).nom_fichier_source,
  118:                     d_exec_path, ds_preprocesseur, d_exec_path, d_exec_path,
  119:                     d_exec_path, (*s_etat_processus).nom_fichier_source,
  120:                     nom_fichier_temporaire);
  121:         }
  122:         else
  123:         {
  124:             if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) +
  125:                     (2 * strlen((*s_etat_processus).nom_fichier_source)) +
  126:                     (4 * strlen((*s_etat_processus).rpl_home)) +
  127:                     strlen(nom_fichier_temporaire) + strlen(instructions) - 11)
  128:                     * sizeof(unsigned char))) == NULL)
  129:             {
  130:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  131: 
  132:                 free(nom_fichier_temporaire);
  133:                 return(d_erreur);
  134:             }
  135: 
  136:             sprintf(commande, instructions,
  137:                     (*s_etat_processus).nom_fichier_source,
  138:                     (*s_etat_processus).rpl_home, ds_preprocesseur,
  139:                     (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home,
  140:                     (*s_etat_processus).rpl_home,
  141:                     (*s_etat_processus).nom_fichier_source,
  142:                     nom_fichier_temporaire);
  143:         }
  144: 
  145:         if ((f_source = popen(commande, "r")) == NULL)
  146:         {
  147:             (*s_etat_processus).erreur_systeme = d_es_processus;
  148: 
  149:             free(nom_fichier_temporaire);
  150:             return(d_erreur);
  151:         }
  152: 
  153:         if (pclose(f_source) != EXIT_SUCCESS)
  154:         {
  155:             (*s_etat_processus).erreur_systeme = d_es_processus;
  156: 
  157:             free(nom_fichier_temporaire);
  158:             return(d_erreur);
  159:         }
  160: 
  161:         free(commande);
  162: 
  163:         if ((f_source = fopen(nom_fichier_temporaire, "r")) == NULL)
  164:         {
  165:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  166: 
  167:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
  168:             {
  169:                 free(nom_fichier_temporaire);
  170:                 return(d_erreur);
  171:             }
  172: 
  173:             free(nom_fichier_temporaire);
  174:             return(d_erreur);
  175:         }
  176: 
  177:         nombre_caracteres_source = 0;
  178: 
  179:         while(getc(f_source) != EOF)
  180:         {
  181:             nombre_caracteres_source++;
  182:         }
  183: 
  184:         (*s_etat_processus).definitions_chainees = (unsigned char *)
  185:                 malloc((nombre_caracteres_source + 1) * sizeof(unsigned char));
  186:         
  187:         if ((*s_etat_processus).definitions_chainees == NULL)
  188:         {
  189:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  190: 
  191:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
  192:             {
  193:                 free(nom_fichier_temporaire);
  194:                 return(d_erreur);
  195:             }
  196: 
  197:             return(d_erreur);
  198:         }
  199:         else
  200:         {
  201:             rewind(f_source);
  202:             presence_chaine = d_faux;
  203: 
  204:             i = 0;
  205:             drapeau_fin = d_faux;
  206: 
  207:             while(drapeau_fin == d_faux)
  208:             {
  209:                 if ((caractere = getc(f_source)) != EOF)
  210:                 {
  211:                     if ((caractere == d_code_retour_chariot) ||
  212:                             (caractere == d_code_tabulation) ||
  213:                             ((caractere == d_code_espace) &&
  214:                             (presence_chaine == d_faux)))
  215:                     {
  216:                         do
  217:                         {
  218:                             caractere = getc(f_source);
  219:                         } while(((caractere == d_code_retour_chariot) ||
  220:                                 (caractere == d_code_tabulation) ||
  221:                                 ((caractere == d_code_espace) &&
  222:                                 (presence_chaine == d_faux))) &&
  223:                                 (caractere != EOF));
  224: 
  225:                         if (caractere != EOF)
  226:                         {
  227:                             ((*s_etat_processus).definitions_chainees)[i++] =
  228:                                     d_code_espace;
  229:                         }
  230:                         else
  231:                         {
  232:                             drapeau_fin = d_vrai;
  233:                         }
  234:                     }
  235: 
  236:                     if ((((*s_etat_processus).definitions_chainees)[i] =
  237:                             caractere) == '\"')
  238:                     {
  239:                         if (i > 0)
  240:                         {
  241:                             if (((*s_etat_processus).definitions_chainees)
  242:                                     [i - 1] != '\\')
  243:                             {
  244:                                 presence_chaine = (presence_chaine == d_faux)
  245:                                         ? d_vrai : d_faux;
  246:                             }
  247:                         }
  248: 
  249:                         i++;
  250:                     }
  251:                     else
  252:                     {
  253:                         i++;
  254:                     }
  255:                 }
  256:                 else
  257:                 {
  258:                     drapeau_fin = d_vrai;
  259:                 }
  260:             }
  261: 
  262:             if ((caractere == EOF) && (i > 0))
  263:             {
  264:                 i--;
  265:             }
  266: 
  267:             ((*s_etat_processus).definitions_chainees)[i] = d_code_fin_chaine;
  268: 
  269:             erreur_os = d_absence_erreur;
  270:         }
  271: 
  272:         (*s_etat_processus).longueur_definitions_chainees =
  273:                 strlen((*s_etat_processus).definitions_chainees);
  274: 
  275:         if (fclose(f_source) != 0)
  276:         {
  277:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  278: 
  279:             if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
  280:             {
  281:                 free(nom_fichier_temporaire);
  282:                 return(d_erreur);
  283:             }
  284: 
  285:             free(nom_fichier_temporaire);
  286:             return(d_erreur);
  287:         }
  288: 
  289:         if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
  290:         {
  291:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  292: 
  293:             free(nom_fichier_temporaire);
  294:             return(d_erreur);
  295:         }
  296: 
  297:         free(nom_fichier_temporaire);
  298:     }
  299:     else
  300:     {
  301:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  302:         erreur_os = d_erreur;
  303:     }
  304: 
  305:     if (((*s_etat_processus).definitions_chainees =
  306:             realloc((*s_etat_processus).definitions_chainees,
  307:             ((*s_etat_processus).longueur_definitions_chainees + 1) *
  308:             sizeof(unsigned char))) == NULL)
  309:     {
  310:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  311:         return(d_erreur);
  312:     }
  313: 
  314:     return(erreur_os);
  315: }
  316: 
  317: 
  318: /*
  319: ================================================================================
  320:   Routine de compactage d'une chaîne de caractères
  321:   Tous les espaces et les retours à ligne surnuméraires sont enlevés.
  322: ================================================================================
  323:   Entrées: structure processus
  324: --------------------------------------------------------------------------------
  325:   Sortie: drapeau d'erreur
  326: --------------------------------------------------------------------------------
  327:   Effets de bord: néant
  328: ================================================================================
  329: */
  330: 
  331: unsigned char *
  332: compactage(unsigned char *chaine)
  333: {
  334:     logical1        drapeau_fin;
  335:     logical1        presence_chaine;
  336: 
  337:     unsigned char   caractere;
  338:     unsigned char   *ptr_ecriture;
  339:     unsigned char   *ptr_lecture;
  340: 
  341:     if (chaine == NULL)
  342:     {
  343:         return(NULL);
  344:     }
  345: 
  346:     presence_chaine = d_faux;
  347: 
  348:     drapeau_fin = d_faux;
  349:     ptr_lecture = chaine;
  350:     ptr_ecriture = chaine;
  351: 
  352:     while(drapeau_fin == d_faux)
  353:     {
  354:         if ((caractere = (*ptr_lecture++)) != d_code_fin_chaine)
  355:         {
  356:             if ((caractere == d_code_retour_chariot) ||
  357:                     (caractere == d_code_tabulation) ||
  358:                     ((caractere == d_code_espace) &&
  359:                     (presence_chaine == d_faux)))
  360:             {
  361:                 do
  362:                 {
  363:                     caractere = (*ptr_lecture++);
  364:                 } while(((caractere == d_code_retour_chariot) ||
  365:                         (caractere == d_code_tabulation) ||
  366:                         ((caractere == d_code_espace) &&
  367:                         (presence_chaine == d_faux))) &&
  368:                         (caractere != d_code_fin_chaine));
  369: 
  370:                 if (caractere != d_code_fin_chaine)
  371:                 {
  372:                     (*ptr_ecriture++) = d_code_espace;
  373:                 }
  374:                 else
  375:                 {
  376:                     drapeau_fin = d_vrai;
  377:                 }
  378:             }
  379: 
  380:             if (((*ptr_ecriture++) = caractere) == '\"')
  381:             {
  382:                 presence_chaine = (presence_chaine == d_faux)
  383:                         ? d_vrai : d_faux;
  384:             }
  385:         }
  386:         else
  387:         {
  388:             drapeau_fin = d_vrai;
  389:         }
  390:     }
  391: 
  392:     (*ptr_ecriture) = d_code_fin_chaine;
  393: 
  394:     return(realloc(chaine, (strlen(chaine) + 1) * sizeof(unsigned char)));
  395: }
  396: 
  397: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>