File:
[local] /
rpl /
src /
chainage.c
Revision
1.30:
download - view:
text,
annotated -
select for diffs -
revision graph
Tue Jun 21 15:26:28 2011 UTC (13 years, 10 months ago) by
bertrand
Branches:
MAIN
CVS tags:
HEAD
Correction d'une réinitialisation sauvage de la pile des variables par niveau
dans la copie de la structure de description du processus. Cela corrige
la fonction SPAWN qui échouait sur un segmentation fault car la pile des
variables par niveau était vide alors même que l'arbre des variables contenait
bien les variables. Passage à la prerelease 2.
1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.0.prerelease.2
4: Copyright (C) 1989-2011 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 | "
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(&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);
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);
232: }
233: else
234: {
235: if ((commande = (unsigned char *) malloc((strlen(ds_preprocesseur) +
236: (2 * strlen((*s_etat_processus).nom_fichier_source)) +
237: (6 * strlen((*s_etat_processus).rpl_home)) +
238: strlen(d_locale) +
239: strlen(nom_fichier_temporaire) + strlen(instructions) - 21)
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: }
247:
248: sprintf(commande, instructions,
249: (*s_etat_processus).rpl_home, ds_preprocesseur,
250: (*s_etat_processus).nom_fichier_source,
251: (*s_etat_processus).rpl_home,
252: (*s_etat_processus).rpl_home,
253: (*s_etat_processus).rpl_home,
254: (*s_etat_processus).nom_fichier_source,
255: (*s_etat_processus).rpl_home,
256: (*s_etat_processus).rpl_home,
257: d_locale, nom_fichier_temporaire);
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);
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);
350: }
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;
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: */
419:
420: while(drapeau_fin == d_faux)
421: {
422: if ((caractere = getc(f_source)) != EOF)
423: {
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:
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
CVSweb interface <joel.bertrand@systella.fr>