File:
[local] /
rpl /
src /
instructions_l1.c
Revision
1.21:
download - view:
text,
annotated -
select for diffs -
revision graph
Tue Jun 21 15:26:32 2011 UTC (13 years, 10 months ago) by
bertrand
Branches:
MAIN
CVS tags:
HEAD
Correction d'une réinitialisation sauvage de la pile des variables par niveau
dans la copie de la structure de description du processus. Cela corrige
la fonction SPAWN qui échouait sur un segmentation fault car la pile des
variables par niveau était vide alors même que l'arbre des variables contenait
bien les variables. Passage à la prerelease 2.
1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.0.prerelease.2
4: Copyright (C) 1989-2011 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 'list->'
29: ================================================================================
30: Entrées : structure processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_list_fleche(struct_processus *s_etat_processus)
40: {
41: struct_liste_chainee *l_element_courant;
42: struct_liste_chainee *l_element_precedent;
43:
44: struct_objet *s_copie_objet;
45: struct_objet *s_objet;
46:
47: unsigned long nombre_elements;
48:
49: (*s_etat_processus).erreur_execution = d_ex;
50:
51: if ((*s_etat_processus).affichage_arguments == 'Y')
52: {
53: printf("\n LIST-> ");
54:
55: if ((*s_etat_processus).langue == 'F')
56: {
57: printf("(expansion d'une liste)\n\n");
58: }
59: else
60: {
61: printf("(expand list)\n\n");
62: }
63:
64: printf(" 1: %s\n", d_LST);
65: printf("-> n: %s, %s, %s, %s, %s, %s,\n"
66: " %s, %s, %s, %s, %s,\n"
67: " %s, %s, %s, %s, %s,\n"
68: " %s, %s\n",
69: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
70: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
71: printf(" ...\n");
72: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
73: " %s, %s, %s, %s, %s,\n"
74: " %s, %s, %s, %s, %s,\n"
75: " %s, %s\n",
76: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
77: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
78: printf(" 1: %s\n", d_INT);
79:
80: return;
81: }
82: else if ((*s_etat_processus).test_instruction == 'Y')
83: {
84: (*s_etat_processus).nombre_arguments = -1;
85: return;
86: }
87:
88: if (test_cfsf(s_etat_processus, 31) == d_vrai)
89: {
90: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
91: {
92: return;
93: }
94: }
95:
96: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
97: &s_objet) == d_erreur)
98: {
99: return;
100: }
101:
102: if ((*s_objet).type != LST)
103: {
104: liberation(s_etat_processus, s_objet);
105:
106: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
107: return;
108: }
109:
110: if ((s_copie_objet = copie_objet(s_etat_processus, s_objet, 'N')) == NULL)
111: {
112: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
113: return;
114: }
115:
116: liberation(s_etat_processus, s_objet);
117: s_objet = s_copie_objet;
118:
119: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
120: nombre_elements = 0;
121:
122: while(l_element_courant != NULL)
123: {
124: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
125: (*l_element_courant).donnee) == d_erreur)
126: {
127: return;
128: }
129:
130: l_element_precedent = l_element_courant;
131: l_element_courant = (*l_element_courant).suivant;
132:
133: free(l_element_precedent);
134:
135: nombre_elements++;
136: }
137:
138: free(s_objet);
139:
140: if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
141: {
142: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
143: return;
144: }
145:
146: (*((integer8 *) ((*s_objet).objet))) = (integer8) nombre_elements;
147:
148: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
149: s_objet) == d_erreur)
150: {
151: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
152: return;
153: }
154:
155: return;
156: }
157:
158:
159: /*
160: ================================================================================
161: Fonction '<='
162: ================================================================================
163: Entrées :
164: --------------------------------------------------------------------------------
165: Sorties :
166: --------------------------------------------------------------------------------
167: Effets de bord : néant
168: ================================================================================
169: */
170:
171: void
172: instruction_le(struct_processus *s_etat_processus)
173: {
174: struct_liste_chainee *l_element_courant;
175: struct_liste_chainee *l_element_precedent;
176:
177: struct_objet *s_copie_argument_1;
178: struct_objet *s_copie_argument_2;
179: struct_objet *s_objet_argument_1;
180: struct_objet *s_objet_argument_2;
181: struct_objet *s_objet_resultat;
182:
183: unsigned long nombre_elements;
184:
185: (*s_etat_processus).erreur_execution = d_ex;
186:
187: if ((*s_etat_processus).affichage_arguments == 'Y')
188: {
189: printf("\n <= ");
190:
191: if ((*s_etat_processus).langue == 'F')
192: {
193: printf("(opérateur inférieur ou égal)\n\n");
194: }
195: else
196: {
197: printf("(less or equal)\n\n");
198: }
199:
200: printf(" 2: %s, %s\n", d_INT, d_REL);
201: printf(" 1: %s, %s\n", d_INT, d_REL);
202: printf("-> 1: %s\n\n", d_INT);
203:
204: printf(" 2: %s\n", d_BIN);
205: printf(" 1: %s\n", d_BIN);
206: printf("-> 1: %s\n\n", d_INT);
207:
208: printf(" 2: %s\n", d_CHN);
209: printf(" 1: %s\n", d_CHN);
210: printf("-> 1: %s\n\n", d_INT);
211:
212: printf(" 2: %s\n", d_NOM);
213: printf(" 1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
214: printf("-> 1: %s\n\n", d_ALG);
215:
216: printf(" 2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
217: printf(" 1: %s\n", d_NOM);
218: printf("-> 1: %s\n\n", d_ALG);
219:
220: printf(" 2: %s\n", d_ALG);
221: printf(" 1: %s\n", d_ALG);
222: printf("-> 1: %s\n\n", d_ALG);
223:
224: printf(" 2: %s\n", d_RPN);
225: printf(" 1: %s\n", d_RPN);
226: printf("-> 1: %s\n", d_RPN);
227:
228: return;
229: }
230: else if ((*s_etat_processus).test_instruction == 'Y')
231: {
232: (*s_etat_processus).nombre_arguments = 0;
233: return;
234: }
235:
236: if (test_cfsf(s_etat_processus, 31) == d_vrai)
237: {
238: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
239: {
240: return;
241: }
242: }
243:
244: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
245: &s_objet_argument_1) == d_erreur)
246: {
247: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
248: return;
249: }
250:
251: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
252: &s_objet_argument_2) == d_erreur)
253: {
254: liberation(s_etat_processus, s_objet_argument_1);
255:
256: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
257: return;
258: }
259:
260: /*
261: --------------------------------------------------------------------------------
262: LE sur des valeurs numériques
263: --------------------------------------------------------------------------------
264: */
265:
266: if ((((*s_objet_argument_1).type == INT) ||
267: ((*s_objet_argument_1).type == REL)) &&
268: (((*s_objet_argument_2).type == INT) ||
269: ((*s_objet_argument_2).type == REL)))
270: {
271: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
272: {
273: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
274: return;
275: }
276:
277: if ((*s_objet_argument_1).type == INT)
278: {
279: if ((*s_objet_argument_2).type == INT)
280: {
281: (*((integer8 *) (*s_objet_resultat).objet)) =
282: ((*((integer8 *) (*s_objet_argument_1).objet)) >=
283: (*((integer8 *) (*s_objet_argument_2).objet)))
284: ? -1 : 0;
285: }
286: else
287: {
288: (*((integer8 *) (*s_objet_resultat).objet)) =
289: ((*((integer8 *) (*s_objet_argument_1).objet)) >=
290: (*((real8 *) (*s_objet_argument_2).objet)))
291: ? -1 : 0;
292: }
293: }
294: else
295: {
296: if ((*s_objet_argument_2).type == INT)
297: {
298: (*((integer8 *) (*s_objet_resultat).objet)) =
299: ((*((real8 *) (*s_objet_argument_1).objet)) >=
300: (*((integer8 *) (*s_objet_argument_2).objet)))
301: ? -1 : 0;
302: }
303: else
304: {
305: (*((integer8 *) (*s_objet_resultat).objet)) =
306: ((*((real8 *) (*s_objet_argument_1).objet)) >=
307: (*((real8 *) (*s_objet_argument_2).objet)))
308: ? -1 : 0;
309: }
310: }
311: }
312:
313: /*
314: --------------------------------------------------------------------------------
315: LE binaire
316: --------------------------------------------------------------------------------
317: */
318:
319: else if (((*s_objet_argument_1).type == BIN) &&
320: ((*s_objet_argument_2).type == BIN))
321: {
322: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
323: {
324: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
325: return;
326: }
327:
328: (*((integer8 *) (*s_objet_resultat).objet)) =
329: ((*((logical8 *) (*s_objet_argument_1).objet)) >=
330: (*((logical8 *) (*s_objet_argument_2).objet)))
331: ? -1 : 0;
332: }
333:
334: /*
335: --------------------------------------------------------------------------------
336: LE portant sur des chaînes de caractères
337: --------------------------------------------------------------------------------
338: */
339:
340: else if (((*s_objet_argument_1).type == CHN) &&
341: ((*s_objet_argument_2).type == CHN))
342: {
343: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
344: {
345: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
346: return;
347: }
348:
349: (*((integer8 *) (*s_objet_resultat).objet)) =
350: (strcmp((unsigned char *) (*s_objet_argument_1).objet,
351: (unsigned char *) (*s_objet_argument_2).objet) >= 0) ? -1 : 0;
352: }
353:
354: /*
355: --------------------------------------------------------------------------------
356: LE entre des arguments complexes
357: --------------------------------------------------------------------------------
358: */
359:
360: /*
361: * Nom ou valeur numérique / Nom ou valeur numérique
362: */
363:
364: else if ((((*s_objet_argument_1).type == NOM) &&
365: (((*s_objet_argument_2).type == NOM) ||
366: ((*s_objet_argument_2).type == INT) ||
367: ((*s_objet_argument_2).type == REL))) ||
368: (((*s_objet_argument_2).type == NOM) &&
369: (((*s_objet_argument_1).type == INT) ||
370: ((*s_objet_argument_1).type == REL))))
371: {
372: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
373: {
374: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
375: return;
376: }
377:
378: if (((*s_objet_resultat).objet =
379: allocation_maillon(s_etat_processus)) == NULL)
380: {
381: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
382: return;
383: }
384:
385: l_element_courant = (*s_objet_resultat).objet;
386:
387: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
388: == NULL)
389: {
390: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
391: return;
392: }
393:
394: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
395: .nombre_arguments = 0;
396: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
397: .fonction = instruction_vers_niveau_superieur;
398:
399: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
400: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
401: {
402: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
403: return;
404: }
405:
406: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
407: .nom_fonction, "<<");
408:
409: if (((*l_element_courant).suivant =
410: allocation_maillon(s_etat_processus)) == NULL)
411: {
412: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
413: return;
414: }
415:
416: l_element_courant = (*l_element_courant).suivant;
417: (*l_element_courant).donnee = s_objet_argument_2;
418:
419: if (((*l_element_courant).suivant =
420: allocation_maillon(s_etat_processus)) == NULL)
421: {
422: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
423: return;
424: }
425:
426: l_element_courant = (*l_element_courant).suivant;
427: (*l_element_courant).donnee = s_objet_argument_1;
428:
429: if (((*l_element_courant).suivant =
430: allocation_maillon(s_etat_processus)) == NULL)
431: {
432: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
433: return;
434: }
435:
436: l_element_courant = (*l_element_courant).suivant;
437:
438: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
439: == NULL)
440: {
441: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
442: return;
443: }
444:
445: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
446: .nombre_arguments = 0;
447: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
448: .fonction = instruction_le;
449:
450: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
451: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
452: {
453: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
454: return;
455: }
456:
457: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
458: .nom_fonction, "<=");
459:
460: if (((*l_element_courant).suivant =
461: allocation_maillon(s_etat_processus)) == NULL)
462: {
463: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
464: return;
465: }
466:
467: l_element_courant = (*l_element_courant).suivant;
468:
469: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
470: == NULL)
471: {
472: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
473: return;
474: }
475:
476: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
477: .nombre_arguments = 0;
478: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
479: .fonction = instruction_vers_niveau_inferieur;
480:
481: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
482: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
483: {
484: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
485: return;
486: }
487:
488: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
489: .nom_fonction, ">>");
490:
491: (*l_element_courant).suivant = NULL;
492:
493: s_objet_argument_1 = NULL;
494: s_objet_argument_2 = NULL;
495: }
496:
497: /*
498: * Nom ou valeur numérique / Expression
499: */
500:
501: else if (((((*s_objet_argument_1).type == ALG) ||
502: ((*s_objet_argument_1).type == RPN))) &&
503: (((*s_objet_argument_2).type == NOM) ||
504: ((*s_objet_argument_2).type == INT) ||
505: ((*s_objet_argument_2).type == REL)))
506: {
507: nombre_elements = 0;
508: l_element_courant = (struct_liste_chainee *)
509: (*s_objet_argument_1).objet;
510:
511: while(l_element_courant != NULL)
512: {
513: nombre_elements++;
514: l_element_courant = (*l_element_courant).suivant;
515: }
516:
517: if (nombre_elements == 2)
518: {
519: liberation(s_etat_processus, s_objet_argument_1);
520: liberation(s_etat_processus, s_objet_argument_2);
521:
522: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
523: return;
524: }
525:
526: if ((s_objet_resultat = copie_objet(s_etat_processus,
527: s_objet_argument_1, 'N')) == NULL)
528: {
529: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
530: return;
531: }
532:
533: l_element_courant = (struct_liste_chainee *)
534: (*s_objet_resultat).objet;
535: l_element_precedent = l_element_courant;
536: l_element_courant = (*l_element_courant).suivant;
537:
538: if (((*l_element_precedent).suivant =
539: allocation_maillon(s_etat_processus)) == NULL)
540: {
541: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
542: return;
543: }
544:
545: (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
546: (*(*l_element_precedent).suivant).suivant = l_element_courant;
547:
548: while((*l_element_courant).suivant != NULL)
549: {
550: l_element_precedent = l_element_courant;
551: l_element_courant = (*l_element_courant).suivant;
552: }
553:
554: if (((*l_element_precedent).suivant =
555: allocation_maillon(s_etat_processus)) == NULL)
556: {
557: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
558: return;
559: }
560:
561: if (((*(*l_element_precedent).suivant).donnee =
562: allocation(s_etat_processus, FCT)) == NULL)
563: {
564: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
565: return;
566: }
567:
568: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
569: .donnee).objet)).nombre_arguments = 0;
570: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
571: .donnee).objet)).fonction = instruction_le;
572:
573: if (((*((struct_fonction *) (*(*(*l_element_precedent)
574: .suivant).donnee).objet)).nom_fonction =
575: malloc(3 * sizeof(unsigned char))) == NULL)
576: {
577: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
578: return;
579: }
580:
581: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
582: .suivant).donnee).objet)).nom_fonction, "<=");
583:
584: (*(*l_element_precedent).suivant).suivant = l_element_courant;
585:
586: s_objet_argument_2 = NULL;
587: }
588:
589: /*
590: * Expression / Nom ou valeur numérique
591: */
592:
593: else if ((((*s_objet_argument_1).type == NOM) ||
594: ((*s_objet_argument_1).type == INT) ||
595: ((*s_objet_argument_1).type == REL)) &&
596: ((((*s_objet_argument_2).type == ALG) ||
597: ((*s_objet_argument_2).type == RPN))))
598: {
599: nombre_elements = 0;
600: l_element_courant = (struct_liste_chainee *)
601: (*s_objet_argument_2).objet;
602:
603: while(l_element_courant != NULL)
604: {
605: nombre_elements++;
606: l_element_courant = (*l_element_courant).suivant;
607: }
608:
609: if (nombre_elements == 2)
610: {
611: liberation(s_etat_processus, s_objet_argument_1);
612: liberation(s_etat_processus, s_objet_argument_2);
613:
614: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
615: return;
616: }
617:
618: if ((s_objet_resultat = copie_objet(s_etat_processus,
619: s_objet_argument_2, 'N')) == NULL)
620: {
621: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
622: return;
623: }
624:
625: l_element_courant = (struct_liste_chainee *)
626: (*s_objet_resultat).objet;
627: l_element_precedent = l_element_courant;
628:
629: while((*l_element_courant).suivant != NULL)
630: {
631: l_element_precedent = l_element_courant;
632: l_element_courant = (*l_element_courant).suivant;
633: }
634:
635: if (((*l_element_precedent).suivant =
636: allocation_maillon(s_etat_processus)) == NULL)
637: {
638: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
639: return;
640: }
641:
642: (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
643: l_element_precedent = (*l_element_precedent).suivant;
644:
645: if (((*l_element_precedent).suivant =
646: allocation_maillon(s_etat_processus)) == NULL)
647: {
648: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
649: return;
650: }
651:
652: if (((*(*l_element_precedent).suivant).donnee =
653: allocation(s_etat_processus, FCT)) == NULL)
654: {
655: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
656: return;
657: }
658:
659: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
660: .donnee).objet)).nombre_arguments = 0;
661: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
662: .donnee).objet)).fonction = instruction_le;
663:
664: if (((*((struct_fonction *) (*(*(*l_element_precedent)
665: .suivant).donnee).objet)).nom_fonction =
666: malloc(3 * sizeof(unsigned char))) == NULL)
667: {
668: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
669: return;
670: }
671:
672: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
673: .suivant).donnee).objet)).nom_fonction, "<=");
674:
675: (*(*l_element_precedent).suivant).suivant = l_element_courant;
676:
677: s_objet_argument_1 = NULL;
678: }
679:
680: /*
681: * Expression / Expression
682: */
683:
684: else if ((((*s_objet_argument_1).type == ALG) &&
685: ((*s_objet_argument_2).type == ALG)) ||
686: (((*s_objet_argument_1).type == RPN) &&
687: ((*s_objet_argument_2).type == RPN)))
688: {
689: nombre_elements = 0;
690: l_element_courant = (struct_liste_chainee *)
691: (*s_objet_argument_1).objet;
692:
693: while(l_element_courant != NULL)
694: {
695: nombre_elements++;
696: l_element_courant = (*l_element_courant).suivant;
697: }
698:
699: if (nombre_elements == 2)
700: {
701: liberation(s_etat_processus, s_objet_argument_1);
702: liberation(s_etat_processus, s_objet_argument_2);
703:
704: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
705: return;
706: }
707:
708: nombre_elements = 0;
709: l_element_courant = (struct_liste_chainee *)
710: (*s_objet_argument_2).objet;
711:
712: while(l_element_courant != NULL)
713: {
714: nombre_elements++;
715: l_element_courant = (*l_element_courant).suivant;
716: }
717:
718: if (nombre_elements == 2)
719: {
720: liberation(s_etat_processus, s_objet_argument_1);
721: liberation(s_etat_processus, s_objet_argument_2);
722:
723: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
724: return;
725: }
726:
727: if ((s_copie_argument_1 = copie_objet(s_etat_processus,
728: s_objet_argument_1, 'N')) == NULL)
729: {
730: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
731: return;
732: }
733:
734: if ((s_copie_argument_2 = copie_objet(s_etat_processus,
735: s_objet_argument_2, 'N')) == NULL)
736: {
737: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
738: return;
739: }
740:
741: l_element_courant = (struct_liste_chainee *)
742: (*s_copie_argument_1).objet;
743: (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
744: (*s_copie_argument_1).objet)).suivant;
745:
746: liberation(s_etat_processus, (*l_element_courant).donnee);
747: free(l_element_courant);
748:
749: l_element_courant = (struct_liste_chainee *)
750: (*s_copie_argument_2).objet;
751: l_element_precedent = l_element_courant;
752: s_objet_resultat = s_copie_argument_2;
753:
754: while((*l_element_courant).suivant != NULL)
755: {
756: l_element_precedent = l_element_courant;
757: l_element_courant = (*l_element_courant).suivant;
758: }
759:
760: liberation(s_etat_processus, (*l_element_courant).donnee);
761: free(l_element_courant);
762:
763: (*l_element_precedent).suivant = (struct_liste_chainee *)
764: (*s_copie_argument_1).objet;
765: free(s_copie_argument_1);
766:
767: l_element_courant = (*l_element_precedent).suivant;
768: while((*l_element_courant).suivant != NULL)
769: {
770: l_element_precedent = l_element_courant;
771: l_element_courant = (*l_element_courant).suivant;
772: }
773:
774: if (((*l_element_precedent).suivant =
775: allocation_maillon(s_etat_processus)) == NULL)
776: {
777: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
778: return;
779: }
780:
781: (*(*l_element_precedent).suivant).suivant = l_element_courant;
782: l_element_courant = (*l_element_precedent).suivant;
783:
784: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
785: == NULL)
786: {
787: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
788: return;
789: }
790:
791: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
792: .nombre_arguments = 0;
793: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
794: .fonction = instruction_le;
795:
796: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
797: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
798: {
799: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
800: return;
801: }
802:
803: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
804: .nom_fonction, "<=");
805: }
806:
807: /*
808: --------------------------------------------------------------------------------
809: LE impossible
810: --------------------------------------------------------------------------------
811: */
812:
813: else
814: {
815: liberation(s_etat_processus, s_objet_argument_1);
816: liberation(s_etat_processus, s_objet_argument_2);
817:
818: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
819: return;
820: }
821:
822: liberation(s_etat_processus, s_objet_argument_1);
823: liberation(s_etat_processus, s_objet_argument_2);
824:
825: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
826: s_objet_resultat) == d_erreur)
827: {
828: return;
829: }
830:
831: return;
832: }
833:
834:
835: /*
836: ================================================================================
837: Fonction '<'
838: ================================================================================
839: Entrées :
840: --------------------------------------------------------------------------------
841: Sorties :
842: --------------------------------------------------------------------------------
843: Effets de bord : néant
844: ================================================================================
845: */
846:
847: void
848: instruction_lt(struct_processus *s_etat_processus)
849: {
850: struct_liste_chainee *l_element_courant;
851: struct_liste_chainee *l_element_precedent;
852:
853: struct_objet *s_copie_argument_1;
854: struct_objet *s_copie_argument_2;
855: struct_objet *s_objet_argument_1;
856: struct_objet *s_objet_argument_2;
857: struct_objet *s_objet_resultat;
858:
859: unsigned long nombre_elements;
860:
861: (*s_etat_processus).erreur_execution = d_ex;
862:
863: if ((*s_etat_processus).affichage_arguments == 'Y')
864: {
865: printf("\n < ");
866:
867: if ((*s_etat_processus).langue == 'F')
868: {
869: printf("(opérateur inférieur strictement)\n\n");
870: }
871: else
872: {
873: printf("(less than)\n\n");
874: }
875:
876: printf(" 2: %s, %s\n", d_INT, d_REL);
877: printf(" 1: %s, %s\n", d_INT, d_REL);
878: printf("-> 1: %s\n\n", d_INT);
879:
880: printf(" 2: %s\n", d_BIN);
881: printf(" 1: %s\n", d_BIN);
882: printf("-> 1: %s\n\n", d_INT);
883:
884: printf(" 2: %s\n", d_CHN);
885: printf(" 1: %s\n", d_CHN);
886: printf("-> 1: %s\n\n", d_INT);
887:
888: printf(" 2: %s\n", d_NOM);
889: printf(" 1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
890: printf("-> 1: %s\n\n", d_ALG);
891:
892: printf(" 2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
893: printf(" 1: %s\n", d_NOM);
894: printf("-> 1: %s\n\n", d_ALG);
895:
896: printf(" 2: %s\n", d_ALG);
897: printf(" 1: %s\n", d_ALG);
898: printf("-> 1: %s\n\n", d_ALG);
899:
900: printf(" 2: %s\n", d_RPN);
901: printf(" 1: %s\n", d_RPN);
902: printf("-> 1: %s\n", d_RPN);
903:
904: return;
905: }
906: else if ((*s_etat_processus).test_instruction == 'Y')
907: {
908: (*s_etat_processus).nombre_arguments = 0;
909: return;
910: }
911:
912: if (test_cfsf(s_etat_processus, 31) == d_vrai)
913: {
914: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
915: {
916: return;
917: }
918: }
919:
920: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
921: &s_objet_argument_1) == d_erreur)
922: {
923: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
924: return;
925: }
926:
927: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
928: &s_objet_argument_2) == d_erreur)
929: {
930: liberation(s_etat_processus, s_objet_argument_1);
931:
932: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
933: return;
934: }
935:
936: /*
937: --------------------------------------------------------------------------------
938: LT sur des valeurs numériques
939: --------------------------------------------------------------------------------
940: */
941:
942: if ((((*s_objet_argument_1).type == INT) ||
943: ((*s_objet_argument_1).type == REL)) &&
944: (((*s_objet_argument_2).type == INT) ||
945: ((*s_objet_argument_2).type == REL)))
946: {
947: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
948: {
949: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
950: return;
951: }
952:
953: if ((*s_objet_argument_1).type == INT)
954: {
955: if ((*s_objet_argument_2).type == INT)
956: {
957: (*((integer8 *) (*s_objet_resultat).objet)) =
958: ((*((integer8 *) (*s_objet_argument_1).objet)) >
959: (*((integer8 *) (*s_objet_argument_2).objet)))
960: ? -1 : 0;
961: }
962: else
963: {
964: (*((integer8 *) (*s_objet_resultat).objet)) =
965: ((*((integer8 *) (*s_objet_argument_1).objet)) >
966: (*((real8 *) (*s_objet_argument_2).objet)))
967: ? -1 : 0;
968: }
969: }
970: else
971: {
972: if ((*s_objet_argument_2).type == INT)
973: {
974: (*((integer8 *) (*s_objet_resultat).objet)) =
975: ((*((real8 *) (*s_objet_argument_1).objet)) >
976: (*((integer8 *) (*s_objet_argument_2).objet)))
977: ? -1 : 0;
978: }
979: else
980: {
981: (*((integer8 *) (*s_objet_resultat).objet)) =
982: ((*((real8 *) (*s_objet_argument_1).objet)) >
983: (*((real8 *) (*s_objet_argument_2).objet)))
984: ? -1 : 0;
985: }
986: }
987: }
988:
989: /*
990: --------------------------------------------------------------------------------
991: LT binaire
992: --------------------------------------------------------------------------------
993: */
994:
995: else if (((*s_objet_argument_1).type == BIN) &&
996: ((*s_objet_argument_2).type == BIN))
997: {
998: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
999: {
1000: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1001: return;
1002: }
1003:
1004: (*((integer8 *) (*s_objet_resultat).objet)) =
1005: ((*((logical8 *) (*s_objet_argument_1).objet)) >
1006: (*((logical8 *) (*s_objet_argument_2).objet)))
1007: ? -1 : 0;
1008: }
1009:
1010: /*
1011: --------------------------------------------------------------------------------
1012: LT portant sur des chaînes de caractères
1013: --------------------------------------------------------------------------------
1014: */
1015:
1016: else if (((*s_objet_argument_1).type == CHN) &&
1017: ((*s_objet_argument_2).type == CHN))
1018: {
1019: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1020: {
1021: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1022: return;
1023: }
1024:
1025: (*((integer8 *) (*s_objet_resultat).objet)) =
1026: (strcmp((unsigned char *) (*s_objet_argument_1).objet,
1027: (unsigned char *) (*s_objet_argument_2).objet) > 0) ? -1 : 0;
1028: }
1029:
1030: /*
1031: --------------------------------------------------------------------------------
1032: LT entre des arguments complexes
1033: --------------------------------------------------------------------------------
1034: */
1035:
1036: /*
1037: * Nom ou valeur numérique / Nom ou valeur numérique
1038: */
1039:
1040: else if ((((*s_objet_argument_1).type == NOM) &&
1041: (((*s_objet_argument_2).type == NOM) ||
1042: ((*s_objet_argument_2).type == INT) ||
1043: ((*s_objet_argument_2).type == REL))) ||
1044: (((*s_objet_argument_2).type == NOM) &&
1045: (((*s_objet_argument_1).type == INT) ||
1046: ((*s_objet_argument_1).type == REL))))
1047: {
1048: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
1049: {
1050: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1051: return;
1052: }
1053:
1054: if (((*s_objet_resultat).objet =
1055: allocation_maillon(s_etat_processus)) == NULL)
1056: {
1057: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1058: return;
1059: }
1060:
1061: l_element_courant = (*s_objet_resultat).objet;
1062:
1063: if (((*l_element_courant).donnee =
1064: allocation(s_etat_processus, FCT)) == NULL)
1065: {
1066: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1067: return;
1068: }
1069:
1070: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1071: .nombre_arguments = 0;
1072: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1073: .fonction = instruction_vers_niveau_superieur;
1074:
1075: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1076: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1077: {
1078: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1079: return;
1080: }
1081:
1082: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1083: .nom_fonction, "<<");
1084:
1085: if (((*l_element_courant).suivant =
1086: allocation_maillon(s_etat_processus)) == NULL)
1087: {
1088: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1089: return;
1090: }
1091:
1092: l_element_courant = (*l_element_courant).suivant;
1093: (*l_element_courant).donnee = s_objet_argument_2;
1094:
1095: if (((*l_element_courant).suivant =
1096: allocation_maillon(s_etat_processus)) == NULL)
1097: {
1098: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1099: return;
1100: }
1101:
1102: l_element_courant = (*l_element_courant).suivant;
1103: (*l_element_courant).donnee = s_objet_argument_1;
1104:
1105: if (((*l_element_courant).suivant =
1106: allocation_maillon(s_etat_processus)) == NULL)
1107: {
1108: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1109: return;
1110: }
1111:
1112: l_element_courant = (*l_element_courant).suivant;
1113:
1114: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1115: == NULL)
1116: {
1117: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1118: return;
1119: }
1120:
1121: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1122: .nombre_arguments = 0;
1123: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1124: .fonction = instruction_lt;
1125:
1126: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1127: .nom_fonction = malloc(2 * sizeof(unsigned char))) == NULL)
1128: {
1129: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1130: return;
1131: }
1132:
1133: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1134: .nom_fonction, "<");
1135:
1136: if (((*l_element_courant).suivant =
1137: allocation_maillon(s_etat_processus)) == NULL)
1138: {
1139: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1140: return;
1141: }
1142:
1143: l_element_courant = (*l_element_courant).suivant;
1144:
1145: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1146: == NULL)
1147: {
1148: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1149: return;
1150: }
1151:
1152: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1153: .nombre_arguments = 0;
1154: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1155: .fonction = instruction_vers_niveau_inferieur;
1156:
1157: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1158: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1159: {
1160: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1161: return;
1162: }
1163:
1164: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1165: .nom_fonction, ">>");
1166:
1167: (*l_element_courant).suivant = NULL;
1168:
1169: s_objet_argument_1 = NULL;
1170: s_objet_argument_2 = NULL;
1171: }
1172:
1173: /*
1174: * Nom ou valeur numérique / Expression
1175: */
1176:
1177: else if (((((*s_objet_argument_1).type == ALG) ||
1178: ((*s_objet_argument_1).type == RPN))) &&
1179: (((*s_objet_argument_2).type == NOM) ||
1180: ((*s_objet_argument_2).type == INT) ||
1181: ((*s_objet_argument_2).type == REL)))
1182: {
1183: nombre_elements = 0;
1184: l_element_courant = (struct_liste_chainee *)
1185: (*s_objet_argument_1).objet;
1186:
1187: while(l_element_courant != NULL)
1188: {
1189: nombre_elements++;
1190: l_element_courant = (*l_element_courant).suivant;
1191: }
1192:
1193: if (nombre_elements == 2)
1194: {
1195: liberation(s_etat_processus, s_objet_argument_1);
1196: liberation(s_etat_processus, s_objet_argument_2);
1197:
1198: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1199: return;
1200: }
1201:
1202: if ((s_objet_resultat = copie_objet(s_etat_processus,
1203: s_objet_argument_1, 'N')) == NULL)
1204: {
1205: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1206: return;
1207: }
1208:
1209: l_element_courant = (struct_liste_chainee *)
1210: (*s_objet_resultat).objet;
1211: l_element_precedent = l_element_courant;
1212: l_element_courant = (*l_element_courant).suivant;
1213:
1214: if (((*l_element_precedent).suivant =
1215: allocation_maillon(s_etat_processus)) == NULL)
1216: {
1217: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1218: return;
1219: }
1220:
1221: (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
1222: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1223:
1224: while((*l_element_courant).suivant != NULL)
1225: {
1226: l_element_precedent = l_element_courant;
1227: l_element_courant = (*l_element_courant).suivant;
1228: }
1229:
1230: if (((*l_element_precedent).suivant =
1231: allocation_maillon(s_etat_processus)) == NULL)
1232: {
1233: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1234: return;
1235: }
1236:
1237: if (((*(*l_element_precedent).suivant).donnee =
1238: allocation(s_etat_processus, FCT)) == NULL)
1239: {
1240: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1241: return;
1242: }
1243:
1244: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1245: .donnee).objet)).nombre_arguments = 0;
1246: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1247: .donnee).objet)).fonction = instruction_lt;
1248:
1249: if (((*((struct_fonction *) (*(*(*l_element_precedent)
1250: .suivant).donnee).objet)).nom_fonction =
1251: malloc(2 * sizeof(unsigned char))) == NULL)
1252: {
1253: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1254: return;
1255: }
1256:
1257: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
1258: .suivant).donnee).objet)).nom_fonction, "<");
1259:
1260: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1261:
1262: s_objet_argument_2 = NULL;
1263: }
1264:
1265: /*
1266: * Expression / Nom ou valeur numérique
1267: */
1268:
1269: else if ((((*s_objet_argument_1).type == NOM) ||
1270: ((*s_objet_argument_1).type == INT) ||
1271: ((*s_objet_argument_1).type == REL)) &&
1272: ((((*s_objet_argument_2).type == ALG) ||
1273: ((*s_objet_argument_2).type == RPN))))
1274: {
1275: nombre_elements = 0;
1276: l_element_courant = (struct_liste_chainee *)
1277: (*s_objet_argument_2).objet;
1278:
1279: while(l_element_courant != NULL)
1280: {
1281: nombre_elements++;
1282: l_element_courant = (*l_element_courant).suivant;
1283: }
1284:
1285: if (nombre_elements == 2)
1286: {
1287: liberation(s_etat_processus, s_objet_argument_1);
1288: liberation(s_etat_processus, s_objet_argument_2);
1289:
1290: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1291: return;
1292: }
1293:
1294: if ((s_objet_resultat = copie_objet(s_etat_processus,
1295: s_objet_argument_2, 'N')) == NULL)
1296: {
1297: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1298: return;
1299: }
1300:
1301: l_element_courant = (struct_liste_chainee *)
1302: (*s_objet_resultat).objet;
1303: l_element_precedent = l_element_courant;
1304:
1305: while((*l_element_courant).suivant != NULL)
1306: {
1307: l_element_precedent = l_element_courant;
1308: l_element_courant = (*l_element_courant).suivant;
1309: }
1310:
1311: if (((*l_element_precedent).suivant =
1312: allocation_maillon(s_etat_processus)) == NULL)
1313: {
1314: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1315: return;
1316: }
1317:
1318: (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
1319: l_element_precedent = (*l_element_precedent).suivant;
1320:
1321: if (((*l_element_precedent).suivant =
1322: allocation_maillon(s_etat_processus)) == NULL)
1323: {
1324: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1325: return;
1326: }
1327:
1328: if (((*(*l_element_precedent).suivant).donnee =
1329: allocation(s_etat_processus, FCT)) == NULL)
1330: {
1331: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1332: return;
1333: }
1334:
1335: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1336: .donnee).objet)).nombre_arguments = 0;
1337: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1338: .donnee).objet)).fonction = instruction_lt;
1339:
1340: if (((*((struct_fonction *) (*(*(*l_element_precedent)
1341: .suivant).donnee).objet)).nom_fonction =
1342: malloc(2 * sizeof(unsigned char))) == NULL)
1343: {
1344: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1345: return;
1346: }
1347:
1348: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
1349: .suivant).donnee).objet)).nom_fonction, "<");
1350:
1351: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1352:
1353: s_objet_argument_1 = NULL;
1354: }
1355:
1356: /*
1357: * Expression / Expression
1358: */
1359:
1360: else if ((((*s_objet_argument_1).type == ALG) &&
1361: ((*s_objet_argument_2).type == ALG)) ||
1362: (((*s_objet_argument_1).type == RPN) &&
1363: ((*s_objet_argument_2).type == RPN)))
1364: {
1365: nombre_elements = 0;
1366: l_element_courant = (struct_liste_chainee *)
1367: (*s_objet_argument_1).objet;
1368:
1369: while(l_element_courant != NULL)
1370: {
1371: nombre_elements++;
1372: l_element_courant = (*l_element_courant).suivant;
1373: }
1374:
1375: if (nombre_elements == 2)
1376: {
1377: liberation(s_etat_processus, s_objet_argument_1);
1378: liberation(s_etat_processus, s_objet_argument_2);
1379:
1380: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1381: return;
1382: }
1383:
1384: nombre_elements = 0;
1385: l_element_courant = (struct_liste_chainee *)
1386: (*s_objet_argument_2).objet;
1387:
1388: while(l_element_courant != NULL)
1389: {
1390: nombre_elements++;
1391: l_element_courant = (*l_element_courant).suivant;
1392: }
1393:
1394: if (nombre_elements == 2)
1395: {
1396: liberation(s_etat_processus, s_objet_argument_1);
1397: liberation(s_etat_processus, s_objet_argument_2);
1398:
1399: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1400: return;
1401: }
1402:
1403: if ((s_copie_argument_1 = copie_objet(s_etat_processus,
1404: s_objet_argument_1, 'N')) == NULL)
1405: {
1406: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1407: return;
1408: }
1409:
1410: if ((s_copie_argument_2 = copie_objet(s_etat_processus,
1411: s_objet_argument_2, 'N')) == NULL)
1412: {
1413: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1414: return;
1415: }
1416:
1417: l_element_courant = (struct_liste_chainee *)
1418: (*s_copie_argument_1).objet;
1419: (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
1420: (*s_copie_argument_1).objet)).suivant;
1421:
1422: liberation(s_etat_processus, (*l_element_courant).donnee);
1423: free(l_element_courant);
1424:
1425: l_element_courant = (struct_liste_chainee *)
1426: (*s_copie_argument_2).objet;
1427: l_element_precedent = l_element_courant;
1428: s_objet_resultat = s_copie_argument_2;
1429:
1430: while((*l_element_courant).suivant != NULL)
1431: {
1432: l_element_precedent = l_element_courant;
1433: l_element_courant = (*l_element_courant).suivant;
1434: }
1435:
1436: liberation(s_etat_processus, (*l_element_courant).donnee);
1437: free(l_element_courant);
1438:
1439: (*l_element_precedent).suivant = (struct_liste_chainee *)
1440: (*s_copie_argument_1).objet;
1441: free(s_copie_argument_1);
1442:
1443: l_element_courant = (*l_element_precedent).suivant;
1444: while((*l_element_courant).suivant != NULL)
1445: {
1446: l_element_precedent = l_element_courant;
1447: l_element_courant = (*l_element_courant).suivant;
1448: }
1449:
1450: if (((*l_element_precedent).suivant =
1451: allocation_maillon(s_etat_processus)) == NULL)
1452: {
1453: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1454: return;
1455: }
1456:
1457: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1458: l_element_courant = (*l_element_precedent).suivant;
1459:
1460: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1461: == NULL)
1462: {
1463: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1464: return;
1465: }
1466:
1467: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1468: .nombre_arguments = 0;
1469: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1470: .fonction = instruction_lt;
1471:
1472: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1473: .nom_fonction = malloc(2 * sizeof(unsigned char))) == NULL)
1474: {
1475: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1476: return;
1477: }
1478:
1479: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1480: .nom_fonction, "<");
1481: }
1482:
1483: /*
1484: --------------------------------------------------------------------------------
1485: LT impossible
1486: --------------------------------------------------------------------------------
1487: */
1488:
1489: else
1490: {
1491: liberation(s_etat_processus, s_objet_argument_1);
1492: liberation(s_etat_processus, s_objet_argument_2);
1493:
1494: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1495: return;
1496: }
1497:
1498: liberation(s_etat_processus, s_objet_argument_1);
1499: liberation(s_etat_processus, s_objet_argument_2);
1500:
1501: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1502: s_objet_resultat) == d_erreur)
1503: {
1504: return;
1505: }
1506:
1507: return;
1508: }
1509:
1510:
1511: /*
1512: ================================================================================
1513: Fonction 'last'
1514: ================================================================================
1515: Entrées : structure processus
1516: --------------------------------------------------------------------------------
1517: Sorties :
1518: --------------------------------------------------------------------------------
1519: Effets de bord : néant
1520: ================================================================================
1521: */
1522:
1523: void
1524: instruction_last(struct_processus *s_etat_processus)
1525: {
1526: struct_liste_chainee *l_element_courant;
1527:
1528: struct_objet *s_objet;
1529:
1530: (*s_etat_processus).erreur_execution = d_ex;
1531:
1532: if ((*s_etat_processus).affichage_arguments == 'Y')
1533: {
1534: printf("\n LAST ");
1535:
1536: if ((*s_etat_processus).langue == 'F')
1537: {
1538: printf("(renvoie les arguments de la dernière fonction "
1539: "intrinsèque)\n\n");
1540: printf(" Aucun argument\n");
1541: }
1542: else
1543: {
1544: printf("(return arguments of the last intrinsic function)\n\n");
1545: printf(" No argument\n");
1546: }
1547:
1548: return;
1549: }
1550: else if ((*s_etat_processus).test_instruction == 'Y')
1551: {
1552: (*s_etat_processus).nombre_arguments = -1;
1553: return;
1554: }
1555:
1556: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1557: {
1558: l_element_courant = (*s_etat_processus).l_base_pile_last;
1559:
1560: while(l_element_courant != NULL)
1561: {
1562: if ((s_objet = copie_objet(s_etat_processus,
1563: (*l_element_courant).donnee, 'P')) == NULL)
1564: {
1565: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1566: return;
1567: }
1568:
1569: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1570: s_objet) == d_erreur)
1571: {
1572: return;
1573: }
1574:
1575: l_element_courant = (*l_element_courant).suivant;
1576: }
1577: }
1578:
1579: return;
1580: }
1581:
1582: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>