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:
26: /*
27: ================================================================================
28: Fonction 'exsub'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_exsub(struct_processus *s_etat_processus)
40: {
41: integer8 position;
42:
43: struct_liste_chainee *l_element_courant;
44: struct_liste_chainee *ptr_1;
45: struct_liste_chainee *ptr_2;
46: struct_liste_chainee *ptr_3;
47:
48: struct_objet *s_copie_argument_1;
49: struct_objet *s_copie_argument_4;
50: struct_objet *s_objet_argument_1;
51: struct_objet *s_objet_argument_2;
52: struct_objet *s_objet_argument_3;
53: struct_objet *s_objet_argument_4;
54:
55: unsigned char *registre_definitions_chainees;
56: unsigned char *registre_instruction_courante;
57:
58: integer8 position_courante;
59:
60: (*s_etat_processus).erreur_execution = d_ex;
61:
62: if ((*s_etat_processus).affichage_arguments == 'Y')
63: {
64: printf("\n EXSUB ");
65:
66: if ((*s_etat_processus).langue == 'F')
67: {
68: printf("(substitution d'expression)\n\n");
69: }
70: else
71: {
72: printf("(expression substitution)\n\n");
73: }
74:
75: printf(" 4: %s\n", d_RPN);
76: printf(" 3: %s\n", d_INT);
77: printf(" 2: %s\n", d_INT);
78: printf(" 1: %s\n", d_LST);
79: printf("-> 1: %s\n", d_RPN);
80:
81: return;
82: }
83: else if ((*s_etat_processus).test_instruction == 'Y')
84: {
85: (*s_etat_processus).nombre_arguments = -1;
86: return;
87: }
88:
89: if (test_cfsf(s_etat_processus, 31) == d_vrai)
90: {
91: if (empilement_pile_last(s_etat_processus, 4) == d_erreur)
92: {
93: return;
94: }
95: }
96:
97: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
98: &s_objet_argument_1) == d_erreur)
99: {
100: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
101: return;
102: }
103:
104: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
105: &s_objet_argument_2) == d_erreur)
106: {
107: liberation(s_etat_processus, s_objet_argument_1);
108:
109: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
110: return;
111: }
112:
113: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
114: &s_objet_argument_3) == d_erreur)
115: {
116: liberation(s_etat_processus, s_objet_argument_1);
117: liberation(s_etat_processus, s_objet_argument_2);
118:
119: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
120: return;
121: }
122:
123: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
124: &s_objet_argument_4) == d_erreur)
125: {
126: liberation(s_etat_processus, s_objet_argument_1);
127: liberation(s_etat_processus, s_objet_argument_2);
128: liberation(s_etat_processus, s_objet_argument_3);
129:
130: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
131: return;
132: }
133:
134: if (((*s_objet_argument_1).type == LST) &&
135: ((*s_objet_argument_2).type == INT) &&
136: ((*s_objet_argument_3).type == INT) &&
137: ((*s_objet_argument_4).type == RPN))
138: {
139: if ((*((integer8 *) (*s_objet_argument_3).objet)) <= 0)
140: {
141: liberation(s_etat_processus, s_objet_argument_1);
142: liberation(s_etat_processus, s_objet_argument_2);
143: liberation(s_etat_processus, s_objet_argument_3);
144: liberation(s_etat_processus, s_objet_argument_4);
145:
146: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
147: return;
148: }
149:
150: if ((*((integer8 *) (*s_objet_argument_3).objet)) >
151: (*((integer8 *) (*s_objet_argument_2).objet)))
152: {
153: liberation(s_etat_processus, s_objet_argument_1);
154: liberation(s_etat_processus, s_objet_argument_2);
155: liberation(s_etat_processus, s_objet_argument_3);
156: liberation(s_etat_processus, s_objet_argument_4);
157:
158: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
159: return;
160: }
161:
162: if ((s_copie_argument_1 = copie_objet(s_etat_processus,
163: s_objet_argument_1, 'N')) == NULL)
164: {
165: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
166: return;
167: }
168:
169: liberation(s_etat_processus, s_objet_argument_1);
170: s_objet_argument_1 = s_copie_argument_1;
171:
172: if ((s_copie_argument_4 = copie_objet(s_etat_processus,
173: s_objet_argument_4, 'N')) == NULL)
174: {
175: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
176: return;
177: }
178:
179: liberation(s_etat_processus, s_objet_argument_4);
180: s_objet_argument_4 = s_copie_argument_4;
181:
182: l_element_courant = (*s_objet_argument_4).objet;
183: position = 1;
184:
185: /*
186: * ptr_1 : premier élément à substituer
187: * ptr_2 : dernier élément à substituer
188: */
189:
190: ptr_1 = NULL;
191: ptr_2 = NULL;
192:
193: while(l_element_courant != NULL)
194: {
195: if (position == (*((integer8 *) (*s_objet_argument_3).objet)))
196: {
197: ptr_1 = l_element_courant;
198: }
199:
200: if (position == (*((integer8 *) (*s_objet_argument_2).objet)))
201: {
202: ptr_2 = (*l_element_courant).suivant;
203: (*l_element_courant).suivant = NULL;
204: break;
205: }
206:
207: position++;
208: l_element_courant = (*l_element_courant).suivant;
209: }
210:
211: if (l_element_courant != NULL)
212: {
213: /*
214: * Substitution
215: */
216:
217: /*
218: * ptr_3 : objet de substitution
219: * ptr_1 : contient maintenant l'objet allant être substitué
220: * et terminé par un NULL donc libérable par liberation().
221: */
222:
223: ptr_3 = (*s_objet_argument_1).objet;
224: (*s_objet_argument_1).objet = ptr_1;
225:
226: l_element_courant = (*s_objet_argument_4).objet;
227:
228: if (l_element_courant == NULL)
229: {
230: (*s_objet_argument_4).objet = ptr_3;
231:
232: if ((*s_objet_argument_4).objet == NULL)
233: {
234: (*s_objet_argument_4).objet = ptr_2;
235: }
236: else
237: {
238: l_element_courant = (*s_objet_argument_4).objet;
239:
240: while((*l_element_courant).suivant != NULL)
241: {
242: l_element_courant = (*l_element_courant).suivant;
243: }
244:
245: (*l_element_courant).suivant = ptr_2;
246: }
247: }
248: else
249: {
250: if ((*((integer8 *) (*s_objet_argument_3).objet)) == 1)
251: {
252: (*s_objet_argument_4).objet = ptr_3;
253: l_element_courant = (*s_objet_argument_4).objet;
254: }
255: else
256: {
257: position = 1;
258:
259: while((*l_element_courant).suivant != NULL)
260: {
261: position++;
262:
263: if (position == (*((integer8 *) (*s_objet_argument_3)
264: .objet)))
265: {
266: break;
267: }
268:
269: l_element_courant = (*l_element_courant).suivant;
270: }
271:
272: (*l_element_courant).suivant = ptr_3;
273: }
274:
275: if ((*l_element_courant).suivant == NULL)
276: {
277: (*l_element_courant).suivant = ptr_2;
278: }
279: else
280: {
281: while((*l_element_courant).suivant != NULL)
282: {
283: l_element_courant = (*l_element_courant).suivant;
284: }
285:
286: (*l_element_courant).suivant = ptr_2;
287: }
288: }
289:
290: /*
291: * Analyse de l'objet résultant de la substitution
292: */
293:
294: // Recherche de la présence d'un '<<' initial
295:
296: l_element_courant = (*s_objet_argument_4).objet;
297:
298: while(l_element_courant != NULL)
299: {
300: if ((*(*l_element_courant).donnee).type == FCT)
301: {
302: if (strcmp((*((struct_fonction *) (*(*l_element_courant)
303: .donnee).objet)).nom_fonction, "<<") == 0)
304: {
305: break;
306: }
307: }
308:
309: l_element_courant = (*l_element_courant).suivant;
310: }
311:
312: if (l_element_courant != (*s_objet_argument_4).objet)
313: {
314: liberation(s_etat_processus, s_objet_argument_1);
315: liberation(s_etat_processus, s_objet_argument_2);
316: liberation(s_etat_processus, s_objet_argument_3);
317: liberation(s_etat_processus, s_objet_argument_4);
318:
319: (*s_etat_processus).erreur_execution =
320: d_ex_argument_invalide;
321: return;
322: }
323:
324: // Analyse syntaxique
325:
326: position_courante = (*s_etat_processus).position_courante;
327: registre_definitions_chainees = (*s_etat_processus)
328: .definitions_chainees;
329: registre_instruction_courante = (*s_etat_processus)
330: .instruction_courante;
331:
332: if (((*s_etat_processus).definitions_chainees =
333: formateur(s_etat_processus, 0, s_objet_argument_4))
334: == NULL)
335: {
336: (*s_etat_processus).erreur_systeme =
337: d_es_allocation_memoire;
338: return;
339: }
340:
341: if (analyse_syntaxique(s_etat_processus) == d_erreur)
342: {
343: free((*s_etat_processus).definitions_chainees);
344:
345: (*s_etat_processus).definitions_chainees =
346: registre_definitions_chainees;
347: (*s_etat_processus).instruction_courante =
348: registre_instruction_courante;
349: (*s_etat_processus).position_courante =
350: position_courante;
351:
352: liberation(s_etat_processus, s_objet_argument_1);
353: liberation(s_etat_processus, s_objet_argument_2);
354: liberation(s_etat_processus, s_objet_argument_3);
355: liberation(s_etat_processus, s_objet_argument_4);
356:
357: (*s_etat_processus).erreur_execution =
358: d_ex_argument_invalide;
359: return;
360: }
361:
362: free((*s_etat_processus).definitions_chainees);
363:
364: (*s_etat_processus).definitions_chainees =
365: registre_definitions_chainees;
366: (*s_etat_processus).instruction_courante =
367: registre_instruction_courante;
368: (*s_etat_processus).position_courante =
369: position_courante;
370: }
371: else
372: {
373: liberation(s_etat_processus, s_objet_argument_1);
374: liberation(s_etat_processus, s_objet_argument_2);
375: liberation(s_etat_processus, s_objet_argument_3);
376: liberation(s_etat_processus, s_objet_argument_4);
377:
378: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
379: return;
380: }
381: }
382: else
383: {
384: liberation(s_etat_processus, s_objet_argument_1);
385: liberation(s_etat_processus, s_objet_argument_2);
386: liberation(s_etat_processus, s_objet_argument_3);
387: liberation(s_etat_processus, s_objet_argument_4);
388:
389: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
390: return;
391: }
392:
393: liberation(s_etat_processus, s_objet_argument_1);
394: liberation(s_etat_processus, s_objet_argument_2);
395: liberation(s_etat_processus, s_objet_argument_3);
396:
397: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
398: s_objet_argument_4) == d_erreur)
399: {
400: return;
401: }
402:
403: return;
404: }
405:
406:
407: /*
408: ================================================================================
409: Fonction 'exget'
410: ================================================================================
411: Entrées :
412: --------------------------------------------------------------------------------
413: Sorties :
414: --------------------------------------------------------------------------------
415: Effets de bord : néant
416: ================================================================================
417: */
418:
419: void
420: instruction_exget(struct_processus *s_etat_processus)
421: {
422: struct_liste_chainee *l_element_courant;
423: struct_liste_chainee *l_element_suivant;
424:
425: struct_objet *s_copie_argument_3;
426: struct_objet *s_objet_argument_1;
427: struct_objet *s_objet_argument_2;
428: struct_objet *s_objet_argument_3;
429:
430: signed long position;
431:
432: (*s_etat_processus).erreur_execution = d_ex;
433:
434: if ((*s_etat_processus).affichage_arguments == 'Y')
435: {
436: printf("\n EXGET ");
437:
438: if ((*s_etat_processus).langue == 'F')
439: {
440: printf("(extraction d'une expression)\n\n");
441: }
442: else
443: {
444: printf("(get expression)\n\n");
445: }
446:
447: printf(" 3: %s\n", d_RPN);
448: printf(" 2: %s\n", d_INT);
449: printf(" 1: %s\n", d_INT);
450: printf("-> 1: %s\n", d_LST);
451:
452: return;
453: }
454: else if ((*s_etat_processus).test_instruction == 'Y')
455: {
456: (*s_etat_processus).nombre_arguments = -1;
457: return;
458: }
459:
460: if (test_cfsf(s_etat_processus, 31) == d_vrai)
461: {
462: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
463: {
464: return;
465: }
466: }
467:
468: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
469: &s_objet_argument_1) == d_erreur)
470: {
471: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
472: return;
473: }
474:
475: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
476: &s_objet_argument_2) == d_erreur)
477: {
478: liberation(s_etat_processus, s_objet_argument_1);
479:
480: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
481: return;
482: }
483:
484: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
485: &s_objet_argument_3) == d_erreur)
486: {
487: liberation(s_etat_processus, s_objet_argument_1);
488: liberation(s_etat_processus, s_objet_argument_2);
489:
490: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
491: return;
492: }
493:
494: if (((*s_objet_argument_1).type == INT) &&
495: ((*s_objet_argument_2).type == INT) &&
496: ((*s_objet_argument_3).type == RPN))
497: {
498: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
499: s_objet_argument_3, 'N')) == NULL)
500: {
501: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
502: return;
503: }
504:
505: liberation(s_etat_processus, s_objet_argument_3);
506: s_objet_argument_3 = s_copie_argument_3;
507:
508: if ((*((integer8 *) (*s_objet_argument_2).objet)) <= 0)
509: {
510: liberation(s_etat_processus, s_objet_argument_1);
511: liberation(s_etat_processus, s_objet_argument_2);
512: liberation(s_etat_processus, s_objet_argument_3);
513:
514: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
515: return;
516: }
517:
518: if ((*((integer8 *) (*s_objet_argument_2).objet)) >
519: (*((integer8 *) (*s_objet_argument_1).objet)))
520: {
521: liberation(s_etat_processus, s_objet_argument_1);
522: liberation(s_etat_processus, s_objet_argument_2);
523: liberation(s_etat_processus, s_objet_argument_3);
524:
525: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
526: return;
527: }
528:
529: (*s_objet_argument_3).type = LST;
530: l_element_courant = (*s_objet_argument_3).objet;
531: position = 1;
532:
533: while(l_element_courant != NULL)
534: {
535: if (position == (*((integer8 *) (*s_objet_argument_2).objet)))
536: {
537: (*s_objet_argument_3).objet = l_element_courant;
538: break;
539: }
540:
541: l_element_suivant = (*l_element_courant).suivant;
542: liberation(s_etat_processus, (*l_element_courant).donnee);
543: free(l_element_courant);
544: l_element_courant = l_element_suivant;
545:
546: position++;
547: }
548:
549: if (position != (*((integer8 *) (*s_objet_argument_2).objet)))
550: {
551: liberation(s_etat_processus, s_objet_argument_1);
552: liberation(s_etat_processus, s_objet_argument_2);
553: liberation(s_etat_processus, s_objet_argument_3);
554:
555: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
556: return;
557: }
558:
559: while(l_element_courant != NULL)
560: {
561: l_element_suivant = (*l_element_courant).suivant;
562:
563: if (position == (*((integer8 *) (*s_objet_argument_1).objet)))
564: {
565: (*l_element_courant).suivant = NULL;
566: l_element_courant = l_element_suivant;
567:
568: while(l_element_courant != NULL)
569: {
570: l_element_suivant = (*l_element_courant).suivant;
571: liberation(s_etat_processus, (*l_element_courant).donnee);
572: free(l_element_courant);
573: l_element_courant = l_element_suivant;
574: }
575:
576: break;
577: }
578:
579: l_element_courant = l_element_suivant;
580: position++;
581: }
582:
583: if (position != (*((integer8 *) (*s_objet_argument_1).objet)))
584: {
585: liberation(s_etat_processus, s_objet_argument_1);
586: liberation(s_etat_processus, s_objet_argument_2);
587: liberation(s_etat_processus, s_objet_argument_3);
588:
589: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
590: return;
591: }
592:
593: /*
594: * Vérification de la cohérence de l'expression. Nous ne devons avoir
595: * ni '<<' ni '>>.
596: */
597:
598: l_element_courant = (*s_objet_argument_3).objet;
599:
600: while(l_element_courant != NULL)
601: {
602: if ((*(*l_element_courant).donnee).type == FCT)
603: {
604: if ((strcmp((*((struct_fonction *) (*(*l_element_courant)
605: .donnee).objet)).nom_fonction, "<<") == 0) ||
606: (strcmp((*((struct_fonction *) (*(*l_element_courant)
607: .donnee).objet)).nom_fonction, ">>") == 0))
608: {
609: liberation(s_etat_processus, s_objet_argument_1);
610: liberation(s_etat_processus, s_objet_argument_2);
611: liberation(s_etat_processus, s_objet_argument_3);
612:
613: (*s_etat_processus).erreur_execution =
614: d_ex_argument_invalide;
615: return;
616: }
617: }
618:
619: l_element_courant = (*l_element_courant).suivant;
620: }
621: }
622: else
623: {
624: liberation(s_etat_processus, s_objet_argument_1);
625: liberation(s_etat_processus, s_objet_argument_2);
626: liberation(s_etat_processus, s_objet_argument_3);
627:
628: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
629: return;
630: }
631:
632: liberation(s_etat_processus, s_objet_argument_1);
633: liberation(s_etat_processus, s_objet_argument_2);
634:
635: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
636: s_objet_argument_3) == d_erreur)
637: {
638: return;
639: }
640:
641: return;
642: }
643:
644:
645: /*
646: ================================================================================
647: Fonction 'eqv'
648: ================================================================================
649: Entrées : pointeur sur une structure struct_processus
650: --------------------------------------------------------------------------------
651: Sorties :
652: --------------------------------------------------------------------------------
653: Effets de bord : néant
654: ================================================================================
655: */
656:
657: void
658: instruction_eqv(struct_processus *s_etat_processus)
659: {
660: struct_liste_chainee *l_element_courant;
661: struct_liste_chainee *l_element_precedent;
662:
663: struct_objet *s_copie_argument_1;
664: struct_objet *s_copie_argument_2;
665: struct_objet *s_objet_argument_1;
666: struct_objet *s_objet_argument_2;
667: struct_objet *s_objet_resultat;
668:
669: integer8 nombre_elements;
670:
671: (*s_etat_processus).erreur_execution = d_ex;
672:
673: if ((*s_etat_processus).affichage_arguments == 'Y')
674: {
675: printf("\n EQV ");
676:
677: if ((*s_etat_processus).langue == 'F')
678: {
679: printf("(opérateur equivalence)\n\n");
680: }
681: else
682: {
683: printf("(equivalence operator)\n\n");
684: }
685:
686: printf(" 2: %s, %s\n", d_INT, d_REL);
687: printf(" 1: %s, %s\n", d_INT, d_REL);
688: printf("-> 1: %s\n\n", d_INT);
689:
690: printf(" 2: %s\n", d_BIN);
691: printf(" 1: %s\n", d_BIN);
692: printf("-> 1: %s\n\n", d_BIN);
693:
694: printf(" 2: %s\n", d_NOM);
695: printf(" 1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
696: printf("-> 1: %s\n\n", d_ALG);
697:
698: printf(" 2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
699: printf(" 1: %s\n", d_NOM);
700: printf("-> 1: %s\n\n", d_ALG);
701:
702: printf(" 2: %s\n", d_ALG);
703: printf(" 1: %s\n", d_ALG);
704: printf("-> 1: %s\n\n", d_ALG);
705:
706: printf(" 2: %s\n", d_RPN);
707: printf(" 1: %s\n", d_RPN);
708: printf("-> 1: %s\n", d_RPN);
709:
710: return;
711: }
712: else if ((*s_etat_processus).test_instruction == 'Y')
713: {
714: (*s_etat_processus).nombre_arguments = 0;
715: return;
716: }
717:
718: if (test_cfsf(s_etat_processus, 31) == d_vrai)
719: {
720: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
721: {
722: return;
723: }
724: }
725:
726: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
727: &s_objet_argument_1) == d_erreur)
728: {
729: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
730: return;
731: }
732:
733: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
734: &s_objet_argument_2) == d_erreur)
735: {
736: liberation(s_etat_processus, s_objet_argument_1);
737:
738: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
739: return;
740: }
741:
742: /*
743: --------------------------------------------------------------------------------
744: EQV logique
745: --------------------------------------------------------------------------------
746: */
747:
748: if ((((*s_objet_argument_1).type == INT) ||
749: ((*s_objet_argument_1).type == REL)) &&
750: (((*s_objet_argument_2).type == INT) ||
751: ((*s_objet_argument_2).type == REL)))
752: {
753: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
754: {
755: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
756: return;
757: }
758:
759: if ((*s_objet_argument_1).type == INT)
760: {
761: if ((*s_objet_argument_2).type == INT)
762: {
763: if ((((*((integer8 *) (*s_objet_argument_1).objet)) == 0) &&
764: ((*((integer8 *) (*s_objet_argument_2).objet)) == 0))
765: || (((*((integer8 *) (*s_objet_argument_1).objet))
766: != 0) && ((*((integer8 *) (*s_objet_argument_2).objet))
767: != 0)))
768: {
769: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
770: }
771: else
772: {
773: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
774: }
775: }
776: else
777: {
778: if ((((*((integer8 *) (*s_objet_argument_1).objet)) == 0) &&
779: ((*((real8 *) (*s_objet_argument_2).objet)) == 0))
780: || (((*((integer8 *) (*s_objet_argument_1).objet))
781: != 0) && ((*((real8 *) (*s_objet_argument_2).objet))
782: != 0)))
783: {
784: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
785: }
786: else
787: {
788: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
789: }
790: }
791: }
792: else
793: {
794: if ((*s_objet_argument_2).type == INT)
795: {
796: if ((((*((real8 *) (*s_objet_argument_1).objet)) == 0) &&
797: ((*((integer8 *) (*s_objet_argument_2).objet)) == 0))
798: || (((*((real8 *) (*s_objet_argument_1).objet))
799: != 0) && ((*((integer8 *) (*s_objet_argument_2).objet))
800: != 0)))
801: {
802: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
803: }
804: else
805: {
806: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
807: }
808: }
809: else
810: {
811: if ((((*((real8 *) (*s_objet_argument_1).objet)) == 0) &&
812: ((*((real8 *) (*s_objet_argument_2).objet)) == 0))
813: || (((*((real8 *) (*s_objet_argument_1).objet))
814: != 0) && ((*((real8 *) (*s_objet_argument_2).objet))
815: != 0)))
816: {
817: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
818: }
819: else
820: {
821: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
822: }
823: }
824: }
825: }
826:
827: /*
828: --------------------------------------------------------------------------------
829: EQV binaire
830: --------------------------------------------------------------------------------
831: */
832:
833: else if (((*s_objet_argument_1).type == BIN) &&
834: ((*s_objet_argument_2).type == BIN))
835: {
836: if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL)
837: {
838: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
839: return;
840: }
841:
842: (*((logical8 *) (*s_objet_resultat).objet)) =
843: ~((*((logical8 *) (*s_objet_argument_1).objet)) ^
844: (*((logical8 *) (*s_objet_argument_2).objet)));
845: }
846:
847: /*
848: --------------------------------------------------------------------------------
849: EQV entre des arguments complexes
850: --------------------------------------------------------------------------------
851: */
852:
853: /*
854: * Nom ou valeur numérique / Nom ou valeur numérique
855: */
856:
857: else if ((((*s_objet_argument_1).type == NOM) &&
858: (((*s_objet_argument_2).type == NOM) ||
859: ((*s_objet_argument_2).type == INT) ||
860: ((*s_objet_argument_2).type == REL))) ||
861: (((*s_objet_argument_2).type == NOM) &&
862: (((*s_objet_argument_1).type == INT) ||
863: ((*s_objet_argument_1).type == REL))))
864: {
865: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
866: {
867: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
868: return;
869: }
870:
871: if (((*s_objet_resultat).objet =
872: allocation_maillon(s_etat_processus)) == NULL)
873: {
874: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
875: return;
876: }
877:
878: l_element_courant = (*s_objet_resultat).objet;
879:
880: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
881: == NULL)
882: {
883: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
884: return;
885: }
886:
887: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
888: .nombre_arguments = 0;
889: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
890: .fonction = instruction_vers_niveau_superieur;
891:
892: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
893: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
894: {
895: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
896: return;
897: }
898:
899: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
900: .nom_fonction, "<<");
901:
902: if (((*l_element_courant).suivant =
903: allocation_maillon(s_etat_processus)) == NULL)
904: {
905: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
906: return;
907: }
908:
909: l_element_courant = (*l_element_courant).suivant;
910: (*l_element_courant).donnee = s_objet_argument_2;
911:
912: if (((*l_element_courant).suivant =
913: allocation_maillon(s_etat_processus)) == NULL)
914: {
915: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
916: return;
917: }
918:
919: l_element_courant = (*l_element_courant).suivant;
920: (*l_element_courant).donnee = s_objet_argument_1;
921:
922: if (((*l_element_courant).suivant =
923: allocation_maillon(s_etat_processus)) == NULL)
924: {
925: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
926: return;
927: }
928:
929: l_element_courant = (*l_element_courant).suivant;
930:
931: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
932: == NULL)
933: {
934: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
935: return;
936: }
937:
938: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
939: .nombre_arguments = 0;
940: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
941: .fonction = instruction_xor;
942:
943: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
944: .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
945: {
946: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
947: return;
948: }
949:
950: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
951: .nom_fonction, "EQV");
952:
953: if (((*l_element_courant).suivant =
954: allocation_maillon(s_etat_processus)) == NULL)
955: {
956: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
957: return;
958: }
959:
960: l_element_courant = (*l_element_courant).suivant;
961:
962: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
963: == NULL)
964: {
965: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
966: return;
967: }
968:
969: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
970: .nombre_arguments = 0;
971: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
972: .fonction = instruction_vers_niveau_inferieur;
973:
974: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
975: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
976: {
977: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
978: return;
979: }
980:
981: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
982: .nom_fonction, ">>");
983:
984: (*l_element_courant).suivant = NULL;
985:
986: s_objet_argument_1 = NULL;
987: s_objet_argument_2 = NULL;
988: }
989:
990: /*
991: * Nom ou valeur numérique / Expression
992: */
993:
994: else if ((((*s_objet_argument_1).type == ALG) ||
995: ((*s_objet_argument_1).type == RPN)) &&
996: (((*s_objet_argument_2).type == NOM) ||
997: ((*s_objet_argument_2).type == INT) ||
998: ((*s_objet_argument_2).type == REL)))
999: {
1000: nombre_elements = 0;
1001: l_element_courant = (struct_liste_chainee *)
1002: (*s_objet_argument_1).objet;
1003:
1004: while(l_element_courant != NULL)
1005: {
1006: nombre_elements++;
1007: l_element_courant = (*l_element_courant).suivant;
1008: }
1009:
1010: if (nombre_elements == 2)
1011: {
1012: liberation(s_etat_processus, s_objet_argument_1);
1013: liberation(s_etat_processus, s_objet_argument_2);
1014:
1015: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1016: return;
1017: }
1018:
1019: if ((s_objet_resultat = copie_objet(s_etat_processus,
1020: s_objet_argument_1, 'N')) == NULL)
1021: {
1022: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1023: return;
1024: }
1025:
1026: l_element_courant = (struct_liste_chainee *)
1027: (*s_objet_resultat).objet;
1028: l_element_precedent = l_element_courant;
1029: l_element_courant = (*l_element_courant).suivant;
1030:
1031: if (((*l_element_precedent).suivant = (struct_liste_chainee *)
1032: allocation_maillon(s_etat_processus)) == NULL)
1033: {
1034: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1035: return;
1036: }
1037:
1038: (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
1039: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1040:
1041: while((*l_element_courant).suivant != NULL)
1042: {
1043: l_element_precedent = l_element_courant;
1044: l_element_courant = (*l_element_courant).suivant;
1045: }
1046:
1047: if (((*l_element_precedent).suivant =
1048: allocation_maillon(s_etat_processus)) == NULL)
1049: {
1050: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1051: return;
1052: }
1053:
1054: if (((*(*l_element_precedent).suivant).donnee =
1055: allocation(s_etat_processus, FCT)) == NULL)
1056: {
1057: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1058: return;
1059: }
1060:
1061: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1062: .donnee).objet)).nombre_arguments = 0;
1063: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1064: .donnee).objet)).fonction = instruction_xor;
1065:
1066: if (((*((struct_fonction *) (*(*(*l_element_precedent)
1067: .suivant).donnee).objet)).nom_fonction =
1068: malloc(4 * sizeof(unsigned char))) == NULL)
1069: {
1070: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1071: return;
1072: }
1073:
1074: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
1075: .suivant).donnee).objet)).nom_fonction, "EQV");
1076:
1077: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1078:
1079: s_objet_argument_2 = NULL;
1080: }
1081:
1082: /*
1083: * Expression / Nom ou valeur numérique
1084: */
1085:
1086: else if ((((*s_objet_argument_1).type == NOM) ||
1087: ((*s_objet_argument_1).type == INT) ||
1088: ((*s_objet_argument_1).type == REL)) &&
1089: (((*s_objet_argument_2).type == ALG) ||
1090: ((*s_objet_argument_2).type == RPN)))
1091: {
1092: nombre_elements = 0;
1093: l_element_courant = (struct_liste_chainee *)
1094: (*s_objet_argument_2).objet;
1095:
1096: while(l_element_courant != NULL)
1097: {
1098: nombre_elements++;
1099: l_element_courant = (*l_element_courant).suivant;
1100: }
1101:
1102: if (nombre_elements == 2)
1103: {
1104: liberation(s_etat_processus, s_objet_argument_1);
1105: liberation(s_etat_processus, s_objet_argument_2);
1106:
1107: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1108: return;
1109: }
1110:
1111: if ((s_objet_resultat = copie_objet(s_etat_processus,
1112: s_objet_argument_2, 'N')) == NULL)
1113: {
1114: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1115: return;
1116: }
1117:
1118: l_element_courant = (struct_liste_chainee *)
1119: (*s_objet_resultat).objet;
1120: l_element_precedent = l_element_courant;
1121:
1122: while((*l_element_courant).suivant != NULL)
1123: {
1124: l_element_precedent = l_element_courant;
1125: l_element_courant = (*l_element_courant).suivant;
1126: }
1127:
1128: if (((*l_element_precedent).suivant =
1129: allocation_maillon(s_etat_processus)) == NULL)
1130: {
1131: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1132: return;
1133: }
1134:
1135: (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
1136: l_element_precedent = (*l_element_precedent).suivant;
1137:
1138: if (((*l_element_precedent).suivant =
1139: allocation_maillon(s_etat_processus)) == NULL)
1140: {
1141: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1142: return;
1143: }
1144:
1145: if (((*(*l_element_precedent).suivant).donnee =
1146: allocation(s_etat_processus, FCT)) == NULL)
1147: {
1148: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1149: return;
1150: }
1151:
1152: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1153: .donnee).objet)).nombre_arguments = 0;
1154: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1155: .donnee).objet)).fonction = instruction_xor;
1156:
1157: if (((*((struct_fonction *) (*(*(*l_element_precedent)
1158: .suivant).donnee).objet)).nom_fonction =
1159: malloc(4 * sizeof(unsigned char))) == NULL)
1160: {
1161: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1162: return;
1163: }
1164:
1165: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
1166: .suivant).donnee).objet)).nom_fonction, "EQV");
1167:
1168: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1169:
1170: s_objet_argument_1 = NULL;
1171: }
1172:
1173: /*
1174: * Expression / Expression
1175: */
1176:
1177: else if ((((*s_objet_argument_1).type == ALG) &&
1178: ((*s_objet_argument_2).type == ALG)) ||
1179: (((*s_objet_argument_1).type == RPN) &&
1180: ((*s_objet_argument_2).type == RPN)))
1181: {
1182: nombre_elements = 0;
1183: l_element_courant = (struct_liste_chainee *)
1184: (*s_objet_argument_1).objet;
1185:
1186: while(l_element_courant != NULL)
1187: {
1188: nombre_elements++;
1189: l_element_courant = (*l_element_courant).suivant;
1190: }
1191:
1192: if (nombre_elements == 2)
1193: {
1194: liberation(s_etat_processus, s_objet_argument_1);
1195: liberation(s_etat_processus, s_objet_argument_2);
1196:
1197: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1198: return;
1199: }
1200:
1201: nombre_elements = 0;
1202: l_element_courant = (struct_liste_chainee *)
1203: (*s_objet_argument_2).objet;
1204:
1205: while(l_element_courant != NULL)
1206: {
1207: nombre_elements++;
1208: l_element_courant = (*l_element_courant).suivant;
1209: }
1210:
1211: if (nombre_elements == 2)
1212: {
1213: liberation(s_etat_processus, s_objet_argument_1);
1214: liberation(s_etat_processus, s_objet_argument_2);
1215:
1216: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1217: return;
1218: }
1219:
1220: if ((s_copie_argument_1 = copie_objet(s_etat_processus,
1221: s_objet_argument_1, 'N')) == NULL)
1222: {
1223: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1224: return;
1225: }
1226:
1227: if ((s_copie_argument_2 = copie_objet(s_etat_processus,
1228: s_objet_argument_2, 'N')) == NULL)
1229: {
1230: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1231: return;
1232: }
1233:
1234: l_element_courant = (struct_liste_chainee *)
1235: (*s_copie_argument_1).objet;
1236: (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
1237: (*s_copie_argument_1).objet)).suivant;
1238:
1239: liberation(s_etat_processus, (*l_element_courant).donnee);
1240: free(l_element_courant);
1241:
1242: l_element_courant = (struct_liste_chainee *)
1243: (*s_copie_argument_2).objet;
1244: l_element_precedent = l_element_courant;
1245: s_objet_resultat = s_copie_argument_2;
1246:
1247: while((*l_element_courant).suivant != NULL)
1248: {
1249: l_element_precedent = l_element_courant;
1250: l_element_courant = (*l_element_courant).suivant;
1251: }
1252:
1253: liberation(s_etat_processus, (*l_element_courant).donnee);
1254: free(l_element_courant);
1255:
1256: (*l_element_precedent).suivant = (struct_liste_chainee *)
1257: (*s_copie_argument_1).objet;
1258: free(s_copie_argument_1);
1259:
1260: l_element_courant = (*l_element_precedent).suivant;
1261: while((*l_element_courant).suivant != NULL)
1262: {
1263: l_element_precedent = l_element_courant;
1264: l_element_courant = (*l_element_courant).suivant;
1265: }
1266:
1267: if (((*l_element_precedent).suivant =
1268: allocation_maillon(s_etat_processus)) == NULL)
1269: {
1270: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1271: return;
1272: }
1273:
1274: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1275: l_element_courant = (*l_element_precedent).suivant;
1276:
1277: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1278: == NULL)
1279: {
1280: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1281: return;
1282: }
1283:
1284: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1285: .nombre_arguments = 0;
1286: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1287: .fonction = instruction_xor;
1288:
1289: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1290: .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
1291: {
1292: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1293: return;
1294: }
1295:
1296: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1297: .nom_fonction, "EQV");
1298: }
1299:
1300: /*
1301: --------------------------------------------------------------------------------
1302: EQV impossible
1303: --------------------------------------------------------------------------------
1304: */
1305:
1306: else
1307: {
1308: liberation(s_etat_processus, s_objet_argument_1);
1309: liberation(s_etat_processus, s_objet_argument_2);
1310:
1311: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1312: return;
1313: }
1314:
1315: liberation(s_etat_processus, s_objet_argument_1);
1316: liberation(s_etat_processus, s_objet_argument_2);
1317:
1318: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1319: s_objet_resultat) == d_erreur)
1320: {
1321: return;
1322: }
1323:
1324: return;
1325: }
1326:
1327: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>