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>