--- rpl/src/chainage.c 2010/01/26 15:22:45 1.1.1.1 +++ rpl/src/chainage.c 2020/01/10 11:15:41 1.77 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.9 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.32 + Copyright (C) 1989-2020 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,13 +20,13 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* ================================================================================ - Routine de chainage du programme (lecture du fichier puis constitution - de la chaine executable) + Routine de chaînage du programme (lecture du fichier puis constitution + de la chaîne exécutable) ================================================================================ Entrées: structure processus -------------------------------------------------------------------------------- @@ -45,24 +45,39 @@ chainage(struct_processus *s_etat_proces int caractere; int erreur; - int erreur_os; logical1 drapeau_fin; + logical1 erreur_os; logical1 existence; + logical1 initialisation; logical1 ouverture; logical1 presence_chaine; - long i; - long nombre_caracteres_source; + integer8 i; + integer8 nombre_caracteres_source; unsigned char *commande; - unsigned char *instructions = "sed -e '1,1s/^#!/\\/\\//g' %s | " - "%s/bin/%s | " + unsigned char *executable_candidat; + +# ifndef OS2 + unsigned char *instructions = "%s/bin/%s %s | " "%s/bin/rpliconv `%s/bin/rplfile " - "-m %s/share/rplfiles -i %s | awk " - "'{ print $3; }' | awk -F= " + "-m %s/share/rplfiles -i %s | " + "%s/bin/rplawk " + "'{ print $3; }' | %s/bin/rplawk -F= " "'{ if ($2 != \"\") printf(\"-f %%s\", " - "$2); }'` -t `locale charmap`//IGNORE > %s"; + "$2); }'` -t %s//IGNORE > %s"; +# else + unsigned char *instructions = BOURNE_SHELL " -c \"" + "%s/bin/%s %s | " + "%s/bin/rpliconv `%s/bin/rplfile " + "-m %s/share/rplfiles -i %s | " + "%s/bin/rplawk " + "'{ print $3; }' | %s/bin/rplawk -F= " + "'{ if ($2 != \\\"\\\") " + "printf(\\\"-f %%s\\\", " + "$2); }'` -t %s//IGNORE > %s\""; +# endif unsigned long unite_fichier; @@ -99,22 +114,184 @@ chainage(struct_processus *s_etat_proces return(d_erreur); } - if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) + - (2 * strlen((*s_etat_processus).nom_fichier_source)) + - (4 * strlen(d_exec_path)) + - strlen(nom_fichier_temporaire) + strlen(instructions) - 11) * - sizeof(unsigned char))) == NULL) + // Avant d'exécuter la commande, on teste les sommes de hashage + // des utilitaires de la famille RPL/2. + + if ((*s_etat_processus).rpl_home == NULL) { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) + + (2 * strlen((*s_etat_processus).nom_fichier_source)) + + (6 * strlen(d_exec_path)) + strlen(d_locale) + + strlen(nom_fichier_temporaire) + strlen(instructions) - 21) + * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - free(nom_fichier_temporaire); - return(d_erreur); + free(nom_fichier_temporaire); + return(d_erreur); + } + + sprintf(commande, instructions, + d_exec_path, ds_preprocesseur, + (*s_etat_processus).nom_fichier_source, + d_exec_path, d_exec_path, + d_exec_path, (*s_etat_processus).nom_fichier_source, + d_exec_path, d_exec_path, d_locale, nom_fichier_temporaire); + + if (alsprintf(s_etat_processus, &executable_candidat, + "%s/bin/rpliconv", d_exec_path) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + if (controle_integrite(s_etat_processus, executable_candidat, + "rpliconv") != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return(d_erreur); + } + + free(executable_candidat); + + if (alsprintf(s_etat_processus, &executable_candidat, + "%s/bin/rplfile", d_exec_path) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + if (controle_integrite(s_etat_processus, executable_candidat, + "rplfile") != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return(d_erreur); + } + + free(executable_candidat); + + if (alsprintf(s_etat_processus, &executable_candidat, + "%s/bin/rplpp", d_exec_path) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + if (controle_integrite(s_etat_processus, executable_candidat, + "rplpp") != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return(d_erreur); + } + + free(executable_candidat); + + if (alsprintf(s_etat_processus, &executable_candidat, + "%s/bin/rplawk", d_exec_path) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + if (controle_integrite(s_etat_processus, executable_candidat, + "rplawk") != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return(d_erreur); + } + + free(executable_candidat); } + else + { + if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) + + (2 * strlen((*s_etat_processus).nom_fichier_source)) + + (6 * strlen((*s_etat_processus).rpl_home)) + + strlen(d_locale) + + strlen(nom_fichier_temporaire) + strlen(instructions) - 21) + * sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - sprintf(commande, instructions, (*s_etat_processus).nom_fichier_source, - d_exec_path, ds_preprocesseur, d_exec_path, d_exec_path, - d_exec_path, (*s_etat_processus).nom_fichier_source, - nom_fichier_temporaire); + free(nom_fichier_temporaire); + return(d_erreur); + } + + sprintf(commande, instructions, + (*s_etat_processus).rpl_home, ds_preprocesseur, + (*s_etat_processus).nom_fichier_source, + (*s_etat_processus).rpl_home, + (*s_etat_processus).rpl_home, + (*s_etat_processus).rpl_home, + (*s_etat_processus).nom_fichier_source, + (*s_etat_processus).rpl_home, + (*s_etat_processus).rpl_home, + d_locale, nom_fichier_temporaire); + + if (alsprintf(s_etat_processus, &executable_candidat, + "%s/bin/rpliconv", (*s_etat_processus).rpl_home) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + if (controle_integrite(s_etat_processus, executable_candidat, + "rpliconv") != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return(d_erreur); + } + + free(executable_candidat); + + if (alsprintf(s_etat_processus, &executable_candidat, + "%s/bin/rplfile", (*s_etat_processus).rpl_home) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + if (controle_integrite(s_etat_processus, executable_candidat, + "rplfile") != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return(d_erreur); + } + + free(executable_candidat); + + if (alsprintf(s_etat_processus, &executable_candidat, + "%s/bin/rplpp", (*s_etat_processus).rpl_home) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + if (controle_integrite(s_etat_processus, executable_candidat, + "rplpp") != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return(d_erreur); + } + + free(executable_candidat); + + if (alsprintf(s_etat_processus, &executable_candidat, + "%s/bin/rplawk", (*s_etat_processus).rpl_home) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(d_erreur); + } + + if (controle_integrite(s_etat_processus, executable_candidat, + "rplawk") != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return(d_erreur); + } + + free(executable_candidat); + } if ((f_source = popen(commande, "r")) == NULL) { @@ -156,7 +333,8 @@ chainage(struct_processus *s_etat_proces } (*s_etat_processus).definitions_chainees = (unsigned char *) - malloc((nombre_caracteres_source + 1) * sizeof(unsigned char)); + malloc((((size_t) nombre_caracteres_source) + 1) + * sizeof(unsigned char)); if ((*s_etat_processus).definitions_chainees == NULL) { @@ -177,11 +355,43 @@ chainage(struct_processus *s_etat_proces i = 0; drapeau_fin = d_faux; + initialisation = d_vrai; + + /* + * Élimination du sharp-bang si nécessaire et des caractères + * inutiles. Conversion de caractères. + */ while(drapeau_fin == d_faux) { if ((caractere = getc(f_source)) != EOF) { + if (initialisation == d_vrai) + { + if (caractere == '#') + { + if ((caractere = getc(f_source)) != EOF) + { + if (caractere == '!') + { + do + { + caractere = getc(f_source); + } while((caractere != EOF) && + (caractere != + d_code_retour_chariot)); + } + else + { + rewind(f_source); + caractere = getc(f_source); + } + } + } + + initialisation = d_faux; + } + if ((caractere == d_code_retour_chariot) || (caractere == d_code_tabulation) || ((caractere == d_code_espace) && @@ -207,8 +417,8 @@ chainage(struct_processus *s_etat_proces } } - if ((((*s_etat_processus).definitions_chainees)[i] = - caractere) == '\"') + if (((int) (((*s_etat_processus).definitions_chainees)[i] = + ((unsigned char) caractere))) == '\"') { if (i > 0) { @@ -244,7 +454,7 @@ chainage(struct_processus *s_etat_proces } (*s_etat_processus).longueur_definitions_chainees = - strlen((*s_etat_processus).definitions_chainees); + (integer8) strlen((*s_etat_processus).definitions_chainees); if (fclose(f_source) != 0) { @@ -278,8 +488,8 @@ chainage(struct_processus *s_etat_proces if (((*s_etat_processus).definitions_chainees = realloc((*s_etat_processus).definitions_chainees, - ((*s_etat_processus).longueur_definitions_chainees + 1) * - sizeof(unsigned char))) == NULL) + (((size_t) (*s_etat_processus).longueur_definitions_chainees) + 1) + * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -303,7 +513,7 @@ chainage(struct_processus *s_etat_proces */ unsigned char * -compactage(unsigned char *chaine) +compactage(struct_processus *s_etat_processus, unsigned char *chaine) { logical1 drapeau_fin; logical1 presence_chaine;