1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.10
4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl.conv.h"
24:
25:
26: /*
27: ================================================================================
28: Fonction 'neg'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_neg(struct_processus *s_etat_processus)
40: {
41: logical1 drapeau;
42:
43: struct_liste_chainee *l_element_courant;
44: struct_liste_chainee *l_element_precedent;
45: struct_liste_chainee *l_element_tampon;
46:
47: struct_objet *s_copie_argument;
48: struct_objet *s_objet_argument;
49: struct_objet *s_objet_resultat;
50:
51: unsigned long i;
52: unsigned long j;
53:
54: (*s_etat_processus).erreur_execution = d_ex;
55:
56: if ((*s_etat_processus).affichage_arguments == 'Y')
57: {
58: printf("\n NEG ");
59:
60: if ((*s_etat_processus).langue == 'F')
61: {
62: printf("(opposition)\n\n");
63: }
64: else
65: {
66: printf("(opposition)\n\n");
67: }
68:
69: printf(" 1: %s, %s, %s\n", d_INT, d_REL, d_CPL);
70: printf("-> 1: %s, %s, %s\n\n", d_INT, d_REL, d_CPL);
71:
72: printf(" 1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
73: printf("-> 1: %s, %s, %s\n\n", d_VIN, d_VRL, d_VCX);
74:
75: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
76: printf("-> 1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
77:
78: printf(" 1: %s, %s\n", d_NOM, d_ALG);
79: printf("-> 1: %s\n\n", d_ALG);
80:
81: printf(" 1: %s\n", d_RPN);
82: printf("-> 1: %s\n", d_RPN);
83:
84: return;
85: }
86: else if ((*s_etat_processus).test_instruction == 'Y')
87: {
88: (*s_etat_processus).nombre_arguments = 1;
89: return;
90: }
91:
92: if (test_cfsf(s_etat_processus, 31) == d_vrai)
93: {
94: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
95: {
96: return;
97: }
98: }
99:
100: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
101: &s_objet_argument) == d_erreur)
102: {
103: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
104: return;
105: }
106:
107: /*
108: --------------------------------------------------------------------------------
109: Opposition d'un entier
110: --------------------------------------------------------------------------------
111: */
112:
113: if ((*s_objet_argument).type == INT)
114: {
115: if ((s_objet_resultat = copie_objet(s_etat_processus,
116: s_objet_argument, 'Q')) == NULL)
117: {
118: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
119: return;
120: }
121:
122: /*
123: * Permet d'éviter les résultats du type -0. Valable pour tous
124: * les types...
125: */
126:
127: if ((*((integer8 *) (*s_objet_argument).objet)) != 0)
128: {
129: (*((integer8 *) (*s_objet_resultat).objet)) =
130: -(*((integer8 *) (*s_objet_argument).objet));
131: }
132: }
133:
134: /*
135: --------------------------------------------------------------------------------
136: Opposition d'un réel
137: --------------------------------------------------------------------------------
138: */
139:
140: else if ((*s_objet_argument).type == REL)
141: {
142: if ((s_objet_resultat = copie_objet(s_etat_processus,
143: s_objet_argument, 'Q')) == NULL)
144: {
145: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
146: return;
147: }
148:
149: if ((*((real8 *) (*s_objet_argument).objet)) != 0)
150: {
151: (*((real8 *) (*s_objet_resultat).objet)) =
152: -(*((real8 *) (*s_objet_argument).objet));
153: }
154: }
155:
156: /*
157: --------------------------------------------------------------------------------
158: Opposition d'un complexe
159: --------------------------------------------------------------------------------
160: */
161:
162: else if ((*s_objet_argument).type == CPL)
163: {
164: if ((s_objet_resultat = copie_objet(s_etat_processus,
165: s_objet_argument, 'Q')) == NULL)
166: {
167: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
168: return;
169: }
170:
171: if ((*((struct_complexe16 *) (*s_objet_argument).objet)).partie_reelle
172: != 0)
173: {
174: (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle =
175: -(*((struct_complexe16 *) (*s_objet_argument).objet))
176: .partie_reelle;
177: }
178:
179: if ((*((struct_complexe16 *) (*s_objet_argument).objet))
180: .partie_imaginaire != 0)
181: {
182: (*((struct_complexe16 *) (*s_objet_resultat).objet))
183: .partie_imaginaire =
184: -(*((struct_complexe16 *) (*s_objet_argument).objet))
185: .partie_imaginaire;
186: }
187: }
188:
189: /*
190: --------------------------------------------------------------------------------
191: Opposition d'un vecteur d'entiers
192: --------------------------------------------------------------------------------
193: */
194:
195: else if ((*s_objet_argument).type == VIN)
196: {
197: if ((s_objet_resultat = copie_objet(s_etat_processus,
198: s_objet_argument, 'Q')) == NULL)
199: {
200: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
201: return;
202: }
203:
204: for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument).objet)))
205: .taille; i++)
206: {
207: if (((integer8 *) (*(((struct_vecteur *)
208: (*s_objet_argument).objet))).tableau)[i] != 0)
209: {
210: ((integer8 *) (*(((struct_vecteur *) (*s_objet_resultat)
211: .objet))).tableau)[i] = -((integer8 *)
212: (*(((struct_vecteur *)
213: (*s_objet_argument).objet))).tableau)[i];
214: }
215: }
216: }
217:
218: /*
219: --------------------------------------------------------------------------------
220: Opposition d'un vecteur de réels
221: --------------------------------------------------------------------------------
222: */
223:
224: else if ((*s_objet_argument).type == VRL)
225: {
226: if ((s_objet_resultat = copie_objet(s_etat_processus,
227: s_objet_argument, 'Q')) == NULL)
228: {
229: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
230: return;
231: }
232:
233: for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument).objet)))
234: .taille; i++)
235: {
236: if (((real8 *) (*(((struct_vecteur *) (*s_objet_argument).objet)))
237: .tableau)[i] != 0)
238: {
239: ((real8 *) (*(((struct_vecteur *) (*s_objet_resultat)
240: .objet))).tableau)[i] = -((real8 *)
241: (*(((struct_vecteur *)
242: (*s_objet_argument).objet))).tableau)[i];
243: }
244: }
245: }
246:
247: /*
248: --------------------------------------------------------------------------------
249: Opposition d'un vecteur de complexes
250: --------------------------------------------------------------------------------
251: */
252:
253: else if ((*s_objet_argument).type == VCX)
254: {
255: if ((s_objet_resultat = copie_objet(s_etat_processus,
256: s_objet_argument, 'Q')) == NULL)
257: {
258: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
259: return;
260: }
261:
262: for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument).objet)))
263: .taille; i++)
264: {
265: if (((struct_complexe16 *) (*(((struct_vecteur *)
266: (*s_objet_argument).objet))).tableau)[i].partie_reelle != 0)
267: {
268: ((struct_complexe16 *) (*(((struct_vecteur *)
269: (*s_objet_resultat)
270: .objet))).tableau)[i].partie_reelle =
271: -((struct_complexe16 *) (*(((struct_vecteur *)
272: (*s_objet_argument).objet))).tableau)[i].partie_reelle;
273: }
274:
275: if (((struct_complexe16 *) (*(((struct_vecteur *)
276: (*s_objet_argument).objet))).tableau)[i].partie_imaginaire
277: != 0)
278: {
279: ((struct_complexe16 *) (*(((struct_vecteur *)
280: (*s_objet_resultat).objet))).tableau)[i]
281: .partie_imaginaire = -((struct_complexe16 *)
282: (*(((struct_vecteur *) (*s_objet_argument).objet)))
283: .tableau)[i].partie_imaginaire;
284: }
285: }
286: }
287:
288: /*
289: --------------------------------------------------------------------------------
290: Opposition d'une matrice d'entiers
291: --------------------------------------------------------------------------------
292: */
293:
294: else if ((*s_objet_argument).type == MIN)
295: {
296: if ((s_objet_resultat = copie_objet(s_etat_processus,
297: s_objet_argument, 'Q')) == NULL)
298: {
299: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
300: return;
301: }
302:
303: for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument).objet)))
304: .nombre_lignes; i++)
305: {
306: for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument).objet)))
307: .nombre_colonnes; j++)
308: {
309: if (((integer8 **) (*(((struct_matrice *) (*s_objet_argument)
310: .objet))).tableau)[i][j] != 0)
311: {
312: ((integer8 **) (*(((struct_matrice *) (*s_objet_resultat)
313: .objet))).tableau)[i][j] = -((integer8 **)
314: (*(((struct_matrice *)
315: (*s_objet_argument).objet))).tableau)[i][j];
316: }
317: }
318: }
319: }
320:
321: /*
322: --------------------------------------------------------------------------------
323: Opposition d'une matrice de réels
324: --------------------------------------------------------------------------------
325: */
326:
327: else if ((*s_objet_argument).type == MRL)
328: {
329: if ((s_objet_resultat = copie_objet(s_etat_processus,
330: s_objet_argument, 'Q')) == NULL)
331: {
332: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
333: return;
334: }
335:
336: for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument).objet)))
337: .nombre_lignes; i++)
338: {
339: for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument).objet)))
340: .nombre_colonnes; j++)
341: {
342: if (((real8 **) (*(((struct_matrice *) (*s_objet_argument)
343: .objet))).tableau)[i][j] != 0)
344: {
345: ((real8 **) (*(((struct_matrice *) (*s_objet_resultat)
346: .objet))).tableau)[i][j] = -((real8 **)
347: (*(((struct_matrice *)
348: (*s_objet_argument).objet))).tableau)[i][j];
349: }
350: }
351: }
352: }
353:
354: /*
355: --------------------------------------------------------------------------------
356: Opposition d'une matrice de complexes
357: --------------------------------------------------------------------------------
358: */
359:
360: else if ((*s_objet_argument).type == MCX)
361: {
362: if ((s_objet_resultat = copie_objet(s_etat_processus,
363: s_objet_argument, 'Q')) == NULL)
364: {
365: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
366: return;
367: }
368:
369: for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument).objet)))
370: .nombre_lignes; i++)
371: {
372: for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument).objet)))
373: .nombre_colonnes; j++)
374: {
375: if (((struct_complexe16 **) (*(((struct_matrice *)
376: (*s_objet_argument).objet))).tableau)[i][j]
377: .partie_reelle != 0)
378: {
379: ((struct_complexe16 **) (*(((struct_matrice *)
380: (*s_objet_resultat).objet))).tableau)[i][j]
381: .partie_reelle = -((struct_complexe16 **)
382: (*(((struct_matrice *) (*s_objet_argument).objet)))
383: .tableau)[i][j].partie_reelle;
384: }
385:
386: if (((struct_complexe16 **) (*(((struct_matrice *)
387: (*s_objet_argument).objet))).tableau)[i][j]
388: .partie_imaginaire != 0)
389: {
390: ((struct_complexe16 **) (*(((struct_matrice *)
391: (*s_objet_resultat).objet))).tableau)[i][j]
392: .partie_imaginaire = -((struct_complexe16 **)
393: (*(((struct_matrice *) (*s_objet_argument).objet)))
394: .tableau)[i][j].partie_imaginaire;
395: }
396: }
397: }
398: }
399:
400: /*
401: --------------------------------------------------------------------------------
402: Opposition d'un nom
403: --------------------------------------------------------------------------------
404: */
405:
406: else if ((*s_objet_argument).type == NOM)
407: {
408: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
409: {
410: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
411: return;
412: }
413:
414: if (((*s_objet_resultat).objet =
415: allocation_maillon(s_etat_processus)) == NULL)
416: {
417: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
418: return;
419: }
420:
421: l_element_courant = (*s_objet_resultat).objet;
422:
423: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
424: == NULL)
425: {
426: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
427: return;
428: }
429:
430: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
431: .nombre_arguments = 0;
432: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
433: .fonction = instruction_vers_niveau_superieur;
434:
435: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
436: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
437: {
438: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
439: return;
440: }
441:
442: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
443: .nom_fonction, "<<");
444:
445: if (((*l_element_courant).suivant =
446: allocation_maillon(s_etat_processus)) == NULL)
447: {
448: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
449: return;
450: }
451:
452: l_element_courant = (*l_element_courant).suivant;
453: (*l_element_courant).donnee = s_objet_argument;
454:
455: if (((*l_element_courant).suivant =
456: allocation_maillon(s_etat_processus)) == NULL)
457: {
458: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
459: return;
460: }
461:
462: l_element_courant = (*l_element_courant).suivant;
463:
464: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
465: == NULL)
466: {
467: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
468: return;
469: }
470:
471: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
472: .nombre_arguments = 1;
473: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
474: .fonction = instruction_neg;
475:
476: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
477: .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
478: {
479: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
480: return;
481: }
482:
483: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
484: .nom_fonction, "NEG");
485:
486: if (((*l_element_courant).suivant =
487: allocation_maillon(s_etat_processus)) == NULL)
488: {
489: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
490: return;
491: }
492:
493: l_element_courant = (*l_element_courant).suivant;
494:
495: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
496: == NULL)
497: {
498: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
499: return;
500: }
501:
502: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
503: .nombre_arguments = 0;
504: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
505: .fonction = instruction_vers_niveau_inferieur;
506:
507: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
508: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
509: {
510: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
511: return;
512: }
513:
514: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
515: .nom_fonction, ">>");
516:
517: (*l_element_courant).suivant = NULL;
518: s_objet_argument = NULL;
519: }
520:
521: /*
522: --------------------------------------------------------------------------------
523: Opposition d'une expression
524: --------------------------------------------------------------------------------
525: */
526:
527: else if (((*s_objet_argument).type == ALG) ||
528: ((*s_objet_argument).type == RPN))
529: {
530: if ((s_copie_argument = copie_objet(s_etat_processus,
531: s_objet_argument, 'N')) == NULL)
532: {
533: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
534: return;
535: }
536:
537: liberation(s_etat_processus, s_objet_argument);
538: s_objet_argument = s_copie_argument;
539:
540: l_element_courant = (struct_liste_chainee *)
541: (*s_objet_argument).objet;
542: l_element_precedent = l_element_courant;
543:
544: while((*l_element_courant).suivant != NULL)
545: {
546: l_element_precedent = l_element_courant;
547: l_element_courant = (*l_element_courant).suivant;
548: }
549:
550: drapeau = d_vrai;
551:
552: if ((*(*l_element_precedent).donnee).type == FCT)
553: {
554: if (strcmp((*((struct_fonction *) (*(*l_element_precedent).donnee)
555: .objet)).nom_fonction, "NEG") == 0)
556: {
557: drapeau = d_faux;
558:
559: l_element_courant = (struct_liste_chainee *)
560: (*s_objet_argument).objet;
561:
562: while((*l_element_courant).suivant != l_element_precedent)
563: {
564: l_element_courant = (*l_element_courant).suivant;
565: }
566:
567: l_element_tampon = (*l_element_courant).suivant;
568: (*l_element_courant).suivant = (*l_element_precedent).suivant;
569:
570: liberation(s_etat_processus, (*l_element_tampon).donnee);
571: free(l_element_tampon);
572: }
573: }
574:
575: if (drapeau == d_vrai)
576: {
577: if (((*l_element_precedent).suivant =
578: allocation_maillon(s_etat_processus)) == NULL)
579: {
580: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
581: return;
582: }
583:
584: if (((*(*l_element_precedent).suivant).donnee =
585: allocation(s_etat_processus, FCT)) == NULL)
586: {
587: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
588: return;
589: }
590:
591: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
592: .donnee).objet)).nombre_arguments = 1;
593: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
594: .donnee).objet)).fonction = instruction_neg;
595:
596: if (((*((struct_fonction *) (*(*(*l_element_precedent)
597: .suivant).donnee).objet)).nom_fonction =
598: malloc(4 * sizeof(unsigned char))) == NULL)
599: {
600: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
601: return;
602: }
603:
604: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
605: .suivant).donnee).objet)).nom_fonction, "NEG");
606:
607: (*(*l_element_precedent).suivant).suivant = l_element_courant;
608: }
609:
610: s_objet_resultat = s_objet_argument;
611: s_objet_argument = NULL;
612: }
613:
614: /*
615: --------------------------------------------------------------------------------
616: Opposition impossible
617: --------------------------------------------------------------------------------
618: */
619:
620: else
621: {
622: liberation(s_etat_processus, s_objet_argument);
623:
624: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
625: return;
626: }
627:
628: liberation(s_etat_processus, s_objet_argument);
629:
630: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
631: s_objet_resultat) == d_erreur)
632: {
633: return;
634: }
635:
636: return;
637: }
638:
639:
640: /*
641: ================================================================================
642: Fonction 'not'
643: ================================================================================
644: Entrées : pointeur sur une struct_processus
645: --------------------------------------------------------------------------------
646: Sorties :
647: --------------------------------------------------------------------------------
648: Effets de bord : néant
649: ================================================================================
650: */
651:
652: void
653: instruction_not(struct_processus *s_etat_processus)
654: {
655: struct_liste_chainee *l_element_courant;
656: struct_liste_chainee *l_element_precedent;
657:
658: struct_objet *s_copie_argument;
659: struct_objet *s_objet_argument;
660: struct_objet *s_objet_resultat;
661:
662: (*s_etat_processus).erreur_execution = d_ex;
663:
664: if ((*s_etat_processus).affichage_arguments == 'Y')
665: {
666: printf("\n NOT ");
667:
668: if ((*s_etat_processus).langue == 'F')
669: {
670: printf("(complément)\n\n");
671: }
672: else
673: {
674: printf("(complement)\n\n");
675: }
676:
677: printf(" 1: %s, %s\n", d_INT, d_REL);
678: printf("-> 1: %s\n\n", d_INT);
679:
680: printf(" 1: %s\n", d_BIN);
681: printf("-> 1: %s\n\n", d_BIN);
682:
683: printf(" 1: %s, %s\n", d_NOM, d_ALG);
684: printf("-> 1: %s\n\n", d_ALG);
685:
686: printf(" 1: %s\n", d_RPN);
687: printf("-> 1: %s\n", d_RPN);
688:
689: return;
690: }
691: else if ((*s_etat_processus).test_instruction == 'Y')
692: {
693: (*s_etat_processus).nombre_arguments = 1;
694: return;
695: }
696:
697: if (test_cfsf(s_etat_processus, 31) == d_vrai)
698: {
699: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
700: {
701: return;
702: }
703: }
704:
705: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
706: &s_objet_argument) == d_erreur)
707: {
708: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
709: return;
710: }
711:
712: /*
713: --------------------------------------------------------------------------------
714: NOT logique
715: --------------------------------------------------------------------------------
716: */
717:
718: if (((*s_objet_argument).type == INT) ||
719: ((*s_objet_argument).type == REL))
720: {
721: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
722: {
723: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
724: return;
725: }
726:
727: if ((*s_objet_argument).type == INT)
728: {
729: if ((*((integer8 *) (*s_objet_argument).objet)) == 0)
730: {
731: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
732: }
733: else
734: {
735: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
736: }
737: }
738: else
739: {
740: if ((*((real8 *) (*s_objet_argument).objet)) == 0)
741: {
742: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
743: }
744: else
745: {
746: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
747: }
748: }
749: }
750:
751: /*
752: --------------------------------------------------------------------------------
753: NOT binaire
754: --------------------------------------------------------------------------------
755: */
756:
757: else if ((*s_objet_argument).type == BIN)
758: {
759: (*((logical8 *) (*s_objet_argument).objet)) =
760: ~(*((logical8 *) (*s_objet_argument).objet));
761:
762: s_objet_resultat = s_objet_argument;
763: s_objet_argument = NULL;
764: }
765:
766: /*
767: --------------------------------------------------------------------------------
768: NOT d'un nom
769: --------------------------------------------------------------------------------
770: */
771:
772: else if ((*s_objet_argument).type == NOM)
773: {
774: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
775: {
776: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
777: return;
778: }
779:
780: if (((*s_objet_resultat).objet =
781: allocation_maillon(s_etat_processus)) == NULL)
782: {
783: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
784: return;
785: }
786:
787: l_element_courant = (*s_objet_resultat).objet;
788:
789: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
790: == NULL)
791: {
792: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
793: return;
794: }
795:
796: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
797: .nombre_arguments = 0;
798: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
799: .fonction = instruction_vers_niveau_superieur;
800:
801: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
802: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
803: {
804: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
805: return;
806: }
807:
808: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
809: .nom_fonction, "<<");
810:
811: if (((*l_element_courant).suivant =
812: allocation_maillon(s_etat_processus)) == NULL)
813: {
814: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
815: return;
816: }
817:
818: l_element_courant = (*l_element_courant).suivant;
819: (*l_element_courant).donnee = s_objet_argument;
820:
821: if (((*l_element_courant).suivant =
822: allocation_maillon(s_etat_processus)) == NULL)
823: {
824: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
825: return;
826: }
827:
828: l_element_courant = (*l_element_courant).suivant;
829:
830: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
831: == NULL)
832: {
833: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
834: return;
835: }
836:
837: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
838: .nombre_arguments = 1;
839: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
840: .fonction = instruction_not;
841:
842: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
843: .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
844: {
845: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
846: return;
847: }
848:
849: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
850: .nom_fonction, "NOT");
851:
852: if (((*l_element_courant).suivant =
853: allocation_maillon(s_etat_processus)) == NULL)
854: {
855: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
856: return;
857: }
858:
859: l_element_courant = (*l_element_courant).suivant;
860:
861: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
862: == NULL)
863: {
864: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
865: return;
866: }
867:
868: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
869: .nombre_arguments = 0;
870: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
871: .fonction = instruction_vers_niveau_inferieur;
872:
873: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
874: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
875: {
876: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
877: return;
878: }
879:
880: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
881: .nom_fonction, ">>");
882:
883: (*l_element_courant).suivant = NULL;
884: s_objet_argument = NULL;
885: }
886:
887: /*
888: --------------------------------------------------------------------------------
889: NOT d'une expression
890: --------------------------------------------------------------------------------
891: */
892:
893: else if (((*s_objet_argument).type == ALG) ||
894: ((*s_objet_argument).type == RPN))
895: {
896: if ((s_copie_argument = copie_objet(s_etat_processus,
897: s_objet_argument, 'N')) == NULL)
898: {
899: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
900: return;
901: }
902:
903: l_element_courant = (struct_liste_chainee *)
904: (*s_copie_argument).objet;
905: l_element_precedent = l_element_courant;
906:
907: while((*l_element_courant).suivant != NULL)
908: {
909: l_element_precedent = l_element_courant;
910: l_element_courant = (*l_element_courant).suivant;
911: }
912:
913: if (((*l_element_precedent).suivant =
914: allocation_maillon(s_etat_processus)) == NULL)
915: {
916: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
917: return;
918: }
919:
920: if (((*(*l_element_precedent).suivant).donnee =
921: allocation(s_etat_processus, FCT)) == NULL)
922: {
923: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
924: return;
925: }
926:
927: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
928: .donnee).objet)).nombre_arguments = 1;
929: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
930: .donnee).objet)).fonction = instruction_not;
931:
932: if (((*((struct_fonction *) (*(*(*l_element_precedent)
933: .suivant).donnee).objet)).nom_fonction =
934: malloc(4 * sizeof(unsigned char))) == NULL)
935: {
936: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
937: return;
938: }
939:
940: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
941: .suivant).donnee).objet)).nom_fonction, "NOT");
942:
943: (*(*l_element_precedent).suivant).suivant = l_element_courant;
944:
945: s_objet_resultat = s_copie_argument;
946: }
947:
948: /*
949: --------------------------------------------------------------------------------
950: NOT impossible
951: --------------------------------------------------------------------------------
952: */
953:
954: else
955: {
956: liberation(s_etat_processus, s_objet_argument);
957:
958: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
959: return;
960: }
961:
962: liberation(s_etat_processus, s_objet_argument);
963:
964: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
965: s_objet_resultat) == d_erreur)
966: {
967: return;
968: }
969:
970: return;
971: }
972:
973:
974: /*
975: ================================================================================
976: Fonction '<>'
977: ================================================================================
978: Entrées :
979: --------------------------------------------------------------------------------
980: Sorties :
981: --------------------------------------------------------------------------------
982: Effets de bord : néant
983: ================================================================================
984: */
985:
986: void
987: instruction_ne(struct_processus *s_etat_processus)
988: {
989: struct_liste_chainee *l_element_courant;
990: struct_liste_chainee *l_element_courant_1;
991: struct_liste_chainee *l_element_courant_2;
992: struct_liste_chainee *l_element_precedent;
993:
994: struct_objet *s_copie_argument_1;
995: struct_objet *s_copie_argument_2;
996: struct_objet *s_objet_argument_1;
997: struct_objet *s_objet_argument_2;
998: struct_objet *s_objet_resultat;
999: struct_objet *s_objet_resultat_intermediaire;
1000:
1001: logical1 difference;
1002:
1003: unsigned long i;
1004: unsigned long j;
1005: unsigned long nombre_elements;
1006:
1007: (*s_etat_processus).erreur_execution = d_ex;
1008:
1009: if ((*s_etat_processus).affichage_arguments == 'Y')
1010: {
1011: printf("\n <> ");
1012:
1013: if ((*s_etat_processus).langue == 'F')
1014: {
1015: printf("(opérateur différence)\n\n");
1016: }
1017: else
1018: {
1019: printf("(different)\n\n");
1020: }
1021:
1022: printf(" 2: %s, %s\n", d_INT, d_REL);
1023: printf(" 1: %s, %s\n", d_INT, d_REL);
1024: printf("-> 1: %s\n\n", d_INT);
1025:
1026: printf(" 2: %s\n", d_BIN);
1027: printf(" 1: %s\n", d_BIN);
1028: printf("-> 1: %s\n\n", d_INT);
1029:
1030: printf(" 2: %s\n", d_CHN);
1031: printf(" 1: %s\n", d_CHN);
1032: printf("-> 1: %s\n\n", d_INT);
1033:
1034: printf(" 2: %s\n", d_NOM);
1035: printf(" 1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
1036: printf("-> 1: %s\n\n", d_ALG);
1037:
1038: printf(" 2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL);
1039: printf(" 1: %s\n", d_NOM);
1040: printf("-> 1: %s\n\n", d_ALG);
1041:
1042: printf(" 2: %s\n", d_ALG);
1043: printf(" 1: %s\n", d_ALG);
1044: printf("-> 1: %s\n\n", d_ALG);
1045:
1046: printf(" 2: %s\n", d_RPN);
1047: printf(" 1: %s\n", d_RPN);
1048: printf("-> 1: %s\n", d_RPN);
1049:
1050: return;
1051: }
1052: else if ((*s_etat_processus).test_instruction == 'Y')
1053: {
1054: (*s_etat_processus).nombre_arguments = 0;
1055: return;
1056: }
1057:
1058: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1059: {
1060: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1061: {
1062: return;
1063: }
1064: }
1065:
1066: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1067: &s_objet_argument_1) == d_erreur)
1068: {
1069: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1070: return;
1071: }
1072:
1073: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1074: &s_objet_argument_2) == d_erreur)
1075: {
1076: liberation(s_etat_processus, s_objet_argument_1);
1077:
1078: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1079: return;
1080: }
1081:
1082: /*
1083: --------------------------------------------------------------------------------
1084: SAME NOT sur des valeurs numériques
1085: --------------------------------------------------------------------------------
1086: */
1087:
1088: if ((((*s_objet_argument_1).type == INT) ||
1089: ((*s_objet_argument_1).type == REL)) &&
1090: (((*s_objet_argument_2).type == INT) ||
1091: ((*s_objet_argument_2).type == REL)))
1092: {
1093: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1094: {
1095: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1096: return;
1097: }
1098:
1099: if ((*s_objet_argument_1).type == INT)
1100: {
1101: if ((*s_objet_argument_2).type == INT)
1102: {
1103: (*((integer8 *) (*s_objet_resultat).objet)) =
1104: ((*((integer8 *) (*s_objet_argument_1).objet)) !=
1105: (*((integer8 *) (*s_objet_argument_2).objet)))
1106: ? -1 : 0;
1107: }
1108: else
1109: {
1110: (*((integer8 *) (*s_objet_resultat).objet)) =
1111: ((*((integer8 *) (*s_objet_argument_1).objet)) !=
1112: (*((real8 *) (*s_objet_argument_2).objet)))
1113: ? -1 : 0;
1114: }
1115: }
1116: else
1117: {
1118: if ((*s_objet_argument_2).type == INT)
1119: {
1120: (*((integer8 *) (*s_objet_resultat).objet)) =
1121: ((*((real8 *) (*s_objet_argument_1).objet)) !=
1122: (*((integer8 *) (*s_objet_argument_2).objet)))
1123: ? -1 : 0;
1124: }
1125: else
1126: {
1127: (*((integer8 *) (*s_objet_resultat).objet)) =
1128: ((*((real8 *) (*s_objet_argument_1).objet)) !=
1129: (*((real8 *) (*s_objet_argument_2).objet)))
1130: ? -1 : 0;
1131: }
1132: }
1133: }
1134:
1135: /*
1136: --------------------------------------------------------------------------------
1137: SAME NOT complexe
1138: --------------------------------------------------------------------------------
1139: */
1140:
1141: else if (((*s_objet_argument_1).type == CPL) &&
1142: ((*s_objet_argument_2).type == CPL))
1143: {
1144: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1145: {
1146: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1147: return;
1148: }
1149:
1150: (*((integer8 *) (*s_objet_resultat).objet)) =
1151: (((*((struct_complexe16 *) (*s_objet_argument_1).objet))
1152: .partie_reelle != (*((struct_complexe16 *) (*s_objet_argument_2)
1153: .objet)).partie_reelle) || ((*((struct_complexe16 *)
1154: (*s_objet_argument_1).objet)).partie_imaginaire !=
1155: ((*((struct_complexe16 *) (*s_objet_argument_1).objet))
1156: .partie_imaginaire))) ? -1 : 0;
1157: }
1158:
1159: /*
1160: --------------------------------------------------------------------------------
1161: SAME NOT binaire
1162: --------------------------------------------------------------------------------
1163: */
1164:
1165: else if (((*s_objet_argument_1).type == BIN) &&
1166: ((*s_objet_argument_2).type == BIN))
1167: {
1168: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1169: {
1170: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1171: return;
1172: }
1173:
1174: (*((integer8 *) (*s_objet_resultat).objet)) =
1175: ((*((logical8 *) (*s_objet_argument_1).objet)) !=
1176: (*((logical8 *) (*s_objet_argument_2).objet)))
1177: ? -1 : 0;
1178: }
1179:
1180: /*
1181: --------------------------------------------------------------------------------
1182: SAME NOT portant sur des chaînes de caractères
1183: --------------------------------------------------------------------------------
1184: */
1185:
1186: else if (((*s_objet_argument_1).type == CHN) &&
1187: ((*s_objet_argument_2).type == CHN))
1188: {
1189: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1190: {
1191: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1192: return;
1193: }
1194:
1195: (*((integer8 *) (*s_objet_resultat).objet)) =
1196: (strcmp((unsigned char *) (*s_objet_argument_1).objet,
1197: (unsigned char *) (*s_objet_argument_2).objet) != 0) ? -1 : 0;
1198: }
1199:
1200: /*
1201: --------------------------------------------------------------------------------
1202: SAME NOT portant sur des listes
1203: --------------------------------------------------------------------------------
1204: */
1205: /*
1206: * Il y a de la récursivité dans l'air...
1207: */
1208:
1209: else if ((((*s_objet_argument_1).type == LST) &&
1210: ((*s_objet_argument_2).type == LST)) ||
1211: (((*s_objet_argument_1).type == ALG) &&
1212: ((*s_objet_argument_2).type == ALG)) ||
1213: (((*s_objet_argument_1).type == RPN) &&
1214: ((*s_objet_argument_2).type == RPN)))
1215: {
1216: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1217: {
1218: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1219: return;
1220: }
1221:
1222: l_element_courant_1 = (struct_liste_chainee *)
1223: (*s_objet_argument_1).objet;
1224: l_element_courant_2 = (struct_liste_chainee *)
1225: (*s_objet_argument_2).objet;
1226:
1227: difference = d_faux;
1228:
1229: while((l_element_courant_1 != NULL) && (l_element_courant_2 != NULL)
1230: && (difference == d_faux))
1231: {
1232: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1233: (*l_element_courant_1).donnee) == d_erreur)
1234: {
1235: return;
1236: }
1237:
1238: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1239: (*l_element_courant_2).donnee) == d_erreur)
1240: {
1241: return;
1242: }
1243:
1244: instruction_same(s_etat_processus);
1245:
1246: (*l_element_courant_1).donnee = NULL;
1247: (*l_element_courant_2).donnee = NULL;
1248:
1249: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1250: &s_objet_resultat_intermediaire) == d_erreur)
1251: {
1252: liberation(s_etat_processus, s_objet_argument_1);
1253: liberation(s_etat_processus, s_objet_argument_2);
1254: liberation(s_etat_processus, s_objet_resultat);
1255:
1256: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1257: return;
1258: }
1259:
1260: if ((*s_objet_resultat_intermediaire).type != INT)
1261: {
1262: liberation(s_etat_processus, s_objet_argument_1);
1263: liberation(s_etat_processus, s_objet_argument_2);
1264: liberation(s_etat_processus, s_objet_resultat);
1265:
1266: return;
1267: }
1268:
1269: difference = (*(((integer8 *) (*s_objet_resultat_intermediaire)
1270: .objet)) == 0) ? d_vrai : d_faux;
1271:
1272: liberation(s_etat_processus, s_objet_resultat_intermediaire);
1273:
1274: l_element_courant_1 = (*l_element_courant_1).suivant;
1275: l_element_courant_2 = (*l_element_courant_2).suivant;
1276: }
1277:
1278: if (((l_element_courant_1 != NULL) && (l_element_courant_2 == NULL)) ||
1279: ((l_element_courant_1 == NULL) &&
1280: (l_element_courant_2 != NULL)))
1281: {
1282: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
1283: }
1284: else
1285: {
1286: (*((integer8 *) (*s_objet_resultat).objet)) =
1287: (difference == d_vrai) ? -1 : 0;
1288: }
1289: }
1290:
1291: /*
1292: --------------------------------------------------------------------------------
1293: SAME NOT portant sur des vecteurs
1294: --------------------------------------------------------------------------------
1295: */
1296: /*
1297: * Vecteurs d'entiers
1298: */
1299:
1300: else if (((*s_objet_argument_1).type == VIN) &&
1301: ((*s_objet_argument_2).type == VIN))
1302: {
1303: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1304: {
1305: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1306: return;
1307: }
1308:
1309: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
1310: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
1311: {
1312: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1313: }
1314: else
1315: {
1316: difference = d_faux;
1317:
1318: for(i = 0; (i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
1319: .taille) && (difference == d_faux); i++)
1320: {
1321: difference = (((integer8 *) (*((struct_vecteur *)
1322: (*s_objet_argument_1).objet)).tableau)[i] ==
1323: ((integer8 *) (*((struct_vecteur *)
1324: (*s_objet_argument_2).objet)).tableau)[i])
1325: ? d_faux : d_vrai;
1326: }
1327:
1328: (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
1329: d_vrai) ? -1 : 0;
1330: }
1331: }
1332:
1333: /*
1334: * Vecteurs de réels
1335: */
1336:
1337: else if (((*s_objet_argument_1).type == VRL) &&
1338: ((*s_objet_argument_2).type == VRL))
1339: {
1340: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1341: {
1342: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1343: return;
1344: }
1345:
1346: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
1347: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
1348: {
1349: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1350: }
1351: else
1352: {
1353: difference = d_faux;
1354:
1355: for(i = 0; (i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
1356: .taille) && (difference == d_faux); i++)
1357: {
1358: difference = (((real8 *) (*((struct_vecteur *)
1359: (*s_objet_argument_1).objet)).tableau)[i] ==
1360: ((real8 *) (*((struct_vecteur *)
1361: (*s_objet_argument_2).objet)).tableau)[i])
1362: ? d_faux : d_vrai;
1363: }
1364:
1365: (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
1366: d_vrai) ? -1 : 0;
1367: }
1368: }
1369:
1370: /*
1371: * Vecteurs de complexes
1372: */
1373:
1374: else if (((*s_objet_argument_1).type == VCX) &&
1375: ((*s_objet_argument_2).type == VCX))
1376: {
1377: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1378: {
1379: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1380: return;
1381: }
1382:
1383: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
1384: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
1385: {
1386: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1387: }
1388: else
1389: {
1390: difference = d_faux;
1391:
1392: for(i = 0; (i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
1393: .taille) && (difference == d_faux); i++)
1394: {
1395: difference = ((((struct_complexe16 *) (*((struct_vecteur *)
1396: (*s_objet_argument_1).objet)).tableau)[i].partie_reelle
1397: == ((struct_complexe16 *) (*((struct_vecteur *)
1398: (*s_objet_argument_2).objet)).tableau)[i].partie_reelle)
1399: && (((struct_complexe16 *) (*((struct_vecteur *)
1400: (*s_objet_argument_1).objet)).tableau)[i]
1401: .partie_imaginaire == ((struct_complexe16 *)
1402: (*((struct_vecteur *) (*s_objet_argument_2).objet))
1403: .tableau)[i].partie_imaginaire)) ? d_faux : d_vrai;
1404: }
1405:
1406: (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
1407: d_vrai) ? -1 : 0;
1408: }
1409: }
1410:
1411: /*
1412: --------------------------------------------------------------------------------
1413: SAME NOT portant sur des matrices
1414: --------------------------------------------------------------------------------
1415: */
1416: /*
1417: * Matrice d'entiers
1418: */
1419:
1420: else if (((*s_objet_argument_1).type == MIN) &&
1421: ((*s_objet_argument_2).type == MIN))
1422: {
1423: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1424: {
1425: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1426: return;
1427: }
1428:
1429: if (((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_lignes
1430: != (*((struct_matrice *) (*s_objet_argument_2).objet))
1431: .nombre_lignes) || ((*((struct_matrice *) (*s_objet_argument_1)
1432: .objet)).nombre_colonnes != (*((struct_matrice *)
1433: (*s_objet_argument_2).objet)).nombre_colonnes))
1434: {
1435: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1436: }
1437: else
1438: {
1439: difference = d_faux;
1440:
1441: for(i = 0; (i < (*((struct_matrice *) (*s_objet_argument_1).objet))
1442: .nombre_lignes) && (difference == d_faux); i++)
1443: {
1444: for(j = 0; (j < (*((struct_matrice *) (*s_objet_argument_1)
1445: .objet)).nombre_colonnes) && (difference == d_faux);
1446: j++)
1447: {
1448: difference = (((integer8 **) (*((struct_matrice *)
1449: (*s_objet_argument_1).objet)).tableau)[i][j] ==
1450: ((integer8 **) (*((struct_matrice *)
1451: (*s_objet_argument_2).objet)).tableau)[i][j])
1452: ? d_faux : d_vrai;
1453: }
1454: }
1455:
1456: (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
1457: d_vrai) ? -1 : 0;
1458: }
1459: }
1460:
1461: /*
1462: * Matrice de réels
1463: */
1464:
1465: else if (((*s_objet_argument_1).type == MRL) &&
1466: ((*s_objet_argument_2).type == MRL))
1467: {
1468: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1469: {
1470: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1471: return;
1472: }
1473:
1474: if (((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_lignes
1475: != (*((struct_matrice *) (*s_objet_argument_2).objet))
1476: .nombre_lignes) || ((*((struct_matrice *) (*s_objet_argument_1)
1477: .objet)).nombre_colonnes != (*((struct_matrice *)
1478: (*s_objet_argument_2).objet)).nombre_colonnes))
1479: {
1480: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1481: }
1482: else
1483: {
1484: difference = d_faux;
1485:
1486: for(i = 0; (i < (*((struct_matrice *) (*s_objet_argument_1).objet))
1487: .nombre_lignes) && (difference == d_faux); i++)
1488: {
1489: for(j = 0; (j < (*((struct_matrice *) (*s_objet_argument_1)
1490: .objet)).nombre_colonnes) && (difference == d_faux);
1491: j++)
1492: {
1493: difference = (((real8 **) (*((struct_matrice *)
1494: (*s_objet_argument_1).objet)).tableau)[i][j] ==
1495: ((real8 **) (*((struct_matrice *)
1496: (*s_objet_argument_2).objet)).tableau)[i][j])
1497: ? d_faux : d_vrai;
1498: }
1499: }
1500:
1501: (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
1502: d_vrai) ? -1 : 0;
1503: }
1504: }
1505:
1506: /*
1507: * Matrice de complexes
1508: */
1509:
1510: else if (((*s_objet_argument_1).type == MCX) &&
1511: ((*s_objet_argument_2).type == MCX))
1512: {
1513: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1514: {
1515: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1516: return;
1517: }
1518:
1519: if (((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_lignes
1520: != (*((struct_matrice *) (*s_objet_argument_2).objet))
1521: .nombre_lignes) || ((*((struct_matrice *) (*s_objet_argument_1)
1522: .objet)).nombre_colonnes != (*((struct_matrice *)
1523: (*s_objet_argument_2).objet)).nombre_colonnes))
1524: {
1525: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1526: }
1527: else
1528: {
1529: difference = d_faux;
1530:
1531: for(i = 0; (i < (*((struct_matrice *) (*s_objet_argument_1).objet))
1532: .nombre_lignes) && (difference == d_faux); i++)
1533: {
1534: for(j = 0; (j < (*((struct_matrice *) (*s_objet_argument_1)
1535: .objet)).nombre_colonnes) && (difference == d_faux);
1536: j++)
1537: {
1538: difference = ((((struct_complexe16 **) (*((struct_matrice *)
1539: (*s_objet_argument_1).objet)).tableau)[i][j]
1540: .partie_reelle == ((struct_complexe16 **)
1541: (*((struct_matrice *) (*s_objet_argument_2).objet))
1542: .tableau)[i][j].partie_reelle) &&
1543: (((struct_complexe16 **) (*((struct_matrice *)
1544: (*s_objet_argument_1).objet)).tableau)[i][j]
1545: .partie_imaginaire == ((struct_complexe16 **)
1546: (*((struct_matrice *) (*s_objet_argument_2).objet))
1547: .tableau)[i][j].partie_imaginaire))
1548: ? d_faux : d_vrai;
1549: }
1550: }
1551:
1552: (*((integer8 *) (*s_objet_resultat).objet)) = (difference ==
1553: d_vrai) ? -1 : 0;
1554: }
1555: }
1556:
1557: /*
1558: --------------------------------------------------------------------------------
1559: SAME NOT entre des arguments complexes
1560: --------------------------------------------------------------------------------
1561: */
1562:
1563: /*
1564: * Nom ou valeur numérique / Nom ou valeur numérique
1565: */
1566:
1567: else if ((((*s_objet_argument_1).type == NOM) &&
1568: (((*s_objet_argument_2).type == NOM) ||
1569: ((*s_objet_argument_2).type == INT) ||
1570: ((*s_objet_argument_2).type == REL))) ||
1571: (((*s_objet_argument_2).type == NOM) &&
1572: (((*s_objet_argument_1).type == INT) ||
1573: ((*s_objet_argument_1).type == REL))))
1574: {
1575: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
1576: {
1577: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1578: return;
1579: }
1580:
1581: if (((*s_objet_resultat).objet =
1582: allocation_maillon(s_etat_processus)) == NULL)
1583: {
1584: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1585: return;
1586: }
1587:
1588: l_element_courant = (*s_objet_resultat).objet;
1589:
1590: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1591: == NULL)
1592: {
1593: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1594: return;
1595: }
1596:
1597: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1598: .nombre_arguments = 0;
1599: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1600: .fonction = instruction_vers_niveau_superieur;
1601:
1602: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1603: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1604: {
1605: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1606: return;
1607: }
1608:
1609: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1610: .nom_fonction, "<<");
1611:
1612: if (((*l_element_courant).suivant =
1613: allocation_maillon(s_etat_processus)) == NULL)
1614: {
1615: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1616: return;
1617: }
1618:
1619: l_element_courant = (*l_element_courant).suivant;
1620: (*l_element_courant).donnee = s_objet_argument_2;
1621:
1622: if (((*l_element_courant).suivant =
1623: allocation_maillon(s_etat_processus)) == NULL)
1624: {
1625: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1626: return;
1627: }
1628:
1629: l_element_courant = (*l_element_courant).suivant;
1630: (*l_element_courant).donnee = s_objet_argument_1;
1631:
1632: if (((*l_element_courant).suivant =
1633: allocation_maillon(s_etat_processus)) == NULL)
1634: {
1635: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1636: return;
1637: }
1638:
1639: l_element_courant = (*l_element_courant).suivant;
1640:
1641: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1642: == NULL)
1643: {
1644: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1645: return;
1646: }
1647:
1648: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1649: .nombre_arguments = 0;
1650: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1651: .fonction = instruction_ne;
1652:
1653: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1654: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1655: {
1656: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1657: return;
1658: }
1659:
1660: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1661: .nom_fonction, "<>");
1662:
1663: if (((*l_element_courant).suivant =
1664: allocation_maillon(s_etat_processus)) == NULL)
1665: {
1666: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1667: return;
1668: }
1669:
1670: l_element_courant = (*l_element_courant).suivant;
1671:
1672: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1673: == NULL)
1674: {
1675: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1676: return;
1677: }
1678:
1679: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1680: .nombre_arguments = 0;
1681: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1682: .fonction = instruction_ne;
1683:
1684: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1685: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1686: {
1687: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1688: return;
1689: }
1690:
1691: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1692: .nom_fonction, ">>");
1693:
1694: (*l_element_courant).suivant = NULL;
1695:
1696: s_objet_argument_1 = NULL;
1697: s_objet_argument_2 = NULL;
1698: }
1699:
1700: /*
1701: * Nom ou valeur numérique / Expression
1702: */
1703:
1704: else if (((((*s_objet_argument_1).type == ALG) ||
1705: ((*s_objet_argument_1).type == RPN))) &&
1706: (((*s_objet_argument_2).type == NOM) ||
1707: ((*s_objet_argument_2).type == INT) ||
1708: ((*s_objet_argument_2).type == REL)))
1709: {
1710: nombre_elements = 0;
1711: l_element_courant = (struct_liste_chainee *)
1712: (*s_objet_argument_1).objet;
1713:
1714: while(l_element_courant != NULL)
1715: {
1716: nombre_elements++;
1717: l_element_courant = (*l_element_courant).suivant;
1718: }
1719:
1720: if (nombre_elements == 2)
1721: {
1722: liberation(s_etat_processus, s_objet_argument_1);
1723: liberation(s_etat_processus, s_objet_argument_2);
1724:
1725: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1726: return;
1727: }
1728:
1729: if ((s_objet_resultat = copie_objet(s_etat_processus,
1730: s_objet_argument_1, 'N')) == NULL)
1731: {
1732: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1733: return;
1734: }
1735:
1736: l_element_courant = (struct_liste_chainee *)
1737: (*s_objet_resultat).objet;
1738: l_element_precedent = l_element_courant;
1739: l_element_courant = (*l_element_courant).suivant;
1740:
1741: if (((*l_element_precedent).suivant =
1742: allocation_maillon(s_etat_processus)) == NULL)
1743: {
1744: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1745: return;
1746: }
1747:
1748: (*(*l_element_precedent).suivant).donnee = s_objet_argument_2;
1749: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1750:
1751: while((*l_element_courant).suivant != NULL)
1752: {
1753: l_element_precedent = l_element_courant;
1754: l_element_courant = (*l_element_courant).suivant;
1755: }
1756:
1757: if (((*l_element_precedent).suivant =
1758: allocation_maillon(s_etat_processus)) == NULL)
1759: {
1760: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1761: return;
1762: }
1763:
1764: if (((*(*l_element_precedent).suivant).donnee =
1765: allocation(s_etat_processus, FCT)) == NULL)
1766: {
1767: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1768: return;
1769: }
1770:
1771: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1772: .donnee).objet)).nombre_arguments = 0;
1773: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1774: .donnee).objet)).fonction = instruction_ne;
1775:
1776: if (((*((struct_fonction *) (*(*(*l_element_precedent)
1777: .suivant).donnee).objet)).nom_fonction =
1778: malloc(3 * sizeof(unsigned char))) == NULL)
1779: {
1780: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1781: return;
1782: }
1783:
1784: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
1785: .suivant).donnee).objet)).nom_fonction, "<>");
1786:
1787: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1788:
1789: s_objet_argument_2 = NULL;
1790: }
1791:
1792: /*
1793: * Expression / Nom ou valeur numérique
1794: */
1795:
1796: else if ((((*s_objet_argument_1).type == NOM) ||
1797: ((*s_objet_argument_1).type == INT) ||
1798: ((*s_objet_argument_1).type == REL)) &&
1799: ((((*s_objet_argument_2).type == ALG) ||
1800: ((*s_objet_argument_2).type == RPN))))
1801: {
1802: nombre_elements = 0;
1803: l_element_courant = (struct_liste_chainee *)
1804: (*s_objet_argument_2).objet;
1805:
1806: while(l_element_courant != NULL)
1807: {
1808: nombre_elements++;
1809: l_element_courant = (*l_element_courant).suivant;
1810: }
1811:
1812: if (nombre_elements == 2)
1813: {
1814: liberation(s_etat_processus, s_objet_argument_1);
1815: liberation(s_etat_processus, s_objet_argument_2);
1816:
1817: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1818: return;
1819: }
1820:
1821: if ((s_objet_resultat = copie_objet(s_etat_processus,
1822: s_objet_argument_2, 'N')) == NULL)
1823: {
1824: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1825: return;
1826: }
1827:
1828: l_element_courant = (struct_liste_chainee *)
1829: (*s_objet_resultat).objet;
1830: l_element_precedent = l_element_courant;
1831:
1832: while((*l_element_courant).suivant != NULL)
1833: {
1834: l_element_precedent = l_element_courant;
1835: l_element_courant = (*l_element_courant).suivant;
1836: }
1837:
1838: if (((*l_element_precedent).suivant =
1839: allocation_maillon(s_etat_processus)) == NULL)
1840: {
1841: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1842: return;
1843: }
1844:
1845: (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
1846: l_element_precedent = (*l_element_precedent).suivant;
1847:
1848: if (((*l_element_precedent).suivant =
1849: allocation_maillon(s_etat_processus)) == NULL)
1850: {
1851: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1852: return;
1853: }
1854:
1855: if (((*(*l_element_precedent).suivant).donnee =
1856: allocation(s_etat_processus, FCT)) == NULL)
1857: {
1858: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1859: return;
1860: }
1861:
1862: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1863: .donnee).objet)).nombre_arguments = 0;
1864: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1865: .donnee).objet)).fonction = instruction_ne;
1866:
1867: if (((*((struct_fonction *) (*(*(*l_element_precedent)
1868: .suivant).donnee).objet)).nom_fonction =
1869: malloc(3 * sizeof(unsigned char))) == NULL)
1870: {
1871: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1872: return;
1873: }
1874:
1875: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
1876: .suivant).donnee).objet)).nom_fonction, "<>");
1877:
1878: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1879:
1880: s_objet_argument_1 = NULL;
1881: }
1882:
1883: /*
1884: * Expression / Expression
1885: */
1886:
1887: else if ((((*s_objet_argument_1).type == ALG) &&
1888: ((*s_objet_argument_2).type == ALG)) ||
1889: (((*s_objet_argument_1).type == RPN) &&
1890: ((*s_objet_argument_2).type == RPN)))
1891: {
1892: nombre_elements = 0;
1893: l_element_courant = (struct_liste_chainee *)
1894: (*s_objet_argument_1).objet;
1895:
1896: while(l_element_courant != NULL)
1897: {
1898: nombre_elements++;
1899: l_element_courant = (*l_element_courant).suivant;
1900: }
1901:
1902: if (nombre_elements == 2)
1903: {
1904: liberation(s_etat_processus, s_objet_argument_1);
1905: liberation(s_etat_processus, s_objet_argument_2);
1906:
1907: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1908: return;
1909: }
1910:
1911: nombre_elements = 0;
1912: l_element_courant = (struct_liste_chainee *)
1913: (*s_objet_argument_2).objet;
1914:
1915: while(l_element_courant != NULL)
1916: {
1917: nombre_elements++;
1918: l_element_courant = (*l_element_courant).suivant;
1919: }
1920:
1921: if (nombre_elements == 2)
1922: {
1923: liberation(s_etat_processus, s_objet_argument_1);
1924: liberation(s_etat_processus, s_objet_argument_2);
1925:
1926: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1927: return;
1928: }
1929:
1930: if ((s_copie_argument_1 = copie_objet(s_etat_processus,
1931: s_objet_argument_1, 'N')) == NULL)
1932: {
1933: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1934: return;
1935: }
1936:
1937: if ((s_copie_argument_2 = copie_objet(s_etat_processus,
1938: s_objet_argument_2, 'N')) == NULL)
1939: {
1940: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1941: return;
1942: }
1943:
1944: l_element_courant = (struct_liste_chainee *)
1945: (*s_copie_argument_1).objet;
1946: (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *)
1947: (*s_copie_argument_1).objet)).suivant;
1948:
1949: liberation(s_etat_processus, (*l_element_courant).donnee);
1950: free(l_element_courant);
1951:
1952: l_element_courant = (struct_liste_chainee *)
1953: (*s_copie_argument_2).objet;
1954: l_element_precedent = l_element_courant;
1955: s_objet_resultat = s_copie_argument_2;
1956:
1957: while((*l_element_courant).suivant != NULL)
1958: {
1959: l_element_precedent = l_element_courant;
1960: l_element_courant = (*l_element_courant).suivant;
1961: }
1962:
1963: liberation(s_etat_processus, (*l_element_courant).donnee);
1964: free(l_element_courant);
1965:
1966: (*l_element_precedent).suivant = (struct_liste_chainee *)
1967: (*s_copie_argument_1).objet;
1968: free(s_copie_argument_1);
1969:
1970: l_element_courant = (*l_element_precedent).suivant;
1971: while((*l_element_courant).suivant != NULL)
1972: {
1973: l_element_precedent = l_element_courant;
1974: l_element_courant = (*l_element_courant).suivant;
1975: }
1976:
1977: if (((*l_element_precedent).suivant =
1978: allocation_maillon(s_etat_processus)) == NULL)
1979: {
1980: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1981: return;
1982: }
1983:
1984: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1985: l_element_courant = (*l_element_precedent).suivant;
1986:
1987: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1988: == NULL)
1989: {
1990: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1991: return;
1992: }
1993:
1994: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1995: .nombre_arguments = 0;
1996: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1997: .donnee).objet)).fonction = instruction_ne;
1998:
1999: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2000: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
2001: {
2002: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2003: return;
2004: }
2005:
2006: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2007: .nom_fonction, "<>");
2008: }
2009:
2010: /*
2011: --------------------------------------------------------------------------------
2012: SAME NOT nul
2013: --------------------------------------------------------------------------------
2014: */
2015:
2016: else
2017: {
2018: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
2019: {
2020: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2021: return;
2022: }
2023:
2024: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
2025: }
2026:
2027: liberation(s_etat_processus, s_objet_argument_1);
2028: liberation(s_etat_processus, s_objet_argument_2);
2029:
2030: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2031: s_objet_resultat) == d_erreur)
2032: {
2033: return;
2034: }
2035:
2036: return;
2037: }
2038:
2039:
2040: /*
2041: ================================================================================
2042: Fonction 'next'
2043: ================================================================================
2044: Entrées :
2045: --------------------------------------------------------------------------------
2046: Sorties :
2047: --------------------------------------------------------------------------------
2048: Effets de bord : néant
2049: ================================================================================
2050: */
2051:
2052: void
2053: instruction_next(struct_processus *s_etat_processus)
2054: {
2055: struct_objet *s_objet;
2056: struct_objet *s_copie_objet;
2057:
2058: logical1 presence_compteur;
2059:
2060: (*s_etat_processus).erreur_execution = d_ex;
2061:
2062: if ((*s_etat_processus).affichage_arguments == 'Y')
2063: {
2064: printf("\n NEXT ");
2065:
2066: if ((*s_etat_processus).langue == 'F')
2067: {
2068: printf("(fin d'une boucle définie)\n\n");
2069: }
2070: else
2071: {
2072: printf("(end of defined loop)\n\n");
2073: }
2074:
2075: if ((*s_etat_processus).langue == 'F')
2076: {
2077: printf(" Utilisation :\n\n");
2078: }
2079: else
2080: {
2081: printf(" Usage:\n\n");
2082: }
2083:
2084: printf(" %s/%s %s/%s START\n", d_INT, d_REL,
2085: d_INT, d_REL);
2086: printf(" (expression)\n");
2087: printf(" [EXIT]/[CYCLE]\n");
2088: printf(" ...\n");
2089: printf(" NEXT\n\n");
2090:
2091: printf(" %s/%s %s/%s FOR (variable)\n", d_INT, d_REL,
2092: d_INT, d_REL);
2093: printf(" (expression)\n");
2094: printf(" [EXIT]/[CYCLE]\n");
2095: printf(" ...\n");
2096: printf(" NEXT\n");
2097:
2098: return;
2099: }
2100: else if ((*s_etat_processus).test_instruction == 'Y')
2101: {
2102: (*s_etat_processus).nombre_arguments = -1;
2103: return;
2104: }
2105:
2106: presence_compteur = ((*(*s_etat_processus).l_base_pile_systeme)
2107: .type_cloture == 'F') ? d_vrai : d_faux;
2108:
2109: if (((*(*s_etat_processus).l_base_pile_systeme).type_cloture != 'S')
2110: && (presence_compteur == d_faux))
2111: {
2112: (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
2113: return;
2114: }
2115:
2116: /*
2117: * Pour une boucle avec indice, on fait pointer
2118: * (*(*s_etat_processus).l_base_pile_systeme).indice_boucle sur
2119: * la variable correspondante. Remarque, le contenu de la variable
2120: * est détruit au courant de l'opération.
2121: */
2122:
2123: if (presence_compteur == d_vrai)
2124: {
2125: if (recherche_variable(s_etat_processus, (*(*s_etat_processus)
2126: .l_base_pile_systeme).nom_variable) == d_faux)
2127: {
2128: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
2129: return;
2130: }
2131:
2132: if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)
2133: .position_variable_courante]).variable_verrouillee == d_vrai)
2134: {
2135: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
2136: return;
2137: }
2138:
2139: if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)
2140: .position_variable_courante]).objet == NULL)
2141: {
2142: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
2143: return;
2144: }
2145:
2146: (*(*s_etat_processus).l_base_pile_systeme).indice_boucle =
2147: ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
2148: .position_variable_courante]).objet;
2149: }
2150:
2151: /*
2152: * Empilement pour calculer le nouvel indice. Au passage, la
2153: * variable (*(*s_etat_processus).l_base_pile_systeme).indice_boucle
2154: * est libérée.
2155: */
2156:
2157: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2158: (*(*s_etat_processus).l_base_pile_systeme).indice_boucle)
2159: == d_erreur)
2160: {
2161: return;
2162: }
2163:
2164: if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
2165: {
2166: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2167: return;
2168: }
2169:
2170: (*((integer8 *) (*s_objet).objet)) = 1;
2171:
2172: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2173: s_objet) == d_erreur)
2174: {
2175: return;
2176: }
2177:
2178: instruction_plus(s_etat_processus);
2179:
2180: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2181: &s_objet) == d_erreur)
2182: {
2183: liberation(s_etat_processus, s_objet);
2184:
2185: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2186: return;
2187: }
2188:
2189: if (((*s_objet).type != INT) &&
2190: ((*s_objet).type != REL))
2191: {
2192: liberation(s_etat_processus, s_objet);
2193:
2194: (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
2195: return;
2196: }
2197:
2198: if (presence_compteur == d_vrai)
2199: {
2200: /*
2201: * L'addition crée si besoin une copie de l'objet
2202: */
2203:
2204: (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = NULL;
2205: ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
2206: .position_variable_courante]).objet = s_objet;
2207: }
2208: else
2209: {
2210: (*(*s_etat_processus).l_base_pile_systeme).indice_boucle = s_objet;
2211: }
2212:
2213: if ((s_copie_objet = copie_objet(s_etat_processus, s_objet, 'P')) == NULL)
2214: {
2215: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2216: return;
2217: }
2218:
2219: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2220: s_copie_objet) == d_erreur)
2221: {
2222: return;
2223: }
2224:
2225: if ((s_copie_objet = copie_objet(s_etat_processus,
2226: (*(*s_etat_processus).l_base_pile_systeme)
2227: .limite_indice_boucle, 'P')) == NULL)
2228: {
2229: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2230: return;
2231: }
2232:
2233: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2234: s_copie_objet) == d_erreur)
2235: {
2236: return;
2237: }
2238:
2239: instruction_le(s_etat_processus);
2240:
2241: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2242: &s_objet) == d_erreur)
2243: {
2244: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2245: return;
2246: }
2247:
2248: if ((*s_objet).type != INT)
2249: {
2250: liberation(s_etat_processus, s_objet);
2251:
2252: (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
2253: return;
2254: }
2255:
2256: if ((*((integer8 *) (*s_objet).objet)) != 0)
2257: {
2258: if ((*(*s_etat_processus).l_base_pile_systeme)
2259: .origine_routine_evaluation == 'N')
2260: {
2261: (*s_etat_processus).position_courante = (*(*s_etat_processus)
2262: .l_base_pile_systeme).adresse_retour;
2263: }
2264: else
2265: {
2266: (*s_etat_processus).expression_courante = (*(*s_etat_processus)
2267: .l_base_pile_systeme).pointeur_objet_retour;
2268: }
2269: }
2270: else
2271: {
2272: depilement_pile_systeme(s_etat_processus);
2273:
2274: if ((*s_etat_processus).erreur_systeme != d_es)
2275: {
2276: return;
2277: }
2278:
2279: if (presence_compteur == d_vrai)
2280: {
2281: (*s_etat_processus).niveau_courant--;
2282:
2283: if (retrait_variable_par_niveau(s_etat_processus) == d_erreur)
2284: {
2285: return;
2286: }
2287: }
2288: }
2289:
2290: liberation(s_etat_processus, s_objet);
2291:
2292: return;
2293: }
2294:
2295:
2296: /*
2297: ================================================================================
2298: Fonction 'nrand'
2299: ================================================================================
2300: Entrées : structure processus
2301: -------------------------------------------------------------------------------
2302: Sorties :
2303: --------------------------------------------------------------------------------
2304: Effets de bord : néant
2305: ================================================================================
2306: */
2307:
2308: void
2309: instruction_nrand(struct_processus *s_etat_processus)
2310: {
2311: struct_objet *s_objet;
2312:
2313: (*s_etat_processus).erreur_execution = d_ex;
2314:
2315: if ((*s_etat_processus).affichage_arguments == 'Y')
2316: {
2317: printf("\n NRAND ");
2318:
2319: if ((*s_etat_processus).langue == 'F')
2320: {
2321: printf("(valeur aléatoire gaussienne)\n\n");
2322: }
2323: else
2324: {
2325: printf("(normal random number)\n\n");
2326: }
2327:
2328: printf("-> 1: %s\n", d_REL);
2329:
2330: return;
2331: }
2332: else if ((*s_etat_processus).test_instruction == 'Y')
2333: {
2334: (*s_etat_processus).nombre_arguments = -1;
2335: return;
2336: }
2337:
2338: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2339: {
2340: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2341: {
2342: return;
2343: }
2344: }
2345:
2346: if ((*s_etat_processus).generateur_aleatoire == NULL)
2347: {
2348: initialisation_generateur_aleatoire(s_etat_processus, d_vrai, 0);
2349: }
2350:
2351: if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
2352: {
2353: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2354: return;
2355: }
2356:
2357: (*((real8 *) (*s_objet).objet)) = gsl_ran_gaussian_ratio_method(
2358: (*s_etat_processus).generateur_aleatoire, 1.0);
2359:
2360: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2361: s_objet) == d_erreur)
2362: {
2363: return;
2364: }
2365:
2366: return;
2367: }
2368:
2369: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>