File:  [local] / rpl / src / chainage.c
Revision 1.19: download - view: text, annotated - select for diffs - revision graph
Tue Sep 7 08:58:04 2010 UTC (13 years, 8 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Retrait de la dépendance à sed pour le préprocesseur.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.19
    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 chaînage du programme (lecture du fichier puis constitution
   29:   de la chaîne exécutable)
   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                initialisation;
   53:     logical1                ouverture;
   54:     logical1                presence_chaine;
   55: 
   56:     long                    i;
   57:     long                    nombre_caracteres_source;
   58: 
   59:     unsigned char           *commande;
   60:     unsigned char           *executable_candidat;
   61: 
   62: #   ifndef OS2
   63:     unsigned char           *instructions = "%s/bin/%s %s | "
   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\", "
   68:                                     "$2); }'` -t %s//IGNORE > %s";
   69: #   else
   70:     unsigned char           *instructions = "sh -c \""
   71:                                     "%s/bin/%s %s | "
   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
   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: 
  115:         // Avant d'exécuter la commande, on teste les sommes de hashage
  116:         // des utilitaires de la famille RPL/2.
  117: 
  118:         if ((*s_etat_processus).rpl_home == NULL)
  119:         {
  120:             if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) +
  121:                     (2 * strlen((*s_etat_processus).nom_fichier_source)) +
  122:                     (4 * strlen(d_exec_path)) + strlen(d_locale) +
  123:                     strlen(nom_fichier_temporaire) + strlen(instructions) - 13)
  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:             }
  131: 
  132:             sprintf(commande, instructions,
  133:                     d_exec_path, ds_preprocesseur,
  134:                     (*s_etat_processus).nom_fichier_source,
  135:                     d_exec_path, d_exec_path,
  136:                     d_exec_path, (*s_etat_processus).nom_fichier_source,
  137:                     d_locale, nom_fichier_temporaire);
  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);
  207:         }
  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:             }
  221: 
  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);
  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);
  298:         }
  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;
  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:              */
  367: 
  368:             while(drapeau_fin == d_faux)
  369:             {
  370:                 if ((caractere = getc(f_source)) != EOF)
  371:                 {
  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: 
  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>