1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.18
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 'clmf'
29: ================================================================================
30: Entrées : structure processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_clmf(struct_processus *s_etat_processus)
40: {
41: (*s_etat_processus).erreur_execution = d_ex;
42:
43: if ((*s_etat_processus).affichage_arguments == 'Y')
44: {
45: printf("\n CLMF ");
46:
47: if ((*s_etat_processus).langue == 'F')
48: {
49: printf("(affiche la pile opérationnelle)\n\n");
50: printf(" Aucun argument\n");
51: }
52: else
53: {
54: printf("(print stack)\n\n");
55: printf(" No argument\n");
56: }
57:
58: return;
59: }
60: else if ((*s_etat_processus).test_instruction == 'Y')
61: {
62: (*s_etat_processus).nombre_arguments = -1;
63: return;
64: }
65:
66: affichage_pile(s_etat_processus, (*s_etat_processus).l_base_pile, 1);
67:
68: return;
69: }
70:
71:
72: /*
73: ================================================================================
74: Fonction 'cont'
75: ================================================================================
76: Entrées :
77: --------------------------------------------------------------------------------
78: Sorties :
79: --------------------------------------------------------------------------------
80: Effets de bord : néant
81: ================================================================================
82: */
83:
84: void
85: instruction_cont(struct_processus *s_etat_processus)
86: {
87: (*s_etat_processus).erreur_execution = d_ex;
88:
89: if ((*s_etat_processus).affichage_arguments == 'Y')
90: {
91: printf("\n CONT ");
92:
93: if ((*s_etat_processus).langue == 'F')
94: {
95: printf("(continue un programme arrêté par HALT)\n\n");
96: printf(" Aucun argument\n");
97: }
98: else
99: {
100: printf("(continue a program stopped by HALT)\n\n");
101: printf(" No argument\n");
102: }
103:
104: return;
105: }
106: else if ((*s_etat_processus).test_instruction == 'Y')
107: {
108: (*s_etat_processus).nombre_arguments = -1;
109: return;
110: }
111:
112: (*s_etat_processus).debug_programme = d_faux;
113: (*s_etat_processus).execution_pas_suivant = d_vrai;
114:
115: return;
116: }
117:
118:
119: /*
120: ================================================================================
121: Fonction 'cnrm'
122: ================================================================================
123: Entrées : pointeur sur une structure struct_processus
124: --------------------------------------------------------------------------------
125: Sorties :
126: --------------------------------------------------------------------------------
127: Effets de bord : néant
128: ================================================================================
129: */
130:
131: void
132: instruction_cnrm(struct_processus *s_etat_processus)
133: {
134: integer8 cumul_entier;
135: integer8 entier_courant;
136: integer8 tampon;
137:
138: logical1 depassement;
139: logical1 erreur_memoire;
140:
141: real8 cumul_reel;
142:
143: struct_objet *s_objet_argument;
144: struct_objet *s_objet_resultat;
145:
146: unsigned long i;
147: unsigned long j;
148:
149: void *accumulateur;
150:
151: (*s_etat_processus).erreur_execution = d_ex;
152:
153: if ((*s_etat_processus).affichage_arguments == 'Y')
154: {
155: printf("\n CNRM ");
156:
157: if ((*s_etat_processus).langue == 'F')
158: {
159: printf("(norme de colonne)\n\n");
160: }
161: else
162: {
163: printf("(column norm)\n\n");
164: }
165:
166: printf(" 1: %s, %s\n", d_VIN, d_MIN);
167: printf("-> 1: %s, %s\n\n", d_INT, d_REL);
168:
169: printf(" 1: %s, %s, %s, %s\n", d_VRL, d_VCX, d_MRL, d_MCX);
170: printf("-> 1: %s\n", d_REL);
171:
172: return;
173: }
174: else if ((*s_etat_processus).test_instruction == 'Y')
175: {
176: (*s_etat_processus).nombre_arguments = -1;
177: return;
178: }
179:
180: if (test_cfsf(s_etat_processus, 31) == d_vrai)
181: {
182: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
183: {
184: return;
185: }
186: }
187:
188: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
189: &s_objet_argument) == d_erreur)
190: {
191: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
192: return;
193: }
194:
195: /*
196: --------------------------------------------------------------------------------
197: Traitement des vecteurs
198: --------------------------------------------------------------------------------
199: */
200:
201: if ((*s_objet_argument).type == VIN)
202: {
203: cumul_entier = 0;
204: depassement = d_faux;
205:
206: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
207: i++)
208: {
209: entier_courant = abs(((integer8 *) (*((struct_vecteur *)
210: (*s_objet_argument).objet)).tableau)[i]);
211:
212: if (depassement_addition(&cumul_entier, &entier_courant,
213: &tampon) == d_erreur)
214: {
215: depassement = d_vrai;
216: break;
217: }
218:
219: cumul_entier = tampon;
220: }
221:
222: if (depassement == d_faux)
223: {
224: if ((s_objet_resultat = allocation(s_etat_processus, INT))
225: == NULL)
226: {
227: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
228: return;
229: }
230:
231: (*((integer8 *) (*s_objet_resultat).objet)) = cumul_entier;
232: }
233: else
234: {
235: cumul_reel = 0;
236:
237: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
238: .taille; i++)
239: {
240: cumul_reel += (real8) abs(((integer8 *) (*((struct_vecteur *)
241: (*s_objet_argument).objet)).tableau)[i]);
242: }
243:
244: if ((s_objet_resultat = allocation(s_etat_processus, REL))
245: == NULL)
246: {
247: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
248: return;
249: }
250:
251: (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
252: }
253: }
254: else if ((*s_objet_argument).type == VRL)
255: {
256: if ((s_objet_resultat = allocation(s_etat_processus, REL))
257: == NULL)
258: {
259: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
260: return;
261: }
262:
263: if ((accumulateur = malloc((*((struct_vecteur *)
264: (*s_objet_argument).objet)).taille * sizeof(real8))) == NULL)
265: {
266: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
267: return;
268: }
269:
270: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
271: i++)
272: {
273: ((real8 *) accumulateur)[i] =
274: fabs(((real8 *) (*((struct_vecteur *)
275: (*s_objet_argument).objet)).tableau)[i]);
276: }
277:
278: (*((real8 *) (*s_objet_resultat).objet)) = sommation_vecteur_reel(
279: accumulateur, &((*((struct_vecteur *) (*s_objet_argument)
280: .objet)).taille), &erreur_memoire);
281:
282: if (erreur_memoire == d_vrai)
283: {
284: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
285: return;
286: }
287:
288: free(accumulateur);
289: }
290: else if ((*s_objet_argument).type == VCX)
291: {
292: if ((s_objet_resultat = allocation(s_etat_processus, REL))
293: == NULL)
294: {
295: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
296: return;
297: }
298:
299: if ((accumulateur = malloc((*((struct_vecteur *)
300: (*s_objet_argument).objet)).taille * sizeof(real8))) == NULL)
301: {
302: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
303: return;
304: }
305:
306: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
307: i++)
308: {
309: f77absc_(&(((struct_complexe16 *) (*((struct_vecteur *)
310: (*s_objet_argument).objet)).tableau)[i]),
311: &(((real8 *) accumulateur)[i]));
312: }
313:
314: (*((real8 *) (*s_objet_resultat).objet)) = sommation_vecteur_reel(
315: accumulateur, &((*((struct_vecteur *) (*s_objet_argument)
316: .objet)).taille), &erreur_memoire);
317:
318: if (erreur_memoire == d_vrai)
319: {
320: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
321: return;
322: }
323:
324: free(accumulateur);
325: }
326:
327: /*
328: --------------------------------------------------------------------------------
329: Traitement des matrices
330: --------------------------------------------------------------------------------
331: */
332:
333: else if ((*s_objet_argument).type == MIN)
334: {
335: if ((s_objet_resultat = allocation(s_etat_processus, INT))
336: == NULL)
337: {
338: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
339: return;
340: }
341:
342: depassement = d_faux;
343: cumul_entier = 0;
344:
345: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
346: .nombre_lignes; i++)
347: {
348: entier_courant = abs(((integer8 **)
349: (*((struct_matrice *) (*s_objet_argument).objet))
350: .tableau)[i][0]);
351:
352: if (depassement_addition(&cumul_entier, &entier_courant,
353: &tampon) == d_erreur)
354: {
355: depassement = d_vrai;
356: break;
357: }
358:
359: cumul_entier = tampon;
360: }
361:
362: if (depassement == d_faux)
363: {
364: (*((integer8 *) (*s_objet_resultat).objet)) = cumul_entier;
365:
366: for(j = 1; j < (*((struct_matrice *) (*s_objet_argument).objet))
367: .nombre_colonnes; j++)
368: {
369: cumul_entier = 0;
370:
371: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
372: .nombre_lignes; i++)
373: {
374: entier_courant = abs(((integer8 **) (*((struct_matrice *)
375: (*s_objet_argument).objet)).tableau)[i][j]);
376:
377: if (depassement_addition(&cumul_entier, &entier_courant,
378: &tampon) == d_erreur)
379: {
380: depassement = d_vrai;
381: break;
382: }
383:
384: cumul_entier = tampon;
385: }
386:
387: if (depassement == d_vrai)
388: {
389: break;
390: }
391:
392: if (cumul_entier > (*((integer8 *) (*s_objet_resultat).objet)))
393: {
394: (*((integer8 *) (*s_objet_resultat).objet)) = cumul_entier;
395: }
396: }
397: }
398:
399: if (depassement == d_vrai)
400: {
401: /*
402: * Dépassement : il faut refaire le calcul en real*8...
403: */
404:
405: free((*s_objet_resultat).objet);
406: (*s_objet_resultat).type = REL;
407:
408: if (((*s_objet_resultat).objet = malloc(sizeof(real8))) == NULL)
409: {
410: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
411: return;
412: }
413:
414: if ((accumulateur = malloc((*((struct_matrice *)
415: (*s_objet_argument).objet)).nombre_lignes * sizeof(real8)))
416: == NULL)
417: {
418: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
419: return;
420: }
421:
422: (*((real8 *) (*s_objet_resultat).objet)) = 0;
423:
424: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
425: .nombre_colonnes; j++)
426: {
427: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
428: .nombre_lignes; i++)
429: {
430: ((real8 *) accumulateur)[i] = fabs((real8) ((integer8 **)
431: (*((struct_matrice *)
432: (*s_objet_argument).objet)).tableau)[i][j]);
433: }
434:
435: cumul_reel = sommation_vecteur_reel(accumulateur,
436: &((*((struct_matrice *) (*s_objet_argument).objet))
437: .nombre_lignes), &erreur_memoire);
438:
439: if (erreur_memoire == d_vrai)
440: {
441: (*s_etat_processus).erreur_systeme =
442: d_es_allocation_memoire;
443: return;
444: }
445:
446: if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
447: {
448: (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
449: }
450: }
451:
452: free(accumulateur);
453: }
454: }
455: else if ((*s_objet_argument).type == MRL)
456: {
457: if ((s_objet_resultat = allocation(s_etat_processus, REL))
458: == NULL)
459: {
460: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
461: return;
462: }
463:
464: if ((accumulateur = malloc((*((struct_matrice *)
465: (*s_objet_argument).objet)).nombre_lignes * sizeof(real8)))
466: == NULL)
467: {
468: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
469: return;
470: }
471:
472: (*((real8 *) (*s_objet_resultat).objet)) = 0;
473:
474: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
475: .nombre_colonnes; j++)
476: {
477: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
478: .nombre_lignes; i++)
479: {
480: ((real8 *) accumulateur)[i] = fabs(((real8 **)
481: (*((struct_matrice *)
482: (*s_objet_argument).objet)).tableau)[i][j]);
483: }
484:
485: cumul_reel = sommation_vecteur_reel(accumulateur,
486: &((*((struct_matrice *) (*s_objet_argument).objet))
487: .nombre_lignes), &erreur_memoire);
488:
489: if (erreur_memoire == d_vrai)
490: {
491: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
492: return;
493: }
494:
495: if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
496: {
497: (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
498: }
499: }
500:
501: free(accumulateur);
502: }
503: else if ((*s_objet_argument).type == MCX)
504: {
505: if ((s_objet_resultat = allocation(s_etat_processus, REL))
506: == NULL)
507: {
508: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
509: return;
510: }
511:
512: if ((accumulateur = malloc((*((struct_matrice *)
513: (*s_objet_argument).objet)).nombre_lignes * sizeof(real8)))
514: == NULL)
515: {
516: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
517: return;
518: }
519:
520: (*((real8 *) (*s_objet_resultat).objet)) = 0;
521:
522: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
523: .nombre_colonnes; j++)
524: {
525: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
526: .nombre_lignes; i++)
527: {
528: f77absc_(&(((struct_complexe16 **) (*((struct_matrice *)
529: (*s_objet_argument).objet)).tableau)[i][j]),
530: &(((real8 *) accumulateur)[i]));
531: }
532:
533: cumul_reel = sommation_vecteur_reel(accumulateur,
534: &((*((struct_matrice *) (*s_objet_argument).objet))
535: .nombre_lignes), &erreur_memoire);
536:
537: if (erreur_memoire == d_vrai)
538: {
539: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
540: return;
541: }
542:
543: if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
544: {
545: (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
546: }
547: }
548:
549: free(accumulateur);
550: }
551:
552: /*
553: --------------------------------------------------------------------------------
554: Traitement impossible du fait du type de l'argument
555: --------------------------------------------------------------------------------
556: */
557:
558: else
559: {
560: liberation(s_etat_processus, s_objet_argument);
561:
562: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
563: return;
564: }
565:
566: liberation(s_etat_processus, s_objet_argument);
567:
568: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
569: s_objet_resultat) == d_erreur)
570: {
571: return;
572: }
573:
574: return;
575: }
576:
577:
578: /*
579: ================================================================================
580: Fonction 'chr'
581: ================================================================================
582: Entrées : structure processus
583: --------------------------------------------------------------------------------
584: Sorties :
585: --------------------------------------------------------------------------------
586: Effets de bord : néant
587: ================================================================================
588: */
589:
590: void
591: instruction_chr(struct_processus *s_etat_processus)
592: {
593: struct_objet *s_objet_argument;
594: struct_objet *s_objet_resultat;
595:
596: (*s_etat_processus).erreur_execution = d_ex;
597:
598: if ((*s_etat_processus).affichage_arguments == 'Y')
599: {
600: printf("\n CHR ");
601:
602: if ((*s_etat_processus).langue == 'F')
603: {
604: printf("(conversion d'un entier en caractère)\n\n");
605: }
606: else
607: {
608: printf("(integer to character conversion)\n\n");
609: }
610:
611: printf(" 1: 0 <= %s <= 255\n", d_INT);
612: printf("-> 1: %s\n", d_CHN);
613:
614: return;
615: }
616: else if ((*s_etat_processus).test_instruction == 'Y')
617: {
618: (*s_etat_processus).nombre_arguments = -1;
619: return;
620: }
621:
622: if (test_cfsf(s_etat_processus, 31) == d_vrai)
623: {
624: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
625: {
626: return;
627: }
628: }
629:
630: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
631: &s_objet_argument) == d_erreur)
632: {
633: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
634: return;
635: }
636:
637: /*
638: --------------------------------------------------------------------------------
639: Entier
640: --------------------------------------------------------------------------------
641: */
642:
643: if ((*s_objet_argument).type == INT)
644: {
645: if (((*((integer8 *) (*s_objet_argument).objet)) < 0) ||
646: ((*((integer8 *) (*s_objet_argument).objet)) > 255))
647: {
648: liberation(s_etat_processus, s_objet_argument);
649:
650: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
651: return;
652: }
653:
654: if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
655: {
656: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
657: return;
658: }
659:
660: if (((*s_objet_resultat).objet = malloc(2 * sizeof(unsigned char)))
661: == NULL)
662: {
663: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
664: return;
665: }
666:
667: ((unsigned char *) (*s_objet_resultat).objet)[0] = (*((integer8 *)
668: (*s_objet_argument).objet));
669: ((unsigned char *) (*s_objet_resultat).objet)[1] = d_code_fin_chaine;
670: }
671:
672: /*
673: --------------------------------------------------------------------------------
674: Type invalide
675: --------------------------------------------------------------------------------
676: */
677:
678: else
679: {
680: liberation(s_etat_processus, s_objet_argument);
681:
682: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
683: return;
684: }
685:
686: liberation(s_etat_processus, s_objet_argument);
687:
688: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
689: s_objet_resultat) == d_erreur)
690: {
691: return;
692: }
693:
694: return;
695: }
696:
697:
698: /*
699: ================================================================================
700: Fonction 'cr'
701: ================================================================================
702: Entrées : structure processus
703: --------------------------------------------------------------------------------
704: Sorties :
705: --------------------------------------------------------------------------------
706: Effets de bord : néant
707: ================================================================================
708: */
709:
710: void
711: instruction_cr(struct_processus *s_etat_processus)
712: {
713: struct_objet s_objet;
714:
715: unsigned char commande[] = "\\\\par";
716:
717: (*s_etat_processus).erreur_execution = d_ex;
718:
719: if ((*s_etat_processus).affichage_arguments == 'Y')
720: {
721: printf("\n CR ");
722:
723: if ((*s_etat_processus).langue == 'F')
724: {
725: printf("(retour à la ligne dans la sortie imprimée)\n\n");
726: printf(" Aucun argument\n");
727: }
728: else
729: {
730: printf("(carriage return in the printer output)\n\n");
731: printf(" No argument\n");
732: }
733:
734: return;
735: }
736: else if ((*s_etat_processus).test_instruction == 'Y')
737: {
738: (*s_etat_processus).nombre_arguments = -1;
739: return;
740: }
741:
742: if (test_cfsf(s_etat_processus, 31) == d_vrai)
743: {
744: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
745: {
746: return;
747: }
748: }
749:
750: s_objet.objet = commande;
751: s_objet.type = CHN;
752:
753: formateur_tex(s_etat_processus, &s_objet, 'N');
754: return;
755: }
756:
757:
758: /*
759: ================================================================================
760: Fonction 'centr'
761: ================================================================================
762: Entrées : pointeur sur une structure struct_processus
763: --------------------------------------------------------------------------------
764: Sorties :
765: --------------------------------------------------------------------------------
766: Effets de bord : néant
767: ================================================================================
768: */
769:
770: void
771: instruction_centr(struct_processus *s_etat_processus)
772: {
773: real8 x_max;
774: real8 x_min;
775: real8 y_max;
776: real8 y_min;
777:
778: struct_objet *s_objet_argument;
779:
780: (*s_etat_processus).erreur_execution = d_ex;
781:
782:
783: if ((*s_etat_processus).affichage_arguments == 'Y')
784: {
785: printf("\n CENTR ");
786:
787: if ((*s_etat_processus).langue == 'F')
788: {
789: printf("(centre des graphiques)\n\n");
790: }
791: else
792: {
793: printf("(center of the graphics)\n\n");
794: }
795:
796: printf(" 1: %s\n", d_CPL);
797:
798: return;
799: }
800: else if ((*s_etat_processus).test_instruction == 'Y')
801: {
802: (*s_etat_processus).nombre_arguments = -1;
803: return;
804: }
805:
806: if (test_cfsf(s_etat_processus, 31) == d_vrai)
807: {
808: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
809: {
810: return;
811: }
812: }
813:
814: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
815: &s_objet_argument) == d_erreur)
816: {
817: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
818: return;
819: }
820:
821: if ((*s_objet_argument).type == CPL)
822: {
823: if ((*s_etat_processus).systeme_axes == 0)
824: {
825: x_min = (*s_etat_processus).x_min;
826: x_max = (*s_etat_processus).x_max;
827:
828: y_min = (*s_etat_processus).y_min;
829: y_max = (*s_etat_processus).y_max;
830:
831: (*s_etat_processus).x_min = (*((complex16 *)
832: (*s_objet_argument).objet))
833: .partie_reelle - ((x_max - x_min) / ((double) 2));
834: (*s_etat_processus).x_max = (*((complex16 *)
835: (*s_objet_argument).objet))
836: .partie_reelle + ((x_max - x_min) / ((double) 2));
837:
838: (*s_etat_processus).y_min = (*((complex16 *)
839: (*s_objet_argument).objet))
840: .partie_imaginaire - ((y_max - y_min) / ((double) 2));
841: (*s_etat_processus).y_max = (*((complex16 *)
842: (*s_objet_argument).objet))
843: .partie_imaginaire + ((y_max - y_min) / ((double) 2));
844: }
845: else
846: {
847: x_min = (*s_etat_processus).x2_min;
848: x_max = (*s_etat_processus).x2_max;
849:
850: y_min = (*s_etat_processus).y2_min;
851: y_max = (*s_etat_processus).y2_max;
852:
853: (*s_etat_processus).x2_min = (*((complex16 *)
854: (*s_objet_argument).objet))
855: .partie_reelle - ((x_max - x_min) / ((double) 2));
856: (*s_etat_processus).x2_max = (*((complex16 *)
857: (*s_objet_argument).objet))
858: .partie_reelle + ((x_max - x_min) / ((double) 2));
859:
860: (*s_etat_processus).y2_min = (*((complex16 *)
861: (*s_objet_argument).objet))
862: .partie_imaginaire - ((y_max - y_min) / ((double) 2));
863: (*s_etat_processus).y2_max = (*((complex16 *)
864: (*s_objet_argument).objet))
865: .partie_imaginaire + ((y_max - y_min) / ((double) 2));
866: }
867: }
868: else
869: {
870: liberation(s_etat_processus, s_objet_argument);
871:
872: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
873: return;
874: }
875:
876: liberation(s_etat_processus, s_objet_argument);
877:
878: if (test_cfsf(s_etat_processus, 52) == d_faux)
879: {
880: if ((*s_etat_processus).fichiers_graphiques != NULL)
881: {
882: appel_gnuplot(s_etat_processus, 'N');
883: }
884: }
885:
886: return;
887: }
888:
889:
890: /*
891: ================================================================================
892: Fonction 'cls'
893: ================================================================================
894: Entrées : pointeur sur une structure struct_processus
895: --------------------------------------------------------------------------------
896: Sorties :
897: --------------------------------------------------------------------------------
898: Effets de bord : néant
899: ================================================================================
900: */
901:
902: void
903: instruction_cls(struct_processus *s_etat_processus)
904: {
905: (*s_etat_processus).erreur_execution = d_ex;
906:
907: if ((*s_etat_processus).affichage_arguments == 'Y')
908: {
909: printf("\n CLS ");
910:
911: if ((*s_etat_processus).langue == 'F')
912: {
913: printf("(effacement de la matrice statistique)\n\n");
914: printf(" Aucun argument\n");
915: }
916: else
917: {
918: printf("(purge of the statistical matrix)\n\n");
919: printf(" No argument\n");
920: }
921:
922: return;
923: }
924: else if ((*s_etat_processus).test_instruction == 'Y')
925: {
926: (*s_etat_processus).nombre_arguments = -1;
927: return;
928: }
929:
930: if (test_cfsf(s_etat_processus, 31) == d_vrai)
931: {
932: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
933: {
934: return;
935: }
936: }
937:
938: if (retrait_variable(s_etat_processus, ds_sdat, 'G') == d_erreur)
939: {
940: (*s_etat_processus).erreur_systeme = d_es;
941: return;
942: }
943:
944: return;
945: }
946:
947:
948: /*
949: ================================================================================
950: Fonction 'comb'
951: ================================================================================
952: Entrées : structure processus
953: --------------------------------------------------------------------------------
954: Sorties :
955: --------------------------------------------------------------------------------
956: Effets de bord : néant
957: ================================================================================
958: */
959:
960: void
961: instruction_comb(struct_processus *s_etat_processus)
962: {
963: integer8 k;
964: integer8 n;
965: integer8 cint_max;
966:
967: real8 c;
968:
969: struct_objet *s_objet_argument_1;
970: struct_objet *s_objet_argument_2;
971: struct_objet *s_objet_resultat;
972:
973: unsigned long i;
974:
975: (*s_etat_processus).erreur_execution = d_ex;
976:
977: if ((*s_etat_processus).affichage_arguments == 'Y')
978: {
979: printf("\n COMB ");
980:
981: if ((*s_etat_processus).langue == 'F')
982: {
983: printf("(combinaison)\n\n");
984: }
985: else
986: {
987: printf("(combinaison)\n\n");
988: }
989:
990: printf(" 1: %s\n", d_INT);
991: printf("-> 1: %s, %s\n", d_INT, d_REL);
992:
993: return;
994: }
995: else if ((*s_etat_processus).test_instruction == 'Y')
996: {
997: (*s_etat_processus).nombre_arguments = 2;
998: return;
999: }
1000:
1001: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1002: {
1003: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1004: {
1005: return;
1006: }
1007: }
1008:
1009: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1010: &s_objet_argument_1) == d_erreur)
1011: {
1012: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1013: return;
1014: }
1015:
1016: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1017: &s_objet_argument_2) == d_erreur)
1018: {
1019: liberation(s_etat_processus, s_objet_argument_1);
1020:
1021: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1022: return;
1023: }
1024:
1025: if (((*s_objet_argument_1).type == INT) &&
1026: ((*s_objet_argument_2).type == INT))
1027: {
1028: n = (*((integer8 *) (*s_objet_argument_2).objet));
1029: k = (*((integer8 *) (*s_objet_argument_1).objet));
1030:
1031: if ((n < 0) || (k < 0) || (k > n))
1032: {
1033: liberation(s_etat_processus, s_objet_argument_1);
1034: liberation(s_etat_processus, s_objet_argument_2);
1035:
1036: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1037: return;
1038: }
1039:
1040: f90combinaison(&n, &k, &c);
1041:
1042: for(i = 1, cint_max = 1; i < (8 * sizeof(integer8)) - 1; cint_max =
1043: (cint_max << 1) + 1, i++);
1044:
1045: if (c > cint_max)
1046: {
1047: if ((s_objet_resultat = allocation(s_etat_processus, REL))
1048: == NULL)
1049: {
1050: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1051: return;
1052: }
1053:
1054: (*((real8 *) (*s_objet_resultat).objet)) = c;
1055: }
1056: else
1057: {
1058: if ((s_objet_resultat = allocation(s_etat_processus, INT))
1059: == NULL)
1060: {
1061: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1062: return;
1063: }
1064:
1065: if (fabs(c - floor(c)) < fabs(ceil(c) - c))
1066: {
1067: (*((integer8 *) (*s_objet_resultat).objet)) =
1068: (integer8) floor(c);
1069: }
1070: else
1071: {
1072: (*((integer8 *) (*s_objet_resultat).objet)) =
1073: 1 + (integer8) floor(c);
1074: }
1075: }
1076: }
1077: else
1078: {
1079: liberation(s_etat_processus, s_objet_argument_1);
1080: liberation(s_etat_processus, s_objet_argument_2);
1081:
1082: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1083: return;
1084: }
1085:
1086: liberation(s_etat_processus, s_objet_argument_1);
1087: liberation(s_etat_processus, s_objet_argument_2);
1088:
1089: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1090: s_objet_resultat) == d_erreur)
1091: {
1092: return;
1093: }
1094:
1095: return;
1096: }
1097:
1098:
1099: /*
1100: ================================================================================
1101: Fonction 'cols'
1102: ================================================================================
1103: Entrées : pointeur sur une structure struct_processus
1104: --------------------------------------------------------------------------------
1105: Sorties :
1106: --------------------------------------------------------------------------------
1107: Effets de bord : néant
1108: ================================================================================
1109: */
1110:
1111: void
1112: instruction_cols(struct_processus *s_etat_processus)
1113: {
1114: struct_objet *s_objet_argument_1;
1115: struct_objet *s_objet_argument_2;
1116:
1117: (*s_etat_processus).erreur_execution = d_ex;
1118:
1119: if ((*s_etat_processus).affichage_arguments == 'Y')
1120: {
1121: printf("\n COLS ");
1122:
1123: if ((*s_etat_processus).langue == 'F')
1124: {
1125: printf("(définition des colonnes X et Y de la matrice "
1126: "statistique)\n\n");
1127: }
1128: else
1129: {
1130: printf("(definition of X and Y columns in statistical matrix)\n\n");
1131: }
1132:
1133: printf(" 2: %s\n", d_INT);
1134: printf(" 1: %s\n", d_INT);
1135:
1136: return;
1137: }
1138: else if ((*s_etat_processus).test_instruction == 'Y')
1139: {
1140: (*s_etat_processus).nombre_arguments = -1;
1141: return;
1142: }
1143:
1144: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1145: {
1146: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1147: {
1148: return;
1149: }
1150: }
1151:
1152: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1153: &s_objet_argument_1) == d_erreur)
1154: {
1155: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1156: return;
1157: }
1158:
1159: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1160: &s_objet_argument_2) == d_erreur)
1161: {
1162: liberation(s_etat_processus, s_objet_argument_1);
1163:
1164: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1165: return;
1166: }
1167:
1168: if (((*s_objet_argument_1).type == INT) &&
1169: ((*s_objet_argument_2).type == INT))
1170: {
1171: if (((*((integer8 *) (*s_objet_argument_1).objet)) <= 0) ||
1172: ((*((integer8 *) (*s_objet_argument_2).objet)) <= 0))
1173: {
1174: liberation(s_etat_processus, s_objet_argument_1);
1175: liberation(s_etat_processus, s_objet_argument_2);
1176:
1177: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1178: return;
1179: }
1180:
1181: (*s_etat_processus).colonne_statistique_1 =
1182: (*((integer8 *) (*s_objet_argument_2).objet));
1183: (*s_etat_processus).colonne_statistique_2 =
1184: (*((integer8 *) (*s_objet_argument_1).objet));
1185: }
1186: else
1187: {
1188: liberation(s_etat_processus, s_objet_argument_1);
1189: liberation(s_etat_processus, s_objet_argument_2);
1190:
1191: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1192: return;
1193: }
1194:
1195: liberation(s_etat_processus, s_objet_argument_1);
1196: liberation(s_etat_processus, s_objet_argument_2);
1197:
1198: return;
1199: }
1200:
1201: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>