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