1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.13
4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl.conv.h"
24:
25:
26: /*
27: ================================================================================
28: Procédure d'estimation de la longueur du tampon
29: ================================================================================
30: Entrée :
31: --------------------------------------------------------------------------------
32: Sortie :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: static inline void
39: estimation_taille_pile_systeme(struct_processus *s_etat_processus)
40: {
41: (*s_etat_processus).estimation_taille_pile_systeme_tampon =
42: ((*s_etat_processus).estimation_taille_pile_systeme_tampon *
43: ((double) 0.9)) + ((*s_etat_processus)
44: .hauteur_pile_systeme * ((double) 0.1));
45: return;
46: }
47:
48:
49: /*
50: ================================================================================
51: Procédure d'empilement d'un nouvel élément
52: ================================================================================
53: Entrée :
54: --------------------------------------------------------------------------------
55: Sortie :
56: --------------------------------------------------------------------------------
57: Effets de bord : néant
58: ================================================================================
59: */
60:
61: void
62: empilement_pile_systeme(struct_processus *s_etat_processus)
63: {
64: struct_liste_pile_systeme *l_ancienne_base_liste;
65: struct_liste_pile_systeme *l_nouvelle_base_liste;
66:
67: l_ancienne_base_liste = (*s_etat_processus).l_base_pile_systeme;
68:
69: if ((*s_etat_processus).debug == d_vrai)
70: if (((*s_etat_processus).type_debug &
71: d_debug_pile_systeme) != 0)
72: {
73: if (strlen((*s_etat_processus).instruction_courante) != 0)
74: {
75: if ((*s_etat_processus).langue == 'F')
76: {
77: printf("[%d] Empilement sur la pile système à la suite de "
78: "l'instruction %s\n", (int) getpid(),
79: (*s_etat_processus).instruction_courante);
80: }
81: else
82: {
83: printf("[%d] Pushing on system stack (instruction %s)\n",
84: (int) getpid(),
85: (*s_etat_processus).instruction_courante);
86: }
87: }
88: else
89: {
90: if ((*s_etat_processus).langue == 'F')
91: {
92: printf("[%d] Empilement sur la pile système\n",
93: (int) getpid());
94: }
95: else
96: {
97: printf("[%d] Pushing on system stack\n", (int) getpid());
98: }
99: }
100:
101: fflush(stdout);
102: }
103:
104: if ((*s_etat_processus).pile_systeme_tampon == NULL)
105: {
106: // Tampon vide, on alloue un élément.
107:
108: if ((l_nouvelle_base_liste = malloc(sizeof(struct_liste_pile_systeme)))
109: == NULL)
110: {
111: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
112: return;
113: }
114: }
115: else
116: {
117: // Tampon utilisable, on retire un élément du tampon.
118:
119: l_nouvelle_base_liste = (*s_etat_processus).pile_systeme_tampon;
120: (*s_etat_processus).pile_systeme_tampon =
121: (*l_nouvelle_base_liste).suivant;
122: (*s_etat_processus).taille_pile_systeme_tampon--;
123: }
124:
125: (*s_etat_processus).hauteur_pile_systeme++;
126: (*s_etat_processus).l_base_pile_systeme = l_nouvelle_base_liste;
127: (*(*s_etat_processus).l_base_pile_systeme).suivant =
128: l_ancienne_base_liste;
129:
130: (*(*s_etat_processus).l_base_pile_systeme).type_cloture = ' ';
131: (*(*s_etat_processus).l_base_pile_systeme).clause = ' ';
132: (*(*s_etat_processus).l_base_pile_systeme).adresse_retour = 0;
133: (*(*s_etat_processus).l_base_pile_systeme).niveau_courant = 0;
134: (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'N';
135: (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = NULL;
136: (*(*s_etat_processus).l_base_pile_systeme).limite_indice_boucle = NULL;
137: (*(*s_etat_processus).l_base_pile_systeme).objet_de_test = NULL;
138: (*(*s_etat_processus).l_base_pile_systeme).nom_variable = NULL;
139: (*(*s_etat_processus).l_base_pile_systeme).pointeur_objet_retour = NULL;
140: (*(*s_etat_processus).l_base_pile_systeme)
141: .origine_routine_evaluation = 'N';
142: (*(*s_etat_processus).l_base_pile_systeme).arret_si_exception =
143: (*s_etat_processus).arret_si_exception;
144: (*(*s_etat_processus).l_base_pile_systeme).creation_variables_statiques
145: = (*s_etat_processus).creation_variables_statiques;
146: (*(*s_etat_processus).l_base_pile_systeme).creation_variables_partagees
147: = (*s_etat_processus).creation_variables_partagees;
148: (*(*s_etat_processus).l_base_pile_systeme).evaluation_expression =
149: d_faux;
150:
151: (*s_etat_processus).erreur_systeme = d_es;
152: (*s_etat_processus).creation_variables_statiques = d_faux;
153: (*s_etat_processus).creation_variables_partagees = d_faux;
154:
155: return;
156: }
157:
158:
159: /*
160: ================================================================================
161: Procédure de dépilement d'un élément
162: ================================================================================
163: Entrée :
164: --------------------------------------------------------------------------------
165: Sortie :
166: --------------------------------------------------------------------------------
167: Effets de bord : néant
168: ================================================================================
169: */
170:
171: void
172: depilement_pile_systeme(struct_processus *s_etat_processus)
173: {
174: struct_liste_pile_systeme *l_ancienne_base_liste;
175: struct_liste_pile_systeme *l_nouvelle_base_liste;
176:
177: if ((*s_etat_processus).debug == d_vrai)
178: if (((*s_etat_processus).type_debug &
179: d_debug_pile_systeme) != 0)
180: {
181: if (strlen((*s_etat_processus).instruction_courante) != 0)
182: {
183: if ((*s_etat_processus).langue == 'F')
184: {
185: printf("[%d] Dépilement de la pile système à la suite "
186: "de l'instruction %s\n", (int) getpid(),
187: (*s_etat_processus).instruction_courante);
188: }
189: else
190: {
191: printf("[%d] Pulling from system stack (instruction %s)\n",
192: (int) getpid(),
193: (*s_etat_processus).instruction_courante);
194: }
195: }
196: else
197: {
198: if ((*s_etat_processus).langue == 'F')
199: {
200: printf("[%d] Dépilement de la pile système\n",
201: (int) getpid());
202: }
203: else
204: {
205: printf("[%d] Pulling from system stack\n", (int) getpid());
206: }
207: }
208:
209: fflush(stdout);
210: }
211:
212: if ((*s_etat_processus).l_base_pile_systeme == NULL)
213: {
214: (*s_etat_processus).erreur_systeme = d_es_pile_vide;
215: }
216: else
217: {
218: (*s_etat_processus).hauteur_pile_systeme--;
219: l_ancienne_base_liste = (*s_etat_processus).l_base_pile_systeme;
220: l_nouvelle_base_liste = (*l_ancienne_base_liste).suivant;
221:
222: (*s_etat_processus).l_base_pile_systeme = l_nouvelle_base_liste;
223: (*s_etat_processus).erreur_systeme = d_es;
224:
225: // On positionne le drapeau de création des variables statiques.
226:
227: (*s_etat_processus).creation_variables_statiques =
228: (*l_ancienne_base_liste).creation_variables_statiques;
229: (*s_etat_processus).creation_variables_partagees =
230: (*l_ancienne_base_liste).creation_variables_partagees;
231:
232: if ((*l_ancienne_base_liste).nom_variable != NULL)
233: {
234: free((*l_ancienne_base_liste).nom_variable);
235: }
236:
237: liberation(s_etat_processus, (*l_ancienne_base_liste).indice_boucle);
238: liberation(s_etat_processus,
239: (*l_ancienne_base_liste).limite_indice_boucle);
240: liberation(s_etat_processus, (*l_ancienne_base_liste).objet_de_test);
241:
242: if ((*s_etat_processus).taille_pile_systeme_tampon <= (10 *
243: ((*s_etat_processus).estimation_taille_pile_systeme_tampon
244: + 1)))
245: {
246: // Enregistrement de la structure pour un usage ultérieur.
247:
248: (*l_ancienne_base_liste).suivant =
249: (*s_etat_processus).pile_systeme_tampon;
250: (*s_etat_processus).pile_systeme_tampon = l_ancienne_base_liste;
251: (*s_etat_processus).taille_pile_systeme_tampon++;
252: }
253: else
254: {
255: // Libération car le tampon est plein.
256:
257: free(l_ancienne_base_liste);
258: }
259: }
260:
261: return;
262: }
263:
264: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>