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