1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.22
4: Copyright (C) 1989-2015 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl-conv.h"
24:
25:
26: /*
27: ================================================================================
28: Fonction 'obsub'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_obsub(struct_processus *s_etat_processus)
40: {
41: integer8 position;
42:
43: struct_liste_chainee *l_element_courant;
44:
45: struct_objet *s_copie_argument_3;
46: struct_objet *s_objet_argument_1;
47: struct_objet *s_objet_argument_2;
48: struct_objet *s_objet_argument_3;
49:
50: unsigned char *registre_definitions_chainees;
51: unsigned char *registre_instruction_courante;
52:
53: integer8 position_courante;
54:
55: (*s_etat_processus).erreur_execution = d_ex;
56:
57: if ((*s_etat_processus).affichage_arguments == 'Y')
58: {
59: printf("\n OBSUB ");
60:
61: if ((*s_etat_processus).langue == 'F')
62: {
63: printf("(substitution d'objet)\n\n");
64: }
65: else
66: {
67: printf("(objet substitution)\n\n");
68: }
69:
70: printf(" 3: %s\n", d_RPN);
71: printf(" 2: %s\n", d_INT);
72: printf(" 1: %s\n", d_LST);
73: printf("-> 1: %s\n\n", d_RPN);
74:
75: if ((*s_etat_processus).langue == 'F')
76: {
77: printf(" Utilisation :\n\n");
78: }
79: else
80: {
81: printf(" Usage:\n\n");
82: }
83:
84: printf(" << 1 4 + >> 3 { * } OBSUB\n");
85: printf(" << << X >> EVAL SIN >> 2 { << X 1 + >> } OBSUB\n");
86:
87: return;
88: }
89: else if ((*s_etat_processus).test_instruction == 'Y')
90: {
91: (*s_etat_processus).nombre_arguments = -1;
92: return;
93: }
94:
95: if (test_cfsf(s_etat_processus, 31) == d_vrai)
96: {
97: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
98: {
99: return;
100: }
101: }
102:
103: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
104: &s_objet_argument_1) == d_erreur)
105: {
106: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
107: return;
108: }
109:
110: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
111: &s_objet_argument_2) == d_erreur)
112: {
113: liberation(s_etat_processus, s_objet_argument_1);
114:
115: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
116: return;
117: }
118:
119: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
120: &s_objet_argument_3) == d_erreur)
121: {
122: liberation(s_etat_processus, s_objet_argument_1);
123: liberation(s_etat_processus, s_objet_argument_2);
124:
125: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
126: return;
127: }
128:
129: if (((*s_objet_argument_1).type == LST) &&
130: ((*s_objet_argument_2).type == INT) &&
131: ((*s_objet_argument_3).type == RPN))
132: {
133: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
134: s_objet_argument_3, 'N')) == NULL)
135: {
136: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
137: return;
138: }
139:
140: liberation(s_etat_processus, s_objet_argument_3);
141: s_objet_argument_3 = s_copie_argument_3;
142:
143: position = 0;
144: l_element_courant = (*s_objet_argument_1).objet;
145:
146: while(l_element_courant != NULL)
147: {
148: position++;
149: l_element_courant = (*l_element_courant).suivant;
150: }
151:
152: if (position != 1)
153: {
154: liberation(s_etat_processus, s_objet_argument_1);
155: liberation(s_etat_processus, s_objet_argument_2);
156: liberation(s_etat_processus, s_objet_argument_3);
157:
158: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
159: return;
160: }
161:
162: if ((*((integer8 *) (*s_objet_argument_2).objet)) <= 0)
163: {
164: liberation(s_etat_processus, s_objet_argument_1);
165: liberation(s_etat_processus, s_objet_argument_2);
166: liberation(s_etat_processus, s_objet_argument_3);
167:
168: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
169: return;
170: }
171:
172: l_element_courant = (*s_objet_argument_3).objet;
173: position = 1;
174:
175: while(l_element_courant != NULL)
176: {
177: if (position == (*((integer8 *) (*s_objet_argument_2).objet)))
178: {
179: /*
180: * Substitution
181: */
182:
183: liberation(s_etat_processus, (*l_element_courant).donnee);
184:
185: if (((*l_element_courant).donnee =
186: copie_objet(s_etat_processus,
187: (*((struct_liste_chainee *)
188: (*s_objet_argument_1).objet)).donnee, 'O')) == NULL)
189: {
190: (*s_etat_processus).erreur_systeme =
191: d_es_allocation_memoire;
192: return;
193: }
194:
195: /*
196: * Analyse de l'objet résultant de la substitution
197: */
198:
199: position_courante = (*s_etat_processus).position_courante;
200: registre_definitions_chainees = (*s_etat_processus)
201: .definitions_chainees;
202: registre_instruction_courante = (*s_etat_processus)
203: .instruction_courante;
204:
205: if (((*s_etat_processus).definitions_chainees =
206: formateur(s_etat_processus, 0, s_objet_argument_3))
207: == NULL)
208: {
209: (*s_etat_processus).erreur_systeme =
210: d_es_allocation_memoire;
211: return;
212: }
213:
214: if (analyse_syntaxique(s_etat_processus) == d_erreur)
215: {
216: free((*s_etat_processus).definitions_chainees);
217:
218: (*s_etat_processus).definitions_chainees =
219: registre_definitions_chainees;
220: (*s_etat_processus).instruction_courante =
221: registre_instruction_courante;
222: (*s_etat_processus).position_courante =
223: position_courante;
224:
225: liberation(s_etat_processus, s_objet_argument_1);
226: liberation(s_etat_processus, s_objet_argument_2);
227: liberation(s_etat_processus, s_objet_argument_3);
228:
229: (*s_etat_processus).erreur_execution =
230: d_ex_argument_invalide;
231: return;
232: }
233:
234: free((*s_etat_processus).definitions_chainees);
235:
236: (*s_etat_processus).definitions_chainees =
237: registre_definitions_chainees;
238: (*s_etat_processus).instruction_courante =
239: registre_instruction_courante;
240: (*s_etat_processus).position_courante =
241: position_courante;
242:
243: break;
244: }
245:
246: position++;
247: l_element_courant = (*l_element_courant).suivant;
248: }
249:
250: if (l_element_courant == NULL)
251: {
252: liberation(s_etat_processus, s_objet_argument_1);
253: liberation(s_etat_processus, s_objet_argument_2);
254: liberation(s_etat_processus, s_objet_argument_3);
255:
256: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
257: return;
258: }
259: }
260: else
261: {
262: liberation(s_etat_processus, s_objet_argument_1);
263: liberation(s_etat_processus, s_objet_argument_2);
264: liberation(s_etat_processus, s_objet_argument_3);
265:
266: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
267: return;
268: }
269:
270: liberation(s_etat_processus, s_objet_argument_1);
271: liberation(s_etat_processus, s_objet_argument_2);
272:
273: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
274: s_objet_argument_3) == d_erreur)
275: {
276: return;
277: }
278:
279: return;
280: }
281:
282:
283: /*
284: ================================================================================
285: Fonction 'obget'
286: ================================================================================
287: Entrées :
288: --------------------------------------------------------------------------------
289: Sorties :
290: --------------------------------------------------------------------------------
291: Effets de bord : néant
292: ================================================================================
293: */
294:
295: void
296: instruction_obget(struct_processus *s_etat_processus)
297: {
298: struct_liste_chainee *l_element_courant;
299:
300: struct_objet *s_objet_argument_1;
301: struct_objet *s_objet_argument_2;
302: struct_objet *s_objet_resultat;
303:
304: integer8 position;
305:
306: (*s_etat_processus).erreur_execution = d_ex;
307:
308: if ((*s_etat_processus).affichage_arguments == 'Y')
309: {
310: printf("\n OBGET ");
311:
312: if ((*s_etat_processus).langue == 'F')
313: {
314: printf("(extraction d'un objet)\n\n");
315: }
316: else
317: {
318: printf("(get objet)\n\n");
319: }
320:
321: printf(" 2: %s\n", d_RPN);
322: printf(" 1: %s\n", d_INT);
323: printf("-> 1: %s\n", d_LST);
324:
325: return;
326: }
327: else if ((*s_etat_processus).test_instruction == 'Y')
328: {
329: (*s_etat_processus).nombre_arguments = -1;
330: return;
331: }
332:
333: if (test_cfsf(s_etat_processus, 31) == d_vrai)
334: {
335: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
336: {
337: return;
338: }
339: }
340:
341: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
342: &s_objet_argument_1) == d_erreur)
343: {
344: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
345: return;
346: }
347:
348: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
349: &s_objet_argument_2) == d_erreur)
350: {
351: liberation(s_etat_processus, s_objet_argument_1);
352:
353: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
354: return;
355: }
356:
357: if (((*s_objet_argument_1).type == INT) &&
358: ((*s_objet_argument_2).type == RPN))
359: {
360: if ((*((integer8 *) (*s_objet_argument_1).objet)) <= 0)
361: {
362: liberation(s_etat_processus, s_objet_argument_1);
363: liberation(s_etat_processus, s_objet_argument_2);
364:
365: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
366: return;
367: }
368:
369: l_element_courant = (*s_objet_argument_2).objet;
370: position = 1;
371:
372: while(l_element_courant != NULL)
373: {
374: if (position == (*((integer8 *) (*s_objet_argument_1).objet)))
375: {
376: /*
377: * Récupération de l'objet
378: */
379:
380: if ((s_objet_resultat = allocation(s_etat_processus, LST))
381: == NULL)
382: {
383: (*s_etat_processus).erreur_systeme =
384: d_es_allocation_memoire;
385: return;
386: }
387:
388: if (((*s_objet_resultat).objet =
389: allocation_maillon(s_etat_processus)) == NULL)
390: {
391: (*s_etat_processus).erreur_systeme =
392: d_es_allocation_memoire;
393: return;
394: }
395:
396: (*((struct_liste_chainee *) (*s_objet_resultat).objet))
397: .suivant = NULL;
398:
399: if (((*((struct_liste_chainee *) (*s_objet_resultat).objet))
400: .donnee = copie_objet(s_etat_processus,
401: (*l_element_courant).donnee, 'O')) == NULL)
402: {
403: (*s_etat_processus).erreur_systeme =
404: d_es_allocation_memoire;
405: return;
406: }
407:
408: break;
409: }
410:
411: position++;
412: l_element_courant = (*l_element_courant).suivant;
413: }
414:
415: if (l_element_courant == NULL)
416: {
417: liberation(s_etat_processus, s_objet_argument_1);
418: liberation(s_etat_processus, s_objet_argument_2);
419:
420: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
421: return;
422: }
423:
424: /*
425: * Vérification de la cohérence de l'élément. Nous ne devons avoir
426: * ni '<<' ni '>>'.
427: */
428:
429: if ((*(*((struct_liste_chainee *) (*s_objet_resultat).objet))
430: .donnee).type == FCT)
431: {
432: if ((strcmp((*((struct_fonction *) (*(*((struct_liste_chainee *)
433: (*s_objet_resultat).objet)).donnee).objet)).nom_fonction,
434: "<<") == 0) || (strcmp((*((struct_fonction *)
435: (*(*((struct_liste_chainee *) (*s_objet_resultat).objet))
436: .donnee).objet)).nom_fonction, ">>") == 0))
437: {
438: liberation(s_etat_processus, s_objet_argument_1);
439: liberation(s_etat_processus, s_objet_argument_2);
440: liberation(s_etat_processus, s_objet_resultat);
441:
442: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
443: return;
444: }
445: }
446: }
447: else
448: {
449: liberation(s_etat_processus, s_objet_argument_1);
450: liberation(s_etat_processus, s_objet_argument_2);
451:
452: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
453: return;
454: }
455:
456: liberation(s_etat_processus, s_objet_argument_1);
457: liberation(s_etat_processus, s_objet_argument_2);
458:
459: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
460: s_objet_resultat) == d_erreur)
461: {
462: return;
463: }
464:
465: return;
466: }
467:
468: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>