Annotation of rpl/src/instructions_e4.c, revision 1.50
1.1 bertrand 1: /*
2: ================================================================================
1.49 bertrand 3: RPL/2 (R) version 4.1.19
1.47 bertrand 4: Copyright (C) 1989-2014 Dr. BERTRAND Joël
1.1 bertrand 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:
1.12 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 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:
1.42 bertrand 58: integer8 position_courante;
1.1 bertrand 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: {
1.8 bertrand 85: (*s_etat_processus).nombre_arguments = -1;
1.1 bertrand 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: {
1.8 bertrand 456: (*s_etat_processus).nombre_arguments = -1;
1.1 bertrand 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:
1.50 ! bertrand 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:
1.1 bertrand 1327: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>