File:  [local] / rpl / src / chainage.c
Revision 1.77: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:41 2020 UTC (4 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_32, HEAD
Modification du copyright.

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

CVSweb interface <joel.bertrand@systella.fr>