1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.36
4: Copyright (C) 1989-2025 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: #define TEST(instruction) (fonction == instruction)
26: #define vers_niveau_inferieur instruction_vers_niveau_inferieur
27: #define vers_niveau_superieur instruction_vers_niveau_superieur
28:
29:
30: /*
31: ================================================================================
32: Evaluation d'une expression
33: ================================================================================
34: Entrées :
35: structure processus,
36: objet à évaluer (non libéré au retour de la routine)
37: et type ('E' pour 'EVAL', 'I' pour interactif et 'N' pour '->NUM')
38: --------------------------------------------------------------------------------
39: Sorties : objet évalué au niveau 1 de la pile
40: --------------------------------------------------------------------------------
41: Effets de bord : néant
42: ================================================================================
43: */
44:
45: logical1
46: evaluation(struct_processus *s_etat_processus, struct_objet *s_objet,
47: unsigned char type_evaluation)
48: {
49: integer8 i;
50: integer8 j;
51: integer8 k;
52: integer8 l;
53: integer8 niveau_initial;
54: integer8 nombre_termes;
55: integer8 registre_hauteur_pile_operationnelle;
56: integer8 registre_position_courante;
57:
58:
59: logical1 drapeau_then;
60: logical1 erreur_evaluation;
61: logical1 presence_compteur;
62: logical1 presence_egalite;
63: logical1 presence_fonction;
64: logical1 presence_variable;
65: logical1 presence_variable_partagee;
66:
67: struct_liste_chainee *l_element_courant;
68: struct_liste_chainee *l_element_egalite;
69: struct_liste_chainee *l_element_fonction;
70: struct_liste_chainee *l_liste1;
71: struct_liste_chainee *l_liste2;
72: struct_liste_chainee *l_registre_atome;
73: struct_liste_chainee *l_registre_pile_operationnelle;
74: struct_liste_chainee *l_sous_element_courant;
75: struct_liste_chainee *registre_expression_courante;
76:
77: struct_liste_pile_systeme *pile_systeme_originelle;
78:
79: struct_objet *s_objet_elementaire;
80: struct_objet *s_objet_evalue;
81: struct_objet *s_objet_indice_i;
82: struct_objet *s_objet_indice_j;
83: struct_objet *s_objet_tampon;
84: struct_objet *s_sous_objet;
85: struct_objet *s_copie_variable_partagee;
86:
87: unsigned char autorisation_empilement_programme;
88: unsigned char *instruction_courante;
89: unsigned char *message;
90: unsigned char registre_evaluation_expression_compilee;
91: unsigned char registre_evaluation_forcee;
92: unsigned char registre_instruction_valide;
93: unsigned char registre_mode_execution_programme;
94: unsigned char registre_test;
95: unsigned char registre_test_2;
96: unsigned char registre_type_evaluation;
97:
98: int registre_erreur_execution;
99: int registre_erreur_systeme;
100: int registre_exception;
101:
102: void (*fonction)();
103:
104: registre_mode_execution_programme =
105: (*s_etat_processus).mode_execution_programme;
106: (*s_etat_processus).mode_execution_programme = 'I';
107: instruction_courante = (*s_etat_processus).instruction_courante;
108: (*s_etat_processus).erreur_execution = d_ex;
109:
110: erreur_evaluation = d_absence_erreur;
111: s_copie_variable_partagee = NULL;
112:
113: if ((*s_objet).type == NOM)
114: {
115: if ((s_objet_tampon = copie_objet(s_etat_processus, s_objet, 'P'))
116: == NULL)
117: {
118: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
119: (*s_etat_processus).instruction_courante = instruction_courante;
120: return(d_erreur);
121: }
122:
123: registre_instruction_valide = (*s_etat_processus).instruction_valide;
124: registre_test = (*s_etat_processus).test_instruction;
125: (*s_etat_processus).test_instruction = 'Y';
126: (*s_etat_processus).instruction_courante = (*((struct_nom *)
127: (*s_objet_tampon).objet)).nom;
128:
129: analyse(s_etat_processus, NULL);
130:
131: (*s_etat_processus).test_instruction = 'N';
132:
133: if ((*s_etat_processus).constante_symbolique == 'N')
134: {
135: presence_fonction = d_faux;
136: presence_variable_partagee = d_faux;
137:
138: if (recherche_variable(s_etat_processus, (*((struct_nom *)
139: (*s_objet_tampon).objet)).nom) == d_faux)
140: {
141: (*s_etat_processus).erreur_execution = d_ex;
142:
143: if ((*s_etat_processus).autorisation_nom_implicite == 'N')
144: {
145: if ((*((struct_nom *) (*s_objet_tampon).objet)).symbole ==
146: d_faux)
147: {
148: if (test_cfsf(s_etat_processus, 31) == d_vrai)
149: {
150: if (empilement_pile_last(s_etat_processus, 0)
151: == d_erreur)
152: {
153: return(d_erreur);
154: }
155: }
156:
157: erreur_evaluation = d_erreur;
158: (*s_etat_processus).erreur_execution =
159: d_ex_nom_implicite;
160:
161: if (type_evaluation == 'I')
162: {
163: (*s_etat_processus).derniere_erreur_evaluation =
164: (*s_etat_processus).erreur_execution;
165: }
166: }
167: }
168:
169: (*s_etat_processus).erreur_systeme = d_es;
170: presence_variable = d_faux;
171: }
172: else
173: {
174: if ((*s_etat_processus).traitement_symbolique == 'N')
175: {
176: if ((*(*s_etat_processus).pointeur_variable_courante)
177: .objet == NULL)
178: {
179: // Variable partagée
180:
181: presence_variable_partagee = d_faux;
182:
183: if (recherche_variable_partagee(s_etat_processus,
184: (*(*s_etat_processus)
185: .pointeur_variable_courante).nom,
186: (*(*s_etat_processus)
187: .pointeur_variable_courante)
188: .variable_partagee, 'E') != NULL)
189: {
190: presence_variable = d_vrai;
191: presence_variable_partagee = d_vrai;
192:
193: if ((*(*(*s_etat_processus)
194: .pointeur_variable_partagee_courante).objet)
195: .type == ADR)
196: {
197: presence_fonction = d_vrai;
198: }
199:
200: if ((s_copie_variable_partagee =
201: copie_objet(s_etat_processus,
202: (*(*s_etat_processus)
203: .pointeur_variable_partagee_courante).objet,
204: 'P')) == NULL)
205: {
206: (*s_etat_processus).erreur_systeme =
207: d_es_allocation_memoire;
208:
209: if (pthread_mutex_unlock(&((*(*s_etat_processus)
210: .pointeur_variable_partagee_courante)
211: .mutex)) != 0)
212: {
213: (*s_etat_processus).erreur_systeme =
214: d_es_processus;
215: return(d_erreur);
216: }
217:
218: return(d_erreur);
219: }
220:
221: if (pthread_mutex_unlock(&((*(*s_etat_processus)
222: .pointeur_variable_partagee_courante)
223: .mutex)) != 0)
224: {
225: (*s_etat_processus).erreur_systeme =
226: d_es_processus;
227: return(d_erreur);
228: }
229: }
230: else
231: {
232: (*s_etat_processus).erreur_systeme = d_es;
233: presence_variable = d_faux;
234: presence_variable_partagee = d_faux;
235: }
236: }
237: else
238: {
239: // Variable privée
240:
241: presence_variable = d_vrai;
242:
243: if ((*(*(*s_etat_processus).pointeur_variable_courante)
244: .objet).type == ADR)
245: {
246: presence_fonction = d_vrai;
247: }
248: }
249: }
250: else
251: {
252: presence_variable = d_faux;
253: }
254: }
255:
256: liberation(s_etat_processus, s_objet_tampon);
257:
258: if (presence_fonction == d_vrai)
259: {
260: autorisation_empilement_programme = (*s_etat_processus)
261: .autorisation_empilement_programme;
262: registre_position_courante = (*s_etat_processus)
263: .position_courante;
264:
265: empilement_pile_systeme(s_etat_processus);
266:
267: if ((*s_etat_processus).erreur_systeme != d_es)
268: {
269: if (presence_variable_partagee == d_vrai)
270: {
271: liberation(s_etat_processus, s_copie_variable_partagee);
272: }
273:
274: (*s_etat_processus).instruction_courante =
275: instruction_courante;
276: return(d_erreur);
277: }
278:
279: (*(*s_etat_processus).l_base_pile_systeme)
280: .retour_definition = 'Y';
281: (*(*s_etat_processus).l_base_pile_systeme)
282: .origine_routine_evaluation = 'Y';
283:
284: (*s_etat_processus).mode_execution_programme = 'Y';
285: (*s_etat_processus).autorisation_empilement_programme = 'N';
286:
287: (*(*s_etat_processus).l_base_pile_systeme)
288: .niveau_courant = (*s_etat_processus).niveau_courant;
289:
290: if (presence_variable_partagee == d_faux)
291: {
292: (*s_etat_processus).position_courante =
293: (*((integer8 *) ((*(*(*s_etat_processus)
294: .pointeur_variable_courante).objet).objet)));
295: }
296: else
297: {
298: (*s_etat_processus).position_courante =
299: (*((integer8 *) (*s_copie_variable_partagee)
300: .objet));
301: liberation(s_etat_processus, s_copie_variable_partagee);
302: }
303:
304: if ((*s_etat_processus).profilage == d_vrai)
305: {
306: profilage(s_etat_processus,
307: (*(*s_etat_processus).pointeur_variable_courante)
308: .nom);
309:
310: if ((*s_etat_processus).erreur_systeme != d_es)
311: {
312: return(d_erreur);
313: }
314: }
315:
316: registre_evaluation_forcee =
317: (*s_etat_processus).evaluation_forcee;
318:
319: if (type_evaluation == 'N')
320: {
321: (*s_etat_processus).evaluation_forcee = 'Y';
322: }
323:
324: if (sequenceur(s_etat_processus) == d_erreur)
325: {
326: depilement_pile_systeme(s_etat_processus);
327:
328: (*s_etat_processus).evaluation_forcee =
329: registre_evaluation_forcee;
330: (*s_etat_processus).mode_execution_programme =
331: registre_mode_execution_programme;
332: (*s_etat_processus).instruction_courante =
333: instruction_courante;
334: return(d_erreur);
335: }
336:
337: (*s_etat_processus).evaluation_forcee =
338: registre_evaluation_forcee;
339: (*s_etat_processus).instruction_courante =
340: instruction_courante;
341: (*s_etat_processus).mode_execution_programme = 'N';
342:
343: depilement_pile_systeme(s_etat_processus);
344:
345: if ((*s_etat_processus).erreur_systeme != d_es)
346: {
347: return(d_erreur);
348: }
349:
350: (*s_etat_processus).retour_routine_evaluation = 'N';
351: (*s_etat_processus).position_courante =
352: registre_position_courante;
353: (*s_etat_processus).autorisation_empilement_programme =
354: autorisation_empilement_programme;
355: }
356: else if (presence_variable == d_vrai)
357: {
358: registre_evaluation_expression_compilee =
359: (*s_etat_processus).evaluation_expression_compilee;
360:
361: if (((*(*s_etat_processus).pointeur_variable_courante).origine
362: == 'E') && ((*(*s_etat_processus)
363: .pointeur_variable_courante).niveau == 0))
364: {
365: (*s_etat_processus).evaluation_expression_compilee = 'Y';
366: }
367: else
368: {
369: (*s_etat_processus).evaluation_expression_compilee = 'N';
370: }
371:
372: if ((*s_etat_processus).profilage == d_vrai)
373: {
374: profilage(s_etat_processus,
375: (*(*s_etat_processus).pointeur_variable_courante)
376: .nom);
377:
378: if ((*s_etat_processus).erreur_systeme != d_es)
379: {
380: return(d_erreur);
381: }
382: }
383:
384: autorisation_empilement_programme = (*s_etat_processus)
385: .autorisation_empilement_programme;
386:
387: empilement_pile_systeme(s_etat_processus);
388:
389: if ((*s_etat_processus).erreur_systeme != d_es)
390: {
391: if (presence_variable_partagee == d_vrai)
392: {
393: liberation(s_etat_processus, s_copie_variable_partagee);
394: }
395:
396: (*s_etat_processus).instruction_courante =
397: instruction_courante;
398: return(d_erreur);
399: }
400:
401: (*(*s_etat_processus).l_base_pile_systeme)
402: .retour_definition = 'Y';
403: (*(*s_etat_processus).l_base_pile_systeme)
404: .origine_routine_evaluation = 'Y';
405:
406: (*s_etat_processus).mode_execution_programme = 'Y';
407: (*s_etat_processus).autorisation_empilement_programme = 'N';
408:
409: (*(*s_etat_processus).l_base_pile_systeme)
410: .niveau_courant = (*s_etat_processus)
411: .niveau_courant;
412:
413: if (presence_variable_partagee == d_faux)
414: {
415: if (evaluation(s_etat_processus, (*(*s_etat_processus)
416: .pointeur_variable_courante).objet,
417: type_evaluation) == d_erreur)
418: {
419: if ((*s_etat_processus).profilage == d_vrai)
420: {
421: profilage(s_etat_processus, NULL);
422: }
423:
424: depilement_pile_systeme(s_etat_processus);
425:
426: (*s_etat_processus).evaluation_expression_compilee =
427: registre_evaluation_expression_compilee;
428:
429: (*s_etat_processus).mode_execution_programme =
430: registre_mode_execution_programme;
431: (*s_etat_processus).instruction_courante =
432: instruction_courante;
433: return(d_erreur);
434: }
435: }
436: else
437: {
438: if (evaluation(s_etat_processus, s_copie_variable_partagee,
439: type_evaluation) == d_erreur)
440: {
441: liberation(s_etat_processus, s_copie_variable_partagee);
442:
443: if ((*s_etat_processus).profilage == d_vrai)
444: {
445: profilage(s_etat_processus, NULL);
446: }
447:
448: depilement_pile_systeme(s_etat_processus);
449:
450: (*s_etat_processus).evaluation_expression_compilee =
451: registre_evaluation_expression_compilee;
452:
453: (*s_etat_processus).mode_execution_programme =
454: registre_mode_execution_programme;
455: (*s_etat_processus).instruction_courante =
456: instruction_courante;
457: return(d_erreur);
458: }
459:
460: liberation(s_etat_processus, s_copie_variable_partagee);
461: }
462:
463: if ((*s_etat_processus).profilage == d_vrai)
464: {
465: profilage(s_etat_processus, NULL);
466: }
467:
468: depilement_pile_systeme(s_etat_processus);
469:
470: if ((*s_etat_processus).erreur_systeme != d_es)
471: {
472: return(d_erreur);
473: }
474:
475: (*s_etat_processus).evaluation_expression_compilee =
476: registre_evaluation_expression_compilee;
477: (*s_etat_processus).autorisation_empilement_programme =
478: autorisation_empilement_programme;
479: }
480: else if ((*s_etat_processus).erreur_execution != d_ex_nom_implicite)
481: {
482: if ((s_objet_tampon = copie_objet(s_etat_processus,
483: s_objet, 'Q')) == NULL)
484: {
485: (*s_etat_processus).erreur_systeme =
486: d_es_allocation_memoire;
487: (*s_etat_processus).instruction_courante =
488: instruction_courante;
489: return(d_erreur);
490: }
491:
492: (*((struct_nom *) (*s_objet_tampon).objet)).symbole = d_vrai;
493:
494: if (empilement(s_etat_processus, &((*s_etat_processus)
495: .l_base_pile), s_objet_tampon) == d_erreur)
496: {
497: (*s_etat_processus).instruction_courante =
498: instruction_courante;
499: return(d_erreur);
500: }
501: }
502: }
503: else
504: {
505: registre_type_evaluation = (test_cfsf(s_etat_processus, 35)
506: == d_vrai) ? 'E' : 'N';
507:
508: if (type_evaluation == 'N')
509: {
510: cf(s_etat_processus, 35);
511: }
512: else
513: {
514: sf(s_etat_processus, 35);
515: }
516:
517: analyse(s_etat_processus, NULL);
518: liberation(s_etat_processus, s_objet_tampon);
519:
520: if (registre_type_evaluation == 'E')
521: {
522: sf(s_etat_processus, 35);
523: }
524: else
525: {
526: cf(s_etat_processus, 35);
527: }
528:
529: if (((*s_etat_processus).erreur_systeme != d_es) ||
530: ((*s_etat_processus).erreur_execution != d_ex) ||
531: ((*s_etat_processus).exception != d_ep))
532: {
533: (*s_etat_processus).mode_execution_programme =
534: registre_mode_execution_programme;
535: (*s_etat_processus).instruction_courante = instruction_courante;
536: return(d_erreur);
537: }
538: }
539:
540: (*s_etat_processus).instruction_courante = instruction_courante;
541: (*s_etat_processus).test_instruction = registre_test;
542: (*s_etat_processus).instruction_valide = registre_instruction_valide;
543: }
544: else if (((*s_objet).type == RPN) || ((*s_objet).type == ALG))
545: {
546: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
547: l_element_egalite = NULL;
548: presence_egalite = d_faux;
549: nombre_termes = 0;
550:
551: while(l_element_courant != NULL)
552: {
553: if ((*(*l_element_courant).donnee).type == FCT)
554: {
555: if (strcmp((*((struct_fonction *) (*(*l_element_courant)
556: .donnee).objet)).nom_fonction, "=") == 0)
557: {
558: presence_egalite = d_vrai;
559: l_element_egalite = l_element_courant;
560: }
561: }
562:
563: l_element_courant = (*l_element_courant).suivant;
564: nombre_termes++;
565: }
566:
567: if (nombre_termes <= 4)
568: {
569: presence_egalite = d_faux;
570: }
571:
572: if (presence_egalite == d_vrai)
573: {
574: // S'il y a un signe '=', on modifie l'expression à évaluer en ôtant
575: // le signe '=' et en le remplaçant d'une part par SWAP DROP
576: // et d'autre part par DROP. On évalue la première puis la
577: // seconde normalement avant de reconstituer le tout à la fin
578: // de la routine.
579:
580: l_registre_pile_operationnelle = NULL;
581: registre_hauteur_pile_operationnelle = (*s_etat_processus)
582: .hauteur_pile_operationnelle;
583: l_element_courant = (*s_etat_processus).l_base_pile;
584:
585: while(l_element_courant != NULL)
586: {
587: s_sous_objet = copie_objet(s_etat_processus,
588: (*l_element_courant).donnee, 'O');
589:
590: if (s_sous_objet == NULL)
591: {
592: (*s_etat_processus).instruction_courante =
593: instruction_courante;
594: (*s_etat_processus).erreur_systeme =
595: d_es_allocation_memoire;
596: return(d_erreur);
597: }
598:
599: if (empilement(s_etat_processus,
600: &l_registre_pile_operationnelle, s_sous_objet)
601: == d_erreur)
602: {
603: (*s_etat_processus).instruction_courante =
604: instruction_courante;
605: (*s_etat_processus).erreur_systeme =
606: d_es_allocation_memoire;
607: return(d_erreur);
608: }
609:
610: l_element_courant = (*l_element_courant).suivant;
611: }
612:
613: free((*((struct_fonction *) (*(*l_element_egalite).donnee)
614: .objet)).nom_fonction);
615:
616: if (((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
617: .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
618: {
619: (*s_etat_processus).instruction_courante = instruction_courante;
620: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
621: return(d_erreur);
622: }
623:
624: (*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
625: .fonction = instruction_drop;
626: strcpy((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
627: .nom_fonction, "DROP");
628:
629: if (evaluation(s_etat_processus, s_objet, type_evaluation)
630: == d_erreur)
631: {
632: (*s_etat_processus).instruction_courante = instruction_courante;
633: return(d_erreur);
634: }
635:
636: // Récupération de l'objet au niveau 1 résultat de l'évaluation
637: // du premier membre de l'équation puis destruction de la pile.
638:
639: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
640: &s_objet_evalue) == d_erreur)
641: {
642: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
643: (*s_etat_processus).instruction_courante = instruction_courante;
644: return(d_erreur);
645: }
646:
647: instruction_clear(s_etat_processus);
648:
649: // Régénération de la pile initiale
650:
651: while(depilement(s_etat_processus, &l_registre_pile_operationnelle,
652: &s_sous_objet) != d_erreur)
653: {
654: if (empilement(s_etat_processus, &((*s_etat_processus)
655: .l_base_pile), s_sous_objet) == d_erreur)
656: {
657: (*s_etat_processus).instruction_courante =
658: instruction_courante;
659: return(d_erreur);
660: }
661: }
662:
663: (*s_etat_processus).hauteur_pile_operationnelle =
664: registre_hauteur_pile_operationnelle;
665: (*s_etat_processus).erreur_execution = d_ex;
666:
667: (*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
668: .fonction = instruction_swap;
669: strcpy((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
670: .nom_fonction, "SWAP");
671: l_element_courant = (*l_element_egalite).suivant;
672:
673: if (((*l_element_egalite).suivant =
674: malloc(sizeof(struct_liste_chainee))) == NULL)
675: {
676: liberation(s_etat_processus, s_objet_evalue);
677:
678: (*s_etat_processus).instruction_courante = instruction_courante;
679: return(d_erreur);
680: }
681:
682: l_element_egalite = (*l_element_egalite).suivant;
683: (*l_element_egalite).suivant = l_element_courant;
684:
685: if (((*l_element_egalite).donnee = allocation(s_etat_processus,
686: FCT)) == NULL)
687: {
688: liberation(s_etat_processus, s_objet_evalue);
689:
690: (*s_etat_processus).instruction_courante = instruction_courante;
691: return(d_erreur);
692: }
693:
694: (*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
695: .nombre_arguments = 0;
696: (*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
697: .fonction = instruction_drop;
698:
699: if (((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
700: .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
701: {
702: liberation(s_etat_processus, s_objet_evalue);
703:
704: (*s_etat_processus).instruction_courante = instruction_courante;
705: return(d_erreur);
706: }
707:
708: strcpy((*((struct_fonction *) (*(*l_element_egalite).donnee).objet))
709: .nom_fonction, "DROP");
710: }
711:
712: /*
713: * Exécution de la séquence d'instructions
714: */
715:
716: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
717: autorisation_empilement_programme = (*s_etat_processus)
718: .autorisation_empilement_programme;
719: (*s_etat_processus).autorisation_empilement_programme = 'N';
720:
721: niveau_initial = (*s_etat_processus).niveau_courant;
722: pile_systeme_originelle = (*s_etat_processus).l_base_pile_systeme;
723:
724: while((l_element_courant != NULL) &&
725: ((*s_etat_processus).var_volatile_requete_arret == 0)
726: && (erreur_evaluation == d_absence_erreur) &&
727: (*s_etat_processus).requete_arret == 'N')
728: {
729: (*s_etat_processus).objet_courant = (*l_element_courant).donnee;
730:
731: if ((*(*l_element_courant).donnee).type == FCT)
732: {
733: /*
734: * Tester la cohérence avec une variable pour récupérer les
735: * données selon les indices passés en argument (tableaux,
736: * listes...).
737: */
738:
739: if (recherche_variable(s_etat_processus,
740: (*((struct_fonction *)
741: (*(*l_element_courant).donnee).objet)).nom_fonction)
742: == d_faux)
743: {
744: (*s_etat_processus).erreur_systeme = d_es;
745: (*s_etat_processus).instruction_courante =
746: (*((struct_fonction *) (*(*l_element_courant)
747: .donnee).objet)).nom_fonction;
748:
749: registre_expression_courante =
750: (*s_etat_processus).expression_courante;
751: (*s_etat_processus).expression_courante = l_element_courant;
752:
753: if (((*s_etat_processus).erreur_execution == d_ex) &&
754: ((*s_etat_processus).erreur_systeme == d_es) &&
755: ((*s_etat_processus).exception == d_ep))
756: {
757: registre_evaluation_expression_compilee =
758: (*s_etat_processus)
759: .evaluation_expression_compilee;
760:
761: (*s_etat_processus).evaluation_expression_compilee
762: = 'Y';
763:
764: analyse(s_etat_processus, (*((struct_fonction *)
765: (*(*l_element_courant).donnee).objet))
766: .fonction);
767:
768: (*s_etat_processus).evaluation_expression_compilee =
769: registre_evaluation_expression_compilee;
770:
771: if (type_evaluation == 'I')
772: {
773: (*s_etat_processus).derniere_erreur_evaluation =
774: (*s_etat_processus).erreur_execution;
775: }
776: }
777:
778: if ((*s_etat_processus).erreur_systeme != d_es)
779: {
780: if (presence_egalite == d_vrai)
781: {
782: liberation(s_etat_processus, s_objet_evalue);
783: }
784:
785: if ((*s_etat_processus).var_volatile_processus_pere
786: == 0)
787: {
788: envoi_signal_processus((*s_etat_processus)
789: .pid_processus_pere, rpl_sigalrm,
790: d_faux);
791: }
792: else
793: {
794: (*s_etat_processus).var_volatile_alarme = -1;
795: }
796:
797: (*s_etat_processus).instruction_courante =
798: instruction_courante;
799: return(d_erreur);
800: }
801: else if (((*s_etat_processus).erreur_execution != d_ex) ||
802: ((*s_etat_processus).exception != d_ep))
803: {
804: if ((*s_etat_processus).arret_si_exception == d_faux)
805: {
806: /*
807: * Reprise sur erreur
808: */
809:
810: if ((message = messages(s_etat_processus)) == NULL)
811: {
812: if (presence_egalite == d_vrai)
813: {
814: liberation(s_etat_processus,
815: s_objet_evalue);
816: }
817:
818: (*s_etat_processus).instruction_courante =
819: instruction_courante;
820: return(d_erreur);
821: }
822:
823: free(message);
824:
825: drapeau_then = d_faux;
826:
827: while(drapeau_then == d_faux)
828: {
829: l_registre_atome = l_element_courant;
830: l_element_courant =
831: (*l_element_courant).suivant;
832:
833: if (l_element_courant == NULL)
834: {
835: /*
836: * La fin de l'expression est atteinte,
837: * le sequenceur reprend la main.
838: */
839:
840: if (presence_egalite == d_vrai)
841: {
842: liberation(s_etat_processus,
843: s_objet_evalue);
844: }
845:
846: (*s_etat_processus)
847: .mode_execution_programme =
848: registre_mode_execution_programme;
849: return(d_absence_erreur);
850: }
851:
852: if ((*(*l_element_courant).donnee).type == FCT)
853: {
854: (*s_etat_processus).instruction_courante =
855: (*((struct_fonction *)
856: (*(*l_element_courant).donnee)
857: .objet)).nom_fonction;
858:
859: if (recherche_variable(s_etat_processus,
860: (*s_etat_processus)
861: .instruction_courante) == d_faux)
862: {
863: (*s_etat_processus).erreur_systeme
864: = d_es;
865: fonction = (*((struct_fonction *)
866: (*(*l_element_courant).donnee)
867: .objet)).fonction;
868:
869: /*
870: * Traitement de la pile système par les
871: * différentes instructions.
872: */
873:
874: if (TEST(instruction_if) ||
875: TEST(instruction_iferr) ||
876: TEST(instruction_do) ||
877: TEST(instruction_while) ||
878: TEST(instruction_for) ||
879: TEST(instruction_forall) ||
880: TEST(instruction_start) ||
881: TEST(instruction_select) ||
882: TEST(instruction_case) ||
883: TEST(instruction_critical) ||
884: TEST(vers_niveau_superieur))
885: {
886: if (TEST(vers_niveau_superieur))
887: {
888: registre_exception =
889: (*s_etat_processus)
890: .exception;
891: registre_erreur_execution =
892: (*s_etat_processus)
893: .erreur_execution;
894:
895: analyse(s_etat_processus,
896: vers_niveau_superieur);
897:
898: if ((*s_etat_processus)
899: .erreur_systeme != d_es)
900: {
901: if (presence_egalite ==
902: d_vrai)
903: {
904: liberation(
905: s_etat_processus,
906: s_objet_evalue);
907: }
908:
909: (*s_etat_processus)
910: .instruction_courante =
911: instruction_courante;
912: return(d_erreur);
913: }
914:
915: (*s_etat_processus).exception
916: = registre_exception;
917: (*s_etat_processus)
918: .erreur_execution =
919: registre_erreur_execution;
920: }
921: else if (TEST(instruction_for) ||
922: TEST(instruction_forall) ||
923: TEST(instruction_start))
924: {
925: empilement_pile_systeme(
926: s_etat_processus);
927:
928: if ((*s_etat_processus)
929: .erreur_systeme != d_es)
930: {
931: if (presence_egalite ==
932: d_vrai)
933: {
934: liberation(
935: s_etat_processus,
936: s_objet_evalue);
937: }
938:
939: (*s_etat_processus)
940: .instruction_courante =
941: instruction_courante;
942: return(d_erreur);
943: }
944:
945: (*(*s_etat_processus)
946: .l_base_pile_systeme)
947: .type_cloture = 'L';
948: }
949: else
950: {
951: empilement_pile_systeme(
952: s_etat_processus);
953:
954: if ((*s_etat_processus)
955: .erreur_systeme != d_es)
956: {
957: if (presence_egalite ==
958: d_vrai)
959: {
960: liberation(
961: s_etat_processus,
962: s_objet_evalue);
963: }
964:
965: (*s_etat_processus)
966: .instruction_courante =
967: instruction_courante;
968: return(d_erreur);
969: }
970: }
971: }
972: else if (TEST(instruction_end) ||
973: TEST(instruction_next) ||
974: TEST(instruction_step) ||
975: TEST(vers_niveau_inferieur))
976: {
977: if (TEST(vers_niveau_inferieur))
978: {
979: registre_exception =
980: (*s_etat_processus)
981: .exception;
982: registre_erreur_execution =
983: (*s_etat_processus)
984: .erreur_execution;
985:
986: analyse(s_etat_processus,
987: vers_niveau_inferieur);
988:
989: if ((*s_etat_processus)
990: .erreur_systeme != d_es)
991: {
992: if (presence_egalite ==
993: d_vrai)
994: {
995: liberation(
996: s_etat_processus,
997: s_objet_evalue);
998: }
999:
1000: (*s_etat_processus)
1001: .instruction_courante =
1002: instruction_courante;
1003: return(d_erreur);
1004: }
1005:
1006: (*s_etat_processus).exception
1007: = registre_exception;
1008: (*s_etat_processus)
1009: .erreur_execution =
1010: registre_erreur_execution;
1011: }
1012: else if ((TEST(instruction_next) ||
1013: TEST(instruction_step)) &&
1014: ((*(*s_etat_processus)
1015: .l_base_pile_systeme)
1016: .type_cloture != 'L'))
1017: {
1018: /*
1019: * Libération des compteurs
1020: * de boucle
1021: */
1022:
1023: presence_compteur =
1024: (((*(*s_etat_processus)
1025: .l_base_pile_systeme)
1026: .type_cloture == 'F') ||
1027: ((*(*s_etat_processus)
1028: .l_base_pile_systeme)
1029: .type_cloture == 'A'))
1030: ? d_vrai : d_faux;
1031:
1032: if (((*(*s_etat_processus)
1033: .l_base_pile_systeme)
1034: .type_cloture != 'S') &&
1035: (presence_compteur ==
1036: d_faux))
1037: {
1038: (*s_etat_processus)
1039: .erreur_execution =
1040: d_ex_erreur_traitement_boucle;
1041:
1042: if (presence_egalite ==
1043: d_vrai)
1044: {
1045: liberation(
1046: s_etat_processus,
1047: s_objet_evalue);
1048: }
1049:
1050: (*s_etat_processus)
1051: .instruction_courante =
1052: instruction_courante;
1053: return(d_erreur);
1054: }
1055:
1056: if (presence_compteur == d_vrai)
1057: {
1058: if (recherche_variable(
1059: s_etat_processus,
1060: (*(*s_etat_processus)
1061: .l_base_pile_systeme)
1062: .nom_variable) ==
1063: d_faux)
1064: {
1065: (*s_etat_processus)
1066: .erreur_systeme = d_es;
1067: (*s_etat_processus)
1068: .erreur_execution =
1069: d_ex_erreur_traitement_boucle;
1070:
1071: if (presence_egalite ==
1072: d_vrai)
1073: {
1074: liberation(
1075: s_etat_processus,
1076: s_objet_evalue);
1077: }
1078:
1079: (*s_etat_processus)
1080: .instruction_courante =
1081: instruction_courante;
1082: return(d_erreur);
1083: }
1084:
1085: if ((*(*s_etat_processus)
1086: .pointeur_variable_courante)
1087: .objet == NULL)
1088: {
1089: (*s_etat_processus)
1090: .erreur_systeme = d_es;
1091: (*s_etat_processus)
1092: .erreur_execution =
1093: d_ex_variable_partagee;
1094:
1095: if (presence_egalite ==
1096: d_vrai)
1097: {
1098: liberation(
1099: s_etat_processus,
1100: s_objet_evalue);
1101: }
1102:
1103: (*s_etat_processus)
1104: .instruction_courante =
1105: instruction_courante;
1106: return(d_erreur);
1107: }
1108:
1109: (*s_etat_processus)
1110: .niveau_courant--;
1111:
1112: if (
1113: retrait_variables_par_niveau(
1114: s_etat_processus) == d_erreur)
1115: {
1116: if (presence_egalite ==
1117: d_vrai)
1118: {
1119: liberation(
1120: s_etat_processus,
1121: s_objet_evalue);
1122: }
1123:
1124: (*s_etat_processus)
1125: .instruction_courante =
1126: instruction_courante;
1127: return(d_erreur);
1128: }
1129: }
1130:
1131: depilement_pile_systeme(
1132: s_etat_processus);
1133: }
1134: else
1135: {
1136: // Traitement spécifique pour
1137: // la fin d'une section
1138: // critique
1139:
1140: if ((*s_etat_processus)
1141: .l_base_pile_systeme
1142: == NULL)
1143: {
1144: (*s_etat_processus)
1145: .erreur_systeme =
1146: d_es_end_incoherent;
1147:
1148: if (presence_egalite ==
1149: d_vrai)
1150: {
1151: liberation(
1152: s_etat_processus,
1153: s_objet_evalue);
1154: }
1155:
1156: (*s_etat_processus)
1157: .instruction_courante =
1158: instruction_courante;
1159: return(d_erreur);
1160: }
1161:
1162: if ((*(*s_etat_processus)
1163: .l_base_pile_systeme)
1164: .type_cloture == 'Q')
1165: {
1166: if (pthread_mutex_unlock(
1167: &mutex_sections_critiques)
1168: != 0)
1169: {
1170: (*s_etat_processus)
1171: .erreur_systeme =
1172: d_es_processus;
1173:
1174: liberation(
1175: s_etat_processus,
1176: s_objet_evalue);
1177:
1178: (*s_etat_processus)
1179: .instruction_courante =
1180: instruction_courante;
1181: return(d_erreur);
1182: }
1183:
1184: (*s_etat_processus)
1185: .sections_critiques--;
1186: }
1187:
1188: depilement_pile_systeme(
1189: s_etat_processus);
1190:
1191: if ((*s_etat_processus)
1192: .erreur_systeme != d_es)
1193: {
1194: if (presence_egalite ==
1195: d_vrai)
1196: {
1197: liberation(
1198: s_etat_processus,
1199: s_objet_evalue);
1200: }
1201:
1202: (*s_etat_processus)
1203: .instruction_courante =
1204: instruction_courante;
1205: return(d_erreur);
1206: }
1207: }
1208: }
1209: else if (TEST(instruction_then))
1210: {
1211: if ((*(*s_etat_processus)
1212: .l_base_pile_systeme)
1213: .clause == 'R')
1214: {
1215: (*(*s_etat_processus)
1216: .l_base_pile_systeme)
1217: .clause = 'X';
1218: instruction_then(
1219: s_etat_processus);
1220: drapeau_then = d_vrai;
1221: }
1222: }
1223: }
1224: }
1225: }
1226:
1227: (*s_etat_processus).expression_courante =
1228: l_element_courant;
1229: (*s_etat_processus).instruction_courante =
1230: instruction_courante;
1231:
1232: (*s_etat_processus).exception = d_ep;
1233: (*s_etat_processus).erreur_execution = d_ex;
1234: }
1235: else if ((*s_etat_processus).mode_evaluation_expression
1236: == 'Y')
1237: {
1238: /*
1239: * Reprise sur erreur
1240: */
1241:
1242: while(l_element_courant != NULL)
1243: {
1244: if ((*(*l_element_courant).donnee).type == FCT)
1245: {
1246: (*s_etat_processus).instruction_courante =
1247: (*((struct_fonction *)
1248: (*(*l_element_courant).donnee)
1249: .objet)).nom_fonction;
1250: fonction = (*((struct_fonction *)
1251: (*(*l_element_courant).donnee)
1252: .objet)).fonction;
1253:
1254: if (recherche_variable(s_etat_processus,
1255: (*s_etat_processus)
1256: .instruction_courante) == d_faux)
1257: {
1258: (*s_etat_processus).erreur_systeme
1259: = d_es;
1260:
1261: /*
1262: * Traitement de la pile système par les
1263: * différentes instructions.
1264: */
1265:
1266: if (TEST(instruction_if) ||
1267: TEST(instruction_iferr) ||
1268: TEST(instruction_do) ||
1269: TEST(instruction_while) ||
1270: TEST(instruction_for) ||
1271: TEST(instruction_forall) ||
1272: TEST(instruction_start) ||
1273: TEST(instruction_select) ||
1274: TEST(instruction_case) ||
1275: TEST(instruction_critical) ||
1276: TEST(vers_niveau_superieur))
1277: {
1278: if (TEST(vers_niveau_superieur))
1279: {
1280: analyse(s_etat_processus,
1281: vers_niveau_superieur);
1282:
1283: if ((*s_etat_processus)
1284: .erreur_systeme != d_es)
1285: {
1286: if (presence_egalite ==
1287: d_vrai)
1288: {
1289: liberation(
1290: s_etat_processus,
1291: s_objet_evalue);
1292: }
1293:
1294: (*s_etat_processus)
1295: .instruction_courante =
1296: instruction_courante;
1297: return(d_erreur);
1298: }
1299: }
1300: else if (TEST(instruction_for) ||
1301: TEST(instruction_forall) ||
1302: TEST(instruction_start))
1303: {
1304: empilement_pile_systeme(
1305: s_etat_processus);
1306:
1307: if ((*s_etat_processus)
1308: .erreur_systeme != d_es)
1309: {
1310: if (presence_egalite ==
1311: d_vrai)
1312: {
1313: liberation(
1314: s_etat_processus,
1315: s_objet_evalue);
1316: }
1317:
1318: (*s_etat_processus)
1319: .instruction_courante =
1320: instruction_courante;
1321: return(d_erreur);
1322: }
1323:
1324: (*(*s_etat_processus)
1325: .l_base_pile_systeme)
1326: .type_cloture = 'L';
1327: }
1328: else
1329: {
1330: empilement_pile_systeme(
1331: s_etat_processus);
1332:
1333: if ((*s_etat_processus)
1334: .erreur_systeme != d_es)
1335: {
1336: if (presence_egalite ==
1337: d_vrai)
1338: {
1339: liberation(
1340: s_etat_processus,
1341: s_objet_evalue);
1342: }
1343:
1344: (*s_etat_processus)
1345: .instruction_courante =
1346: instruction_courante;
1347: return(d_erreur);
1348: }
1349: }
1350: }
1351: else if (TEST(instruction_end) ||
1352: TEST(instruction_next) ||
1353: TEST(instruction_step) ||
1354: TEST(vers_niveau_inferieur))
1355: {
1356: if (TEST(vers_niveau_inferieur))
1357: {
1358: analyse(s_etat_processus,
1359: vers_niveau_inferieur);
1360:
1361: if ((*s_etat_processus)
1362: .erreur_systeme != d_es)
1363: {
1364: if (presence_egalite ==
1365: d_vrai)
1366: {
1367: liberation(
1368: s_etat_processus,
1369: s_objet_evalue);
1370: }
1371:
1372: (*s_etat_processus)
1373: .instruction_courante =
1374: instruction_courante;
1375: return(d_erreur);
1376: }
1377: }
1378: else if ((TEST(instruction_next) ||
1379: TEST(instruction_step)) &&
1380: ((*(*s_etat_processus)
1381: .l_base_pile_systeme)
1382: .type_cloture != 'L'))
1383: {
1384: /*
1385: * Libération des compteurs
1386: * de boucle
1387: */
1388:
1389: presence_compteur =
1390: (((*(*s_etat_processus)
1391: .l_base_pile_systeme)
1392: .type_cloture == 'F') ||
1393: ((*(*s_etat_processus)
1394: .l_base_pile_systeme)
1395: .type_cloture == 'A'))
1396: ? d_vrai : d_faux;
1397:
1398: if (((*(*s_etat_processus)
1399: .l_base_pile_systeme)
1400: .type_cloture != 'S') &&
1401: (presence_compteur ==
1402: d_faux))
1403: {
1404: (*s_etat_processus)
1405: .erreur_execution =
1406: d_ex_erreur_traitement_boucle;
1407:
1408: if (presence_egalite ==
1409: d_vrai)
1410: {
1411: liberation(
1412: s_etat_processus,
1413: s_objet_evalue);
1414: }
1415:
1416: (*s_etat_processus)
1417: .instruction_courante =
1418: instruction_courante;
1419: return(d_erreur);
1420: }
1421:
1422: if (presence_compteur == d_vrai)
1423: {
1424: if (recherche_variable(
1425: s_etat_processus,
1426: (*(*s_etat_processus)
1427: .l_base_pile_systeme)
1428: .nom_variable) ==
1429: d_faux)
1430: {
1431: (*s_etat_processus)
1432: .erreur_systeme = d_es;
1433: (*s_etat_processus)
1434: .erreur_execution =
1435: d_ex_erreur_traitement_boucle;
1436:
1437: if (presence_egalite ==
1438: d_vrai)
1439: {
1440: liberation(
1441: s_etat_processus,
1442: s_objet_evalue);
1443: }
1444:
1445: (*s_etat_processus)
1446: .instruction_courante =
1447: instruction_courante;
1448: return(d_erreur);
1449: }
1450:
1451: if ((*(*s_etat_processus)
1452: .pointeur_variable_courante)
1453: .objet == NULL)
1454: {
1455: (*s_etat_processus)
1456: .erreur_systeme = d_es;
1457: (*s_etat_processus)
1458: .erreur_execution =
1459: d_ex_variable_partagee;
1460:
1461: if (presence_egalite ==
1462: d_vrai)
1463: {
1464: liberation(
1465: s_etat_processus,
1466: s_objet_evalue);
1467: }
1468:
1469: (*s_etat_processus)
1470: .instruction_courante =
1471: instruction_courante;
1472: return(d_erreur);
1473: }
1474:
1475: (*s_etat_processus)
1476: .niveau_courant--;
1477:
1478: if (
1479: retrait_variables_par_niveau(
1480: s_etat_processus) == d_erreur)
1481: {
1482: if (presence_egalite ==
1483: d_vrai)
1484: {
1485: liberation(
1486: s_etat_processus,
1487: s_objet_evalue);
1488: }
1489:
1490: (*s_etat_processus)
1491: .instruction_courante =
1492: instruction_courante;
1493: return(d_erreur);
1494: }
1495: }
1496:
1497: depilement_pile_systeme(
1498: s_etat_processus);
1499: }
1500: else
1501: {
1502: // Traitement spécifique pour
1503: // la fin d'une section
1504: // critique
1505:
1506: if ((*s_etat_processus)
1507: .l_base_pile_systeme
1508: == NULL)
1509: {
1510: (*s_etat_processus)
1511: .erreur_systeme =
1512: d_es_end_incoherent;
1513:
1514: if (presence_egalite ==
1515: d_vrai)
1516: {
1517: liberation(
1518: s_etat_processus,
1519: s_objet_evalue);
1520: }
1521:
1522: (*s_etat_processus)
1523: .instruction_courante =
1524: instruction_courante;
1525: return(d_erreur);
1526: }
1527:
1528: if ((*(*s_etat_processus)
1529: .l_base_pile_systeme)
1530: .type_cloture == 'Q')
1531: {
1532: if (pthread_mutex_unlock(
1533: &mutex_sections_critiques)
1534: != 0)
1535: {
1536: (*s_etat_processus)
1537: .erreur_systeme =
1538: d_es_processus;
1539:
1540: if (presence_egalite ==
1541: d_vrai)
1542: {
1543: liberation(
1544: s_etat_processus,
1545: s_objet_evalue);
1546: }
1547:
1548: (*s_etat_processus)
1549: .instruction_courante =
1550: instruction_courante;
1551: return(d_erreur);
1552: }
1553:
1554: (*s_etat_processus)
1555: .sections_critiques--;
1556: }
1557:
1558: depilement_pile_systeme(
1559: s_etat_processus);
1560: }
1561:
1562: if ((*s_etat_processus)
1563: .erreur_systeme != d_es)
1564: {
1565: if (presence_egalite ==
1566: d_vrai)
1567: {
1568: liberation(
1569: s_etat_processus,
1570: s_objet_evalue);
1571: }
1572:
1573: (*s_etat_processus)
1574: .instruction_courante =
1575: instruction_courante;
1576: return(d_erreur);
1577: }
1578: }
1579: }
1580: }
1581:
1582: l_element_courant =
1583: (*l_element_courant).suivant;
1584: }
1585:
1586: (*s_etat_processus).mode_execution_programme =
1587: registre_mode_execution_programme;
1588: (*s_etat_processus).instruction_courante =
1589: instruction_courante;
1590:
1591: (*s_etat_processus).exception = d_ep;
1592: (*s_etat_processus).erreur_execution = d_ex;
1593:
1594: erreur_evaluation = d_erreur;
1595:
1596: (*s_etat_processus).expression_courante =
1597: registre_expression_courante;
1598: }
1599: else
1600: {
1601: // On ne détruit pas les variables pour les inclure
1602: // dans le fichier rpl-core.
1603:
1604: (*s_etat_processus).gel_liste_variables = d_vrai;
1605:
1606: registre_erreur_execution =
1607: (*s_etat_processus).erreur_execution;
1608: registre_exception =
1609: (*s_etat_processus).exception;
1610: registre_erreur_systeme =
1611: (*s_etat_processus).erreur_systeme;
1612:
1613: (*s_etat_processus).s_objet_errone = s_objet;
1614: (*s_etat_processus).s_objet_erreur =
1615: (*l_element_courant).donnee;
1616:
1617: l_element_courant = (*l_element_courant).suivant;
1618:
1619: while(l_element_courant != NULL)
1620: {
1621: if ((*(*l_element_courant).donnee).type == FCT)
1622: {
1623: (*s_etat_processus).instruction_courante =
1624: (*((struct_fonction *)
1625: (*(*l_element_courant).donnee)
1626: .objet)).nom_fonction;
1627: fonction = (*((struct_fonction *)
1628: (*(*l_element_courant).donnee)
1629: .objet)).fonction;
1630:
1631: if (recherche_variable(s_etat_processus,
1632: (*s_etat_processus)
1633: .instruction_courante) == d_faux)
1634: {
1635: (*s_etat_processus).erreur_systeme
1636: = d_es;
1637:
1638: /*
1639: * Traitement de la pile système par les
1640: * différentes instructions.
1641: */
1642:
1643: if (TEST(instruction_if) ||
1644: TEST(instruction_iferr) ||
1645: TEST(instruction_do) ||
1646: TEST(instruction_while) ||
1647: TEST(instruction_for) ||
1648: TEST(instruction_forall) ||
1649: TEST(instruction_start) ||
1650: TEST(instruction_select) ||
1651: TEST(instruction_case) ||
1652: TEST(instruction_critical) ||
1653: TEST(vers_niveau_superieur))
1654: {
1655: if (TEST(vers_niveau_superieur))
1656: {
1657: analyse(s_etat_processus,
1658: vers_niveau_superieur);
1659:
1660: if ((*s_etat_processus)
1661: .erreur_systeme != d_es)
1662: {
1663: if (presence_egalite ==
1664: d_vrai)
1665: {
1666: liberation(
1667: s_etat_processus,
1668: s_objet_evalue);
1669: }
1670:
1671: (*s_etat_processus)
1672: .instruction_courante =
1673: instruction_courante;
1674: return(d_erreur);
1675: }
1676: }
1677: else if (TEST(instruction_for) ||
1678: TEST(instruction_forall) ||
1679: TEST(instruction_start))
1680: {
1681: empilement_pile_systeme(
1682: s_etat_processus);
1683:
1684: if ((*s_etat_processus)
1685: .erreur_systeme != d_es)
1686: {
1687: if (presence_egalite ==
1688: d_vrai)
1689: {
1690: liberation(
1691: s_etat_processus,
1692: s_objet_evalue);
1693: }
1694:
1695: (*s_etat_processus)
1696: .instruction_courante =
1697: instruction_courante;
1698: return(d_erreur);
1699: }
1700:
1701: (*(*s_etat_processus)
1702: .l_base_pile_systeme)
1703: .type_cloture = 'L';
1704: }
1705: else
1706: {
1707: empilement_pile_systeme(
1708: s_etat_processus);
1709:
1710: if ((*s_etat_processus)
1711: .erreur_systeme != d_es)
1712: {
1713: if (presence_egalite ==
1714: d_vrai)
1715: {
1716: liberation(
1717: s_etat_processus,
1718: s_objet_evalue);
1719: }
1720:
1721: (*s_etat_processus)
1722: .instruction_courante =
1723: instruction_courante;
1724: return(d_erreur);
1725: }
1726: }
1727: }
1728: else if (TEST(instruction_end) ||
1729: TEST(instruction_next) ||
1730: TEST(instruction_step) ||
1731: TEST(vers_niveau_inferieur))
1732: {
1733: if (TEST(vers_niveau_inferieur))
1734: {
1735: analyse(s_etat_processus,
1736: vers_niveau_inferieur);
1737:
1738: if ((*s_etat_processus)
1739: .erreur_systeme != d_es)
1740: {
1741: if (presence_egalite ==
1742: d_vrai)
1743: {
1744: liberation(
1745: s_etat_processus,
1746: s_objet_evalue);
1747: }
1748:
1749: (*s_etat_processus)
1750: .instruction_courante =
1751: instruction_courante;
1752: return(d_erreur);
1753: }
1754:
1755: if ((*(*s_etat_processus)
1756: .l_base_pile_systeme)
1757: .retour_definition
1758: == 'Y')
1759: {
1760: break;
1761: }
1762: }
1763: else if ((TEST(instruction_next) ||
1764: TEST(instruction_step)) &&
1765: ((*(*s_etat_processus)
1766: .l_base_pile_systeme)
1767: .type_cloture != 'L'))
1768: {
1769: /*
1770: * Libération des compteurs
1771: * de boucle
1772: */
1773:
1774: presence_compteur =
1775: (((*(*s_etat_processus)
1776: .l_base_pile_systeme)
1777: .type_cloture == 'F') ||
1778: ((*(*s_etat_processus)
1779: .l_base_pile_systeme)
1780: .type_cloture == 'A'))
1781: ? d_vrai : d_faux;
1782:
1783: if (((*(*s_etat_processus)
1784: .l_base_pile_systeme)
1785: .type_cloture != 'S') &&
1786: (presence_compteur ==
1787: d_faux))
1788: {
1789: (*s_etat_processus)
1790: .erreur_execution =
1791: d_ex_erreur_traitement_boucle;
1792:
1793: if (presence_egalite ==
1794: d_vrai)
1795: {
1796: liberation(
1797: s_etat_processus,
1798: s_objet_evalue);
1799: }
1800:
1801: (*s_etat_processus)
1802: .instruction_courante =
1803: instruction_courante;
1804: return(d_erreur);
1805: }
1806:
1807: if (presence_compteur == d_vrai)
1808: {
1809: if (recherche_variable(
1810: s_etat_processus,
1811: (*(*s_etat_processus)
1812: .l_base_pile_systeme)
1813: .nom_variable) ==
1814: d_faux)
1815: {
1816: (*s_etat_processus)
1817: .erreur_systeme = d_es;
1818: (*s_etat_processus)
1819: .erreur_execution =
1820: d_ex_erreur_traitement_boucle;
1821:
1822: if (presence_egalite ==
1823: d_vrai)
1824: {
1825: liberation(
1826: s_etat_processus,
1827: s_objet_evalue);
1828: }
1829:
1830: (*s_etat_processus)
1831: .instruction_courante =
1832: instruction_courante;
1833: return(d_erreur);
1834: }
1835:
1836: if ((*(*s_etat_processus)
1837: .pointeur_variable_courante)
1838: .objet == NULL)
1839: {
1840: (*s_etat_processus)
1841: .erreur_systeme = d_es;
1842: (*s_etat_processus)
1843: .erreur_execution =
1844: d_ex_variable_partagee;
1845:
1846: if (presence_egalite ==
1847: d_vrai)
1848: {
1849: liberation(
1850: s_etat_processus,
1851: s_objet_evalue);
1852: }
1853:
1854: (*s_etat_processus)
1855: .instruction_courante =
1856: instruction_courante;
1857: return(d_erreur);
1858: }
1859:
1860: (*s_etat_processus)
1861: .niveau_courant--;
1862:
1863: if (
1864: retrait_variables_par_niveau(
1865: s_etat_processus) == d_erreur)
1866: {
1867: if (presence_egalite ==
1868: d_vrai)
1869: {
1870: liberation(
1871: s_etat_processus,
1872: s_objet_evalue);
1873: }
1874:
1875: (*s_etat_processus)
1876: .instruction_courante =
1877: instruction_courante;
1878: return(d_erreur);
1879: }
1880: }
1881:
1882: depilement_pile_systeme(
1883: s_etat_processus);
1884: }
1885: else
1886: {
1887: // Traitement spécifique pour
1888: // la fin d'une section critique
1889:
1890: if ((*s_etat_processus)
1891: .l_base_pile_systeme
1892: == NULL)
1893: {
1894: (*s_etat_processus)
1895: .erreur_systeme =
1896: d_es_end_incoherent;
1897:
1898: if (presence_egalite ==
1899: d_vrai)
1900: {
1901: liberation(
1902: s_etat_processus,
1903: s_objet_evalue);
1904: }
1905:
1906: (*s_etat_processus)
1907: .instruction_courante =
1908: instruction_courante;
1909: return(d_erreur);
1910: }
1911:
1912: if ((*(*s_etat_processus)
1913: .l_base_pile_systeme)
1914: .type_cloture == 'Q')
1915: {
1916: if (pthread_mutex_unlock(
1917: &mutex_sections_critiques)
1918: != 0)
1919: {
1920: (*s_etat_processus)
1921: .erreur_systeme =
1922: d_es_processus;
1923:
1924: if (presence_egalite ==
1925: d_vrai)
1926: {
1927: liberation(
1928: s_etat_processus,
1929: s_objet_evalue);
1930: }
1931:
1932: (*s_etat_processus)
1933: .instruction_courante =
1934: instruction_courante;
1935: return(d_erreur);
1936: }
1937:
1938: (*s_etat_processus)
1939: .sections_critiques--;
1940: }
1941:
1942: depilement_pile_systeme(
1943: s_etat_processus);
1944:
1945: if ((*s_etat_processus)
1946: .erreur_systeme != d_es)
1947: {
1948: if (presence_egalite ==
1949: d_vrai)
1950: {
1951: liberation(
1952: s_etat_processus,
1953: s_objet_evalue);
1954: }
1955:
1956: (*s_etat_processus)
1957: .instruction_courante =
1958: instruction_courante;
1959: return(d_erreur);
1960: }
1961: }
1962: }
1963: }
1964: }
1965:
1966: l_element_courant =
1967: (*l_element_courant).suivant;
1968: }
1969:
1970: (*s_etat_processus).mode_execution_programme =
1971: registre_mode_execution_programme;
1972: (*s_etat_processus).instruction_courante =
1973: instruction_courante;
1974:
1975: if (presence_egalite == d_vrai)
1976: {
1977: liberation(s_etat_processus, s_objet_evalue);
1978: }
1979:
1980: if ((*s_etat_processus)
1981: .var_volatile_processus_pere == 0)
1982: {
1983: envoi_signal_processus((*s_etat_processus)
1984: .pid_processus_pere, rpl_sigalrm,
1985: d_faux);
1986: }
1987: else
1988: {
1989: (*s_etat_processus).var_volatile_alarme = -1;
1990: }
1991:
1992: (*s_etat_processus).erreur_execution =
1993: registre_erreur_execution;
1994: (*s_etat_processus).erreur_systeme =
1995: registre_erreur_systeme;
1996: (*s_etat_processus).exception =
1997: registre_exception;
1998: return(d_erreur);
1999: }
2000: }
2001:
2002: if ((*s_etat_processus).instruction_valide == 'Y')
2003: {
2004: l_element_courant = (*s_etat_processus)
2005: .expression_courante;
2006: }
2007: else
2008: {
2009: /*
2010: * Régénération de la fonction en notation algébrique
2011: */
2012:
2013: if ((s_objet_elementaire = (struct_objet *)
2014: allocation(s_etat_processus, ALG)) == NULL)
2015: {
2016: if (presence_egalite == d_vrai)
2017: {
2018: liberation(s_etat_processus, s_objet_evalue);
2019: }
2020:
2021: (*s_etat_processus).erreur_systeme =
2022: d_es_allocation_memoire;
2023: (*s_etat_processus).instruction_courante =
2024: instruction_courante;
2025: return(d_erreur);
2026: }
2027:
2028: /*
2029: * Ouverture de l'expression
2030: */
2031:
2032: if (((*s_objet_elementaire).objet =
2033: (struct_liste_chainee *)
2034: malloc(sizeof(struct_liste_chainee))) == NULL)
2035: {
2036: if (presence_egalite == d_vrai)
2037: {
2038: liberation(s_etat_processus, s_objet_evalue);
2039: }
2040:
2041: (*s_etat_processus).erreur_systeme =
2042: d_es_allocation_memoire;
2043: (*s_etat_processus).instruction_courante =
2044: instruction_courante;
2045: return(d_erreur);
2046: }
2047:
2048: l_element_fonction = (*s_objet_elementaire).objet;
2049:
2050: if (((*l_element_fonction).donnee = (struct_objet *)
2051: allocation(s_etat_processus, FCT)) == NULL)
2052: {
2053: if (presence_egalite == d_vrai)
2054: {
2055: liberation(s_etat_processus, s_objet_evalue);
2056: }
2057:
2058: (*s_etat_processus).erreur_systeme =
2059: d_es_allocation_memoire;
2060: (*s_etat_processus).instruction_courante =
2061: instruction_courante;
2062: return(d_erreur);
2063: }
2064:
2065: (*((struct_fonction *) (*(*l_element_fonction).donnee)
2066: .objet)).nombre_arguments = 0;
2067: (*((struct_fonction *) (*(*l_element_fonction).donnee)
2068: .objet)).fonction =
2069: instruction_vers_niveau_superieur;
2070:
2071: if (((*((struct_fonction *) (*(*l_element_fonction)
2072: .donnee).objet)).nom_fonction =
2073: (unsigned char *) malloc(3 * sizeof(
2074: unsigned char))) == NULL)
2075: {
2076: if (presence_egalite == d_vrai)
2077: {
2078: liberation(s_etat_processus, s_objet_evalue);
2079: }
2080:
2081: (*s_etat_processus).erreur_systeme =
2082: d_es_allocation_memoire;
2083: (*s_etat_processus).instruction_courante =
2084: instruction_courante;
2085: return(d_erreur);
2086: }
2087:
2088: strcpy((*((struct_fonction *) (*(*l_element_fonction)
2089: .donnee).objet)).nom_fonction, "<<");
2090:
2091: /*
2092: * Ajout des arguments
2093: */
2094:
2095: for(k = (*((struct_fonction *)
2096: (*(*l_element_courant).donnee).objet))
2097: .nombre_arguments; k >= 1; k--)
2098: {
2099: if (((*l_element_fonction).suivant =
2100: (struct_liste_chainee *) malloc(sizeof(
2101: struct_liste_chainee))) == NULL)
2102: {
2103: if (presence_egalite == d_vrai)
2104: {
2105: liberation(s_etat_processus,
2106: s_objet_evalue);
2107: }
2108:
2109: (*s_etat_processus).erreur_systeme =
2110: d_es_allocation_memoire;
2111: (*s_etat_processus).instruction_courante =
2112: instruction_courante;
2113: return(d_erreur);
2114: }
2115:
2116: l_element_fonction = (*l_element_fonction).suivant;
2117:
2118: if (k > 1)
2119: {
2120: l_liste1 = (*s_etat_processus).l_base_pile;
2121:
2122: for(l = 2; l < k; l++)
2123: {
2124: l_liste1 = (*l_liste1).suivant;
2125: }
2126:
2127: l_liste2 = (*l_liste1).suivant;
2128: (*l_liste1).suivant = (*l_liste2).suivant;
2129: (*l_liste2).suivant = (*s_etat_processus)
2130: .l_base_pile;
2131: (*s_etat_processus).l_base_pile = l_liste2;
2132: }
2133:
2134: if (depilement(s_etat_processus,
2135: &((*s_etat_processus).l_base_pile),
2136: &s_sous_objet) == d_erreur)
2137: {
2138: if (presence_egalite == d_vrai)
2139: {
2140: liberation(s_etat_processus,
2141: s_objet_evalue);
2142: }
2143:
2144: (*s_etat_processus).erreur_execution =
2145: d_ex_manque_argument;
2146: (*s_etat_processus).instruction_courante =
2147: instruction_courante;
2148: (*s_etat_processus).mode_execution_programme =
2149: registre_mode_execution_programme;
2150: return(d_erreur);
2151: }
2152:
2153: (*l_element_fonction).donnee = s_sous_objet;
2154: }
2155:
2156: /*
2157: * Ajout de la fonction
2158: */
2159:
2160: if (((*l_element_fonction).suivant =
2161: (struct_liste_chainee *) malloc(sizeof(
2162: struct_liste_chainee))) == NULL)
2163: {
2164: if (presence_egalite == d_vrai)
2165: {
2166: liberation(s_etat_processus, s_objet_evalue);
2167: }
2168:
2169: (*s_etat_processus).erreur_systeme =
2170: d_es_allocation_memoire;
2171: (*s_etat_processus).instruction_courante =
2172: instruction_courante;
2173: return(d_erreur);
2174: }
2175:
2176: l_element_fonction = (*l_element_fonction).suivant;
2177:
2178: if (((*l_element_fonction).donnee =
2179: copie_objet(s_etat_processus,
2180: (*l_element_courant).donnee, 'P'))
2181: == NULL)
2182: {
2183: if (presence_egalite == d_vrai)
2184: {
2185: liberation(s_etat_processus, s_objet_evalue);
2186: }
2187:
2188: (*s_etat_processus).erreur_systeme =
2189: d_es_allocation_memoire;
2190: (*s_etat_processus).instruction_courante =
2191: instruction_courante;
2192: return(d_erreur);
2193: }
2194:
2195: /*
2196: * Clôture de l'expression
2197: */
2198:
2199: if (((*l_element_fonction).suivant =
2200: (struct_liste_chainee *) malloc(sizeof(
2201: struct_liste_chainee))) == NULL)
2202: {
2203: if (presence_egalite == d_vrai)
2204: {
2205: liberation(s_etat_processus, s_objet_evalue);
2206: }
2207:
2208: (*s_etat_processus).erreur_systeme =
2209: d_es_allocation_memoire;
2210: (*s_etat_processus).instruction_courante =
2211: instruction_courante;
2212: return(d_erreur);
2213: }
2214:
2215: l_element_fonction = (*l_element_fonction).suivant;
2216:
2217: if (((*l_element_fonction).donnee =
2218: allocation(s_etat_processus, FCT)) == NULL)
2219: {
2220: if (presence_egalite == d_vrai)
2221: {
2222: liberation(s_etat_processus, s_objet_evalue);
2223: }
2224:
2225: (*s_etat_processus).erreur_systeme =
2226: d_es_allocation_memoire;
2227: (*s_etat_processus).instruction_courante =
2228: instruction_courante;
2229: return(d_erreur);
2230: }
2231:
2232: (*((struct_fonction *) (*(*l_element_fonction).donnee)
2233: .objet)).nombre_arguments = 0;
2234: (*((struct_fonction *) (*(*l_element_fonction).donnee)
2235: .objet)).fonction =
2236: instruction_vers_niveau_inferieur;
2237:
2238: if (((*((struct_fonction *) (*(*l_element_fonction)
2239: .donnee).objet)).nom_fonction =
2240: (unsigned char *) malloc(3 * sizeof(
2241: unsigned char))) == NULL)
2242: {
2243: if (presence_egalite == d_vrai)
2244: {
2245: liberation(s_etat_processus, s_objet_evalue);
2246: }
2247:
2248: (*s_etat_processus).erreur_systeme =
2249: d_es_allocation_memoire;
2250: (*s_etat_processus).instruction_courante =
2251: instruction_courante;
2252: return(d_erreur);
2253: }
2254:
2255: strcpy((*((struct_fonction *) (*(*l_element_fonction)
2256: .donnee).objet)).nom_fonction, ">>");
2257:
2258: (*l_element_fonction).suivant = NULL;
2259:
2260: if (empilement(s_etat_processus, &((*s_etat_processus)
2261: .l_base_pile), s_objet_elementaire) ==
2262: d_erreur)
2263: {
2264: if (presence_egalite == d_vrai)
2265: {
2266: liberation(s_etat_processus, s_objet_evalue);
2267: }
2268:
2269: (*s_etat_processus).instruction_courante =
2270: instruction_courante;
2271: return(d_erreur);
2272: }
2273: }
2274:
2275: (*s_etat_processus).expression_courante =
2276: registre_expression_courante;
2277: }
2278: else
2279: {
2280: if ((s_objet_elementaire =
2281: allocation(s_etat_processus, NON)) == NULL)
2282: {
2283: if (presence_egalite == d_vrai)
2284: {
2285: liberation(s_etat_processus, s_objet_evalue);
2286: }
2287:
2288: (*s_etat_processus).erreur_systeme =
2289: d_es_allocation_memoire;
2290: (*s_etat_processus).instruction_courante =
2291: instruction_courante;
2292: return(d_erreur);
2293: }
2294:
2295: if ((*(*s_etat_processus).pointeur_variable_courante).objet
2296: == NULL)
2297: {
2298: if (recherche_variable_partagee(s_etat_processus,
2299: (*(*s_etat_processus)
2300: .pointeur_variable_courante).nom,
2301: (*(*s_etat_processus)
2302: .pointeur_variable_courante).variable_partagee,
2303: 'E') != NULL)
2304: {
2305: // Une variable partagée existe.
2306:
2307: presence_variable_partagee = d_vrai;
2308:
2309: (*(*s_etat_processus).pointeur_variable_courante)
2310: .objet = (*(*s_etat_processus)
2311: .pointeur_variable_partagee_courante)
2312: .objet;
2313: }
2314: else
2315: {
2316: presence_variable_partagee = d_faux;
2317: }
2318: }
2319: else
2320: {
2321: presence_variable_partagee = d_faux;
2322: }
2323:
2324: /*
2325: * Recherche d'un élément dans un vecteur
2326: */
2327:
2328: if ((*(*s_etat_processus).pointeur_variable_courante)
2329: .objet == NULL)
2330: {
2331: // La variable partagée n'existe plus.
2332:
2333: free(s_objet_elementaire);
2334:
2335: if ((s_objet_elementaire =
2336: copie_objet(s_etat_processus,
2337: (*l_element_courant).donnee, 'P')) == NULL)
2338: {
2339: if (presence_variable_partagee == d_vrai)
2340: {
2341: (*(*s_etat_processus)
2342: .pointeur_variable_courante).objet =
2343: NULL;
2344:
2345: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2346: .pointeur_variable_partagee_courante)
2347: .mutex)) != 0)
2348: {
2349: (*s_etat_processus).erreur_systeme =
2350: d_es_processus;
2351: }
2352: }
2353:
2354: (*s_etat_processus).erreur_systeme =
2355: d_es_allocation_memoire;
2356: return(d_erreur);;
2357: }
2358: }
2359: else if ((((*((*(*s_etat_processus)
2360: .pointeur_variable_courante).objet)).type == VIN) ||
2361: ((*((*(*s_etat_processus)
2362: .pointeur_variable_courante).objet)).type == VRL) ||
2363: ((*((*(*s_etat_processus)
2364: .pointeur_variable_courante).objet)).type == VCX))
2365: && ((*((struct_fonction *) (*(*l_element_courant)
2366: .donnee).objet)).nombre_arguments == 1))
2367: {
2368: if (depilement(s_etat_processus, &((*s_etat_processus)
2369: .l_base_pile), &s_objet_indice_i) == d_erreur)
2370: {
2371: free(s_objet_elementaire);
2372:
2373: if (presence_variable_partagee == d_vrai)
2374: {
2375: (*(*s_etat_processus)
2376: .pointeur_variable_courante).objet =
2377: NULL;
2378:
2379: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2380: .pointeur_variable_partagee_courante)
2381: .mutex)) != 0)
2382: {
2383: (*s_etat_processus).erreur_systeme =
2384: d_es_processus;
2385: }
2386: }
2387:
2388: if (presence_egalite == d_vrai)
2389: {
2390: liberation(s_etat_processus, s_objet_evalue);
2391: }
2392:
2393: (*s_etat_processus).erreur_execution =
2394: d_ex_manque_argument;
2395: (*s_etat_processus).instruction_courante =
2396: instruction_courante;
2397: (*s_etat_processus).mode_execution_programme =
2398: registre_mode_execution_programme;
2399: return(d_erreur);
2400: }
2401:
2402: if ((*s_objet_indice_i).type != INT)
2403: {
2404: liberation(s_etat_processus, s_objet_indice_i);
2405: free(s_objet_elementaire);
2406:
2407: if (presence_variable_partagee == d_vrai)
2408: {
2409: (*(*s_etat_processus)
2410: .pointeur_variable_courante).objet =
2411: NULL;
2412:
2413: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2414: .pointeur_variable_partagee_courante)
2415: .mutex)) != 0)
2416: {
2417: (*s_etat_processus).erreur_systeme =
2418: d_es_processus;
2419: }
2420: }
2421:
2422: if (presence_egalite == d_vrai)
2423: {
2424: liberation(s_etat_processus, s_objet_evalue);
2425: }
2426:
2427: (*s_etat_processus).erreur_execution =
2428: d_ex_erreur_type_argument;
2429: (*s_etat_processus).instruction_courante =
2430: instruction_courante;
2431: (*s_etat_processus).mode_execution_programme =
2432: registre_mode_execution_programme;
2433: return(d_erreur);
2434: }
2435:
2436: i = (*((integer8 *) (*s_objet_indice_i).objet));
2437:
2438: liberation(s_etat_processus, s_objet_indice_i);
2439:
2440: if ((i < 1) || (i > (integer8) (*((struct_vecteur *)
2441: (*((*(*s_etat_processus)
2442: .pointeur_variable_courante).objet)).objet))
2443: .taille))
2444: {
2445: free(s_objet_elementaire);
2446:
2447: if (presence_variable_partagee == d_vrai)
2448: {
2449: (*(*s_etat_processus)
2450: .pointeur_variable_courante).objet =
2451: NULL;
2452:
2453: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2454: .pointeur_variable_partagee_courante)
2455: .mutex)) != 0)
2456: {
2457: (*s_etat_processus).erreur_systeme =
2458: d_es_processus;
2459: }
2460: }
2461:
2462: if (presence_egalite == d_vrai)
2463: {
2464: liberation(s_etat_processus, s_objet_evalue);
2465: }
2466:
2467: (*s_etat_processus).erreur_execution =
2468: d_ex_element_inexistant;
2469: (*s_etat_processus).instruction_courante =
2470: instruction_courante;
2471: (*s_etat_processus).mode_execution_programme =
2472: registre_mode_execution_programme;
2473: return(d_erreur);
2474: }
2475:
2476: if ((*((*(*s_etat_processus)
2477: .pointeur_variable_courante).objet)).type
2478: == VIN)
2479: {
2480: if (((*s_objet_elementaire).objet = malloc(sizeof(
2481: integer8))) == NULL)
2482: {
2483: if (presence_egalite == d_vrai)
2484: {
2485: liberation(s_etat_processus,
2486: s_objet_evalue);
2487: }
2488:
2489: if (presence_variable_partagee == d_vrai)
2490: {
2491: (*(*s_etat_processus)
2492: .pointeur_variable_courante).objet =
2493: NULL;
2494:
2495: if (pthread_mutex_unlock(
2496: &((*(*s_etat_processus)
2497: .pointeur_variable_partagee_courante
2498: ).mutex)) != 0)
2499: {
2500: (*s_etat_processus).erreur_systeme =
2501: d_es_processus;
2502: }
2503: }
2504:
2505: (*s_etat_processus).erreur_systeme =
2506: d_es_allocation_memoire;
2507: (*s_etat_processus).instruction_courante =
2508: instruction_courante;
2509: return(d_erreur);
2510: }
2511:
2512: (*s_objet_elementaire).type = INT;
2513: (*((integer8 *) (*s_objet_elementaire).objet)) =
2514: ((integer8 *) (*((struct_vecteur *)
2515: (*((*(*s_etat_processus)
2516: .pointeur_variable_courante).objet))
2517: .objet)).tableau)[i - 1];
2518: }
2519: else if ((*((*(*s_etat_processus)
2520: .pointeur_variable_courante).objet)).type
2521: == VRL)
2522: {
2523: if (((*s_objet_elementaire).objet = malloc(sizeof(
2524: real8))) == NULL)
2525: {
2526: if (presence_variable_partagee == d_vrai)
2527: {
2528: (*(*s_etat_processus)
2529: .pointeur_variable_courante).objet =
2530: NULL;
2531:
2532: if (pthread_mutex_unlock(
2533: &((*(*s_etat_processus)
2534: .pointeur_variable_partagee_courante
2535: ).mutex)) != 0)
2536: {
2537: (*s_etat_processus).erreur_systeme =
2538: d_es_processus;
2539: }
2540: }
2541:
2542: if (presence_egalite == d_vrai)
2543: {
2544: liberation(s_etat_processus,
2545: s_objet_evalue);
2546: }
2547:
2548: (*s_etat_processus).erreur_systeme =
2549: d_es_allocation_memoire;
2550: (*s_etat_processus).instruction_courante =
2551: instruction_courante;
2552: return(d_erreur);
2553: }
2554:
2555: (*s_objet_elementaire).type = REL;
2556: (*((real8 *) (*s_objet_elementaire).objet)) =
2557: ((real8 *) (*((struct_vecteur *)
2558: (*((*(*s_etat_processus)
2559: .pointeur_variable_courante).objet))
2560: .objet)).tableau)[i - 1];
2561: }
2562: else if ((*((*(*s_etat_processus)
2563: .pointeur_variable_courante).objet)).type
2564: == VCX)
2565: {
2566: if (((*s_objet_elementaire).objet = malloc(sizeof(
2567: struct_complexe16))) == NULL)
2568: {
2569: if (presence_variable_partagee == d_vrai)
2570: {
2571: (*(*s_etat_processus)
2572: .pointeur_variable_courante).objet =
2573: NULL;
2574:
2575: if (pthread_mutex_unlock(
2576: &((*(*s_etat_processus)
2577: .pointeur_variable_partagee_courante
2578: ).mutex)) != 0)
2579: {
2580: (*s_etat_processus).erreur_systeme =
2581: d_es_processus;
2582: }
2583: }
2584:
2585: if (presence_egalite == d_vrai)
2586: {
2587: liberation(s_etat_processus,
2588: s_objet_evalue);
2589: }
2590:
2591: (*s_etat_processus).erreur_systeme =
2592: d_es_allocation_memoire;
2593: (*s_etat_processus).instruction_courante =
2594: instruction_courante;
2595: return(d_erreur);
2596: }
2597:
2598: (*s_objet_elementaire).type = CPL;
2599: (*((struct_complexe16 *) (*s_objet_elementaire)
2600: .objet)).partie_reelle =
2601: ((struct_complexe16 *) (*((struct_vecteur *)
2602: (*((*(*s_etat_processus)
2603: .pointeur_variable_courante).objet))
2604: .objet)).tableau)[i - 1].partie_reelle;
2605: (*((struct_complexe16 *) (*s_objet_elementaire)
2606: .objet)).partie_imaginaire =
2607: ((struct_complexe16 *) (*((struct_vecteur *)
2608: (*((*(*s_etat_processus)
2609: .pointeur_variable_courante).objet))
2610: .objet)).tableau)[i - 1].partie_imaginaire;
2611: }
2612: }
2613:
2614: /*
2615: * Recherche d'un élément dans une matrice
2616: */
2617:
2618: else if ((((*((*(*s_etat_processus)
2619: .pointeur_variable_courante).objet)).type == MIN) ||
2620: ((*((*(*s_etat_processus)
2621: .pointeur_variable_courante).objet)).type == MRL) ||
2622: ((*((*(*s_etat_processus)
2623: .pointeur_variable_courante).objet)).type == MCX))
2624: && ((*((struct_fonction *) (*(*l_element_courant)
2625: .donnee).objet)).nombre_arguments == 2))
2626: {
2627: if (depilement(s_etat_processus, &((*s_etat_processus)
2628: .l_base_pile), &s_objet_indice_j) == d_erreur)
2629: {
2630: free(s_objet_elementaire);
2631:
2632: if (presence_variable_partagee == d_vrai)
2633: {
2634: (*(*s_etat_processus)
2635: .pointeur_variable_courante).objet =
2636: NULL;
2637:
2638: if (pthread_mutex_unlock(
2639: &((*(*s_etat_processus)
2640: .pointeur_variable_partagee_courante)
2641: .mutex)) != 0)
2642: {
2643: (*s_etat_processus).erreur_systeme =
2644: d_es_processus;
2645: }
2646: }
2647:
2648: if (presence_egalite == d_vrai)
2649: {
2650: liberation(s_etat_processus, s_objet_evalue);
2651: }
2652:
2653: (*s_etat_processus).erreur_execution =
2654: d_ex_manque_argument;
2655: (*s_etat_processus).instruction_courante =
2656: instruction_courante;
2657: (*s_etat_processus).mode_execution_programme =
2658: registre_mode_execution_programme;
2659: return(d_erreur);
2660: }
2661:
2662: if (depilement(s_etat_processus, &((*s_etat_processus)
2663: .l_base_pile), &s_objet_indice_i) == d_erreur)
2664: {
2665: liberation(s_etat_processus, s_objet_indice_j);
2666: free(s_objet_elementaire);
2667:
2668: if (presence_variable_partagee == d_vrai)
2669: {
2670: (*(*s_etat_processus)
2671: .pointeur_variable_courante).objet =
2672: NULL;
2673:
2674: if (pthread_mutex_unlock(
2675: &((*(*s_etat_processus)
2676: .pointeur_variable_partagee_courante)
2677: .mutex)) != 0)
2678: {
2679: (*s_etat_processus).erreur_systeme =
2680: d_es_processus;
2681: }
2682: }
2683:
2684: if (presence_egalite == d_vrai)
2685: {
2686: liberation(s_etat_processus, s_objet_evalue);
2687: }
2688:
2689: (*s_etat_processus).erreur_execution =
2690: d_ex_manque_argument;
2691: (*s_etat_processus).instruction_courante =
2692: instruction_courante;
2693: (*s_etat_processus).mode_execution_programme =
2694: registre_mode_execution_programme;
2695: return(d_erreur);
2696: }
2697:
2698: if (((*s_objet_indice_i).type != INT) ||
2699: ((*s_objet_indice_j).type != INT))
2700: {
2701: liberation(s_etat_processus, s_objet_indice_i);
2702: liberation(s_etat_processus, s_objet_indice_j);
2703: free(s_objet_elementaire);
2704:
2705: if (presence_variable_partagee == d_vrai)
2706: {
2707: (*(*s_etat_processus)
2708: .pointeur_variable_courante).objet =
2709: NULL;
2710:
2711: if (pthread_mutex_unlock(
2712: &((*(*s_etat_processus)
2713: .pointeur_variable_partagee_courante)
2714: .mutex)) != 0)
2715: {
2716: (*s_etat_processus).erreur_systeme =
2717: d_es_processus;
2718: }
2719: }
2720:
2721: if (presence_egalite == d_vrai)
2722: {
2723: liberation(s_etat_processus, s_objet_evalue);
2724: }
2725:
2726: (*s_etat_processus).erreur_execution =
2727: d_ex_erreur_type_argument;
2728: (*s_etat_processus).instruction_courante =
2729: instruction_courante;
2730: (*s_etat_processus).mode_execution_programme =
2731: registre_mode_execution_programme;
2732: return(d_erreur);
2733: }
2734:
2735: i = (*((integer8 *) (*s_objet_indice_i).objet));
2736: j = (*((integer8 *) (*s_objet_indice_j).objet));
2737:
2738: liberation(s_etat_processus, s_objet_indice_i);
2739: liberation(s_etat_processus, s_objet_indice_j);
2740:
2741: if ((i < 1) || (i > (integer8) (*((struct_matrice *)
2742: (*((*(*s_etat_processus)
2743: .pointeur_variable_courante).objet)).objet))
2744: .nombre_lignes) || (j < 1) || (j > (integer8)
2745: (*((struct_matrice *) (*((*(*s_etat_processus)
2746: .pointeur_variable_courante).objet)).objet))
2747: .nombre_colonnes))
2748: {
2749: free(s_objet_elementaire);
2750:
2751: if (presence_variable_partagee == d_vrai)
2752: {
2753: (*(*s_etat_processus)
2754: .pointeur_variable_courante).objet =
2755: NULL;
2756:
2757: if (pthread_mutex_unlock(
2758: &((*(*s_etat_processus)
2759: .pointeur_variable_partagee_courante)
2760: .mutex)) != 0)
2761: {
2762: (*s_etat_processus).erreur_systeme =
2763: d_es_processus;
2764: }
2765: }
2766:
2767: if (presence_egalite == d_vrai)
2768: {
2769: liberation(s_etat_processus, s_objet_evalue);
2770: }
2771:
2772: (*s_etat_processus).erreur_execution =
2773: d_ex_element_inexistant;
2774: (*s_etat_processus).instruction_courante =
2775: instruction_courante;
2776: (*s_etat_processus).mode_execution_programme =
2777: registre_mode_execution_programme;
2778: return(d_erreur);
2779: }
2780:
2781: if ((*((*(*s_etat_processus).pointeur_variable_courante)
2782: .objet)).type == MIN)
2783: {
2784: if (((*s_objet_elementaire).objet = malloc(sizeof(
2785: integer8))) == NULL)
2786: {
2787: if (presence_variable_partagee == d_vrai)
2788: {
2789: (*(*s_etat_processus)
2790: .pointeur_variable_courante).objet =
2791: NULL;
2792:
2793: if (pthread_mutex_unlock(
2794: &((*(*s_etat_processus)
2795: .pointeur_variable_partagee_courante
2796: ).mutex)) != 0)
2797: {
2798: (*s_etat_processus).erreur_systeme =
2799: d_es_processus;
2800: }
2801: }
2802:
2803: if (presence_egalite == d_vrai)
2804: {
2805: liberation(s_etat_processus,
2806: s_objet_evalue);
2807: }
2808:
2809: (*s_etat_processus).erreur_systeme =
2810: d_es_allocation_memoire;
2811: (*s_etat_processus).instruction_courante =
2812: instruction_courante;
2813: return(d_erreur);
2814: }
2815:
2816: (*s_objet_elementaire).type = INT;
2817: (*((integer8 *) (*s_objet_elementaire).objet)) =
2818: ((integer8 **) (*((struct_matrice *)
2819: (*((*(*s_etat_processus)
2820: .pointeur_variable_courante).objet))
2821: .objet)).tableau)[i - 1][j - 1];
2822: }
2823: else if ((*((*(*s_etat_processus)
2824: .pointeur_variable_courante).objet)).type
2825: == MRL)
2826: {
2827: if (((*s_objet_elementaire).objet = malloc(sizeof(
2828: real8))) == NULL)
2829: {
2830: if (presence_variable_partagee == d_vrai)
2831: {
2832: (*(*s_etat_processus)
2833: .pointeur_variable_courante).objet =
2834: NULL;
2835:
2836: if (pthread_mutex_unlock(
2837: &((*(*s_etat_processus)
2838: .pointeur_variable_partagee_courante
2839: ).mutex)) != 0)
2840: {
2841: (*s_etat_processus).erreur_systeme =
2842: d_es_processus;
2843: }
2844: }
2845:
2846: if (presence_egalite == d_vrai)
2847: {
2848: liberation(s_etat_processus,
2849: s_objet_evalue);
2850: }
2851:
2852: (*s_etat_processus).erreur_systeme =
2853: d_es_allocation_memoire;
2854: (*s_etat_processus).instruction_courante =
2855: instruction_courante;
2856: return(d_erreur);
2857: }
2858:
2859: (*s_objet_elementaire).type = REL;
2860: (*((real8 *) (*s_objet_elementaire).objet)) =
2861: ((real8 **) (*((struct_matrice *)
2862: (*((*(*s_etat_processus)
2863: .pointeur_variable_courante).objet))
2864: .objet)).tableau)[i - 1][j - 1];
2865: }
2866: else if ((*((*(*s_etat_processus)
2867: .pointeur_variable_courante).objet)).type
2868: == MCX)
2869: {
2870: if (((*s_objet_elementaire).objet = malloc(sizeof(
2871: struct_complexe16))) == NULL)
2872: {
2873: if (presence_variable_partagee == d_vrai)
2874: {
2875: (*(*s_etat_processus)
2876: .pointeur_variable_courante).objet =
2877: NULL;
2878:
2879: if (pthread_mutex_unlock(
2880: &((*(*s_etat_processus)
2881: .pointeur_variable_partagee_courante
2882: ).mutex)) != 0)
2883: {
2884: (*s_etat_processus).erreur_systeme =
2885: d_es_processus;
2886: }
2887: }
2888:
2889: if (presence_egalite == d_vrai)
2890: {
2891: liberation(s_etat_processus,
2892: s_objet_evalue);
2893: }
2894:
2895: (*s_etat_processus).erreur_systeme =
2896: d_es_allocation_memoire;
2897: (*s_etat_processus).instruction_courante =
2898: instruction_courante;
2899: return(d_erreur);
2900: }
2901:
2902: (*s_objet_elementaire).type = CPL;
2903: (*((struct_complexe16 *) (*s_objet_elementaire)
2904: .objet)).partie_reelle =
2905: ((struct_complexe16 **)
2906: (*((struct_matrice *)
2907: (*((*(*s_etat_processus)
2908: .pointeur_variable_courante).objet))
2909: .objet)).tableau)[i - 1][j - 1]
2910: .partie_reelle;
2911: (*((struct_complexe16 *) (*s_objet_elementaire)
2912: .objet)).partie_imaginaire =
2913: ((struct_complexe16 **)
2914: (*((struct_matrice *)
2915: (*((*(*s_etat_processus)
2916: .pointeur_variable_courante).objet))
2917: .objet)).tableau)[i - 1][j - 1]
2918: .partie_imaginaire;
2919: }
2920: }
2921:
2922: /*
2923: * Recherche de l'élément idoine dans la liste
2924: */
2925:
2926: else if (((*((*(*s_etat_processus)
2927: .pointeur_variable_courante).objet)).type == LST) &&
2928: ((*((struct_fonction *) (*(*l_element_courant)
2929: .donnee).objet)).nombre_arguments == 1))
2930: {
2931: if (depilement(s_etat_processus, &((*s_etat_processus)
2932: .l_base_pile), &s_objet_indice_i) == d_erreur)
2933: {
2934: free(s_objet_elementaire);
2935:
2936: if (presence_variable_partagee == d_vrai)
2937: {
2938: (*(*s_etat_processus)
2939: .pointeur_variable_courante).objet =
2940: NULL;
2941:
2942: if (pthread_mutex_unlock(
2943: &((*(*s_etat_processus)
2944: .pointeur_variable_partagee_courante)
2945: .mutex)) != 0)
2946: {
2947: (*s_etat_processus).erreur_systeme =
2948: d_es_processus;
2949: }
2950: }
2951:
2952: if (presence_egalite == d_vrai)
2953: {
2954: liberation(s_etat_processus, s_objet_evalue);
2955: }
2956:
2957: (*s_etat_processus).erreur_execution =
2958: d_ex_manque_argument;
2959: (*s_etat_processus).instruction_courante =
2960: instruction_courante;
2961: (*s_etat_processus).mode_execution_programme =
2962: registre_mode_execution_programme;
2963: return(d_erreur);
2964: }
2965:
2966: if ((*s_objet_indice_i).type != INT)
2967: {
2968: liberation(s_etat_processus, s_objet_indice_i);
2969: free(s_objet_elementaire);
2970:
2971: if (presence_variable_partagee == d_vrai)
2972: {
2973: (*(*s_etat_processus)
2974: .pointeur_variable_courante).objet =
2975: NULL;
2976:
2977: if (pthread_mutex_unlock(
2978: &((*(*s_etat_processus)
2979: .pointeur_variable_partagee_courante)
2980: .mutex)) != 0)
2981: {
2982: (*s_etat_processus).erreur_systeme =
2983: d_es_processus;
2984: }
2985: }
2986:
2987: if (presence_egalite == d_vrai)
2988: {
2989: liberation(s_etat_processus, s_objet_evalue);
2990: }
2991:
2992: (*s_etat_processus).erreur_execution =
2993: d_ex_erreur_type_argument;
2994: (*s_etat_processus).instruction_courante =
2995: instruction_courante;
2996: (*s_etat_processus).mode_execution_programme =
2997: registre_mode_execution_programme;
2998: return(d_erreur);
2999: }
3000:
3001: i = (*((integer8 *) (*s_objet_indice_i).objet));
3002:
3003: liberation(s_etat_processus, s_objet_indice_i);
3004:
3005: l_sous_element_courant = (*((*(*s_etat_processus)
3006: .pointeur_variable_courante).objet)).objet;
3007: j = 0;
3008:
3009: while(l_sous_element_courant != NULL)
3010: {
3011: if ((++j) == i)
3012: {
3013: break;
3014: }
3015:
3016: l_sous_element_courant =
3017: (*l_sous_element_courant).suivant;
3018: }
3019:
3020: if (j != i)
3021: {
3022: free(s_objet_elementaire);
3023:
3024: if (presence_variable_partagee == d_vrai)
3025: {
3026: (*(*s_etat_processus)
3027: .pointeur_variable_courante).objet =
3028: NULL;
3029:
3030: if (pthread_mutex_unlock(
3031: &((*(*s_etat_processus)
3032: .pointeur_variable_partagee_courante)
3033: .mutex)) != 0)
3034: {
3035: (*s_etat_processus).erreur_systeme =
3036: d_es_processus;
3037: }
3038: }
3039:
3040: if (presence_egalite == d_vrai)
3041: {
3042: liberation(s_etat_processus, s_objet_evalue);
3043: }
3044:
3045: (*s_etat_processus).erreur_execution =
3046: d_ex_element_inexistant;
3047: (*s_etat_processus).instruction_courante =
3048: instruction_courante;
3049: (*s_etat_processus).mode_execution_programme =
3050: registre_mode_execution_programme;
3051: return(d_erreur);
3052: }
3053:
3054: free(s_objet_elementaire);
3055:
3056: if ((s_objet_elementaire =
3057: copie_objet(s_etat_processus,
3058: (*l_sous_element_courant).donnee, 'P')) == NULL)
3059: {
3060: if (presence_variable_partagee == d_vrai)
3061: {
3062: (*(*s_etat_processus)
3063: .pointeur_variable_courante).objet =
3064: NULL;
3065:
3066: if (pthread_mutex_unlock(
3067: &((*(*s_etat_processus)
3068: .pointeur_variable_partagee_courante)
3069: .mutex)) != 0)
3070: {
3071: (*s_etat_processus).erreur_systeme =
3072: d_es_processus;
3073: }
3074: }
3075:
3076: if (presence_egalite == d_vrai)
3077: {
3078: liberation(s_etat_processus, s_objet_evalue);
3079: }
3080:
3081: (*s_etat_processus).erreur_systeme =
3082: d_es_allocation_memoire;
3083: (*s_etat_processus).instruction_courante =
3084: instruction_courante;
3085: return(d_erreur);
3086: }
3087:
3088: // Si l'objet élémentaire est un nom et que ce nom n'est
3089: // pas un nom symbolique, il convient de l'évaluer.
3090:
3091: if ((*s_objet_elementaire).type == NOM)
3092: {
3093: if (((*((struct_nom *) (*s_objet_elementaire)
3094: .objet)).symbole == d_faux) ||
3095: (type_evaluation == 'N'))
3096: {
3097: if (evaluation(s_etat_processus,
3098: s_objet_elementaire, 'E') == d_erreur)
3099: {
3100: if (presence_variable_partagee == d_vrai)
3101: {
3102: (*(*s_etat_processus)
3103: .pointeur_variable_courante)
3104: .objet = NULL;
3105:
3106: if (pthread_mutex_unlock(
3107: &((*(*s_etat_processus)
3108: .pointeur_variable_partagee_courante
3109: ).mutex)) != 0)
3110: {
3111: (*s_etat_processus).erreur_systeme =
3112: d_es_processus;
3113: }
3114: }
3115:
3116: if (presence_egalite == d_vrai)
3117: {
3118: liberation(s_etat_processus,
3119: s_objet_evalue);
3120: }
3121:
3122: (*s_etat_processus).erreur_systeme =
3123: d_es_allocation_memoire;
3124: (*s_etat_processus).instruction_courante =
3125: instruction_courante;
3126: return(d_erreur);
3127: }
3128:
3129: liberation(s_etat_processus,
3130: s_objet_elementaire);
3131:
3132:
3133: if (depilement(s_etat_processus,
3134: &((*s_etat_processus).l_base_pile),
3135: &s_objet_elementaire) == d_erreur)
3136: {
3137: if (presence_variable_partagee == d_vrai)
3138: {
3139: (*(*s_etat_processus)
3140: .pointeur_variable_courante)
3141: .objet = NULL;
3142:
3143: if (pthread_mutex_unlock(
3144: &((*(*s_etat_processus)
3145: .pointeur_variable_partagee_courante
3146: ).mutex)) != 0)
3147: {
3148: (*s_etat_processus).erreur_systeme =
3149: d_es_processus;
3150: }
3151: }
3152:
3153: if (presence_egalite == d_vrai)
3154: {
3155: liberation(s_etat_processus,
3156: s_objet_evalue);
3157: }
3158:
3159: (*s_etat_processus).erreur_systeme =
3160: d_es_allocation_memoire;
3161: (*s_etat_processus).instruction_courante =
3162: instruction_courante;
3163: return(d_erreur);
3164: }
3165: }
3166: }
3167: }
3168:
3169: /*
3170: * Recherche de l'élément idoine dans la table
3171: */
3172:
3173: else if (((*((*(*s_etat_processus)
3174: .pointeur_variable_courante).objet)).type == TBL) &&
3175: ((*((struct_fonction *) (*(*l_element_courant)
3176: .donnee).objet)).nombre_arguments == 1))
3177: {
3178: if (depilement(s_etat_processus, &((*s_etat_processus)
3179: .l_base_pile), &s_objet_indice_i) == d_erreur)
3180: {
3181: free(s_objet_elementaire);
3182:
3183: if (presence_variable_partagee == d_vrai)
3184: {
3185: (*(*s_etat_processus)
3186: .pointeur_variable_courante).objet =
3187: NULL;
3188:
3189: if (pthread_mutex_unlock(
3190: &((*(*s_etat_processus)
3191: .pointeur_variable_partagee_courante)
3192: .mutex)) != 0)
3193: {
3194: (*s_etat_processus).erreur_systeme =
3195: d_es_processus;
3196: }
3197: }
3198:
3199: if (presence_egalite == d_vrai)
3200: {
3201: liberation(s_etat_processus, s_objet_evalue);
3202: }
3203:
3204: (*s_etat_processus).erreur_execution =
3205: d_ex_manque_argument;
3206: (*s_etat_processus).instruction_courante =
3207: instruction_courante;
3208: (*s_etat_processus).mode_execution_programme =
3209: registre_mode_execution_programme;
3210: return(d_erreur);
3211: }
3212:
3213: if ((*s_objet_indice_i).type != INT)
3214: {
3215: liberation(s_etat_processus, s_objet_indice_i);
3216: free(s_objet_elementaire);
3217:
3218: if (presence_variable_partagee == d_vrai)
3219: {
3220: (*(*s_etat_processus)
3221: .pointeur_variable_courante).objet =
3222: NULL;
3223:
3224: if (pthread_mutex_unlock(
3225: &((*(*s_etat_processus)
3226: .pointeur_variable_partagee_courante)
3227: .mutex)) != 0)
3228: {
3229: (*s_etat_processus).erreur_systeme =
3230: d_es_processus;
3231: }
3232: }
3233:
3234: if (presence_egalite == d_vrai)
3235: {
3236: liberation(s_etat_processus, s_objet_evalue);
3237: }
3238:
3239: (*s_etat_processus).erreur_execution =
3240: d_ex_erreur_type_argument;
3241: (*s_etat_processus).instruction_courante =
3242: instruction_courante;
3243: (*s_etat_processus).mode_execution_programme =
3244: registre_mode_execution_programme;
3245: return(d_erreur);
3246: }
3247:
3248: i = (*((integer8 *) (*s_objet_indice_i).objet));
3249:
3250: liberation(s_etat_processus, s_objet_indice_i);
3251:
3252: if ((i < 1) || (i > (integer8) (*((struct_tableau *)
3253: (*(*(*s_etat_processus)
3254: .pointeur_variable_courante).objet)
3255: .objet)).nombre_elements))
3256: {
3257: free(s_objet_elementaire);
3258:
3259: if (presence_variable_partagee == d_vrai)
3260: {
3261: (*(*s_etat_processus)
3262: .pointeur_variable_courante).objet =
3263: NULL;
3264:
3265: if (pthread_mutex_unlock(
3266: &((*(*s_etat_processus)
3267: .pointeur_variable_partagee_courante)
3268: .mutex)) != 0)
3269: {
3270: (*s_etat_processus).erreur_systeme =
3271: d_es_processus;
3272: }
3273: }
3274:
3275: if (presence_egalite == d_vrai)
3276: {
3277: liberation(s_etat_processus, s_objet_evalue);
3278: }
3279:
3280: (*s_etat_processus).erreur_execution =
3281: d_ex_element_inexistant;
3282: (*s_etat_processus).instruction_courante =
3283: instruction_courante;
3284: (*s_etat_processus).mode_execution_programme =
3285: registre_mode_execution_programme;
3286: return(d_erreur);
3287: }
3288:
3289: free(s_objet_elementaire);
3290:
3291: if ((s_objet_elementaire =
3292: copie_objet(s_etat_processus,
3293: (*((struct_tableau *) (*(*(*s_etat_processus)
3294: .pointeur_variable_courante).objet)
3295: .objet)).elements[i - 1], 'P')) == NULL)
3296: {
3297: if (presence_variable_partagee == d_vrai)
3298: {
3299: (*(*s_etat_processus)
3300: .pointeur_variable_courante).objet =
3301: NULL;
3302:
3303: if (pthread_mutex_unlock(
3304: &((*(*s_etat_processus)
3305: .pointeur_variable_partagee_courante)
3306: .mutex)) != 0)
3307: {
3308: (*s_etat_processus).erreur_systeme =
3309: d_es_processus;
3310: }
3311: }
3312:
3313: if (presence_egalite == d_vrai)
3314: {
3315: liberation(s_etat_processus, s_objet_evalue);
3316: }
3317:
3318: (*s_etat_processus).erreur_systeme =
3319: d_es_allocation_memoire;
3320: (*s_etat_processus).instruction_courante =
3321: instruction_courante;
3322: return(d_erreur);
3323: }
3324:
3325: // Si l'objet élémentaire est un nom et que ce nom n'est
3326: // pas un nom symbolique, il convient de l'évaluer.
3327:
3328: if ((*s_objet_elementaire).type == NOM)
3329: {
3330: if (((*((struct_nom *) (*s_objet_elementaire)
3331: .objet)).symbole == d_faux) ||
3332: (type_evaluation == 'N'))
3333: {
3334: if (evaluation(s_etat_processus,
3335: s_objet_elementaire, 'E') == d_erreur)
3336: {
3337: if (presence_variable_partagee == d_vrai)
3338: {
3339: (*(*s_etat_processus)
3340: .pointeur_variable_courante)
3341: .objet = NULL;
3342:
3343: if (pthread_mutex_unlock(
3344: &((*(*s_etat_processus)
3345: .pointeur_variable_partagee_courante
3346: ).mutex)) != 0)
3347: {
3348: (*s_etat_processus).erreur_systeme =
3349: d_es_processus;
3350: }
3351: }
3352:
3353: if (presence_egalite == d_vrai)
3354: {
3355: liberation(s_etat_processus,
3356: s_objet_evalue);
3357: }
3358:
3359: (*s_etat_processus).erreur_systeme =
3360: d_es_allocation_memoire;
3361: (*s_etat_processus).instruction_courante =
3362: instruction_courante;
3363: return(d_erreur);
3364: }
3365:
3366: liberation(s_etat_processus,
3367: s_objet_elementaire);
3368:
3369:
3370: if (depilement(s_etat_processus,
3371: &((*s_etat_processus).l_base_pile),
3372: &s_objet_elementaire) == d_erreur)
3373: {
3374: if (presence_variable_partagee == d_vrai)
3375: {
3376: (*(*s_etat_processus)
3377: .pointeur_variable_courante)
3378: .objet = NULL;
3379:
3380: if (pthread_mutex_unlock(
3381: &((*(*s_etat_processus)
3382: .pointeur_variable_partagee_courante
3383: ).mutex)) != 0)
3384: {
3385: (*s_etat_processus).erreur_systeme =
3386: d_es_processus;
3387: }
3388: }
3389:
3390: if (presence_egalite == d_vrai)
3391: {
3392: liberation(s_etat_processus,
3393: s_objet_evalue);
3394: }
3395:
3396: (*s_etat_processus).erreur_systeme =
3397: d_es_allocation_memoire;
3398: (*s_etat_processus).instruction_courante =
3399: instruction_courante;
3400: return(d_erreur);
3401: }
3402: }
3403: }
3404: }
3405: else if (((*((*(*s_etat_processus)
3406: .pointeur_variable_courante).objet)).type == ALG) ||
3407: ((*((*(*s_etat_processus)
3408: .pointeur_variable_courante).objet)).type == RPN))
3409: {
3410: registre_evaluation_expression_compilee =
3411: (*s_etat_processus)
3412: .evaluation_expression_compilee;
3413:
3414: if (((*(*s_etat_processus).pointeur_variable_courante)
3415: .origine == 'E') && ((*(*s_etat_processus)
3416: .pointeur_variable_courante).niveau == 0))
3417: {
3418: (*s_etat_processus).evaluation_expression_compilee =
3419: 'Y';
3420: }
3421: else
3422: {
3423: (*s_etat_processus).evaluation_expression_compilee =
3424: 'N';
3425: }
3426:
3427: if (evaluation(s_etat_processus, (*(*s_etat_processus)
3428: .pointeur_variable_courante).objet,
3429: type_evaluation) == d_erreur)
3430: {
3431: (*s_etat_processus).evaluation_expression_compilee =
3432: registre_evaluation_expression_compilee;
3433:
3434: if (presence_variable_partagee == d_vrai)
3435: {
3436: (*(*s_etat_processus)
3437: .pointeur_variable_courante).objet =
3438: NULL;
3439:
3440: if (pthread_mutex_unlock(
3441: &((*(*s_etat_processus)
3442: .pointeur_variable_partagee_courante)
3443: .mutex)) != 0)
3444: {
3445: (*s_etat_processus).erreur_systeme =
3446: d_es_processus;
3447: }
3448: }
3449:
3450: if (presence_egalite == d_vrai)
3451: {
3452: liberation(s_etat_processus, s_objet_evalue);
3453: }
3454:
3455: (*s_etat_processus).instruction_courante =
3456: instruction_courante;
3457: (*s_etat_processus).mode_execution_programme =
3458: registre_mode_execution_programme;
3459: return(d_erreur);
3460: }
3461:
3462: (*s_etat_processus).evaluation_expression_compilee =
3463: registre_evaluation_expression_compilee;
3464:
3465: free(s_objet_elementaire);
3466:
3467: if (depilement(s_etat_processus, &((*s_etat_processus)
3468: .l_base_pile), &s_objet_elementaire)
3469: == d_erreur)
3470: {
3471: if (presence_variable_partagee == d_vrai)
3472: {
3473: (*(*s_etat_processus)
3474: .pointeur_variable_courante).objet =
3475: NULL;
3476:
3477: if (pthread_mutex_unlock(
3478: &((*(*s_etat_processus)
3479: .pointeur_variable_partagee_courante)
3480: .mutex)) != 0)
3481: {
3482: (*s_etat_processus).erreur_systeme =
3483: d_es_processus;
3484: }
3485: }
3486:
3487: if (presence_egalite == d_vrai)
3488: {
3489: liberation(s_etat_processus, s_objet_evalue);
3490: }
3491:
3492: (*s_etat_processus).erreur_execution =
3493: d_ex_manque_argument;
3494: (*s_etat_processus).instruction_courante =
3495: instruction_courante;
3496: (*s_etat_processus).mode_execution_programme =
3497: registre_mode_execution_programme;
3498: return(d_erreur);
3499: }
3500: }
3501: else if ((*((*(*s_etat_processus)
3502: .pointeur_variable_courante).objet)).type == ADR)
3503: {
3504: autorisation_empilement_programme = (*s_etat_processus)
3505: .autorisation_empilement_programme;
3506: registre_position_courante = (*s_etat_processus)
3507: .position_courante;
3508:
3509: empilement_pile_systeme(s_etat_processus);
3510:
3511: if ((*s_etat_processus).erreur_systeme != d_es)
3512: {
3513: if (presence_variable_partagee == d_vrai)
3514: {
3515: (*(*s_etat_processus)
3516: .pointeur_variable_courante).objet =
3517: NULL;
3518:
3519: if (pthread_mutex_unlock(
3520: &((*(*s_etat_processus)
3521: .pointeur_variable_partagee_courante)
3522: .mutex)) != 0)
3523: {
3524: (*s_etat_processus).erreur_systeme =
3525: d_es_processus;
3526: }
3527: }
3528:
3529: if (presence_egalite == d_vrai)
3530: {
3531: liberation(s_etat_processus, s_objet_evalue);
3532: }
3533:
3534: depilement_pile_systeme(s_etat_processus);
3535:
3536: (*s_etat_processus).instruction_courante =
3537: instruction_courante;
3538: return(d_erreur);
3539: }
3540:
3541: (*(*s_etat_processus).l_base_pile_systeme)
3542: .retour_definition = 'Y';
3543: (*(*s_etat_processus).l_base_pile_systeme)
3544: .origine_routine_evaluation = 'Y';
3545:
3546: (*s_etat_processus).mode_execution_programme = 'Y';
3547: (*s_etat_processus).autorisation_empilement_programme
3548: = 'N';
3549:
3550: (*(*s_etat_processus).l_base_pile_systeme)
3551: .niveau_courant = (*s_etat_processus)
3552: .niveau_courant;
3553:
3554: (*s_etat_processus).position_courante =
3555: (*((integer8 *) ((*(*(*s_etat_processus)
3556: .pointeur_variable_courante).objet).objet)));
3557:
3558: if ((*s_etat_processus).profilage == d_vrai)
3559: {
3560: profilage(s_etat_processus,
3561: (*(*s_etat_processus)
3562: .pointeur_variable_courante).nom);
3563:
3564: if ((*s_etat_processus).erreur_systeme != d_es)
3565: {
3566: if (presence_variable_partagee == d_vrai)
3567: {
3568: (*(*s_etat_processus)
3569: .pointeur_variable_courante).objet =
3570: NULL;
3571:
3572: if (pthread_mutex_unlock(
3573: &((*(*s_etat_processus)
3574: .pointeur_variable_partagee_courante
3575: ).mutex)) != 0)
3576: {
3577: (*s_etat_processus).erreur_systeme =
3578: d_es_processus;
3579: }
3580: }
3581:
3582: return(d_erreur);
3583: }
3584: }
3585:
3586: registre_evaluation_forcee =
3587: (*s_etat_processus).evaluation_forcee;
3588:
3589: if (type_evaluation == 'N')
3590: {
3591: (*s_etat_processus).evaluation_forcee = 'Y';
3592: }
3593:
3594: if (sequenceur(s_etat_processus) == d_erreur)
3595: {
3596: (*s_etat_processus).evaluation_forcee =
3597: registre_evaluation_forcee;
3598:
3599: if (presence_variable_partagee == d_vrai)
3600: {
3601: (*(*s_etat_processus)
3602: .pointeur_variable_courante).objet =
3603: NULL;
3604:
3605: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3606: .pointeur_variable_partagee_courante)
3607: .mutex)) != 0)
3608: {
3609: (*s_etat_processus).erreur_systeme =
3610: d_es_processus;
3611: }
3612: }
3613:
3614: if (presence_egalite == d_vrai)
3615: {
3616: liberation(s_etat_processus, s_objet_evalue);
3617: }
3618:
3619: depilement_pile_systeme(s_etat_processus);
3620:
3621: (*s_etat_processus).instruction_courante =
3622: instruction_courante;
3623: (*s_etat_processus).mode_execution_programme =
3624: registre_mode_execution_programme;
3625: return(d_erreur);
3626: }
3627:
3628: (*s_etat_processus).evaluation_forcee =
3629: registre_evaluation_forcee;
3630: (*s_etat_processus).instruction_courante =
3631: instruction_courante;
3632: (*s_etat_processus).mode_execution_programme = 'N';
3633:
3634: depilement_pile_systeme(s_etat_processus);
3635:
3636: if ((*s_etat_processus).erreur_systeme != d_es)
3637: {
3638: if (presence_variable_partagee == d_vrai)
3639: {
3640: (*(*s_etat_processus)
3641: .pointeur_variable_courante).objet =
3642: NULL;
3643:
3644: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3645: .pointeur_variable_partagee_courante)
3646: .mutex)) != 0)
3647: {
3648: (*s_etat_processus).erreur_systeme =
3649: d_es_processus;
3650: }
3651: }
3652:
3653: if (presence_egalite == d_vrai)
3654: {
3655: liberation(s_etat_processus, s_objet_evalue);
3656: }
3657:
3658: return(d_erreur);
3659: }
3660:
3661: (*s_etat_processus).retour_routine_evaluation = 'N';
3662: (*s_etat_processus).position_courante =
3663: registre_position_courante;
3664: (*s_etat_processus).autorisation_empilement_programme =
3665: autorisation_empilement_programme;
3666:
3667: free(s_objet_elementaire);
3668:
3669: if (depilement(s_etat_processus, &((*s_etat_processus)
3670: .l_base_pile), &s_objet_elementaire)
3671: == d_erreur)
3672: {
3673: if (presence_variable_partagee == d_vrai)
3674: {
3675: (*(*s_etat_processus)
3676: .pointeur_variable_courante).objet =
3677: NULL;
3678:
3679: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3680: .pointeur_variable_partagee_courante)
3681: .mutex)) != 0)
3682: {
3683: (*s_etat_processus).erreur_systeme =
3684: d_es_processus;
3685: }
3686: }
3687:
3688: if (presence_egalite == d_vrai)
3689: {
3690: liberation(s_etat_processus, s_objet_evalue);
3691: }
3692:
3693: (*s_etat_processus).erreur_execution =
3694: d_ex_manque_argument;
3695: (*s_etat_processus).instruction_courante =
3696: instruction_courante;
3697: (*s_etat_processus).mode_execution_programme =
3698: registre_mode_execution_programme;
3699: return(d_erreur);
3700: }
3701: }
3702: else
3703: {
3704: if (presence_variable_partagee == d_vrai)
3705: {
3706: (*(*s_etat_processus)
3707: .pointeur_variable_courante).objet =
3708: NULL;
3709:
3710: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3711: .pointeur_variable_partagee_courante)
3712: .mutex)) != 0)
3713: {
3714: (*s_etat_processus).erreur_systeme =
3715: d_es_processus;
3716: }
3717: }
3718:
3719: if (presence_egalite == d_vrai)
3720: {
3721: liberation(s_etat_processus, s_objet_evalue);
3722: }
3723:
3724: (*s_etat_processus).erreur_execution =
3725: d_ex_element_inexistant;
3726: (*s_etat_processus).instruction_courante =
3727: instruction_courante;
3728: (*s_etat_processus).mode_execution_programme =
3729: registre_mode_execution_programme;
3730:
3731: return(d_erreur);
3732: }
3733:
3734: if (empilement(s_etat_processus, &((*s_etat_processus)
3735: .l_base_pile), s_objet_elementaire) == d_erreur)
3736: {
3737: if (presence_variable_partagee == d_vrai)
3738: {
3739: (*(*s_etat_processus)
3740: .pointeur_variable_courante).objet =
3741: NULL;
3742:
3743: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3744: .pointeur_variable_partagee_courante)
3745: .mutex)) != 0)
3746: {
3747: (*s_etat_processus).erreur_systeme =
3748: d_es_processus;
3749: }
3750: }
3751:
3752: if (presence_egalite == d_vrai)
3753: {
3754: liberation(s_etat_processus, s_objet_evalue);
3755: }
3756:
3757: (*s_etat_processus).instruction_courante =
3758: instruction_courante;
3759: return(d_erreur);
3760: }
3761:
3762: if (presence_variable_partagee == d_vrai)
3763: {
3764: (*(*s_etat_processus)
3765: .pointeur_variable_courante).objet = NULL;
3766:
3767: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3768: .pointeur_variable_partagee_courante).mutex))
3769: != 0)
3770: {
3771: (*s_etat_processus).erreur_systeme =
3772: d_es_processus;
3773: }
3774: }
3775: }
3776: }
3777: else if (((*(*l_element_courant).donnee).type == ALG)
3778: || ((*(*l_element_courant).donnee).type == RPN))
3779: {
3780: if (type_evaluation == 'I')
3781: {
3782: if ((s_objet_elementaire = copie_objet(s_etat_processus,
3783: (*l_element_courant).donnee, 'P')) == NULL)
3784: {
3785: if (presence_egalite == d_vrai)
3786: {
3787: liberation(s_etat_processus, s_objet_evalue);
3788: }
3789:
3790: (*s_etat_processus).erreur_systeme =
3791: d_es_allocation_memoire;
3792: (*s_etat_processus).instruction_courante =
3793: instruction_courante;
3794: return(d_erreur);
3795: }
3796:
3797: if (empilement(s_etat_processus, &((*s_etat_processus)
3798: .l_base_pile), s_objet_elementaire)
3799: == d_erreur)
3800: {
3801: if (presence_egalite == d_vrai)
3802: {
3803: liberation(s_etat_processus, s_objet_evalue);
3804: }
3805:
3806: (*s_etat_processus).instruction_courante =
3807: instruction_courante;
3808: return(d_erreur);
3809: }
3810: }
3811: else
3812: {
3813: if ((*s_etat_processus).autorisation_empilement_programme
3814: == 'N')
3815: {
3816: registre_evaluation_expression_compilee =
3817: (*s_etat_processus)
3818: .evaluation_expression_compilee;
3819:
3820: (*s_etat_processus).evaluation_expression_compilee
3821: = 'Y';
3822:
3823: if (evaluation(s_etat_processus, (*l_element_courant)
3824: .donnee, type_evaluation) == d_erreur)
3825: {
3826: (*s_etat_processus).evaluation_expression_compilee
3827: = registre_evaluation_expression_compilee;
3828:
3829: if (presence_egalite == d_vrai)
3830: {
3831: liberation(s_etat_processus, s_objet_evalue);
3832: }
3833:
3834: (*s_etat_processus).instruction_courante =
3835: instruction_courante;
3836: (*s_etat_processus).mode_execution_programme =
3837: registre_mode_execution_programme;
3838: return(d_erreur);
3839: }
3840:
3841: (*s_etat_processus).evaluation_expression_compilee
3842: = registre_evaluation_expression_compilee;
3843: }
3844: else
3845: {
3846: if ((s_objet_elementaire =
3847: copie_objet(s_etat_processus,
3848: (*l_element_courant).donnee, 'P')) == NULL)
3849: {
3850: if (presence_egalite == d_vrai)
3851: {
3852: liberation(s_etat_processus, s_objet_evalue);
3853: }
3854:
3855: (*s_etat_processus).erreur_systeme =
3856: d_es_allocation_memoire;
3857: (*s_etat_processus).instruction_courante =
3858: instruction_courante;
3859: return(d_erreur);
3860: }
3861:
3862: if (empilement(s_etat_processus, &((*s_etat_processus)
3863: .l_base_pile), s_objet_elementaire)
3864: == d_erreur)
3865: {
3866: if (presence_egalite == d_vrai)
3867: {
3868: liberation(s_etat_processus, s_objet_evalue);
3869: }
3870:
3871: (*s_etat_processus).instruction_courante =
3872: instruction_courante;
3873: return(d_erreur);
3874: }
3875: }
3876: }
3877: }
3878: else if ((*(*l_element_courant).donnee).type == NOM)
3879: {
3880: registre_instruction_valide = (*s_etat_processus)
3881: .instruction_valide;
3882: registre_test = (*s_etat_processus).test_instruction;
3883: (*s_etat_processus).test_instruction = 'Y';
3884: (*s_etat_processus).instruction_courante = (*((struct_nom *)
3885: (*(*l_element_courant).donnee).objet)).nom;
3886:
3887: analyse(s_etat_processus, NULL);
3888:
3889: (*s_etat_processus).test_instruction = 'N';
3890:
3891: if ((*s_etat_processus).instruction_valide == 'Y')
3892: {
3893: registre_test_2 = (*s_etat_processus).test_instruction;
3894: (*s_etat_processus).test_instruction = 'N';
3895:
3896: registre_type_evaluation = (test_cfsf(s_etat_processus, 35)
3897: == d_vrai) ? 'E' : 'N';
3898:
3899: if (type_evaluation == 'N')
3900: {
3901: cf(s_etat_processus, 35);
3902: }
3903: else
3904: {
3905: sf(s_etat_processus, 35);
3906: }
3907:
3908: analyse(s_etat_processus, NULL);
3909:
3910: if (registre_type_evaluation == 'E')
3911: {
3912: sf(s_etat_processus, 35);
3913: }
3914: else
3915: {
3916: cf(s_etat_processus, 35);
3917: }
3918:
3919: (*s_etat_processus).test_instruction = registre_test_2;
3920:
3921: if ((*s_etat_processus).erreur_systeme != d_es)
3922: {
3923: if (presence_egalite == d_vrai)
3924: {
3925: liberation(s_etat_processus, s_objet_evalue);
3926: }
3927:
3928: if ((*s_etat_processus).var_volatile_processus_pere
3929: == 0)
3930: {
3931: envoi_signal_processus((*s_etat_processus)
3932: .pid_processus_pere, rpl_sigalrm,
3933: d_faux);
3934: }
3935: else
3936: {
3937: (*s_etat_processus).var_volatile_alarme = -1;
3938: }
3939:
3940: (*s_etat_processus).instruction_courante =
3941: instruction_courante;
3942: return(d_erreur);
3943: }
3944: else if (((*s_etat_processus).erreur_execution != d_ex) ||
3945: ((*s_etat_processus).exception != d_ep))
3946: {
3947: if ((*s_etat_processus).arret_si_exception == d_faux)
3948: {
3949: /*
3950: * Reprise sur erreur
3951: */
3952:
3953: if ((message = messages(s_etat_processus)) == NULL)
3954: {
3955: if (presence_egalite == d_vrai)
3956: {
3957: liberation(s_etat_processus,
3958: s_objet_evalue);
3959: }
3960:
3961: (*s_etat_processus).instruction_courante =
3962: instruction_courante;
3963: return(d_erreur);
3964: }
3965:
3966: free(message);
3967:
3968: while((*(*s_etat_processus).l_base_pile_systeme)
3969: .clause != 'R')
3970: {
3971: l_registre_atome = l_element_courant;
3972: l_element_courant =
3973: (*l_element_courant).suivant;
3974:
3975: if (l_element_courant == NULL)
3976: {
3977: /*
3978: * La fin de l'expression est atteinte,
3979: * le sequenceur reprend la main.
3980: */
3981:
3982: if (presence_egalite == d_vrai)
3983: {
3984: liberation(s_etat_processus,
3985: s_objet_evalue);
3986: }
3987:
3988: (*s_etat_processus)
3989: .mode_execution_programme =
3990: registre_mode_execution_programme;
3991: return(d_absence_erreur);
3992: }
3993:
3994: if ((*(*l_element_courant).donnee).type == FCT)
3995: {
3996: (*s_etat_processus).instruction_courante =
3997: (*((struct_fonction *)
3998: (*(*l_element_courant).donnee)
3999: .objet)).nom_fonction;
4000:
4001: if (recherche_variable(s_etat_processus,
4002: (*s_etat_processus)
4003: .instruction_courante) == d_faux)
4004: {
4005: (*s_etat_processus).erreur_systeme
4006: = d_es;
4007: fonction = (*((struct_fonction *)
4008: (*(*l_element_courant).donnee)
4009: .objet)).fonction;
4010:
4011: /*
4012: * Traitement de la pile système par les
4013: * différentes instructions.
4014: */
4015:
4016: if (TEST(instruction_if) ||
4017: TEST(instruction_iferr) ||
4018: TEST(instruction_do) ||
4019: TEST(instruction_while) ||
4020: TEST(instruction_for) ||
4021: TEST(instruction_forall) ||
4022: TEST(instruction_start) ||
4023: TEST(instruction_select) ||
4024: TEST(instruction_case) ||
4025: TEST(instruction_critical) ||
4026: TEST(vers_niveau_superieur))
4027: {
4028: if (TEST(vers_niveau_superieur))
4029: {
4030: registre_exception =
4031: (*s_etat_processus)
4032: .exception;
4033: registre_erreur_execution =
4034: (*s_etat_processus)
4035: .erreur_execution;
4036:
4037: analyse(s_etat_processus,
4038: vers_niveau_superieur);
4039:
4040: if ((*s_etat_processus)
4041: .erreur_systeme != d_es)
4042: {
4043: if (presence_egalite ==
4044: d_vrai)
4045: {
4046: liberation(
4047: s_etat_processus,
4048: s_objet_evalue);
4049: }
4050:
4051: (*s_etat_processus)
4052: .instruction_courante =
4053: instruction_courante;
4054: return(d_erreur);
4055: }
4056:
4057: (*s_etat_processus).exception
4058: = registre_exception;
4059: (*s_etat_processus)
4060: .erreur_execution =
4061: registre_erreur_execution;
4062: }
4063: else if (TEST(instruction_for) ||
4064: TEST(instruction_forall) ||
4065: TEST(instruction_start))
4066: {
4067: empilement_pile_systeme(
4068: s_etat_processus);
4069:
4070: if ((*s_etat_processus)
4071: .erreur_systeme != d_es)
4072: {
4073: if (presence_egalite ==
4074: d_vrai)
4075: {
4076: liberation(
4077: s_etat_processus,
4078: s_objet_evalue);
4079: }
4080:
4081: (*s_etat_processus)
4082: .instruction_courante =
4083: instruction_courante;
4084: return(d_erreur);
4085: }
4086:
4087: (*(*s_etat_processus)
4088: .l_base_pile_systeme)
4089: .type_cloture = 'L';
4090: }
4091: else
4092: {
4093: empilement_pile_systeme(
4094: s_etat_processus);
4095:
4096: if ((*s_etat_processus)
4097: .erreur_systeme != d_es)
4098: {
4099: if (presence_egalite ==
4100: d_vrai)
4101: {
4102: liberation(
4103: s_etat_processus,
4104: s_objet_evalue);
4105: }
4106:
4107: (*s_etat_processus)
4108: .instruction_courante =
4109: instruction_courante;
4110: return(d_erreur);
4111: }
4112: }
4113: }
4114: else if (TEST(instruction_end) ||
4115: TEST(instruction_next) ||
4116: TEST(instruction_step) ||
4117: TEST(vers_niveau_inferieur))
4118: {
4119: if (TEST(vers_niveau_inferieur))
4120: {
4121: registre_exception =
4122: (*s_etat_processus)
4123: .exception;
4124: registre_erreur_execution =
4125: (*s_etat_processus)
4126: .erreur_execution;
4127:
4128: analyse(s_etat_processus,
4129: vers_niveau_inferieur);
4130:
4131: if ((*s_etat_processus)
4132: .erreur_systeme != d_es)
4133: {
4134: if (presence_egalite ==
4135: d_vrai)
4136: {
4137: liberation(
4138: s_etat_processus,
4139: s_objet_evalue);
4140: }
4141:
4142: (*s_etat_processus)
4143: .instruction_courante =
4144: instruction_courante;
4145: return(d_erreur);
4146: }
4147:
4148: (*s_etat_processus).exception
4149: = registre_exception;
4150: (*s_etat_processus)
4151: .erreur_execution =
4152: registre_erreur_execution;
4153: }
4154: else if ((TEST(instruction_next) ||
4155: TEST(instruction_step)) &&
4156: ((*(*s_etat_processus)
4157: .l_base_pile_systeme)
4158: .type_cloture != 'L'))
4159: {
4160: /*
4161: * Libération des compteurs
4162: * de boucle
4163: */
4164:
4165: presence_compteur =
4166: (((*(*s_etat_processus)
4167: .l_base_pile_systeme)
4168: .type_cloture == 'F') ||
4169: ((*(*s_etat_processus)
4170: .l_base_pile_systeme)
4171: .type_cloture == 'A'))
4172: ? d_vrai : d_faux;
4173:
4174: if (((*(*s_etat_processus)
4175: .l_base_pile_systeme)
4176: .type_cloture != 'S') &&
4177: (presence_compteur ==
4178: d_faux))
4179: {
4180: (*s_etat_processus)
4181: .erreur_execution =
4182: d_ex_erreur_traitement_boucle;
4183:
4184: if (presence_egalite ==
4185: d_vrai)
4186: {
4187: liberation(
4188: s_etat_processus,
4189: s_objet_evalue);
4190: }
4191:
4192: (*s_etat_processus)
4193: .instruction_courante =
4194: instruction_courante;
4195: return(d_erreur);
4196: }
4197:
4198: if (presence_compteur == d_vrai)
4199: {
4200: if (recherche_variable(
4201: s_etat_processus,
4202: (*(*s_etat_processus)
4203: .l_base_pile_systeme)
4204: .nom_variable) ==
4205: d_faux)
4206: {
4207: (*s_etat_processus)
4208: .erreur_systeme = d_es;
4209: (*s_etat_processus)
4210: .erreur_execution =
4211: d_ex_erreur_traitement_boucle;
4212:
4213: if (presence_egalite ==
4214: d_vrai)
4215: {
4216: liberation(
4217: s_etat_processus,
4218: s_objet_evalue);
4219: }
4220:
4221: (*s_etat_processus)
4222: .instruction_courante =
4223: instruction_courante;
4224: return(d_erreur);
4225: }
4226:
4227: if ((*(*s_etat_processus)
4228: .pointeur_variable_courante)
4229: .objet == NULL)
4230: {
4231: (*s_etat_processus)
4232: .erreur_systeme = d_es;
4233: (*s_etat_processus)
4234: .erreur_execution =
4235: d_ex_variable_partagee;
4236:
4237: if (presence_egalite ==
4238: d_vrai)
4239: {
4240: liberation(
4241: s_etat_processus,
4242: s_objet_evalue);
4243: }
4244:
4245: (*s_etat_processus)
4246: .instruction_courante =
4247: instruction_courante;
4248: return(d_erreur);
4249: }
4250:
4251: (*s_etat_processus)
4252: .niveau_courant--;
4253:
4254: if (
4255: retrait_variables_par_niveau(
4256: s_etat_processus) == d_erreur)
4257: {
4258: if (presence_egalite ==
4259: d_vrai)
4260: {
4261: liberation(
4262: s_etat_processus,
4263: s_objet_evalue);
4264: }
4265:
4266: (*s_etat_processus)
4267: .instruction_courante =
4268: instruction_courante;
4269: return(d_erreur);
4270: }
4271: }
4272:
4273: depilement_pile_systeme(
4274: s_etat_processus);
4275: }
4276: else
4277: {
4278: // Traitement spécifique pour la
4279: // fin d'une section critique
4280:
4281: if ((*s_etat_processus)
4282: .l_base_pile_systeme ==
4283: NULL)
4284: {
4285: (*s_etat_processus)
4286: .erreur_systeme =
4287: d_es_end_incoherent;
4288:
4289: if (presence_egalite ==
4290: d_vrai)
4291: {
4292: liberation(
4293: s_etat_processus,
4294: s_objet_evalue);
4295: }
4296:
4297: (*s_etat_processus)
4298: .instruction_courante =
4299: instruction_courante;
4300: return(d_erreur);
4301: }
4302:
4303: if ((*(*s_etat_processus)
4304: .l_base_pile_systeme)
4305: .type_cloture == 'Q')
4306: {
4307: if (pthread_mutex_unlock(
4308: &mutex_sections_critiques)
4309: != 0)
4310: {
4311: (*s_etat_processus)
4312: .erreur_systeme =
4313: d_es_processus;
4314:
4315: if (presence_egalite ==
4316: d_vrai)
4317: {
4318: liberation(
4319: s_etat_processus,
4320: s_objet_evalue);
4321: }
4322:
4323: (*s_etat_processus)
4324: .instruction_courante =
4325: instruction_courante;
4326: return(d_erreur);
4327: }
4328:
4329: (*s_etat_processus)
4330: .sections_critiques--;
4331: }
4332:
4333: depilement_pile_systeme(
4334: s_etat_processus);
4335:
4336: if ((*s_etat_processus)
4337: .erreur_systeme != d_es)
4338: {
4339: if (presence_egalite ==
4340: d_vrai)
4341: {
4342: liberation(
4343: s_etat_processus,
4344: s_objet_evalue);
4345: }
4346:
4347: (*s_etat_processus)
4348: .instruction_courante =
4349: instruction_courante;
4350: return(d_erreur);
4351: }
4352: }
4353: }
4354: }
4355: }
4356: }
4357:
4358: (*s_etat_processus).instruction_courante =
4359: instruction_courante;
4360: drapeau_then = d_faux;
4361:
4362: do
4363: {
4364: l_element_courant = (*l_element_courant)
4365: .suivant;
4366: l_registre_atome = l_element_courant;
4367:
4368: if (l_element_courant == NULL)
4369: {
4370: /*
4371: * La fin de l'expression est atteinte,
4372: * le sequenceur reprend la main.
4373: */
4374:
4375: if (presence_egalite == d_vrai)
4376: {
4377: liberation(s_etat_processus,
4378: s_objet_evalue);
4379: }
4380:
4381: (*s_etat_processus)
4382: .mode_execution_programme =
4383: registre_mode_execution_programme;
4384: (*s_etat_processus).instruction_courante =
4385: instruction_courante;
4386: return(d_absence_erreur);
4387: }
4388:
4389: if ((*(*l_element_courant).donnee).type == FCT)
4390: {
4391: (*s_etat_processus)
4392: .instruction_courante =
4393: (*((struct_fonction *)
4394: (*(*l_element_courant).donnee)
4395: .objet)).nom_fonction;
4396: fonction = (*((struct_fonction *)
4397: (*(*l_element_courant).donnee)
4398: .objet)).fonction;
4399: (*s_etat_processus).instruction_courante =
4400: instruction_courante;
4401:
4402: drapeau_then = TEST(instruction_then)
4403: ? d_vrai : d_faux;
4404: }
4405: } while(drapeau_then == d_faux);
4406:
4407: (*s_etat_processus).expression_courante =
4408: l_registre_atome;
4409:
4410: (*(*s_etat_processus).l_base_pile_systeme)
4411: .clause = 'X';
4412: instruction_then(s_etat_processus);
4413:
4414: (*s_etat_processus).exception = d_ep;
4415: (*s_etat_processus).erreur_execution = d_ex;
4416: }
4417: else if ((*s_etat_processus).mode_evaluation_expression
4418: == 'Y')
4419: {
4420: /*
4421: * Reprise sur erreur
4422: */
4423:
4424: while(l_element_courant != NULL)
4425: {
4426: if ((*(*l_element_courant).donnee).type == FCT)
4427: {
4428: (*s_etat_processus).instruction_courante =
4429: (*((struct_fonction *)
4430: (*(*l_element_courant).donnee)
4431: .objet)).nom_fonction;
4432: fonction = (*((struct_fonction *)
4433: (*(*l_element_courant).donnee)
4434: .objet)).fonction;
4435:
4436: if (recherche_variable(s_etat_processus,
4437: (*s_etat_processus)
4438: .instruction_courante) == d_faux)
4439: {
4440: (*s_etat_processus).erreur_systeme
4441: = d_es;
4442:
4443: /*
4444: * Traitement de la pile système par les
4445: * différentes instructions.
4446: */
4447:
4448: if (TEST(instruction_if) ||
4449: TEST(instruction_iferr) ||
4450: TEST(instruction_do) ||
4451: TEST(instruction_while) ||
4452: TEST(instruction_for) ||
4453: TEST(instruction_forall) ||
4454: TEST(instruction_start) ||
4455: TEST(instruction_select) ||
4456: TEST(instruction_case) ||
4457: TEST(instruction_critical) ||
4458: TEST(vers_niveau_superieur))
4459: {
4460: if (TEST(vers_niveau_superieur))
4461: {
4462: analyse(s_etat_processus,
4463: vers_niveau_superieur);
4464:
4465: if ((*s_etat_processus)
4466: .erreur_systeme != d_es)
4467: {
4468: if (presence_egalite ==
4469: d_vrai)
4470: {
4471: liberation(
4472: s_etat_processus,
4473: s_objet_evalue);
4474: }
4475:
4476: (*s_etat_processus)
4477: .instruction_courante =
4478: instruction_courante;
4479: return(d_erreur);
4480: }
4481: }
4482: else if (TEST(instruction_for) ||
4483: TEST(instruction_forall) ||
4484: TEST(instruction_start))
4485: {
4486: empilement_pile_systeme(
4487: s_etat_processus);
4488:
4489: if ((*s_etat_processus)
4490: .erreur_systeme != d_es)
4491: {
4492: if (presence_egalite ==
4493: d_vrai)
4494: {
4495: liberation(
4496: s_etat_processus,
4497: s_objet_evalue);
4498: }
4499:
4500: (*s_etat_processus)
4501: .instruction_courante =
4502: instruction_courante;
4503: return(d_erreur);
4504: }
4505:
4506: (*(*s_etat_processus)
4507: .l_base_pile_systeme)
4508: .type_cloture = 'L';
4509: }
4510: else
4511: {
4512: empilement_pile_systeme(
4513: s_etat_processus);
4514:
4515: if ((*s_etat_processus)
4516: .erreur_systeme != d_es)
4517: {
4518: if (presence_egalite ==
4519: d_vrai)
4520: {
4521: liberation(
4522: s_etat_processus,
4523: s_objet_evalue);
4524: }
4525:
4526: (*s_etat_processus)
4527: .instruction_courante =
4528: instruction_courante;
4529: return(d_erreur);
4530: }
4531: }
4532: }
4533: else if (TEST(instruction_end) ||
4534: TEST(instruction_next) ||
4535: TEST(instruction_step) ||
4536: TEST(vers_niveau_inferieur))
4537: {
4538: if (TEST(vers_niveau_inferieur))
4539: {
4540: analyse(s_etat_processus,
4541: vers_niveau_inferieur);
4542:
4543: if ((*s_etat_processus)
4544: .erreur_systeme != d_es)
4545: {
4546: if (presence_egalite ==
4547: d_vrai)
4548: {
4549: liberation(
4550: s_etat_processus,
4551: s_objet_evalue);
4552: }
4553:
4554: (*s_etat_processus)
4555: .instruction_courante =
4556: instruction_courante;
4557: return(d_erreur);
4558: }
4559: }
4560: else if ((TEST(instruction_next) ||
4561: TEST(instruction_step)) &&
4562: ((*(*s_etat_processus)
4563: .l_base_pile_systeme)
4564: .type_cloture != 'L'))
4565: {
4566: /*
4567: * Libération des compteurs
4568: * de boucle
4569: */
4570:
4571: presence_compteur =
4572: (((*(*s_etat_processus)
4573: .l_base_pile_systeme)
4574: .type_cloture == 'F') ||
4575: ((*(*s_etat_processus)
4576: .l_base_pile_systeme)
4577: .type_cloture == 'A'))
4578: ? d_vrai : d_faux;
4579:
4580: if (((*(*s_etat_processus)
4581: .l_base_pile_systeme)
4582: .type_cloture != 'S') &&
4583: (presence_compteur ==
4584: d_faux))
4585: {
4586: (*s_etat_processus)
4587: .erreur_execution =
4588: d_ex_erreur_traitement_boucle;
4589:
4590: if (presence_egalite ==
4591: d_vrai)
4592: {
4593: liberation(
4594: s_etat_processus,
4595: s_objet_evalue);
4596: }
4597:
4598: (*s_etat_processus)
4599: .instruction_courante =
4600: instruction_courante;
4601: return(d_erreur);
4602: }
4603:
4604: if (presence_compteur == d_vrai)
4605: {
4606: if (recherche_variable(
4607: s_etat_processus,
4608: (*(*s_etat_processus)
4609: .l_base_pile_systeme)
4610: .nom_variable) ==
4611: d_faux)
4612: {
4613: (*s_etat_processus)
4614: .erreur_systeme = d_es;
4615: (*s_etat_processus)
4616: .erreur_execution =
4617: d_ex_erreur_traitement_boucle;
4618:
4619: if (presence_egalite ==
4620: d_vrai)
4621: {
4622: liberation(
4623: s_etat_processus,
4624: s_objet_evalue);
4625: }
4626:
4627: (*s_etat_processus)
4628: .instruction_courante =
4629: instruction_courante;
4630: return(d_erreur);
4631: }
4632:
4633: if ((*(*s_etat_processus)
4634: .pointeur_variable_courante)
4635: .objet == NULL)
4636: {
4637: (*s_etat_processus)
4638: .erreur_systeme = d_es;
4639: (*s_etat_processus)
4640: .erreur_execution =
4641: d_ex_variable_partagee;
4642:
4643: if (presence_egalite ==
4644: d_vrai)
4645: {
4646: liberation(
4647: s_etat_processus,
4648: s_objet_evalue);
4649: }
4650:
4651: (*s_etat_processus)
4652: .instruction_courante =
4653: instruction_courante;
4654: return(d_erreur);
4655: }
4656:
4657: (*s_etat_processus)
4658: .niveau_courant--;
4659:
4660: if (
4661: retrait_variables_par_niveau(
4662: s_etat_processus) == d_erreur)
4663: {
4664: if (presence_egalite ==
4665: d_vrai)
4666: {
4667: liberation(
4668: s_etat_processus,
4669: s_objet_evalue);
4670: }
4671:
4672: (*s_etat_processus)
4673: .instruction_courante =
4674: instruction_courante;
4675: return(d_erreur);
4676: }
4677: }
4678:
4679: depilement_pile_systeme(
4680: s_etat_processus);
4681: }
4682: else
4683: {
4684: // Traitement spécifique pour la
4685: // fin d'une section critique
4686:
4687: if ((*s_etat_processus)
4688: .l_base_pile_systeme ==
4689: NULL)
4690: {
4691: (*s_etat_processus)
4692: .erreur_systeme =
4693: d_es_end_incoherent;
4694:
4695: if (presence_egalite ==
4696: d_vrai)
4697: {
4698: liberation(
4699: s_etat_processus,
4700: s_objet_evalue);
4701: }
4702:
4703: (*s_etat_processus)
4704: .instruction_courante =
4705: instruction_courante;
4706: return(d_erreur);
4707: }
4708:
4709: if ((*(*s_etat_processus)
4710: .l_base_pile_systeme)
4711: .type_cloture == 'Q')
4712: {
4713: if (pthread_mutex_unlock(
4714: &mutex_sections_critiques)
4715: != 0)
4716: {
4717: (*s_etat_processus)
4718: .erreur_systeme =
4719: d_es_processus;
4720:
4721: if (presence_egalite ==
4722: d_vrai)
4723: {
4724: liberation(
4725: s_etat_processus,
4726: s_objet_evalue);
4727: }
4728:
4729: (*s_etat_processus)
4730: .instruction_courante =
4731: instruction_courante;
4732: return(d_erreur);
4733: }
4734:
4735: (*s_etat_processus)
4736: .sections_critiques--;
4737: }
4738:
4739: depilement_pile_systeme(
4740: s_etat_processus);
4741:
4742: if ((*s_etat_processus)
4743: .erreur_systeme != d_es)
4744: {
4745: if (presence_egalite ==
4746: d_vrai)
4747: {
4748: liberation(
4749: s_etat_processus,
4750: s_objet_evalue);
4751: }
4752:
4753: (*s_etat_processus)
4754: .instruction_courante =
4755: instruction_courante;
4756: return(d_erreur);
4757: }
4758: }
4759: }
4760: }
4761: }
4762:
4763: l_element_courant =
4764: (*l_element_courant).suivant;
4765: }
4766:
4767: (*s_etat_processus).mode_execution_programme =
4768: registre_mode_execution_programme;
4769: (*s_etat_processus).instruction_courante =
4770: instruction_courante;
4771:
4772: (*s_etat_processus).exception = d_ep;
4773: (*s_etat_processus).erreur_execution = d_ex;
4774:
4775: erreur_evaluation = d_erreur;
4776: }
4777: else
4778: {
4779: // On ne détruit pas les variables pour les inclure
4780: // dans le fichier rpl-core.
4781:
4782: (*s_etat_processus).gel_liste_variables = d_vrai;
4783:
4784: registre_erreur_execution =
4785: (*s_etat_processus).erreur_execution;
4786: registre_exception =
4787: (*s_etat_processus).exception;
4788: registre_erreur_systeme =
4789: (*s_etat_processus).erreur_systeme;
4790:
4791: (*s_etat_processus).s_objet_errone = s_objet;
4792: (*s_etat_processus).s_objet_erreur =
4793: (*l_element_courant).donnee;
4794:
4795: l_element_courant = (*l_element_courant).suivant;
4796:
4797: while(l_element_courant != NULL)
4798: {
4799: if ((*(*l_element_courant).donnee).type == FCT)
4800: {
4801: (*s_etat_processus).instruction_courante =
4802: (*((struct_fonction *)
4803: (*(*l_element_courant).donnee)
4804: .objet)).nom_fonction;
4805: fonction = (*((struct_fonction *)
4806: (*(*l_element_courant).donnee)
4807: .objet)).fonction;
4808:
4809: if (recherche_variable(s_etat_processus,
4810: (*s_etat_processus)
4811: .instruction_courante) == d_faux)
4812: {
4813: (*s_etat_processus).erreur_systeme
4814: = d_es;
4815:
4816: /*
4817: * Traitement de la pile système par les
4818: * différentes instructions.
4819: */
4820:
4821: if (TEST(instruction_if) ||
4822: TEST(instruction_iferr) ||
4823: TEST(instruction_do) ||
4824: TEST(instruction_while) ||
4825: TEST(instruction_for) ||
4826: TEST(instruction_forall) ||
4827: TEST(instruction_start) ||
4828: TEST(instruction_select) ||
4829: TEST(instruction_case) ||
4830: TEST(instruction_critical) ||
4831: TEST(vers_niveau_superieur))
4832: {
4833: if (TEST(vers_niveau_superieur))
4834: {
4835: analyse(s_etat_processus,
4836: vers_niveau_superieur);
4837:
4838: if ((*s_etat_processus)
4839: .erreur_systeme != d_es)
4840: {
4841: if (presence_egalite ==
4842: d_vrai)
4843: {
4844: liberation(
4845: s_etat_processus,
4846: s_objet_evalue);
4847: }
4848:
4849: (*s_etat_processus)
4850: .instruction_courante =
4851: instruction_courante;
4852: return(d_erreur);
4853: }
4854: }
4855: else if (TEST(instruction_for) ||
4856: TEST(instruction_forall) ||
4857: TEST(instruction_start))
4858: {
4859: empilement_pile_systeme(
4860: s_etat_processus);
4861:
4862: if ((*s_etat_processus)
4863: .erreur_systeme != d_es)
4864: {
4865: if (presence_egalite ==
4866: d_vrai)
4867: {
4868: liberation(
4869: s_etat_processus,
4870: s_objet_evalue);
4871: }
4872:
4873: (*s_etat_processus)
4874: .instruction_courante =
4875: instruction_courante;
4876: return(d_erreur);
4877: }
4878:
4879: (*(*s_etat_processus)
4880: .l_base_pile_systeme)
4881: .type_cloture = 'L';
4882: }
4883: else
4884: {
4885: empilement_pile_systeme(
4886: s_etat_processus);
4887:
4888: if ((*s_etat_processus)
4889: .erreur_systeme != d_es)
4890: {
4891: if (presence_egalite ==
4892: d_vrai)
4893: {
4894: liberation(
4895: s_etat_processus,
4896: s_objet_evalue);
4897: }
4898:
4899: (*s_etat_processus)
4900: .instruction_courante =
4901: instruction_courante;
4902: return(d_erreur);
4903: }
4904: }
4905: }
4906: else if (TEST(instruction_end) ||
4907: TEST(instruction_next) ||
4908: TEST(instruction_step) ||
4909: TEST(vers_niveau_inferieur))
4910: {
4911: if (TEST(vers_niveau_inferieur))
4912: {
4913: analyse(s_etat_processus,
4914: vers_niveau_inferieur);
4915:
4916: if ((*s_etat_processus)
4917: .erreur_systeme != d_es)
4918: {
4919: if (presence_egalite ==
4920: d_vrai)
4921: {
4922: liberation(
4923: s_etat_processus,
4924: s_objet_evalue);
4925: }
4926:
4927: (*s_etat_processus)
4928: .instruction_courante =
4929: instruction_courante;
4930: return(d_erreur);
4931: }
4932: }
4933: else if ((TEST(instruction_next) ||
4934: TEST(instruction_step)) &&
4935: ((*(*s_etat_processus)
4936: .l_base_pile_systeme)
4937: .type_cloture != 'L'))
4938: {
4939: /*
4940: * Libération des compteurs
4941: * de boucle
4942: */
4943:
4944: presence_compteur =
4945: (((*(*s_etat_processus)
4946: .l_base_pile_systeme)
4947: .type_cloture == 'F') ||
4948: ((*(*s_etat_processus)
4949: .l_base_pile_systeme)
4950: .type_cloture == 'A'))
4951: ? d_vrai : d_faux;
4952:
4953: if (((*(*s_etat_processus)
4954: .l_base_pile_systeme)
4955: .type_cloture != 'S') &&
4956: (presence_compteur ==
4957: d_faux))
4958: {
4959: (*s_etat_processus)
4960: .erreur_execution =
4961: d_ex_erreur_traitement_boucle;
4962:
4963: if (presence_egalite ==
4964: d_vrai)
4965: {
4966: liberation(
4967: s_etat_processus,
4968: s_objet_evalue);
4969: }
4970:
4971: (*s_etat_processus)
4972: .instruction_courante =
4973: instruction_courante;
4974: return(d_erreur);
4975: }
4976:
4977: if (presence_compteur == d_vrai)
4978: {
4979: if (recherche_variable(
4980: s_etat_processus,
4981: (*(*s_etat_processus)
4982: .l_base_pile_systeme)
4983: .nom_variable) ==
4984: d_faux)
4985: {
4986: (*s_etat_processus)
4987: .erreur_systeme = d_es;
4988: (*s_etat_processus)
4989: .erreur_execution =
4990: d_ex_erreur_traitement_boucle;
4991:
4992: if (presence_egalite ==
4993: d_vrai)
4994: {
4995: liberation(
4996: s_etat_processus,
4997: s_objet_evalue);
4998: }
4999:
5000: (*s_etat_processus)
5001: .instruction_courante =
5002: instruction_courante;
5003: return(d_erreur);
5004: }
5005:
5006: if ((*(*s_etat_processus)
5007: .pointeur_variable_courante)
5008: .objet == NULL)
5009: {
5010: (*s_etat_processus)
5011: .erreur_systeme = d_es;
5012: (*s_etat_processus)
5013: .erreur_execution =
5014: d_ex_variable_partagee;
5015:
5016: if (presence_egalite ==
5017: d_vrai)
5018: {
5019: liberation(
5020: s_etat_processus,
5021: s_objet_evalue);
5022: }
5023:
5024: (*s_etat_processus)
5025: .instruction_courante =
5026: instruction_courante;
5027: return(d_erreur);
5028: }
5029:
5030: (*s_etat_processus)
5031: .niveau_courant--;
5032:
5033: if (
5034: retrait_variables_par_niveau(
5035: s_etat_processus) == d_erreur)
5036: {
5037: if (presence_egalite ==
5038: d_vrai)
5039: {
5040: liberation(
5041: s_etat_processus,
5042: s_objet_evalue);
5043: }
5044:
5045: (*s_etat_processus)
5046: .instruction_courante =
5047: instruction_courante;
5048: return(d_erreur);
5049: }
5050: }
5051:
5052: depilement_pile_systeme(
5053: s_etat_processus);
5054: }
5055: else
5056: {
5057: // Traitement spécifique pour la
5058: // fin d'une section critique
5059:
5060: if ((*s_etat_processus)
5061: .l_base_pile_systeme ==
5062: NULL)
5063: {
5064: (*s_etat_processus)
5065: .erreur_systeme =
5066: d_es_end_incoherent;
5067:
5068: if (presence_egalite ==
5069: d_vrai)
5070: {
5071: liberation(
5072: s_etat_processus,
5073: s_objet_evalue);
5074: }
5075:
5076: (*s_etat_processus)
5077: .instruction_courante =
5078: instruction_courante;
5079: return(d_erreur);
5080: }
5081:
5082: if ((*(*s_etat_processus)
5083: .l_base_pile_systeme)
5084: .type_cloture == 'Q')
5085: {
5086: if (pthread_mutex_unlock(
5087: &mutex_sections_critiques)
5088: != 0)
5089: {
5090: (*s_etat_processus)
5091: .erreur_systeme =
5092: d_es_processus;
5093:
5094: if (presence_egalite ==
5095: d_vrai)
5096: {
5097: liberation(
5098: s_etat_processus,
5099: s_objet_evalue);
5100: }
5101:
5102: (*s_etat_processus)
5103: .instruction_courante =
5104: instruction_courante;
5105: return(d_erreur);
5106: }
5107:
5108: (*s_etat_processus)
5109: .sections_critiques--;
5110: }
5111:
5112: depilement_pile_systeme(
5113: s_etat_processus);
5114:
5115: if ((*s_etat_processus)
5116: .erreur_systeme != d_es)
5117: {
5118: if (presence_egalite ==
5119: d_vrai)
5120: {
5121: liberation(
5122: s_etat_processus,
5123: s_objet_evalue);
5124: }
5125:
5126: (*s_etat_processus)
5127: .instruction_courante =
5128: instruction_courante;
5129: return(d_erreur);
5130: }
5131: }
5132: }
5133: }
5134: }
5135:
5136: l_element_courant =
5137: (*l_element_courant).suivant;
5138: }
5139:
5140: (*s_etat_processus).mode_execution_programme =
5141: registre_mode_execution_programme;
5142: (*s_etat_processus).instruction_courante =
5143: instruction_courante;
5144:
5145: if (presence_egalite == d_vrai)
5146: {
5147: liberation(s_etat_processus, s_objet_evalue);
5148: }
5149:
5150: if ((*s_etat_processus)
5151: .var_volatile_processus_pere == 0)
5152: {
5153: envoi_signal_processus((*s_etat_processus)
5154: .pid_processus_pere, rpl_sigalrm,
5155: d_faux);
5156: }
5157: else
5158: {
5159: (*s_etat_processus).var_volatile_alarme = -1;
5160: }
5161:
5162: (*s_etat_processus).erreur_execution =
5163: registre_erreur_execution;
5164: (*s_etat_processus).erreur_systeme =
5165: registre_erreur_systeme;
5166: (*s_etat_processus).exception =
5167: registre_exception;
5168: return(d_erreur);
5169: }
5170: }
5171:
5172: if ((*s_etat_processus).erreur_systeme != d_es)
5173: {
5174: if (presence_egalite == d_vrai)
5175: {
5176: liberation(s_etat_processus, s_objet_evalue);
5177: }
5178:
5179: if ((*s_etat_processus).var_volatile_processus_pere
5180: == 0)
5181: {
5182: envoi_signal_processus((*s_etat_processus)
5183: .pid_processus_pere, rpl_sigalrm,
5184: d_faux);
5185: }
5186: else
5187: {
5188: (*s_etat_processus).var_volatile_alarme = -1;
5189: }
5190:
5191: (*s_etat_processus).instruction_courante =
5192: instruction_courante;
5193: return(d_erreur);
5194: }
5195: else if (((*s_etat_processus).erreur_execution != d_ex) ||
5196: ((*s_etat_processus).exception != d_ep))
5197: {
5198: if ((*s_etat_processus).arret_si_exception == d_faux)
5199: {
5200: /*
5201: * Reprise sur erreur
5202: */
5203:
5204: if ((message = messages(s_etat_processus)) == NULL)
5205: {
5206: if (presence_egalite == d_vrai)
5207: {
5208: liberation(s_etat_processus,
5209: s_objet_evalue);
5210: }
5211:
5212: (*s_etat_processus).instruction_courante =
5213: instruction_courante;
5214: return(d_erreur);
5215: }
5216:
5217: free(message);
5218:
5219: l_registre_atome = l_element_courant;
5220:
5221: while((*(*s_etat_processus).l_base_pile_systeme)
5222: .clause != 'R')
5223: {
5224: l_registre_atome = l_element_courant;
5225: l_element_courant =
5226: (*l_element_courant).suivant;
5227:
5228: if (l_element_courant == NULL)
5229: {
5230: /*
5231: * La fin de l'expression est atteinte,
5232: * le sequenceur reprend la main.
5233: */
5234:
5235: if (presence_egalite == d_vrai)
5236: {
5237: liberation(s_etat_processus,
5238: s_objet_evalue);
5239: }
5240:
5241: (*s_etat_processus)
5242: .mode_execution_programme =
5243: registre_mode_execution_programme;
5244: return(d_absence_erreur);
5245: }
5246:
5247: if ((*(*l_element_courant).donnee).type == FCT)
5248: {
5249: (*s_etat_processus).instruction_courante =
5250: (*((struct_fonction *)
5251: (*(*l_element_courant).donnee)
5252: .objet)).nom_fonction;
5253:
5254: if (recherche_variable(s_etat_processus,
5255: (*s_etat_processus)
5256: .instruction_courante) == d_faux)
5257: {
5258: (*s_etat_processus).erreur_systeme
5259: = d_es;
5260: fonction = (*((struct_fonction *)
5261: (*(*l_element_courant).donnee)
5262: .objet)).fonction;
5263:
5264: /*
5265: * Traitement de la pile système par les
5266: * différentes instructions.
5267: */
5268:
5269: if (TEST(instruction_if) ||
5270: TEST(instruction_iferr) ||
5271: TEST(instruction_do) ||
5272: TEST(instruction_while) ||
5273: TEST(instruction_for) ||
5274: TEST(instruction_forall) ||
5275: TEST(instruction_start) ||
5276: TEST(instruction_select) ||
5277: TEST(instruction_case) ||
5278: TEST(instruction_critical) ||
5279: TEST(vers_niveau_superieur))
5280: {
5281: if (TEST(vers_niveau_superieur))
5282: {
5283: registre_exception =
5284: (*s_etat_processus)
5285: .exception;
5286: registre_erreur_execution =
5287: (*s_etat_processus)
5288: .erreur_execution;
5289:
5290: analyse(s_etat_processus,
5291: vers_niveau_superieur);
5292:
5293: if ((*s_etat_processus)
5294: .erreur_systeme != d_es)
5295: {
5296: if (presence_egalite ==
5297: d_vrai)
5298: {
5299: liberation(
5300: s_etat_processus,
5301: s_objet_evalue);
5302: }
5303:
5304: (*s_etat_processus)
5305: .instruction_courante =
5306: instruction_courante;
5307: return(d_erreur);
5308: }
5309:
5310: (*s_etat_processus).exception
5311: = registre_exception;
5312: (*s_etat_processus)
5313: .erreur_execution =
5314: registre_erreur_execution;
5315: }
5316: else if (TEST(instruction_for) ||
5317: TEST(instruction_forall) ||
5318: TEST(instruction_start))
5319: {
5320: empilement_pile_systeme(
5321: s_etat_processus);
5322:
5323: if ((*s_etat_processus)
5324: .erreur_systeme != d_es)
5325: {
5326: if (presence_egalite ==
5327: d_vrai)
5328: {
5329: liberation(
5330: s_etat_processus,
5331: s_objet_evalue);
5332: }
5333:
5334: (*s_etat_processus)
5335: .instruction_courante =
5336: instruction_courante;
5337: return(d_erreur);
5338: }
5339:
5340: (*(*s_etat_processus)
5341: .l_base_pile_systeme)
5342: .type_cloture = 'L';
5343: }
5344: else
5345: {
5346: empilement_pile_systeme(
5347: s_etat_processus);
5348:
5349: if ((*s_etat_processus)
5350: .erreur_systeme != d_es)
5351: {
5352: if (presence_egalite ==
5353: d_vrai)
5354: {
5355: liberation(
5356: s_etat_processus,
5357: s_objet_evalue);
5358: }
5359:
5360: (*s_etat_processus)
5361: .instruction_courante =
5362: instruction_courante;
5363: return(d_erreur);
5364: }
5365: }
5366: }
5367: else if (TEST(instruction_end) ||
5368: TEST(instruction_next) ||
5369: TEST(instruction_step) ||
5370: TEST(vers_niveau_inferieur))
5371: {
5372: if (TEST(vers_niveau_inferieur))
5373: {
5374: registre_exception =
5375: (*s_etat_processus)
5376: .exception;
5377: registre_erreur_execution =
5378: (*s_etat_processus)
5379: .erreur_execution;
5380:
5381: analyse(s_etat_processus,
5382: vers_niveau_inferieur);
5383:
5384: if ((*s_etat_processus)
5385: .erreur_systeme != d_es)
5386: {
5387: if (presence_egalite ==
5388: d_vrai)
5389: {
5390: liberation(
5391: s_etat_processus,
5392: s_objet_evalue);
5393: }
5394:
5395: (*s_etat_processus)
5396: .instruction_courante =
5397: instruction_courante;
5398: return(d_erreur);
5399: }
5400:
5401: (*s_etat_processus).exception
5402: = registre_exception;
5403: (*s_etat_processus)
5404: .erreur_execution =
5405: registre_erreur_execution;
5406: }
5407: else if ((TEST(instruction_next) ||
5408: TEST(instruction_step)) &&
5409: ((*(*s_etat_processus)
5410: .l_base_pile_systeme)
5411: .type_cloture != 'L'))
5412: {
5413: /*
5414: * Libération des compteurs
5415: * de boucle
5416: */
5417:
5418: presence_compteur =
5419: (((*(*s_etat_processus)
5420: .l_base_pile_systeme)
5421: .type_cloture == 'F') ||
5422: ((*(*s_etat_processus)
5423: .l_base_pile_systeme)
5424: .type_cloture == 'A'))
5425: ? d_vrai : d_faux;
5426:
5427: if (((*(*s_etat_processus)
5428: .l_base_pile_systeme)
5429: .type_cloture != 'S') &&
5430: (presence_compteur ==
5431: d_faux))
5432: {
5433: (*s_etat_processus)
5434: .erreur_execution =
5435: d_ex_erreur_traitement_boucle;
5436:
5437: if (presence_egalite ==
5438: d_vrai)
5439: {
5440: liberation(
5441: s_etat_processus,
5442: s_objet_evalue);
5443: }
5444:
5445: (*s_etat_processus)
5446: .instruction_courante =
5447: instruction_courante;
5448: return(d_erreur);
5449: }
5450:
5451: if (presence_compteur == d_vrai)
5452: {
5453: if (recherche_variable(
5454: s_etat_processus,
5455: (*(*s_etat_processus)
5456: .l_base_pile_systeme)
5457: .nom_variable) ==
5458: d_faux)
5459: {
5460: (*s_etat_processus)
5461: .erreur_systeme = d_es;
5462: (*s_etat_processus)
5463: .erreur_execution =
5464: d_ex_erreur_traitement_boucle;
5465:
5466: if (presence_egalite ==
5467: d_vrai)
5468: {
5469: liberation(
5470: s_etat_processus,
5471: s_objet_evalue);
5472: }
5473:
5474: (*s_etat_processus)
5475: .instruction_courante =
5476: instruction_courante;
5477: return(d_erreur);
5478: }
5479:
5480: if ((*(*s_etat_processus)
5481: .pointeur_variable_courante)
5482: .objet == NULL)
5483: {
5484: (*s_etat_processus)
5485: .erreur_systeme = d_es;
5486: (*s_etat_processus)
5487: .erreur_execution =
5488: d_ex_variable_partagee;
5489:
5490: if (presence_egalite ==
5491: d_vrai)
5492: {
5493: liberation(
5494: s_etat_processus,
5495: s_objet_evalue);
5496: }
5497:
5498: (*s_etat_processus)
5499: .instruction_courante =
5500: instruction_courante;
5501: return(d_erreur);
5502: }
5503:
5504: (*s_etat_processus)
5505: .niveau_courant--;
5506:
5507: if (
5508: retrait_variables_par_niveau(
5509: s_etat_processus) == d_erreur)
5510: {
5511: if (presence_egalite ==
5512: d_vrai)
5513: {
5514: liberation(
5515: s_etat_processus,
5516: s_objet_evalue);
5517: }
5518:
5519: (*s_etat_processus)
5520: .instruction_courante =
5521: instruction_courante;
5522: return(d_erreur);
5523: }
5524: }
5525:
5526: depilement_pile_systeme(
5527: s_etat_processus);
5528: }
5529: else
5530: {
5531: // Traitement spécifique pour la
5532: // fin d'une section critique
5533:
5534: if ((*s_etat_processus)
5535: .l_base_pile_systeme ==
5536: NULL)
5537: {
5538: (*s_etat_processus)
5539: .erreur_systeme =
5540: d_es_end_incoherent;
5541:
5542: if (presence_egalite ==
5543: d_vrai)
5544: {
5545: liberation(
5546: s_etat_processus,
5547: s_objet_evalue);
5548: }
5549:
5550: (*s_etat_processus)
5551: .instruction_courante =
5552: instruction_courante;
5553: return(d_erreur);
5554: }
5555:
5556: if ((*(*s_etat_processus)
5557: .l_base_pile_systeme)
5558: .type_cloture == 'Q')
5559: {
5560: if (pthread_mutex_unlock(
5561: &mutex_sections_critiques)
5562: != 0)
5563: {
5564: (*s_etat_processus)
5565: .erreur_systeme =
5566: d_es_processus;
5567:
5568: if (presence_egalite ==
5569: d_vrai)
5570: {
5571: liberation(
5572: s_etat_processus,
5573: s_objet_evalue);
5574: }
5575:
5576: (*s_etat_processus)
5577: .instruction_courante =
5578: instruction_courante;
5579: return(d_erreur);
5580: }
5581:
5582: (*s_etat_processus)
5583: .sections_critiques--;
5584: }
5585:
5586: depilement_pile_systeme(
5587: s_etat_processus);
5588:
5589: if ((*s_etat_processus)
5590: .erreur_systeme != d_es)
5591: {
5592: if (presence_egalite ==
5593: d_vrai)
5594: {
5595: liberation(
5596: s_etat_processus,
5597: s_objet_evalue);
5598: }
5599:
5600: (*s_etat_processus)
5601: .instruction_courante =
5602: instruction_courante;
5603: return(d_erreur);
5604: }
5605: }
5606: }
5607: }
5608: }
5609: }
5610:
5611: (*s_etat_processus).instruction_courante =
5612: instruction_courante;
5613: drapeau_then = d_faux;
5614:
5615: do
5616: {
5617: (*s_etat_processus).expression_courante =
5618: l_registre_atome;
5619: l_registre_atome = l_element_courant;
5620:
5621: if (l_element_courant == NULL)
5622: {
5623: /*
5624: * La fin de l'expression est atteinte,
5625: * le séquenceur reprend la main.
5626: */
5627:
5628: if (presence_egalite == d_vrai)
5629: {
5630: liberation(s_etat_processus,
5631: s_objet_evalue);
5632: }
5633:
5634: (*s_etat_processus)
5635: .mode_execution_programme =
5636: registre_mode_execution_programme;
5637: (*s_etat_processus).instruction_courante =
5638: instruction_courante;
5639: return(d_absence_erreur);
5640: }
5641:
5642: if ((*(*l_element_courant).donnee).type == FCT)
5643: {
5644: (*s_etat_processus)
5645: .instruction_courante =
5646: (*((struct_fonction *)
5647: (*(*l_element_courant).donnee)
5648: .objet)).nom_fonction;
5649: fonction = (*((struct_fonction *)
5650: (*(*l_element_courant).donnee)
5651: .objet)).fonction;
5652: (*s_etat_processus).instruction_courante =
5653: instruction_courante;
5654:
5655: drapeau_then = TEST(instruction_then)
5656: ? d_vrai : d_faux;
5657: }
5658:
5659: l_element_courant = (*l_element_courant)
5660: .suivant;
5661: } while(drapeau_then == d_faux);
5662:
5663: (*(*s_etat_processus).l_base_pile_systeme)
5664: .clause = 'X';
5665: instruction_then(s_etat_processus);
5666:
5667: (*s_etat_processus).exception = d_ep;
5668: (*s_etat_processus).erreur_execution = d_ex;
5669: }
5670: else if ((*s_etat_processus).mode_evaluation_expression
5671: == 'Y')
5672: {
5673: /*
5674: * Reprise sur erreur
5675: */
5676:
5677: while(l_element_courant != NULL)
5678: {
5679: if ((*(*l_element_courant).donnee).type == FCT)
5680: {
5681: (*s_etat_processus).instruction_courante =
5682: (*((struct_fonction *)
5683: (*(*l_element_courant).donnee)
5684: .objet)).nom_fonction;
5685: fonction = (*((struct_fonction *)
5686: (*(*l_element_courant).donnee)
5687: .objet)).fonction;
5688:
5689: if (recherche_variable(s_etat_processus,
5690: (*s_etat_processus)
5691: .instruction_courante) == d_faux)
5692: {
5693: (*s_etat_processus).erreur_systeme
5694: = d_es;
5695:
5696: /*
5697: * Traitement de la pile système par les
5698: * différentes instructions.
5699: */
5700:
5701: if (TEST(instruction_if) ||
5702: TEST(instruction_iferr) ||
5703: TEST(instruction_do) ||
5704: TEST(instruction_while) ||
5705: TEST(instruction_for) ||
5706: TEST(instruction_forall) ||
5707: TEST(instruction_start) ||
5708: TEST(instruction_select) ||
5709: TEST(instruction_case) ||
5710: TEST(instruction_critical) ||
5711: TEST(vers_niveau_superieur))
5712: {
5713: if (TEST(vers_niveau_superieur))
5714: {
5715: analyse(s_etat_processus,
5716: vers_niveau_superieur);
5717:
5718: if ((*s_etat_processus)
5719: .erreur_systeme != d_es)
5720: {
5721: if (presence_egalite ==
5722: d_vrai)
5723: {
5724: liberation(
5725: s_etat_processus,
5726: s_objet_evalue);
5727: }
5728:
5729: (*s_etat_processus)
5730: .instruction_courante =
5731: instruction_courante;
5732: return(d_erreur);
5733: }
5734: }
5735: else if (TEST(instruction_for) ||
5736: TEST(instruction_forall) ||
5737: TEST(instruction_start))
5738: {
5739: empilement_pile_systeme(
5740: s_etat_processus);
5741:
5742: if ((*s_etat_processus)
5743: .erreur_systeme != d_es)
5744: {
5745: if (presence_egalite ==
5746: d_vrai)
5747: {
5748: liberation(
5749: s_etat_processus,
5750: s_objet_evalue);
5751: }
5752:
5753: (*s_etat_processus)
5754: .instruction_courante =
5755: instruction_courante;
5756: return(d_erreur);
5757: }
5758:
5759: (*(*s_etat_processus)
5760: .l_base_pile_systeme)
5761: .type_cloture = 'L';
5762: }
5763: else
5764: {
5765: empilement_pile_systeme(
5766: s_etat_processus);
5767:
5768: if ((*s_etat_processus)
5769: .erreur_systeme != d_es)
5770: {
5771: if (presence_egalite ==
5772: d_vrai)
5773: {
5774: liberation(
5775: s_etat_processus,
5776: s_objet_evalue);
5777: }
5778:
5779: (*s_etat_processus)
5780: .instruction_courante =
5781: instruction_courante;
5782: return(d_erreur);
5783: }
5784: }
5785: }
5786: else if (TEST(instruction_end) ||
5787: TEST(instruction_next) ||
5788: TEST(instruction_step) ||
5789: TEST(vers_niveau_inferieur))
5790: {
5791: if (TEST(vers_niveau_inferieur))
5792: {
5793: analyse(s_etat_processus,
5794: vers_niveau_inferieur);
5795:
5796: if ((*s_etat_processus)
5797: .erreur_systeme != d_es)
5798: {
5799: if (presence_egalite ==
5800: d_vrai)
5801: {
5802: liberation(
5803: s_etat_processus,
5804: s_objet_evalue);
5805: }
5806:
5807: (*s_etat_processus)
5808: .instruction_courante =
5809: instruction_courante;
5810: return(d_erreur);
5811: }
5812: }
5813: else if ((TEST(instruction_next) ||
5814: TEST(instruction_step)) &&
5815: ((*(*s_etat_processus)
5816: .l_base_pile_systeme)
5817: .type_cloture != 'L'))
5818: {
5819: /*
5820: * Libération des compteurs
5821: * de boucle
5822: */
5823:
5824: presence_compteur =
5825: (((*(*s_etat_processus)
5826: .l_base_pile_systeme)
5827: .type_cloture == 'F') ||
5828: ((*(*s_etat_processus)
5829: .l_base_pile_systeme)
5830: .type_cloture == 'A'))
5831: ? d_vrai : d_faux;
5832:
5833: if (((*(*s_etat_processus)
5834: .l_base_pile_systeme)
5835: .type_cloture != 'S') &&
5836: (presence_compteur ==
5837: d_faux))
5838: {
5839: (*s_etat_processus)
5840: .erreur_execution =
5841: d_ex_erreur_traitement_boucle;
5842:
5843: if (presence_egalite ==
5844: d_vrai)
5845: {
5846: liberation(
5847: s_etat_processus,
5848: s_objet_evalue);
5849: }
5850:
5851: (*s_etat_processus)
5852: .instruction_courante =
5853: instruction_courante;
5854: return(d_erreur);
5855: }
5856:
5857: if (presence_compteur == d_vrai)
5858: {
5859: if (recherche_variable(
5860: s_etat_processus,
5861: (*(*s_etat_processus)
5862: .l_base_pile_systeme)
5863: .nom_variable) ==
5864: d_faux)
5865: {
5866: (*s_etat_processus)
5867: .erreur_systeme = d_es;
5868: (*s_etat_processus)
5869: .erreur_execution =
5870: d_ex_erreur_traitement_boucle;
5871:
5872: if (presence_egalite ==
5873: d_vrai)
5874: {
5875: liberation(
5876: s_etat_processus,
5877: s_objet_evalue);
5878: }
5879:
5880: (*s_etat_processus)
5881: .instruction_courante =
5882: instruction_courante;
5883: return(d_erreur);
5884: }
5885:
5886: if ((*(*s_etat_processus)
5887: .pointeur_variable_courante)
5888: .objet == NULL)
5889: {
5890: (*s_etat_processus)
5891: .erreur_systeme = d_es;
5892: (*s_etat_processus)
5893: .erreur_execution =
5894: d_ex_variable_partagee;
5895:
5896: if (presence_egalite ==
5897: d_vrai)
5898: {
5899: liberation(
5900: s_etat_processus,
5901: s_objet_evalue);
5902: }
5903:
5904: (*s_etat_processus)
5905: .instruction_courante =
5906: instruction_courante;
5907: return(d_erreur);
5908: }
5909:
5910: (*s_etat_processus)
5911: .niveau_courant--;
5912:
5913: if (
5914: retrait_variables_par_niveau(
5915: s_etat_processus) == d_erreur)
5916: {
5917: if (presence_egalite ==
5918: d_vrai)
5919: {
5920: liberation(
5921: s_etat_processus,
5922: s_objet_evalue);
5923: }
5924:
5925: (*s_etat_processus)
5926: .instruction_courante =
5927: instruction_courante;
5928: return(d_erreur);
5929: }
5930: }
5931:
5932: depilement_pile_systeme(
5933: s_etat_processus);
5934: }
5935: else
5936: {
5937: // Traitement spécifique pour la
5938: // fin d'une section critique
5939:
5940: if ((*s_etat_processus)
5941: .l_base_pile_systeme ==
5942: NULL)
5943: {
5944: (*s_etat_processus)
5945: .erreur_systeme =
5946: d_es_end_incoherent;
5947:
5948: if (presence_egalite ==
5949: d_vrai)
5950: {
5951: liberation(
5952: s_etat_processus,
5953: s_objet_evalue);
5954: }
5955:
5956: (*s_etat_processus)
5957: .instruction_courante =
5958: instruction_courante;
5959: return(d_erreur);
5960: }
5961:
5962: if ((*(*s_etat_processus)
5963: .l_base_pile_systeme)
5964: .type_cloture == 'Q')
5965: {
5966: if (pthread_mutex_unlock(
5967: &mutex_sections_critiques)
5968: != 0)
5969: {
5970: (*s_etat_processus)
5971: .erreur_systeme =
5972: d_es_processus;
5973:
5974: if (presence_egalite ==
5975: d_vrai)
5976: {
5977: liberation(
5978: s_etat_processus,
5979: s_objet_evalue);
5980: }
5981:
5982: (*s_etat_processus)
5983: .instruction_courante =
5984: instruction_courante;
5985: return(d_erreur);
5986: }
5987:
5988: (*s_etat_processus)
5989: .sections_critiques--;
5990: }
5991:
5992: depilement_pile_systeme(
5993: s_etat_processus);
5994:
5995: if ((*s_etat_processus)
5996: .erreur_systeme != d_es)
5997: {
5998: if (presence_egalite ==
5999: d_vrai)
6000: {
6001: liberation(
6002: s_etat_processus,
6003: s_objet_evalue);
6004: }
6005:
6006: (*s_etat_processus)
6007: .instruction_courante =
6008: instruction_courante;
6009: return(d_erreur);
6010: }
6011: }
6012: }
6013: }
6014: }
6015:
6016: l_element_courant =
6017: (*l_element_courant).suivant;
6018: }
6019:
6020: (*s_etat_processus).mode_execution_programme =
6021: registre_mode_execution_programme;
6022: (*s_etat_processus).instruction_courante =
6023: instruction_courante;
6024:
6025: (*s_etat_processus).exception = d_ep;
6026: (*s_etat_processus).erreur_execution = d_ex;
6027:
6028: erreur_evaluation = d_erreur;
6029: }
6030: else
6031: {
6032: // On ne détruit pas les variables pour les inclure
6033: // dans le fichier rpl-core.
6034:
6035: (*s_etat_processus).gel_liste_variables = d_vrai;
6036:
6037: registre_erreur_execution =
6038: (*s_etat_processus).erreur_execution;
6039: registre_exception =
6040: (*s_etat_processus).exception;
6041: registre_erreur_systeme =
6042: (*s_etat_processus).erreur_systeme;
6043:
6044: (*s_etat_processus).s_objet_errone = s_objet;
6045: (*s_etat_processus).s_objet_erreur =
6046: (*l_element_courant).donnee;
6047:
6048: l_element_courant = (*l_element_courant).suivant;
6049:
6050: while(l_element_courant != NULL)
6051: {
6052: if ((*(*l_element_courant).donnee).type == FCT)
6053: {
6054: (*s_etat_processus).instruction_courante =
6055: (*((struct_fonction *)
6056: (*(*l_element_courant).donnee)
6057: .objet)).nom_fonction;
6058: fonction = (*((struct_fonction *)
6059: (*(*l_element_courant).donnee)
6060: .objet)).fonction;
6061:
6062: if (recherche_variable(s_etat_processus,
6063: (*s_etat_processus)
6064: .instruction_courante) == d_faux)
6065: {
6066: (*s_etat_processus).erreur_systeme
6067: = d_es;
6068:
6069: /*
6070: * Traitement de la pile système par les
6071: * différentes instructions.
6072: */
6073:
6074: if (TEST(instruction_if) ||
6075: TEST(instruction_iferr) ||
6076: TEST(instruction_do) ||
6077: TEST(instruction_while) ||
6078: TEST(instruction_for) ||
6079: TEST(instruction_forall) ||
6080: TEST(instruction_start) ||
6081: TEST(instruction_select) ||
6082: TEST(instruction_case) ||
6083: TEST(instruction_critical) ||
6084: TEST(vers_niveau_superieur))
6085: {
6086: if (TEST(vers_niveau_superieur))
6087: {
6088: analyse(s_etat_processus,
6089: vers_niveau_superieur);
6090:
6091: if ((*s_etat_processus)
6092: .erreur_systeme != d_es)
6093: {
6094: if (presence_egalite ==
6095: d_vrai)
6096: {
6097: liberation(
6098: s_etat_processus,
6099: s_objet_evalue);
6100: }
6101:
6102: (*s_etat_processus)
6103: .instruction_courante =
6104: instruction_courante;
6105: return(d_erreur);
6106: }
6107: }
6108: else if (TEST(instruction_for) ||
6109: TEST(instruction_forall) ||
6110: TEST(instruction_start))
6111: {
6112: empilement_pile_systeme(
6113: s_etat_processus);
6114:
6115: if ((*s_etat_processus)
6116: .erreur_systeme != d_es)
6117: {
6118: if (presence_egalite ==
6119: d_vrai)
6120: {
6121: liberation(
6122: s_etat_processus,
6123: s_objet_evalue);
6124: }
6125:
6126: (*s_etat_processus)
6127: .instruction_courante =
6128: instruction_courante;
6129: return(d_erreur);
6130: }
6131:
6132: (*(*s_etat_processus)
6133: .l_base_pile_systeme)
6134: .type_cloture = 'L';
6135: }
6136: else
6137: {
6138: empilement_pile_systeme(
6139: s_etat_processus);
6140:
6141: if ((*s_etat_processus)
6142: .erreur_systeme != d_es)
6143: {
6144: if (presence_egalite ==
6145: d_vrai)
6146: {
6147: liberation(
6148: s_etat_processus,
6149: s_objet_evalue);
6150: }
6151:
6152: (*s_etat_processus)
6153: .instruction_courante =
6154: instruction_courante;
6155: return(d_erreur);
6156: }
6157: }
6158: }
6159: else if (TEST(instruction_end) ||
6160: TEST(instruction_next) ||
6161: TEST(instruction_step) ||
6162: TEST(vers_niveau_inferieur))
6163: {
6164: if (TEST(vers_niveau_inferieur))
6165: {
6166: analyse(s_etat_processus,
6167: vers_niveau_inferieur);
6168:
6169: if ((*s_etat_processus)
6170: .erreur_systeme != d_es)
6171: {
6172: if (presence_egalite ==
6173: d_vrai)
6174: {
6175: liberation(
6176: s_etat_processus,
6177: s_objet_evalue);
6178: }
6179:
6180: (*s_etat_processus)
6181: .instruction_courante =
6182: instruction_courante;
6183: return(d_erreur);
6184: }
6185: }
6186: else if ((TEST(instruction_next) ||
6187: TEST(instruction_step)) &&
6188: ((*(*s_etat_processus)
6189: .l_base_pile_systeme)
6190: .type_cloture != 'L'))
6191: {
6192: /*
6193: * Libération des compteurs
6194: * de boucle
6195: */
6196:
6197: presence_compteur =
6198: (((*(*s_etat_processus)
6199: .l_base_pile_systeme)
6200: .type_cloture == 'F') ||
6201: ((*(*s_etat_processus)
6202: .l_base_pile_systeme)
6203: .type_cloture == 'A'))
6204: ? d_vrai : d_faux;
6205:
6206: if (((*(*s_etat_processus)
6207: .l_base_pile_systeme)
6208: .type_cloture != 'S') &&
6209: (presence_compteur ==
6210: d_faux))
6211: {
6212: (*s_etat_processus)
6213: .erreur_execution =
6214: d_ex_erreur_traitement_boucle;
6215:
6216: if (presence_egalite ==
6217: d_vrai)
6218: {
6219: liberation(
6220: s_etat_processus,
6221: s_objet_evalue);
6222: }
6223:
6224: (*s_etat_processus)
6225: .instruction_courante =
6226: instruction_courante;
6227: return(d_erreur);
6228: }
6229:
6230: if (presence_compteur == d_vrai)
6231: {
6232: if (recherche_variable(
6233: s_etat_processus,
6234: (*(*s_etat_processus)
6235: .l_base_pile_systeme)
6236: .nom_variable) ==
6237: d_faux)
6238: {
6239: (*s_etat_processus)
6240: .erreur_systeme = d_es;
6241: (*s_etat_processus)
6242: .erreur_execution =
6243: d_ex_erreur_traitement_boucle;
6244:
6245: if (presence_egalite ==
6246: d_vrai)
6247: {
6248: liberation(
6249: s_etat_processus,
6250: s_objet_evalue);
6251: }
6252:
6253: (*s_etat_processus)
6254: .instruction_courante =
6255: instruction_courante;
6256: return(d_erreur);
6257: }
6258:
6259: if ((*(*s_etat_processus)
6260: .pointeur_variable_courante)
6261: .objet == NULL)
6262: {
6263: (*s_etat_processus)
6264: .erreur_systeme = d_es;
6265: (*s_etat_processus)
6266: .erreur_execution =
6267: d_ex_variable_partagee;
6268:
6269: if (presence_egalite ==
6270: d_vrai)
6271: {
6272: liberation(
6273: s_etat_processus,
6274: s_objet_evalue);
6275: }
6276:
6277: (*s_etat_processus)
6278: .instruction_courante =
6279: instruction_courante;
6280: return(d_erreur);
6281: }
6282:
6283: (*s_etat_processus)
6284: .niveau_courant--;
6285:
6286: if (
6287: retrait_variables_par_niveau(
6288: s_etat_processus) == d_erreur)
6289: {
6290: if (presence_egalite ==
6291: d_vrai)
6292: {
6293: liberation(
6294: s_etat_processus,
6295: s_objet_evalue);
6296: }
6297:
6298: (*s_etat_processus)
6299: .instruction_courante =
6300: instruction_courante;
6301: return(d_erreur);
6302: }
6303: }
6304:
6305: depilement_pile_systeme(
6306: s_etat_processus);
6307: }
6308: else
6309: {
6310: // Traitement spécifique pour la
6311: // fin d'une section critique
6312:
6313: if ((*s_etat_processus)
6314: .l_base_pile_systeme ==
6315: NULL)
6316: {
6317: (*s_etat_processus)
6318: .erreur_systeme =
6319: d_es_end_incoherent;
6320:
6321: if (presence_egalite ==
6322: d_vrai)
6323: {
6324: liberation(
6325: s_etat_processus,
6326: s_objet_evalue);
6327: }
6328:
6329: (*s_etat_processus)
6330: .instruction_courante =
6331: instruction_courante;
6332: return(d_erreur);
6333: }
6334:
6335: if ((*(*s_etat_processus)
6336: .l_base_pile_systeme)
6337: .type_cloture == 'Q')
6338: {
6339: if (pthread_mutex_unlock(
6340: &mutex_sections_critiques)
6341: != 0)
6342: {
6343: (*s_etat_processus)
6344: .erreur_systeme =
6345: d_es_processus;
6346:
6347: if (presence_egalite ==
6348: d_vrai)
6349: {
6350: liberation(
6351: s_etat_processus,
6352: s_objet_evalue);
6353: }
6354:
6355: (*s_etat_processus)
6356: .instruction_courante =
6357: instruction_courante;
6358: return(d_erreur);
6359: }
6360:
6361: (*s_etat_processus)
6362: .sections_critiques--;
6363: }
6364:
6365: depilement_pile_systeme(
6366: s_etat_processus);
6367:
6368: if ((*s_etat_processus)
6369: .erreur_systeme != d_es)
6370: {
6371: if (presence_egalite ==
6372: d_vrai)
6373: {
6374: liberation(
6375: s_etat_processus,
6376: s_objet_evalue);
6377: }
6378:
6379: (*s_etat_processus)
6380: .instruction_courante =
6381: instruction_courante;
6382: return(d_erreur);
6383: }
6384: }
6385: }
6386: }
6387: }
6388:
6389: l_element_courant =
6390: (*l_element_courant).suivant;
6391: }
6392:
6393: (*s_etat_processus).mode_execution_programme =
6394: registre_mode_execution_programme;
6395: (*s_etat_processus).instruction_courante =
6396: instruction_courante;
6397: if (presence_egalite == d_vrai)
6398: {
6399: liberation(s_etat_processus, s_objet_evalue);
6400: }
6401:
6402: if ((*s_etat_processus)
6403: .var_volatile_processus_pere == 0)
6404: {
6405: envoi_signal_processus((*s_etat_processus)
6406: .pid_processus_pere, rpl_sigalrm,
6407: d_faux);
6408: }
6409: else
6410: {
6411: (*s_etat_processus).var_volatile_alarme = -1;
6412: }
6413:
6414: (*s_etat_processus).erreur_execution =
6415: registre_erreur_execution;
6416: (*s_etat_processus).erreur_systeme =
6417: registre_erreur_systeme;
6418: (*s_etat_processus).exception =
6419: registre_exception;
6420: return(d_erreur);
6421: }
6422: }
6423: }
6424: else if ((*s_etat_processus).constante_symbolique == 'N')
6425: {
6426: if ((s_objet_elementaire = copie_objet(s_etat_processus,
6427: (*l_element_courant).donnee, 'P')) == NULL)
6428: {
6429: if (presence_egalite == d_vrai)
6430: {
6431: liberation(s_etat_processus, s_objet_evalue);
6432: }
6433:
6434: (*s_etat_processus).erreur_systeme =
6435: d_es_allocation_memoire;
6436: (*s_etat_processus).instruction_courante =
6437: instruction_courante;
6438: return(d_erreur);
6439: }
6440:
6441: presence_fonction = d_faux;
6442: presence_variable_partagee = d_faux;
6443:
6444: if (recherche_variable(s_etat_processus, (*((struct_nom *)
6445: (*s_objet_elementaire).objet)).nom) == d_faux)
6446: {
6447: (*s_etat_processus).erreur_systeme = d_es;
6448: presence_variable = d_faux;
6449:
6450: if ((*s_etat_processus).autorisation_nom_implicite
6451: == 'N')
6452: {
6453: if ((*((struct_nom *) (*s_objet_elementaire).objet))
6454: .symbole == d_faux)
6455: {
6456: if (test_cfsf(s_etat_processus, 31) == d_vrai)
6457: {
6458: if (empilement_pile_last(s_etat_processus,
6459: 0) == d_erreur)
6460: {
6461: return(d_erreur);
6462: }
6463: }
6464:
6465: erreur_evaluation = d_erreur;
6466: (*s_etat_processus).erreur_execution =
6467: d_ex_nom_implicite;
6468:
6469: if (type_evaluation == 'I')
6470: {
6471: (*s_etat_processus)
6472: .derniere_erreur_evaluation =
6473: (*s_etat_processus)
6474: .erreur_execution;
6475: }
6476: }
6477: }
6478: }
6479: else
6480: {
6481: if ((*s_etat_processus).traitement_symbolique == 'N')
6482: {
6483: if ((*(*s_etat_processus)
6484: .pointeur_variable_courante).objet == NULL)
6485: {
6486: // Variable partagée
6487:
6488: presence_variable_partagee = d_faux;
6489:
6490: if (recherche_variable_partagee(
6491: s_etat_processus, (*(*s_etat_processus)
6492: .pointeur_variable_courante).nom,
6493: (*(*s_etat_processus)
6494: .pointeur_variable_courante)
6495: .variable_partagee, 'E') != NULL)
6496: {
6497: presence_variable = d_vrai;
6498: presence_variable_partagee = d_vrai;
6499:
6500: if ((*(*(*s_etat_processus)
6501: .pointeur_variable_partagee_courante
6502: ).objet).type == ADR)
6503: {
6504: presence_fonction = d_vrai;
6505: }
6506:
6507: if ((type_evaluation == 'N') ||
6508: ((*((struct_nom *)
6509: (*(*l_element_courant).donnee)
6510: .objet)).symbole == d_faux))
6511: {
6512: if ((s_copie_variable_partagee =
6513: copie_objet(s_etat_processus,
6514: (*(*s_etat_processus)
6515: .pointeur_variable_partagee_courante
6516: ).objet, 'P')) == NULL)
6517: {
6518: if (pthread_mutex_unlock(
6519: &((*(*s_etat_processus)
6520: .pointeur_variable_partagee_courante
6521: ).mutex)) != 0)
6522: {
6523: (*s_etat_processus)
6524: .erreur_systeme =
6525: d_es_processus;
6526: return(d_erreur);
6527: }
6528: }
6529: }
6530: else
6531: {
6532: s_copie_variable_partagee = NULL;
6533: }
6534:
6535: if (pthread_mutex_unlock(
6536: &((*(*s_etat_processus)
6537: .pointeur_variable_partagee_courante
6538: ).mutex)) != 0)
6539: {
6540: (*s_etat_processus).erreur_systeme =
6541: d_es_processus;
6542: return(d_erreur);
6543: }
6544: }
6545: else
6546: {
6547: (*s_etat_processus).erreur_systeme = d_es;
6548: presence_variable = d_faux;
6549: presence_variable_partagee = d_faux;
6550: }
6551: }
6552: else
6553: {
6554: presence_variable = d_vrai;
6555:
6556: if ((*(*(*s_etat_processus)
6557: .pointeur_variable_courante).objet)
6558: .type == ADR)
6559: {
6560: presence_fonction = d_vrai;
6561: }
6562: }
6563: }
6564: else
6565: {
6566: presence_variable = d_faux;
6567: }
6568: }
6569:
6570: liberation(s_etat_processus, s_objet_elementaire);
6571:
6572: if (presence_fonction == d_vrai)
6573: {
6574: if ((*((struct_nom *) (*(*l_element_courant).donnee)
6575: .objet)).symbole == d_vrai)
6576: {
6577: // L'objet apparaît comme un symbole dans
6578: // l'expression en cours d'évaluation. On se
6579: // contente de l'empiler.
6580:
6581: if ((s_sous_objet = copie_objet(s_etat_processus,
6582: (*l_element_courant).donnee, 'P')) == NULL)
6583: {
6584: (*s_etat_processus).instruction_courante =
6585: instruction_courante;
6586:
6587: (*s_etat_processus).erreur_systeme =
6588: d_es_allocation_memoire;
6589: return(d_erreur);
6590: }
6591:
6592: if (empilement(s_etat_processus,
6593: &((*s_etat_processus).l_base_pile),
6594: s_sous_objet) == d_erreur)
6595: {
6596: (*s_etat_processus).instruction_courante =
6597: instruction_courante;
6598: liberation(s_etat_processus, s_sous_objet);
6599: return(d_erreur);
6600: }
6601: }
6602: else
6603: {
6604: autorisation_empilement_programme =
6605: (*s_etat_processus)
6606: .autorisation_empilement_programme;
6607: registre_position_courante = (*s_etat_processus)
6608: .position_courante;
6609:
6610: empilement_pile_systeme(s_etat_processus);
6611:
6612: if ((*s_etat_processus).erreur_systeme != d_es)
6613: {
6614: if (presence_variable_partagee == d_vrai)
6615: {
6616: liberation(s_etat_processus,
6617: s_copie_variable_partagee);
6618: }
6619:
6620: if (presence_egalite == d_vrai)
6621: {
6622: liberation(s_etat_processus,
6623: s_objet_evalue);
6624: }
6625:
6626: (*s_etat_processus).instruction_courante =
6627: instruction_courante;
6628: return(d_erreur);
6629: }
6630:
6631: (*(*s_etat_processus).l_base_pile_systeme)
6632: .retour_definition = 'Y';
6633: (*(*s_etat_processus).l_base_pile_systeme)
6634: .origine_routine_evaluation = 'Y';
6635:
6636: (*s_etat_processus).mode_execution_programme = 'Y';
6637: (*s_etat_processus)
6638: .autorisation_empilement_programme = 'N';
6639:
6640: (*(*s_etat_processus).l_base_pile_systeme)
6641: .niveau_courant = (*s_etat_processus)
6642: .niveau_courant;
6643:
6644: if (presence_variable_partagee == d_faux)
6645: {
6646: (*s_etat_processus).position_courante =
6647: (*((integer8 *)
6648: ((*(*(*s_etat_processus)
6649: .pointeur_variable_courante)
6650: .objet).objet)));
6651: }
6652: else
6653: {
6654: (*s_etat_processus).position_courante =
6655: (*((integer8 *)
6656: (*s_copie_variable_partagee).objet));
6657: liberation(s_etat_processus,
6658: s_copie_variable_partagee);
6659: }
6660:
6661: if ((*s_etat_processus).profilage == d_vrai)
6662: {
6663: profilage(s_etat_processus,
6664: (*(*s_etat_processus)
6665: .pointeur_variable_courante).nom);
6666:
6667: if ((*s_etat_processus).erreur_systeme != d_es)
6668: {
6669: return(d_erreur);
6670: }
6671: }
6672:
6673: registre_evaluation_forcee =
6674: (*s_etat_processus).evaluation_forcee;
6675:
6676: if (type_evaluation == 'N')
6677: {
6678: (*s_etat_processus).evaluation_forcee = 'Y';
6679: }
6680:
6681: if (sequenceur(s_etat_processus) == d_erreur)
6682: {
6683: (*s_etat_processus).evaluation_forcee =
6684: registre_evaluation_forcee;
6685:
6686: if (presence_egalite == d_vrai)
6687: {
6688: liberation(s_etat_processus,
6689: s_objet_evalue);
6690: }
6691:
6692: depilement_pile_systeme(s_etat_processus);
6693:
6694: (*s_etat_processus).instruction_courante =
6695: instruction_courante;
6696: (*s_etat_processus).mode_execution_programme =
6697: registre_mode_execution_programme;
6698: return(d_erreur);
6699: }
6700:
6701: (*s_etat_processus).evaluation_forcee =
6702: registre_evaluation_forcee;
6703: (*s_etat_processus).instruction_courante =
6704: instruction_courante;
6705: (*s_etat_processus).mode_execution_programme = 'N';
6706:
6707: depilement_pile_systeme(s_etat_processus);
6708:
6709: if ((*s_etat_processus).erreur_systeme != d_es)
6710: {
6711: if (presence_egalite == d_vrai)
6712: {
6713: liberation(s_etat_processus,
6714: s_objet_evalue);
6715: }
6716:
6717: return(d_erreur);
6718: }
6719:
6720: (*s_etat_processus).retour_routine_evaluation = 'N';
6721: (*s_etat_processus).position_courante =
6722: registre_position_courante;
6723: (*s_etat_processus)
6724: .autorisation_empilement_programme =
6725: autorisation_empilement_programme;
6726: }
6727: }
6728: else if (((type_evaluation == 'N') || ((*((struct_nom *)
6729: (*(*l_element_courant).donnee).objet)).symbole ==
6730: d_faux)) && (presence_variable == d_vrai))
6731: {
6732: if (type_evaluation == 'I')
6733: {
6734: if (presence_variable_partagee == d_faux)
6735: {
6736: if ((s_sous_objet =
6737: copie_objet(s_etat_processus,
6738: (*(*s_etat_processus)
6739: .pointeur_variable_courante).objet,
6740: 'P')) == NULL)
6741: {
6742: if (presence_variable_partagee == d_vrai)
6743: {
6744: liberation(s_etat_processus,
6745: s_copie_variable_partagee);
6746: }
6747:
6748: if (presence_egalite == d_vrai)
6749: {
6750: liberation(s_etat_processus,
6751: s_objet_evalue);
6752: }
6753:
6754: (*s_etat_processus).erreur_systeme =
6755: d_es_allocation_memoire;
6756: (*s_etat_processus).instruction_courante =
6757: instruction_courante;
6758: return(d_erreur);
6759: }
6760:
6761: if (empilement(s_etat_processus,
6762: &((*s_etat_processus).l_base_pile),
6763: s_sous_objet) == d_erreur)
6764: {
6765: if (presence_variable_partagee == d_vrai)
6766: {
6767: liberation(s_etat_processus,
6768: s_copie_variable_partagee);
6769: }
6770:
6771: if (presence_egalite == d_vrai)
6772: {
6773: liberation(s_etat_processus,
6774: s_objet_evalue);
6775: }
6776:
6777: return(d_erreur);
6778: }
6779: }
6780: else
6781: {
6782: if (empilement(s_etat_processus,
6783: &((*s_etat_processus).l_base_pile),
6784: s_copie_variable_partagee) == d_erreur)
6785: {
6786: if (presence_variable_partagee == d_vrai)
6787: {
6788: liberation(s_etat_processus,
6789: s_copie_variable_partagee);
6790: }
6791:
6792: if (presence_egalite == d_vrai)
6793: {
6794: liberation(s_etat_processus,
6795: s_objet_evalue);
6796: }
6797:
6798: return(d_erreur);
6799: }
6800: }
6801: }
6802: else
6803: {
6804: registre_evaluation_expression_compilee =
6805: (*s_etat_processus)
6806: .evaluation_expression_compilee;
6807:
6808: if (((*(*s_etat_processus)
6809: .pointeur_variable_courante)
6810: .origine == 'E') && ((*(*s_etat_processus)
6811: .pointeur_variable_courante).niveau == 0))
6812: {
6813: (*s_etat_processus)
6814: .evaluation_expression_compilee = 'Y';
6815: }
6816: else
6817: {
6818: (*s_etat_processus)
6819: .evaluation_expression_compilee = 'N';
6820: }
6821:
6822: if (presence_variable_partagee == d_faux)
6823: {
6824: if ((*s_etat_processus).profilage == d_vrai)
6825: {
6826: profilage(s_etat_processus,
6827: (*(*s_etat_processus)
6828: .pointeur_variable_courante).nom);
6829:
6830: if ((*s_etat_processus).erreur_systeme
6831: != d_es)
6832: {
6833: return(d_erreur);
6834: }
6835: }
6836:
6837: empilement_pile_systeme(s_etat_processus);
6838:
6839: (*(*s_etat_processus).l_base_pile_systeme)
6840: .retour_definition = 'Y';
6841: (*(*s_etat_processus).l_base_pile_systeme)
6842: .niveau_courant = (*s_etat_processus)
6843: .niveau_courant;
6844: (*(*s_etat_processus).l_base_pile_systeme)
6845: .pointeur_objet_retour =
6846: l_element_courant;
6847: (*(*s_etat_processus).l_base_pile_systeme)
6848: .origine_routine_evaluation = 'Y';
6849:
6850: if (evaluation(s_etat_processus,
6851: (*(*s_etat_processus)
6852: .pointeur_variable_courante).objet,
6853: type_evaluation) == d_erreur)
6854: {
6855: depilement_pile_systeme(s_etat_processus);
6856:
6857: if ((*s_etat_processus).profilage == d_vrai)
6858: {
6859: profilage(s_etat_processus, NULL);
6860: }
6861:
6862: (*s_etat_processus)
6863: .evaluation_expression_compilee =
6864: registre_evaluation_expression_compilee;
6865:
6866: if (presence_egalite == d_vrai)
6867: {
6868: liberation(s_etat_processus,
6869: s_objet_evalue);
6870: }
6871:
6872: (*s_etat_processus).instruction_courante =
6873: instruction_courante;
6874: (*s_etat_processus).mode_execution_programme
6875: = registre_mode_execution_programme;
6876: return(d_erreur);
6877: }
6878:
6879: depilement_pile_systeme(s_etat_processus);
6880:
6881: if ((((*s_etat_processus).erreur_execution !=
6882: d_ex) || ((*s_etat_processus)
6883: .erreur_systeme != d_es)) &&
6884: ((*s_etat_processus).arret_si_exception
6885: == d_faux))
6886: {
6887: // Reprise sur erreur.
6888:
6889: //==============================================================================
6890: // Réindentation
6891: //==============================================================================
6892:
6893: drapeau_then = d_faux;
6894:
6895: while(drapeau_then == d_faux)
6896: {
6897: l_registre_atome = l_element_courant;
6898: l_element_courant = (*l_element_courant).suivant;
6899:
6900: if (l_element_courant == NULL)
6901: {
6902: /*
6903: * La fin de l'expression est atteinte,
6904: * le sequenceur reprend la main.
6905: */
6906:
6907: if (presence_egalite == d_vrai)
6908: {
6909: liberation(s_etat_processus, s_objet_evalue);
6910: }
6911:
6912: (*s_etat_processus).mode_execution_programme =
6913: registre_mode_execution_programme;
6914: return(d_absence_erreur);
6915: }
6916:
6917: if ((*(*l_element_courant).donnee).type == FCT)
6918: {
6919: (*s_etat_processus).instruction_courante =
6920: (*((struct_fonction *)
6921: (*(*l_element_courant).donnee)
6922: .objet)).nom_fonction;
6923:
6924: if (recherche_variable(s_etat_processus,
6925: (*s_etat_processus).instruction_courante) == d_faux)
6926: {
6927: (*s_etat_processus).erreur_systeme = d_es;
6928: fonction = (*((struct_fonction *)
6929: (*(*l_element_courant).donnee)
6930: .objet)).fonction;
6931:
6932: /*
6933: * Traitement de la pile système par les
6934: * différentes instructions.
6935: */
6936:
6937: if (TEST(instruction_if) ||
6938: TEST(instruction_iferr) ||
6939: TEST(instruction_do) ||
6940: TEST(instruction_while) ||
6941: TEST(instruction_for) ||
6942: TEST(instruction_forall) ||
6943: TEST(instruction_start) ||
6944: TEST(instruction_select) ||
6945: TEST(instruction_case) ||
6946: TEST(instruction_critical) ||
6947: TEST(vers_niveau_superieur))
6948: {
6949: if (TEST(vers_niveau_superieur))
6950: {
6951: registre_exception = (*s_etat_processus)
6952: .exception;
6953: registre_erreur_execution = (*s_etat_processus)
6954: .erreur_execution;
6955:
6956: analyse(s_etat_processus,
6957: vers_niveau_superieur);
6958:
6959: if ((*s_etat_processus).erreur_systeme != d_es)
6960: {
6961: if (presence_egalite == d_vrai)
6962: {
6963: liberation(s_etat_processus,
6964: s_objet_evalue);
6965: }
6966:
6967: (*s_etat_processus).instruction_courante =
6968: instruction_courante;
6969: return(d_erreur);
6970: }
6971:
6972: (*s_etat_processus).exception
6973: = registre_exception;
6974: (*s_etat_processus).erreur_execution =
6975: registre_erreur_execution;
6976: }
6977: else if (TEST(instruction_for) ||
6978: TEST(instruction_forall) ||
6979: TEST(instruction_start))
6980: {
6981: empilement_pile_systeme(s_etat_processus);
6982:
6983: if ((*s_etat_processus).erreur_systeme != d_es)
6984: {
6985: if (presence_egalite == d_vrai)
6986: {
6987: liberation(s_etat_processus,
6988: s_objet_evalue);
6989: }
6990:
6991: (*s_etat_processus).instruction_courante =
6992: instruction_courante;
6993: return(d_erreur);
6994: }
6995:
6996: (*(*s_etat_processus).l_base_pile_systeme)
6997: .type_cloture = 'L';
6998: }
6999: else
7000: {
7001: empilement_pile_systeme(s_etat_processus);
7002:
7003: if ((*s_etat_processus).erreur_systeme != d_es)
7004: {
7005: if (presence_egalite == d_vrai)
7006: {
7007: liberation(s_etat_processus,
7008: s_objet_evalue);
7009: }
7010:
7011: (*s_etat_processus).instruction_courante =
7012: instruction_courante;
7013: return(d_erreur);
7014: }
7015: }
7016: }
7017: else if (TEST(instruction_end) ||
7018: TEST(instruction_next) ||
7019: TEST(instruction_step) ||
7020: TEST(vers_niveau_inferieur))
7021: {
7022: if (TEST(vers_niveau_inferieur))
7023: {
7024: registre_exception = (*s_etat_processus)
7025: .exception;
7026: registre_erreur_execution = (*s_etat_processus)
7027: .erreur_execution;
7028:
7029: analyse(s_etat_processus,
7030: vers_niveau_inferieur);
7031:
7032: if ((*s_etat_processus).erreur_systeme != d_es)
7033: {
7034: if (presence_egalite == d_vrai)
7035: {
7036: liberation(s_etat_processus,
7037: s_objet_evalue);
7038: }
7039:
7040: (*s_etat_processus).instruction_courante =
7041: instruction_courante;
7042: return(d_erreur);
7043: }
7044:
7045: (*s_etat_processus).exception
7046: = registre_exception;
7047: (*s_etat_processus).erreur_execution =
7048: registre_erreur_execution;
7049: }
7050: else if ((TEST(instruction_next) ||
7051: TEST(instruction_step)) &&
7052: ((*(*s_etat_processus)
7053: .l_base_pile_systeme)
7054: .type_cloture != 'L'))
7055: {
7056: /*
7057: * Libération des compteurs
7058: * de boucle
7059: */
7060:
7061: presence_compteur = (((*(*s_etat_processus)
7062: .l_base_pile_systeme).type_cloture == 'F')
7063: || ((*(*s_etat_processus)
7064: .l_base_pile_systeme).type_cloture == 'A'))
7065: ? d_vrai : d_faux;
7066:
7067: if (((*(*s_etat_processus).l_base_pile_systeme)
7068: .type_cloture != 'S') && (presence_compteur
7069: == d_faux))
7070: {
7071: (*s_etat_processus).erreur_execution =
7072: d_ex_erreur_traitement_boucle;
7073:
7074: if (presence_egalite == d_vrai)
7075: {
7076: liberation(s_etat_processus,
7077: s_objet_evalue);
7078: }
7079:
7080: (*s_etat_processus).instruction_courante =
7081: instruction_courante;
7082: return(d_erreur);
7083: }
7084:
7085: if (presence_compteur == d_vrai)
7086: {
7087: if (recherche_variable(s_etat_processus,
7088: (*(*s_etat_processus)
7089: .l_base_pile_systeme).nom_variable)
7090: == d_faux)
7091: {
7092: (*s_etat_processus).erreur_systeme =
7093: d_es;
7094: (*s_etat_processus).erreur_execution =
7095: d_ex_erreur_traitement_boucle;
7096:
7097: if (presence_egalite == d_vrai)
7098: {
7099: liberation(s_etat_processus,
7100: s_objet_evalue);
7101: }
7102:
7103: (*s_etat_processus).instruction_courante
7104: = instruction_courante;
7105: return(d_erreur);
7106: }
7107:
7108: if ((*(*s_etat_processus)
7109: .pointeur_variable_courante)
7110: .objet == NULL)
7111: {
7112: (*s_etat_processus).erreur_systeme =
7113: d_es;
7114: (*s_etat_processus).erreur_execution =
7115: d_ex_variable_partagee;
7116:
7117: if (presence_egalite == d_vrai)
7118: {
7119: liberation(s_etat_processus,
7120: s_objet_evalue);
7121: }
7122:
7123: (*s_etat_processus).instruction_courante
7124: = instruction_courante;
7125: return(d_erreur);
7126: }
7127:
7128: (*s_etat_processus)
7129: .niveau_courant--;
7130:
7131: if (retrait_variables_par_niveau(
7132: s_etat_processus) == d_erreur)
7133: {
7134: if (presence_egalite == d_vrai)
7135: {
7136: liberation(s_etat_processus,
7137: s_objet_evalue);
7138: }
7139:
7140: (*s_etat_processus).instruction_courante = instruction_courante;
7141: return(d_erreur);
7142: }
7143: }
7144:
7145: depilement_pile_systeme(s_etat_processus);
7146: }
7147: else
7148: {
7149: // Traitement spécifique pour
7150: // la fin d'une section
7151: // critique
7152:
7153: if ((*s_etat_processus).l_base_pile_systeme
7154: == NULL)
7155: {
7156: (*s_etat_processus).erreur_systeme =
7157: d_es_end_incoherent;
7158:
7159: if (presence_egalite == d_vrai)
7160: {
7161: liberation(s_etat_processus,
7162: s_objet_evalue);
7163: }
7164:
7165: (*s_etat_processus).instruction_courante =
7166: instruction_courante;
7167: return(d_erreur);
7168: }
7169:
7170: if ((*(*s_etat_processus).l_base_pile_systeme)
7171: .type_cloture == 'Q')
7172: {
7173: if (pthread_mutex_unlock(
7174: &mutex_sections_critiques) != 0)
7175: {
7176: (*s_etat_processus).erreur_systeme =
7177: d_es_processus;
7178:
7179: liberation(s_etat_processus,
7180: s_objet_evalue);
7181:
7182: (*s_etat_processus).instruction_courante = instruction_courante;
7183: return(d_erreur);
7184: }
7185:
7186: (*s_etat_processus).sections_critiques--;
7187: }
7188:
7189: depilement_pile_systeme(s_etat_processus);
7190:
7191: if ((*s_etat_processus)
7192: .erreur_systeme != d_es)
7193: {
7194: if (presence_egalite == d_vrai)
7195: {
7196: liberation(s_etat_processus,
7197: s_objet_evalue);
7198: }
7199:
7200: (*s_etat_processus).instruction_courante =
7201: instruction_courante;
7202: return(d_erreur);
7203: }
7204: }
7205: }
7206: else if (TEST(instruction_then))
7207: {
7208: if ((*(*s_etat_processus).l_base_pile_systeme)
7209: .clause == 'R')
7210: {
7211: (*(*s_etat_processus).l_base_pile_systeme)
7212: .clause = 'X';
7213: instruction_then(s_etat_processus);
7214: drapeau_then = d_vrai;
7215: }
7216: }
7217: }
7218: }
7219: }
7220:
7221: (*s_etat_processus).expression_courante =
7222: l_element_courant;
7223: (*s_etat_processus).instruction_courante =
7224: instruction_courante;
7225:
7226: (*s_etat_processus).exception = d_ep;
7227: (*s_etat_processus).erreur_execution = d_ex;
7228:
7229: //==============================================================================
7230: // Fin de la réindentation
7231: //==============================================================================
7232: }
7233: }
7234: else
7235: {
7236: if ((*s_etat_processus).profilage == d_vrai)
7237: {
7238: profilage(s_etat_processus,
7239: (*(*s_etat_processus)
7240: .pointeur_variable_courante).nom);
7241:
7242: if ((*s_etat_processus).erreur_systeme
7243: != d_es)
7244: {
7245: return(d_erreur);
7246: }
7247: }
7248:
7249: empilement_pile_systeme(s_etat_processus);
7250: (*(*s_etat_processus).l_base_pile_systeme)
7251: .retour_definition = 'Y';
7252: (*(*s_etat_processus).l_base_pile_systeme)
7253: .niveau_courant = (*s_etat_processus)
7254: .niveau_courant;
7255:
7256: if (evaluation(s_etat_processus,
7257: s_copie_variable_partagee,
7258: type_evaluation) == d_erreur)
7259: {
7260: depilement_pile_systeme(s_etat_processus);
7261:
7262: liberation(s_etat_processus,
7263: s_copie_variable_partagee);
7264:
7265: if ((*s_etat_processus).profilage == d_vrai)
7266: {
7267: profilage(s_etat_processus, NULL);
7268: }
7269:
7270: (*s_etat_processus)
7271: .evaluation_expression_compilee =
7272: registre_evaluation_expression_compilee;
7273:
7274: if (presence_egalite == d_vrai)
7275: {
7276: liberation(s_etat_processus,
7277: s_objet_evalue);
7278: }
7279:
7280: (*s_etat_processus).instruction_courante =
7281: instruction_courante;
7282: (*s_etat_processus).mode_execution_programme
7283: = registre_mode_execution_programme;
7284: return(d_erreur);
7285: }
7286:
7287: depilement_pile_systeme(s_etat_processus);
7288:
7289: liberation(s_etat_processus,
7290: s_copie_variable_partagee);
7291: }
7292:
7293: if ((*s_etat_processus).profilage == d_vrai)
7294: {
7295: profilage(s_etat_processus, NULL);
7296: }
7297:
7298: (*s_etat_processus)
7299: .evaluation_expression_compilee =
7300: registre_evaluation_expression_compilee;
7301: }
7302: }
7303: else
7304: {
7305: if (presence_variable_partagee == d_vrai)
7306: {
7307: liberation(s_etat_processus,
7308: s_copie_variable_partagee);
7309: }
7310:
7311: if ((s_objet_elementaire =
7312: copie_objet(s_etat_processus,
7313: (*l_element_courant).donnee, 'P')) == NULL)
7314: {
7315: if (presence_egalite == d_vrai)
7316: {
7317: liberation(s_etat_processus, s_objet_evalue);
7318: }
7319:
7320: (*s_etat_processus).erreur_systeme =
7321: d_es_allocation_memoire;
7322: (*s_etat_processus).instruction_courante =
7323: instruction_courante;
7324: return(d_erreur);
7325: }
7326:
7327: /*
7328: * Vérification du drapeau symbole pour
7329: * savoir si l'on met dans la pile le nom
7330: * ou le contenu de la variable.
7331: */
7332:
7333: if (((*((struct_nom *) (*s_objet_elementaire).objet))
7334: .symbole == d_faux) && ((*s_etat_processus)
7335: .traitement_symbolique == 'N'))
7336: {
7337: if (recherche_variable(s_etat_processus,
7338: (*((struct_nom *) (*s_objet_elementaire)
7339: .objet)).nom) == d_vrai)
7340: {
7341: if ((*(*s_etat_processus)
7342: .pointeur_variable_courante).objet
7343: == NULL)
7344: {
7345: // Variable partagée
7346:
7347: if (recherche_variable_partagee(
7348: s_etat_processus,
7349: (*(*s_etat_processus)
7350: .pointeur_variable_courante).nom,
7351: (*(*s_etat_processus)
7352: .pointeur_variable_courante)
7353: .variable_partagee, 'E') != NULL)
7354: {
7355: liberation(s_etat_processus,
7356: s_objet_elementaire);
7357:
7358: if ((s_objet_elementaire =
7359: copie_objet(s_etat_processus,
7360: (*(*s_etat_processus)
7361: .pointeur_variable_partagee_courante
7362: ).objet, 'P')) == NULL)
7363: {
7364: if (pthread_mutex_unlock(
7365: &((*(*s_etat_processus)
7366: .pointeur_variable_partagee_courante
7367: ).mutex)) != 0)
7368: {
7369: (*s_etat_processus)
7370: .erreur_systeme =
7371: d_es_processus;
7372: return(d_erreur);
7373: }
7374:
7375: if (presence_egalite == d_vrai)
7376: {
7377: liberation(s_etat_processus,
7378: s_objet_evalue);
7379: }
7380:
7381: (*s_etat_processus).erreur_systeme =
7382: d_es_allocation_memoire;
7383: (*s_etat_processus)
7384: .instruction_courante =
7385: instruction_courante;
7386: return(d_erreur);
7387: }
7388:
7389: if (pthread_mutex_unlock(
7390: &((*(*s_etat_processus)
7391: .pointeur_variable_partagee_courante
7392: ).mutex)) != 0)
7393: {
7394: (*s_etat_processus).erreur_systeme =
7395: d_es_processus;
7396: return(d_erreur);
7397: }
7398: }
7399: }
7400: else
7401: {
7402: // Variable privée
7403:
7404: liberation(s_etat_processus,
7405: s_objet_elementaire);
7406:
7407: if ((s_objet_elementaire =
7408: copie_objet(s_etat_processus,
7409: (*(*s_etat_processus)
7410: .pointeur_variable_courante).objet,
7411: 'P')) == NULL)
7412: {
7413: if (presence_egalite == d_vrai)
7414: {
7415: liberation(s_etat_processus,
7416: s_objet_evalue);
7417: }
7418:
7419: (*s_etat_processus).erreur_systeme =
7420: d_es_allocation_memoire;
7421: (*s_etat_processus)
7422: .instruction_courante =
7423: instruction_courante;
7424: return(d_erreur);
7425: }
7426: }
7427: }
7428: else
7429: {
7430: (*s_etat_processus).erreur_systeme = d_es;
7431:
7432: (*((struct_nom *) (*s_objet_elementaire)
7433: .objet)).symbole = d_vrai;
7434: }
7435: }
7436:
7437: if (empilement(s_etat_processus, &((*s_etat_processus)
7438: .l_base_pile), s_objet_elementaire) == d_erreur)
7439: {
7440: if (presence_egalite == d_vrai)
7441: {
7442: liberation(s_etat_processus, s_objet_evalue);
7443: }
7444:
7445: (*s_etat_processus).instruction_courante =
7446: instruction_courante;
7447: return(d_erreur);
7448: }
7449:
7450: if ((*s_etat_processus).erreur_execution ==
7451: d_ex_variable_non_definie)
7452: {
7453: (*s_etat_processus).erreur_execution = d_ex;
7454: }
7455: }
7456: }
7457: else
7458: {
7459: registre_type_evaluation = (test_cfsf(s_etat_processus, 35)
7460: == d_vrai) ? 'E' : 'N';
7461:
7462: if (type_evaluation == 'N')
7463: {
7464: cf(s_etat_processus, 35);
7465: }
7466: else
7467: {
7468: sf(s_etat_processus, 35);
7469: }
7470:
7471: analyse(s_etat_processus, NULL);
7472:
7473: if (registre_type_evaluation == 'E')
7474: {
7475: sf(s_etat_processus, 35);
7476: }
7477: else
7478: {
7479: cf(s_etat_processus, 35);
7480: }
7481:
7482: if (((*s_etat_processus).erreur_systeme != d_es) ||
7483: ((*s_etat_processus).erreur_execution != d_ex) ||
7484: ((*s_etat_processus).exception != d_ep))
7485: {
7486: // Il est anormal de récupérer ici une erreur
7487: // d'exécution puisqu'on empile une constante
7488: // symbolique.
7489:
7490: if (presence_egalite == d_vrai)
7491: {
7492: liberation(s_etat_processus, s_objet_evalue);
7493: }
7494:
7495: (*s_etat_processus).instruction_courante =
7496: instruction_courante;
7497: (*s_etat_processus).mode_execution_programme =
7498: registre_mode_execution_programme;
7499: return(d_erreur);
7500: }
7501: }
7502:
7503: (*s_etat_processus).instruction_courante =
7504: instruction_courante;
7505: (*s_etat_processus).test_instruction = registre_test;
7506: (*s_etat_processus).instruction_valide =
7507: registre_instruction_valide;
7508: }
7509: else
7510: {
7511: if ((s_objet_tampon = copie_objet(s_etat_processus,
7512: (*l_element_courant).donnee, 'P')) == NULL)
7513: {
7514: (*s_etat_processus).erreur_systeme =
7515: d_es_allocation_memoire;
7516: (*s_etat_processus).instruction_courante =
7517: instruction_courante;
7518: return(d_erreur);
7519: }
7520:
7521: if (empilement(s_etat_processus, &((*s_etat_processus)
7522: .l_base_pile), s_objet_tampon) == d_erreur)
7523: {
7524: if (presence_egalite == d_vrai)
7525: {
7526: liberation(s_etat_processus, s_objet_evalue);
7527: }
7528:
7529: (*s_etat_processus).instruction_courante =
7530: instruction_courante;
7531: return(d_erreur);
7532: }
7533: }
7534:
7535: // Traitement de l'instruction EXIT en mode interactif
7536:
7537: if ((*s_etat_processus).traitement_cycle_exit != 'N')
7538: {
7539: registre_expression_courante =
7540: (*s_etat_processus).expression_courante;
7541: (*s_etat_processus).expression_courante =
7542: l_element_courant;
7543:
7544: switch((*s_etat_processus).traitement_cycle_exit)
7545: {
7546: case 'C' :
7547: {
7548: instruction_cycle(s_etat_processus);
7549: break;
7550: }
7551:
7552: case 'E' :
7553: {
7554: instruction_exit(s_etat_processus);
7555: break;
7556: }
7557: }
7558:
7559: l_element_courant = (*s_etat_processus).expression_courante;
7560: (*s_etat_processus).expression_courante =
7561: registre_expression_courante;
7562: }
7563:
7564: if (l_element_courant != NULL)
7565: {
7566: l_element_courant = (*l_element_courant).suivant;
7567: }
7568: else
7569: {
7570: (*s_etat_processus).mode_execution_programme = 'Y';
7571:
7572: if ((*s_etat_processus).niveau_courant == 1)
7573: {
7574: (*s_etat_processus).debug_programme = d_faux;
7575: (*s_etat_processus).execution_pas_suivant = d_vrai;
7576: }
7577: }
7578:
7579: }
7580:
7581: if (niveau_initial < (*s_etat_processus).niveau_courant)
7582: {
7583: /*
7584: * Retrait des variables dans le cas où l'évaluation de
7585: * l'expression a été interrompue
7586: */
7587:
7588: (*s_etat_processus).niveau_courant = niveau_initial;
7589:
7590: if (retrait_variables_par_niveau(s_etat_processus) == d_erreur)
7591: {
7592: if (presence_egalite == d_vrai)
7593: {
7594: liberation(s_etat_processus, s_objet_evalue);
7595: }
7596:
7597: (*s_etat_processus).instruction_courante =
7598: instruction_courante;
7599: (*s_etat_processus).mode_execution_programme =
7600: registre_mode_execution_programme;
7601: return(d_erreur);
7602: }
7603: }
7604:
7605: /*
7606: * Retrait des variables statiques créées dans l'expression
7607: */
7608:
7609: if (retrait_variables_statiques_locales(s_etat_processus) == d_erreur)
7610: {
7611: if (presence_egalite == d_vrai)
7612: {
7613: liberation(s_etat_processus, s_objet_evalue);
7614: }
7615:
7616: (*s_etat_processus).instruction_courante =
7617: instruction_courante;
7618: (*s_etat_processus).mode_execution_programme =
7619: registre_mode_execution_programme;
7620: return(d_erreur);
7621: }
7622:
7623: /*
7624: * Retrait des variables partagées créées dans l'expression
7625: */
7626:
7627: if (retrait_variables_partagees_locales(s_etat_processus) == d_erreur)
7628: {
7629: if (presence_egalite == d_vrai)
7630: {
7631: liberation(s_etat_processus, s_objet_evalue);
7632: }
7633:
7634: (*s_etat_processus).instruction_courante =
7635: instruction_courante;
7636: (*s_etat_processus).mode_execution_programme =
7637: registre_mode_execution_programme;
7638: return(d_erreur);
7639: }
7640:
7641: if ((*s_etat_processus).var_volatile_requete_arret != 0)
7642: {
7643: // Restauration de la pile système
7644:
7645: while(pile_systeme_originelle !=
7646: (*s_etat_processus).l_base_pile_systeme)
7647: {
7648: depilement_pile_systeme(s_etat_processus);
7649: }
7650: }
7651:
7652: if (presence_egalite == d_vrai)
7653: {
7654: // Ajout du membre évalué lors de la première passe
7655:
7656: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
7657: s_objet_evalue) == d_erreur)
7658: {
7659: (*s_etat_processus).instruction_courante =
7660: instruction_courante;
7661: return(d_erreur);
7662: }
7663:
7664: instruction_swap(s_etat_processus);
7665:
7666: if ((*s_etat_processus).erreur_execution != d_ex)
7667: {
7668: (*s_etat_processus).mode_execution_programme =
7669: registre_mode_execution_programme;
7670: (*s_etat_processus).autorisation_empilement_programme =
7671: autorisation_empilement_programme;
7672: (*s_etat_processus).instruction_courante = instruction_courante;
7673: return(d_erreur);
7674: }
7675:
7676: instruction_egalite(s_etat_processus);
7677:
7678: if ((*s_etat_processus).erreur_execution != d_ex)
7679: {
7680: (*s_etat_processus).mode_execution_programme =
7681: registre_mode_execution_programme;
7682: (*s_etat_processus).autorisation_empilement_programme =
7683: autorisation_empilement_programme;
7684: (*s_etat_processus).instruction_courante = instruction_courante;
7685: return(d_erreur);
7686: }
7687: }
7688:
7689: (*s_etat_processus).autorisation_empilement_programme =
7690: autorisation_empilement_programme;
7691: (*s_etat_processus).instruction_courante = instruction_courante;
7692: }
7693: else if ((*s_objet).type == FCT)
7694: {
7695: (*s_etat_processus).instruction_courante =
7696: (*((struct_fonction *) (*s_objet).objet)).nom_fonction;
7697:
7698: registre_type_evaluation = (test_cfsf(s_etat_processus, 35) == d_vrai)
7699: ? 'E' : 'N';
7700:
7701: if (type_evaluation == 'N')
7702: {
7703: cf(s_etat_processus, 35);
7704: }
7705: else
7706: {
7707: sf(s_etat_processus, 35);
7708: }
7709:
7710: analyse(s_etat_processus, (*((struct_fonction *)
7711: (*s_objet).objet)).fonction);
7712: (*s_etat_processus).instruction_courante = instruction_courante;
7713:
7714: if (registre_type_evaluation == 'E')
7715: {
7716: sf(s_etat_processus, 35);
7717: }
7718: else
7719: {
7720: cf(s_etat_processus, 35);
7721: }
7722:
7723: if (((*s_etat_processus).erreur_systeme != d_es) ||
7724: ((*s_etat_processus).erreur_execution != d_ex) ||
7725: ((*s_etat_processus).exception != d_ep))
7726: {
7727: (*s_etat_processus).mode_execution_programme =
7728: registre_mode_execution_programme;
7729: return(d_erreur);
7730: }
7731: }
7732: else
7733: {
7734: (*s_etat_processus).instruction_courante = instruction_courante;
7735:
7736: if ((s_objet_tampon = copie_objet(s_etat_processus, s_objet, 'P'))
7737: == NULL)
7738: {
7739: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
7740: return(d_erreur);
7741: }
7742:
7743: if (empilement(s_etat_processus, &((*s_etat_processus)
7744: .l_base_pile), s_objet_tampon) == d_erreur)
7745: {
7746: return(d_erreur);
7747: }
7748: }
7749:
7750: (*s_etat_processus).mode_execution_programme =
7751: registre_mode_execution_programme;
7752:
7753: return((erreur_evaluation == d_absence_erreur)
7754: ? d_absence_erreur : d_erreur);
7755: }
7756:
7757: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>