Annotation of rpl/src/rplcore.c, revision 1.44
1.1 bertrand 1: /*
2: ================================================================================
1.43 bertrand 3: RPL/2 (R) version 4.1.13
1.42 bertrand 4: Copyright (C) 1989-2013 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.13 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 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;
1.3 bertrand 61: unsigned char registre;
1.1 bertrand 62: unsigned char registre_langue;
63:
64: (*s_etat_processus).core = d_faux;
65:
1.44 ! bertrand 66: cf(s_etat_processus, 34);
! 67:
1.1 bertrand 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:
1.15 bertrand 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",
1.1 bertrand 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:
1.10 bertrand 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:
1.1 bertrand 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: {
1.3 bertrand 272: registre = (*s_etat_processus).autorisation_conversion_chaine;
273: (*s_etat_processus).autorisation_conversion_chaine = 'N';
274:
1.1 bertrand 275: ecriture_pile(s_etat_processus, fichier, l_base_pile, 1);
1.3 bertrand 276:
277: (*s_etat_processus).autorisation_conversion_chaine = registre;
1.1 bertrand 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: {
1.3 bertrand 322: registre = (*s_etat_processus).autorisation_conversion_chaine;
323: (*s_etat_processus).autorisation_conversion_chaine = 'N';
324:
1.1 bertrand 325: ecriture_pile(s_etat_processus, fichier,
326: (*s_etat_processus).l_base_pile, 1);
1.3 bertrand 327:
328: (*s_etat_processus).autorisation_conversion_chaine = registre;
1.1 bertrand 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>