![]() ![]() | ![]() |
1.1 bertrand 1: /*
2: ================================================================================
1.35 ! bertrand 3: RPL/2 (R) version 4.1.2
1.24 bertrand 4: Copyright (C) 1989-2011 Dr. BERTRAND Joël
1.1 bertrand 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:
1.15 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
1.8 bertrand 28: Routine de chaînage du programme (lecture du fichier puis constitution
29: de la chaîne exécutable)
1.1 bertrand 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;
1.19 bertrand 52: logical1 initialisation;
1.1 bertrand 53: logical1 ouverture;
54: logical1 presence_chaine;
55:
56: long i;
57: long nombre_caracteres_source;
58:
59: unsigned char *commande;
1.6 bertrand 60: unsigned char *executable_candidat;
1.17 bertrand 61:
62: # ifndef OS2
1.19 bertrand 63: unsigned char *instructions = "%s/bin/%s %s | "
1.1 bertrand 64: "%s/bin/rpliconv `%s/bin/rplfile "
1.20 bertrand 65: "-m %s/share/rplfiles -i %s | "
66: "%s/bin/rplawk "
67: "'{ print $3; }' | %s/bin/rplawk -F= "
1.1 bertrand 68: "'{ if ($2 != \"\") printf(\"-f %%s\", "
1.10 bertrand 69: "$2); }'` -t %s//IGNORE > %s";
1.17 bertrand 70: # else
1.21 bertrand 71: unsigned char *instructions = BOURNE_SHELL " -c \""
1.19 bertrand 72: "%s/bin/%s %s | "
1.17 bertrand 73: "%s/bin/rpliconv `%s/bin/rplfile "
1.22 bertrand 74: "-m %s/share/rplfiles -i %s | "
75: "%s/bin/rplawk "
1.20 bertrand 76: "'{ print $3; }' | %s/bin/rplawk -F= "
1.17 bertrand 77: "'{ if ($2 != \\\"\\\") "
78: "printf(\\\"-f %%s\\\", "
1.22 bertrand 79: "$2); }'` -t %s//IGNORE > %s\"";
1.17 bertrand 80: # endif
1.1 bertrand 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:
1.6 bertrand 117: // Avant d'exécuter la commande, on teste les sommes de hashage
118: // des utilitaires de la famille RPL/2.
119:
1.5 bertrand 120: if ((*s_etat_processus).rpl_home == NULL)
1.1 bertrand 121: {
1.5 bertrand 122: if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) +
123: (2 * strlen((*s_etat_processus).nom_fichier_source)) +
1.20 bertrand 124: (6 * strlen(d_exec_path)) + strlen(d_locale) +
125: strlen(nom_fichier_temporaire) + strlen(instructions) - 21)
1.5 bertrand 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: }
1.1 bertrand 133:
1.5 bertrand 134: sprintf(commande, instructions,
1.19 bertrand 135: d_exec_path, ds_preprocesseur,
1.5 bertrand 136: (*s_etat_processus).nom_fichier_source,
1.19 bertrand 137: d_exec_path, d_exec_path,
1.5 bertrand 138: d_exec_path, (*s_etat_processus).nom_fichier_source,
1.20 bertrand 139: d_exec_path, d_exec_path, d_locale, nom_fichier_temporaire);
1.6 bertrand 140:
141: if (alsprintf(&executable_candidat, "%s/bin/rpliconv",
142: d_exec_path) < 0)
143: {
144: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
145: return(d_erreur);
146: }
147:
148: if (controle(s_etat_processus, executable_candidat, "md5",
149: rpliconv_md5) != d_vrai)
150: {
151: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
152: return(d_erreur);
153: }
154:
155: if (controle(s_etat_processus, executable_candidat, "sha1",
156: rpliconv_sha1) != d_vrai)
157: {
158: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
159: return(d_erreur);
160: }
161:
162: free(executable_candidat);
163:
164: if (alsprintf(&executable_candidat, "%s/bin/rplfile",
165: d_exec_path) < 0)
166: {
167: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
168: return(d_erreur);
169: }
170:
171: if (controle(s_etat_processus, executable_candidat, "md5",
172: rplfile_md5) != d_vrai)
173: {
174: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
175: return(d_erreur);
176: }
177:
178: if (controle(s_etat_processus, executable_candidat, "sha1",
179: rplfile_sha1) != d_vrai)
180: {
181: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
182: return(d_erreur);
183: }
184:
185: free(executable_candidat);
186:
187: if (alsprintf(&executable_candidat, "%s/bin/rplpp",
188: d_exec_path) < 0)
189: {
190: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
191: return(d_erreur);
192: }
193:
194: if (controle(s_etat_processus, executable_candidat, "md5",
195: rplpp_md5) != d_vrai)
196: {
197: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
198: return(d_erreur);
199: }
200:
201: if (controle(s_etat_processus, executable_candidat, "sha1",
202: rplpp_sha1) != d_vrai)
203: {
204: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
205: return(d_erreur);
206: }
207:
208: free(executable_candidat);
1.20 bertrand 209:
210: if (alsprintf(&executable_candidat, "%s/bin/rplawk",
211: d_exec_path) < 0)
212: {
213: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
214: return(d_erreur);
215: }
216:
217: if (controle(s_etat_processus, executable_candidat, "md5",
218: rplawk_md5) != d_vrai)
219: {
220: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
221: return(d_erreur);
222: }
223:
224: if (controle(s_etat_processus, executable_candidat, "sha1",
225: rplawk_sha1) != d_vrai)
226: {
227: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
228: return(d_erreur);
229: }
230:
231: free(executable_candidat);
1.1 bertrand 232: }
1.5 bertrand 233: else
234: {
235: if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) +
236: (2 * strlen((*s_etat_processus).nom_fichier_source)) +
1.20 bertrand 237: (6 * strlen((*s_etat_processus).rpl_home)) +
238: strlen(d_locale) +
239: strlen(nom_fichier_temporaire) + strlen(instructions) - 21)
1.5 bertrand 240: * sizeof(unsigned char))) == NULL)
241: {
242: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
243:
244: free(nom_fichier_temporaire);
245: return(d_erreur);
246: }
1.1 bertrand 247:
1.5 bertrand 248: sprintf(commande, instructions,
1.20 bertrand 249: (*s_etat_processus).rpl_home, ds_preprocesseur,
1.5 bertrand 250: (*s_etat_processus).nom_fichier_source,
1.20 bertrand 251: (*s_etat_processus).rpl_home,
252: (*s_etat_processus).rpl_home,
1.5 bertrand 253: (*s_etat_processus).rpl_home,
254: (*s_etat_processus).nom_fichier_source,
1.20 bertrand 255: (*s_etat_processus).rpl_home,
256: (*s_etat_processus).rpl_home,
257: d_locale, nom_fichier_temporaire);
1.6 bertrand 258:
259: if (alsprintf(&executable_candidat, "%s/bin/rpliconv",
260: (*s_etat_processus).rpl_home) < 0)
261: {
262: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
263: return(d_erreur);
264: }
265:
266: if (controle(s_etat_processus, executable_candidat, "md5",
267: rpliconv_md5) != d_vrai)
268: {
269: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
270: return(d_erreur);
271: }
272:
273: if (controle(s_etat_processus, executable_candidat, "sha1",
274: rpliconv_sha1) != d_vrai)
275: {
276: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
277: return(d_erreur);
278: }
279:
280: free(executable_candidat);
281:
282: if (alsprintf(&executable_candidat, "%s/bin/rplfile",
283: (*s_etat_processus).rpl_home) < 0)
284: {
285: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
286: return(d_erreur);
287: }
288:
289: if (controle(s_etat_processus, executable_candidat, "md5",
290: rplfile_md5) != d_vrai)
291: {
292: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
293: return(d_erreur);
294: }
295:
296: if (controle(s_etat_processus, executable_candidat, "sha1",
297: rplfile_sha1) != d_vrai)
298: {
299: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
300: return(d_erreur);
301: }
302:
303: free(executable_candidat);
304:
305: if (alsprintf(&executable_candidat, "%s/bin/rplpp",
306: (*s_etat_processus).rpl_home) < 0)
307: {
308: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
309: return(d_erreur);
310: }
311:
312: if (controle(s_etat_processus, executable_candidat, "md5",
313: rplpp_md5) != d_vrai)
314: {
315: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
316: return(d_erreur);
317: }
318:
319: if (controle(s_etat_processus, executable_candidat, "sha1",
320: rplpp_sha1) != d_vrai)
321: {
322: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
323: return(d_erreur);
324: }
325:
326: free(executable_candidat);
1.20 bertrand 327:
328: if (alsprintf(&executable_candidat, "%s/bin/rplawk",
329: (*s_etat_processus).rpl_home) < 0)
330: {
331: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
332: return(d_erreur);
333: }
334:
335: if (controle(s_etat_processus, executable_candidat, "md5",
336: rplawk_md5) != d_vrai)
337: {
338: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
339: return(d_erreur);
340: }
341:
342: if (controle(s_etat_processus, executable_candidat, "sha1",
343: rplawk_sha1) != d_vrai)
344: {
345: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
346: return(d_erreur);
347: }
348:
349: free(executable_candidat);
1.5 bertrand 350: }
1.1 bertrand 351:
352: if ((f_source = popen(commande, "r")) == NULL)
353: {
354: (*s_etat_processus).erreur_systeme = d_es_processus;
355:
356: free(nom_fichier_temporaire);
357: return(d_erreur);
358: }
359:
360: if (pclose(f_source) != EXIT_SUCCESS)
361: {
362: (*s_etat_processus).erreur_systeme = d_es_processus;
363:
364: free(nom_fichier_temporaire);
365: return(d_erreur);
366: }
367:
368: free(commande);
369:
370: if ((f_source = fopen(nom_fichier_temporaire, "r")) == NULL)
371: {
372: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
373:
374: if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
375: {
376: free(nom_fichier_temporaire);
377: return(d_erreur);
378: }
379:
380: free(nom_fichier_temporaire);
381: return(d_erreur);
382: }
383:
384: nombre_caracteres_source = 0;
385:
386: while(getc(f_source) != EOF)
387: {
388: nombre_caracteres_source++;
389: }
390:
391: (*s_etat_processus).definitions_chainees = (unsigned char *)
392: malloc((nombre_caracteres_source + 1) * sizeof(unsigned char));
393:
394: if ((*s_etat_processus).definitions_chainees == NULL)
395: {
396: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
397:
398: if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
399: {
400: free(nom_fichier_temporaire);
401: return(d_erreur);
402: }
403:
404: return(d_erreur);
405: }
406: else
407: {
408: rewind(f_source);
409: presence_chaine = d_faux;
410:
411: i = 0;
412: drapeau_fin = d_faux;
1.19 bertrand 413: initialisation = d_vrai;
414:
415: /*
416: * Élimination du sharp-bang si nécessaire et des caractères
417: * inutiles. Conversion de caractères.
418: */
1.1 bertrand 419:
420: while(drapeau_fin == d_faux)
421: {
422: if ((caractere = getc(f_source)) != EOF)
423: {
1.19 bertrand 424: if (initialisation == d_vrai)
425: {
426: if (caractere == '#')
427: {
428: if ((caractere = getc(f_source)) != EOF)
429: {
430: if (caractere == '!')
431: {
432: do
433: {
434: caractere = getc(f_source);
435: } while((caractere != EOF) &&
436: (caractere !=
437: d_code_retour_chariot));
438: }
439: else
440: {
441: rewind(f_source);
442: caractere = getc(f_source);
443: }
444: }
445: }
446:
447: initialisation = d_faux;
448: }
449:
1.1 bertrand 450: if ((caractere == d_code_retour_chariot) ||
451: (caractere == d_code_tabulation) ||
452: ((caractere == d_code_espace) &&
453: (presence_chaine == d_faux)))
454: {
455: do
456: {
457: caractere = getc(f_source);
458: } while(((caractere == d_code_retour_chariot) ||
459: (caractere == d_code_tabulation) ||
460: ((caractere == d_code_espace) &&
461: (presence_chaine == d_faux))) &&
462: (caractere != EOF));
463:
464: if (caractere != EOF)
465: {
466: ((*s_etat_processus).definitions_chainees)[i++] =
467: d_code_espace;
468: }
469: else
470: {
471: drapeau_fin = d_vrai;
472: }
473: }
474:
475: if ((((*s_etat_processus).definitions_chainees)[i] =
476: caractere) == '\"')
477: {
478: if (i > 0)
479: {
480: if (((*s_etat_processus).definitions_chainees)
481: [i - 1] != '\\')
482: {
483: presence_chaine = (presence_chaine == d_faux)
484: ? d_vrai : d_faux;
485: }
486: }
487:
488: i++;
489: }
490: else
491: {
492: i++;
493: }
494: }
495: else
496: {
497: drapeau_fin = d_vrai;
498: }
499: }
500:
501: if ((caractere == EOF) && (i > 0))
502: {
503: i--;
504: }
505:
506: ((*s_etat_processus).definitions_chainees)[i] = d_code_fin_chaine;
507:
508: erreur_os = d_absence_erreur;
509: }
510:
511: (*s_etat_processus).longueur_definitions_chainees =
512: strlen((*s_etat_processus).definitions_chainees);
513:
514: if (fclose(f_source) != 0)
515: {
516: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
517:
518: if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
519: {
520: free(nom_fichier_temporaire);
521: return(d_erreur);
522: }
523:
524: free(nom_fichier_temporaire);
525: return(d_erreur);
526: }
527:
528: if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
529: {
530: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
531:
532: free(nom_fichier_temporaire);
533: return(d_erreur);
534: }
535:
536: free(nom_fichier_temporaire);
537: }
538: else
539: {
540: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
541: erreur_os = d_erreur;
542: }
543:
544: if (((*s_etat_processus).definitions_chainees =
545: realloc((*s_etat_processus).definitions_chainees,
546: ((*s_etat_processus).longueur_definitions_chainees + 1) *
547: sizeof(unsigned char))) == NULL)
548: {
549: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
550: return(d_erreur);
551: }
552:
553: return(erreur_os);
554: }
555:
556:
557: /*
558: ================================================================================
559: Routine de compactage d'une chaîne de caractères
560: Tous les espaces et les retours à ligne surnuméraires sont enlevés.
561: ================================================================================
562: Entrées: structure processus
563: --------------------------------------------------------------------------------
564: Sortie: drapeau d'erreur
565: --------------------------------------------------------------------------------
566: Effets de bord: néant
567: ================================================================================
568: */
569:
570: unsigned char *
571: compactage(unsigned char *chaine)
572: {
573: logical1 drapeau_fin;
574: logical1 presence_chaine;
575:
576: unsigned char caractere;
577: unsigned char *ptr_ecriture;
578: unsigned char *ptr_lecture;
579:
580: if (chaine == NULL)
581: {
582: return(NULL);
583: }
584:
585: presence_chaine = d_faux;
586:
587: drapeau_fin = d_faux;
588: ptr_lecture = chaine;
589: ptr_ecriture = chaine;
590:
591: while(drapeau_fin == d_faux)
592: {
593: if ((caractere = (*ptr_lecture++)) != d_code_fin_chaine)
594: {
595: if ((caractere == d_code_retour_chariot) ||
596: (caractere == d_code_tabulation) ||
597: ((caractere == d_code_espace) &&
598: (presence_chaine == d_faux)))
599: {
600: do
601: {
602: caractere = (*ptr_lecture++);
603: } while(((caractere == d_code_retour_chariot) ||
604: (caractere == d_code_tabulation) ||
605: ((caractere == d_code_espace) &&
606: (presence_chaine == d_faux))) &&
607: (caractere != d_code_fin_chaine));
608:
609: if (caractere != d_code_fin_chaine)
610: {
611: (*ptr_ecriture++) = d_code_espace;
612: }
613: else
614: {
615: drapeau_fin = d_vrai;
616: }
617: }
618:
619: if (((*ptr_ecriture++) = caractere) == '\"')
620: {
621: presence_chaine = (presence_chaine == d_faux)
622: ? d_vrai : d_faux;
623: }
624: }
625: else
626: {
627: drapeau_fin = d_vrai;
628: }
629: }
630:
631: (*ptr_ecriture) = d_code_fin_chaine;
632:
633: return(realloc(chaine, (strlen(chaine) + 1) * sizeof(unsigned char)));
634: }
635:
636: // vim: ts=4