File:
[local] /
rpl /
src /
rplcore.c
Revision
1.44:
download - view:
text,
annotated -
select for diffs -
revision graph
Wed Mar 6 10:05:09 2013 UTC (12 years, 2 months ago) by
bertrand
Branches:
MAIN
CVS tags:
HEAD
Correction d'un bug majeur de la routine d'évaluation (n'arrivait qu'en
cas d'erreur en raison d'entrées non dépilées de la pile système). Ajout
d'un drapeau pour éviter la translitération des chaînes dans la génération
des fichiers rpl-core. En effet, si l'erreur était due à un problème
de translitération, le fichier rpl-core n'était jamais écrit car les routines
de translitération bouclaient indéfiniment).
1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.13
4: Copyright (C) 1989-2013 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: Fonction 'rplcore' générant un fichier de débogage
29: ================================================================================
30: Entrées : pointeur sur une structure struct_processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: rplcore(struct_processus *s_etat_processus)
40: {
41: file *fichier;
42:
43: logical1 erreur;
44: logical1 fin_boucle;
45:
46: long i;
47: long j;
48: long longueur_lignes = 65;
49:
50: struct_liste_chainee *l_base_pile;
51: struct_liste_chainee *l_element_courant;
52:
53: struct_objet *s_objet_last;
54:
55: unsigned char *expression;
56: unsigned char *nom;
57: unsigned char *message_erreur;
58: unsigned char *pile;
59: unsigned char *ptr;
60: unsigned char *ptr_bis;
61: unsigned char registre;
62: unsigned char registre_langue;
63:
64: (*s_etat_processus).core = d_faux;
65:
66: cf(s_etat_processus, 34);
67:
68: sf(s_etat_processus, 37);
69: sf(s_etat_processus, 38);
70: sf(s_etat_processus, 39);
71: sf(s_etat_processus, 40);
72: sf(s_etat_processus, 41);
73: sf(s_etat_processus, 42);
74:
75: cf(s_etat_processus, 43);
76: cf(s_etat_processus, 44);
77:
78: sf(s_etat_processus, 45);
79:
80: cf(s_etat_processus, 48);
81:
82: cf(s_etat_processus, 49);
83: cf(s_etat_processus, 50);
84:
85: cf(s_etat_processus, 53);
86: cf(s_etat_processus, 54);
87: cf(s_etat_processus, 55);
88: cf(s_etat_processus, 56);
89:
90: sf(s_etat_processus, 60);
91:
92: registre_langue = (*s_etat_processus).langue;
93: (*s_etat_processus).langue = 'E';
94:
95: message_erreur = messages(s_etat_processus);
96:
97: (*s_etat_processus).langue = registre_langue;
98:
99: if ((nom = malloc((strlen(ds_rplcore) + 64 + 1) * sizeof(unsigned char)))
100: == NULL)
101: {
102: free(message_erreur);
103: return;
104: }
105:
106: snprintf(nom, strlen(ds_rplcore) + 64 + 1,
107: "%s-%lu-%lu", ds_rplcore, (unsigned long) getpid(),
108: (unsigned long) pthread_self());
109:
110: if ((fichier = fopen(nom, "w+")) == NULL)
111: {
112: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
113: free(message_erreur);
114: free(nom);
115:
116: return;
117: }
118:
119: free(nom);
120:
121: if (fprintf(fichier, "// RPL/2 version %s process image\n",
122: d_version_rpl) < 0)
123: {
124: free(message_erreur);
125:
126: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
127: return;
128: }
129:
130: if (fprintf(fichier, "// Process %d\n", (int) getpid()) < 0)
131: {
132: free(message_erreur);
133:
134: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
135: return;
136: }
137:
138: if (fprintf(fichier, "// Source file : %s\n\n",
139: (*s_etat_processus).nom_fichier_source) < 0)
140: {
141: free(message_erreur);
142:
143: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
144: return;
145: }
146:
147: if ((*s_etat_processus).instruction_derniere_erreur != NULL)
148: {
149: if (fprintf(fichier, "// Error :\n%s [level %lu]\n\n",
150: message_erreur, (*s_etat_processus).niveau_derniere_erreur) < 0)
151: {
152: free(message_erreur);
153:
154: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
155: return;
156: }
157: }
158: else if ((*s_etat_processus).instruction_derniere_erreur[0] ==
159: d_code_fin_chaine)
160: {
161: if (fprintf(fichier, "// Error :\n%s [level %lu]\n\n",
162: message_erreur, (*s_etat_processus).niveau_derniere_erreur) < 0)
163: {
164: free(message_erreur);
165:
166: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
167: return;
168: }
169: }
170: else if (fprintf(fichier, "// Error :\n%s [%s at level %lu]\n\n",
171: message_erreur, (*s_etat_processus).instruction_derniere_erreur,
172: (*s_etat_processus).niveau_derniere_erreur) < 0)
173: {
174: free(message_erreur);
175:
176: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
177: return;
178: }
179:
180: free(message_erreur);
181:
182: if (fprintf(fichier, "// System stack\n\n") < 0)
183: {
184: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
185: return;
186: }
187:
188: trace(s_etat_processus, fichier);
189:
190: if (fprintf(fichier, "// Process stack\n\n") < 0)
191: {
192: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
193: return;
194: }
195:
196: l_element_courant = (struct_liste_chainee *)
197: (*s_etat_processus).l_base_pile_processus;
198: i = 0;
199:
200: if (pthread_mutex_trylock(&((*s_etat_processus).mutex)) == 0)
201: {
202: while(l_element_courant != NULL)
203: {
204: if ((*(*((struct_processus_fils *)
205: (*(*l_element_courant).donnee).objet)).thread)
206: .processus_detache == d_vrai)
207: {
208: if (fprintf(fichier, "%ld: Process [%d]\n",
209: i++, (int) (*(*((struct_processus_fils *)
210: (*(*l_element_courant).donnee).objet)).thread).pid) < 0)
211: {
212: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
213: return;
214: }
215: }
216: else
217: {
218: if (fprintf(fichier, "%ld: Thread [%llu] from [%llu]\n",
219: i++, (unsigned long long) (*(*((struct_processus_fils *)
220: (*(*l_element_courant).donnee).objet)).thread)
221: .tid, (unsigned long long)
222: (*(*((struct_processus_fils *) (*(*l_element_courant)
223: .donnee).objet)).thread).pid) < 0)
224: {
225: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
226: return;
227: }
228: }
229:
230: l_element_courant = (*l_element_courant).suivant;
231: }
232:
233: if (fprintf(fichier, "%ld: Process [%d]\n\n", i,
234: (int) getpid()) < 0)
235: {
236: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
237: return;
238: }
239:
240: pthread_mutex_unlock(&((*s_etat_processus).mutex));
241: }
242:
243: if (test_cfsf(s_etat_processus, 31) == d_vrai)
244: {
245: // LAST valide
246:
247: if (fprintf(fichier, "// Arguments\n\n") < 0)
248: {
249: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
250: return;
251: }
252:
253: l_base_pile = NULL;
254:
255: while((*s_etat_processus).l_base_pile_last != NULL)
256: {
257: if (depilement(s_etat_processus, &((*s_etat_processus)
258: .l_base_pile_last), &s_objet_last) == d_erreur)
259: {
260: return;
261: }
262:
263: if (empilement(s_etat_processus, &l_base_pile, s_objet_last)
264: == d_erreur)
265: {
266: return;
267: }
268: }
269:
270: if ((*s_etat_processus).l_base_pile != NULL)
271: {
272: registre = (*s_etat_processus).autorisation_conversion_chaine;
273: (*s_etat_processus).autorisation_conversion_chaine = 'N';
274:
275: ecriture_pile(s_etat_processus, fichier, l_base_pile, 1);
276:
277: (*s_etat_processus).autorisation_conversion_chaine = registre;
278: }
279: else
280: {
281: if (fprintf(fichier, " No argument\n") < 0)
282: {
283: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
284: return;
285: }
286: }
287:
288: while(l_base_pile != NULL)
289: {
290: if (depilement(s_etat_processus, &l_base_pile,
291: &s_objet_last) == d_erreur)
292: {
293: return;
294: }
295:
296: if (empilement(s_etat_processus, &((*s_etat_processus)
297: .l_base_pile_last), s_objet_last) == d_erreur)
298: {
299: return;
300: }
301: }
302: }
303: else
304: {
305: // LAST invalide
306:
307: if (fprintf(fichier, "// Current stack (LAST disabled)\n") < 0)
308: {
309: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
310: return;
311: }
312: }
313:
314: if (fprintf(fichier, "\n// Stack\n\n") < 0)
315: {
316: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
317: return;
318: }
319:
320: if ((*s_etat_processus).l_base_pile != NULL)
321: {
322: registre = (*s_etat_processus).autorisation_conversion_chaine;
323: (*s_etat_processus).autorisation_conversion_chaine = 'N';
324:
325: ecriture_pile(s_etat_processus, fichier,
326: (*s_etat_processus).l_base_pile, 1);
327:
328: (*s_etat_processus).autorisation_conversion_chaine = registre;
329: }
330: else
331: {
332: if (fprintf(fichier, " Empty stack\n") < 0)
333: {
334: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
335: return;
336: }
337: }
338:
339: if ((*s_etat_processus).s_objet_errone != NULL)
340: {
341: if (fprintf(fichier, "\n// Current evaluation\n") < 0)
342: {
343: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
344: return;
345: }
346:
347: // L'objet ne peut être qu'une expression algébrique ou RPN
348:
349: if (((*(*s_etat_processus).s_objet_errone).type == RPN) ||
350: ((*(*s_etat_processus).s_objet_errone).type == ALG))
351: {
352: l_element_courant = (*(*s_etat_processus).s_objet_errone).objet;
353:
354: if (fprintf(fichier, "\n") < 0)
355: {
356: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
357: return;
358: }
359:
360: while(l_element_courant != NULL)
361: {
362: if ((*l_element_courant).donnee ==
363: (*s_etat_processus).s_objet_erreur)
364: {
365: if ((expression = formateur(s_etat_processus, 4,
366: (*l_element_courant).donnee)) == NULL)
367: {
368: return;
369: }
370:
371: if ((*(*l_element_courant).donnee).type == CHN)
372: {
373: if (fprintf(fichier, " -> \"%s\"\n", expression) < 0)
374: {
375: (*s_etat_processus).erreur_systeme =
376: d_es_erreur_fichier;
377: return;
378: }
379: }
380: else
381: {
382: if (fprintf(fichier, " -> %s\n", expression) < 0)
383: {
384: (*s_etat_processus).erreur_systeme =
385: d_es_erreur_fichier;
386: return;
387: }
388: }
389: }
390: else
391: {
392: if ((expression = formateur(s_etat_processus, 4,
393: (*l_element_courant).donnee)) == NULL)
394: {
395: return;
396: }
397:
398: if ((*(*l_element_courant).donnee).type == CHN)
399: {
400: if (fprintf(fichier, " \"%s\"\n", expression) < 0)
401: {
402: (*s_etat_processus).erreur_systeme =
403: d_es_erreur_fichier;
404: return;
405: }
406: }
407: else
408: {
409: if (fprintf(fichier, " %s\n", expression) < 0)
410: {
411: (*s_etat_processus).erreur_systeme =
412: d_es_erreur_fichier;
413: return;
414: }
415: }
416: }
417:
418: free(expression);
419: l_element_courant = (*l_element_courant).suivant;
420: }
421: }
422: else
423: {
424: if ((expression = formateur(s_etat_processus, 4,
425: (*s_etat_processus).s_objet_errone)) == NULL)
426: {
427: return;
428: }
429:
430: if (fprintf(fichier, "\n%s\n", expression) < 0)
431: {
432: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
433: return;
434: }
435:
436: free(expression);
437: }
438: }
439:
440: if ((*s_etat_processus).longueur_definitions_chainees != 0)
441: {
442: if (fprintf(fichier, "\n// Definitions\n") < 0)
443: {
444: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
445: return;
446: }
447:
448: ptr = (*s_etat_processus).definitions_chainees;
449: i = 0;
450: erreur = d_faux;
451:
452: while(((*ptr) != d_code_fin_chaine) || (erreur == d_vrai))
453: {
454: if ((i % longueur_lignes) == 0)
455: {
456: if (fprintf(fichier, "\n") < 0)
457: {
458: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
459: return;
460: }
461:
462: if (erreur == d_vrai)
463: {
464: if (fprintf(fichier, "PC :") < 0)
465: {
466: (*s_etat_processus).erreur_systeme =
467: d_es_erreur_fichier;
468: return;
469: }
470:
471: if ((j = i - longueur_lignes) < 0)
472: {
473: j = 0;
474: ptr_bis = (*s_etat_processus).definitions_chainees;
475: }
476: else
477: {
478: ptr_bis = ptr - longueur_lignes;
479: }
480:
481: fin_boucle = d_faux;
482:
483: while(((*ptr_bis) != d_code_fin_chaine) &&
484: (fin_boucle == d_faux))
485: {
486: if (j == (long) (*s_etat_processus).position_courante)
487: {
488: if (fprintf(fichier, ">|<") < 0)
489: {
490: (*s_etat_processus).erreur_systeme =
491: d_es_erreur_fichier;
492: return;
493: }
494:
495: fin_boucle = d_vrai;
496: }
497: else
498: {
499: if (fprintf(fichier, " ") < 0)
500: {
501: (*s_etat_processus).erreur_systeme =
502: d_es_erreur_fichier;
503: return;
504: }
505: }
506:
507: j++;
508: ptr_bis++;
509: }
510:
511: if (fprintf(fichier, "\n") < 0)
512: {
513: (*s_etat_processus).erreur_systeme =
514: d_es_erreur_fichier;
515: return;
516: }
517: }
518:
519: if ((*ptr) != d_code_fin_chaine)
520: {
521: if (erreur == d_vrai)
522: {
523: if (fprintf(fichier, "\n") < 0)
524: {
525: (*s_etat_processus).erreur_systeme =
526: d_es_erreur_fichier;
527: return;
528: }
529: }
530:
531: if ((i <= (long) (*s_etat_processus).position_courante) &&
532: ((i + longueur_lignes) > (long) (*s_etat_processus)
533: .position_courante))
534: {
535: if (fprintf(fichier, "\nError : ") < 0)
536: {
537: (*s_etat_processus).erreur_systeme =
538: d_es_erreur_fichier;
539: return;
540: }
541:
542: erreur = d_vrai;
543: }
544: else
545: {
546: if (fprintf(fichier, " ") < 0)
547: {
548: (*s_etat_processus).erreur_systeme =
549: d_es_erreur_fichier;
550: return;
551: }
552:
553: erreur = d_faux;
554: }
555: }
556: else
557: {
558: erreur = d_faux;
559: }
560: }
561:
562: if ((*ptr) != d_code_fin_chaine)
563: {
564: if (ufprintf(fichier, "%c", *ptr) < 0)
565: {
566: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
567: return;
568: }
569:
570: ptr++;
571: }
572:
573: i++;
574: }
575:
576: if (fprintf(fichier, "\n// End of definitions\n") < 0)
577: {
578: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
579: return;
580: }
581: }
582:
583: if (fprintf(fichier, "\n// Externals\n\n") < 0)
584: {
585: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
586: return;
587: }
588:
589: instruction_externals(s_etat_processus);
590:
591: if (fprintf(fichier, "%s\n", pile =
592: formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile)
593: .donnee)) < 0)
594: {
595: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
596: return;
597: }
598:
599: free(pile);
600:
601: if (fprintf(fichier, "\n// Variables\n\n") < 0)
602: {
603: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
604: return;
605: }
606:
607: instruction_vars(s_etat_processus);
608:
609: if (fprintf(fichier, "%s\n", pile =
610: formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile)
611: .donnee)) < 0)
612: {
613: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
614: return;
615: }
616:
617: free(pile);
618:
619: instruction_drop2(s_etat_processus);
620:
621: if (fclose(fichier) != 0)
622: {
623: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
624: return;
625: }
626:
627: free((*s_etat_processus).instruction_derniere_erreur);
628: (*s_etat_processus).instruction_derniere_erreur = NULL;
629:
630: return;
631: }
632:
633: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>