1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.36
4: Copyright (C) 1989-2025 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl-conv.h"
24:
25:
26: /*
27: ================================================================================
28: Fonction 'd->r'
29: ================================================================================
30: Entrées : pointeur sur une structure struct_processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_d_vers_r(struct_processus *s_etat_processus)
40: {
41: struct_liste_chainee *l_element_courant;
42: struct_liste_chainee *l_element_precedent;
43:
44: struct_objet *s_copie_argument;
45: struct_objet *s_objet_argument;
46: struct_objet *s_objet_resultat;
47:
48: (*s_etat_processus).erreur_execution = d_ex;
49:
50: if ((*s_etat_processus).affichage_arguments == 'Y')
51: {
52: printf("\n D->R ");
53:
54: if ((*s_etat_processus).langue == 'F')
55: {
56: printf("(degrés vers radians)\n\n");
57: }
58: else
59: {
60: printf("(degrees to radians)\n\n");
61: }
62:
63: printf(" 1: %s, %s\n", d_INT, d_REL);
64: printf("-> 1: %s\n\n", d_REL);
65:
66: printf(" 1: %s, %s\n", d_NOM, d_ALG);
67: printf("-> 1: %s\n\n", d_ALG);
68:
69: printf(" 1: %s\n", d_RPN);
70: printf("-> 1: %s\n", d_RPN);
71:
72: return;
73: }
74: else if ((*s_etat_processus).test_instruction == 'Y')
75: {
76: (*s_etat_processus).nombre_arguments = -1;
77: return;
78: }
79:
80: if (test_cfsf(s_etat_processus, 31) == d_vrai)
81: {
82: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
83: {
84: return;
85: }
86: }
87:
88: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
89: &s_objet_argument) == d_erreur)
90: {
91: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
92: return;
93: }
94:
95: /*
96: --------------------------------------------------------------------------------
97: Conversion d'un entier ou d'un réel
98: --------------------------------------------------------------------------------
99: */
100:
101: if (((*s_objet_argument).type == INT) ||
102: ((*s_objet_argument).type == REL))
103: {
104: if ((s_objet_resultat = allocation(s_etat_processus, REL))
105: == NULL)
106: {
107: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
108: return;
109: }
110:
111: if ((*s_objet_argument).type == INT)
112: {
113: (*((real8 *) (*s_objet_resultat).objet)) =
114: (real8) (*((integer8 *) (*s_objet_argument).objet));
115: }
116: else
117: {
118: (*((real8 *) (*s_objet_resultat).objet)) =
119: (*((real8 *) (*s_objet_argument).objet));
120: }
121:
122: conversion_degres_vers_radians((real8 *) (*s_objet_resultat).objet);
123: }
124:
125: /*
126: --------------------------------------------------------------------------------
127: Conversion d'un nom
128: --------------------------------------------------------------------------------
129: */
130:
131: else if ((*s_objet_argument).type == NOM)
132: {
133: if ((s_objet_resultat = allocation(s_etat_processus, ALG))
134: == NULL)
135: {
136: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
137: return;
138: }
139:
140: if (((*s_objet_resultat).objet =
141: allocation_maillon(s_etat_processus)) == NULL)
142: {
143: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
144: return;
145: }
146:
147: l_element_courant = (*s_objet_resultat).objet;
148:
149: if (((*l_element_courant).donnee =
150: allocation(s_etat_processus, FCT)) == NULL)
151: {
152: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
153: return;
154: }
155:
156: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
157: .nombre_arguments = 0;
158: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
159: .fonction = instruction_vers_niveau_superieur;
160:
161: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
162: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
163: {
164: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
165: return;
166: }
167:
168: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
169: .nom_fonction, "<<");
170:
171: if (((*l_element_courant).suivant =
172: allocation_maillon(s_etat_processus)) == NULL)
173: {
174: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
175: return;
176: }
177:
178: l_element_courant = (*l_element_courant).suivant;
179: (*l_element_courant).donnee = s_objet_argument;
180:
181: if (((*l_element_courant).suivant =
182: allocation_maillon(s_etat_processus)) == NULL)
183: {
184: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
185: return;
186: }
187:
188: l_element_courant = (*l_element_courant).suivant;
189:
190: if (((*l_element_courant).donnee =
191: allocation(s_etat_processus, FCT)) == NULL)
192: {
193: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
194: return;
195: }
196:
197: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
198: .nombre_arguments = 1;
199: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
200: .fonction = instruction_d_vers_r;
201:
202: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
203: .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
204: {
205: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
206: return;
207: }
208:
209: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
210: .nom_fonction, "D->R");
211:
212: if (((*l_element_courant).suivant =
213: allocation_maillon(s_etat_processus)) == NULL)
214: {
215: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
216: return;
217: }
218:
219: l_element_courant = (*l_element_courant).suivant;
220:
221: if (((*l_element_courant).donnee =
222: allocation(s_etat_processus, FCT)) == NULL)
223: {
224: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
225: return;
226: }
227:
228: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
229: .nombre_arguments = 0;
230: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
231: .fonction = instruction_vers_niveau_inferieur;
232:
233: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
234: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
235: {
236: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
237: return;
238: }
239:
240: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
241: .nom_fonction, ">>");
242:
243: (*l_element_courant).suivant = NULL;
244: s_objet_argument = NULL;
245: }
246:
247: /*
248: --------------------------------------------------------------------------------
249: Conversion d'une expression
250: --------------------------------------------------------------------------------
251: */
252:
253: else if (((*s_objet_argument).type == ALG) ||
254: ((*s_objet_argument).type == RPN))
255: {
256: if ((s_copie_argument = copie_objet(s_etat_processus,
257: s_objet_argument, 'N')) == NULL)
258: {
259: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
260: return;
261: }
262:
263: l_element_courant = (struct_liste_chainee *)
264: (*s_copie_argument).objet;
265: l_element_precedent = l_element_courant;
266:
267: while((*l_element_courant).suivant != NULL)
268: {
269: l_element_precedent = l_element_courant;
270: l_element_courant = (*l_element_courant).suivant;
271: }
272:
273: if (((*l_element_precedent).suivant =
274: allocation_maillon(s_etat_processus)) == NULL)
275: {
276: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
277: return;
278: }
279:
280: if (((*(*l_element_precedent).suivant).donnee =
281: allocation(s_etat_processus, FCT)) == NULL)
282: {
283: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
284: return;
285: }
286:
287: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
288: .donnee).objet)).nombre_arguments = 1;
289: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
290: .donnee).objet)).fonction = instruction_d_vers_r;
291:
292: if (((*((struct_fonction *) (*(*(*l_element_precedent)
293: .suivant).donnee).objet)).nom_fonction =
294: malloc(5 * sizeof(unsigned char))) == NULL)
295: {
296: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
297: return;
298: }
299:
300: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
301: .suivant).donnee).objet)).nom_fonction, "D->R");
302:
303: (*(*l_element_precedent).suivant).suivant = l_element_courant;
304:
305: s_objet_resultat = s_copie_argument;
306: }
307:
308: /*
309: --------------------------------------------------------------------------------
310: Réalisation impossible de la fonction R->D
311: --------------------------------------------------------------------------------
312: */
313:
314: else
315: {
316: liberation(s_etat_processus, s_objet_argument);
317:
318: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
319: return;
320: }
321:
322: liberation(s_etat_processus, s_objet_argument);
323:
324: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
325: s_objet_resultat) == d_erreur)
326: {
327: return;
328: }
329:
330: return;
331: }
332:
333:
334: /*
335: ================================================================================
336: Fonction 'det'
337: ================================================================================
338: Entrées : pointeur sur une structure struct_processus
339: --------------------------------------------------------------------------------
340: Sorties :
341: --------------------------------------------------------------------------------
342: Effets de bord : néant
343: ================================================================================
344: */
345:
346: void
347: instruction_det(struct_processus *s_etat_processus)
348: {
349: struct_objet *s_objet_argument;
350: struct_objet *s_objet_resultat;
351:
352: (*s_etat_processus).erreur_execution = d_ex;
353:
354: if ((*s_etat_processus).affichage_arguments == 'Y')
355: {
356: printf("\n DET ");
357:
358: if ((*s_etat_processus).langue == 'F')
359: {
360: printf("(déterminant)\n\n");
361: }
362: else
363: {
364: printf("(determinant)\n\n");
365: }
366:
367: printf(" 1: %s\n", d_MIN);
368: printf("-> 1: %s, %s\n\n", d_INT, d_REL);
369:
370: printf(" 1: %s\n", d_MRL);
371: printf("-> 1: %s\n\n", d_REL);
372:
373: printf(" 1: %s\n", d_MCX);
374: printf("-> 1: %s\n", d_CPL);
375:
376: return;
377: }
378: else if ((*s_etat_processus).test_instruction == 'Y')
379: {
380: (*s_etat_processus).nombre_arguments = -1;
381: return;
382: }
383:
384: if (test_cfsf(s_etat_processus, 31) == d_vrai)
385: {
386: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
387: {
388: return;
389: }
390: }
391:
392: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
393: &s_objet_argument) == d_erreur)
394: {
395: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
396: return;
397: }
398:
399: /*
400: --------------------------------------------------------------------------------
401: L'argument est une matrice carrée
402: --------------------------------------------------------------------------------
403: */
404:
405: if (((*s_objet_argument).type == MIN) ||
406: ((*s_objet_argument).type == MRL))
407: {
408: if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes !=
409: (*((struct_matrice *) (*s_objet_argument).objet))
410: .nombre_colonnes)
411: {
412: liberation(s_etat_processus, s_objet_argument);
413:
414: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
415: return;
416: }
417:
418: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
419: {
420: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
421: return;
422: }
423:
424: determinant(s_etat_processus, (struct_matrice *)
425: (*s_objet_argument).objet, (*s_objet_resultat).objet);
426:
427: if ((*s_etat_processus).erreur_systeme != d_es)
428: {
429: return;
430: }
431:
432: if (((*s_etat_processus).exception != d_ep) ||
433: ((*s_etat_processus).erreur_execution != d_ex))
434: {
435: liberation(s_etat_processus, s_objet_resultat);
436: liberation(s_etat_processus, s_objet_argument);
437: return;
438: }
439: }
440: else if ((*s_objet_argument).type == MCX)
441: {
442: if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes !=
443: (*((struct_matrice *) (*s_objet_argument).objet))
444: .nombre_colonnes)
445: {
446: liberation(s_etat_processus, s_objet_argument);
447:
448: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
449: return;
450: }
451:
452: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
453: {
454: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
455: return;
456: }
457:
458: determinant(s_etat_processus, (struct_matrice *)
459: (*s_objet_argument).objet,
460: ((complex16 *) (*s_objet_resultat).objet));
461:
462: if ((*s_etat_processus).erreur_systeme != d_es)
463: {
464: return;
465: }
466:
467: if (((*s_etat_processus).exception != d_ep) ||
468: ((*s_etat_processus).erreur_execution != d_ex))
469: {
470: liberation(s_etat_processus, s_objet_resultat);
471: liberation(s_etat_processus, s_objet_argument);
472: return;
473: }
474: }
475:
476: /*
477: --------------------------------------------------------------------------------
478: Type incompatible avec la fonction déterminant
479: --------------------------------------------------------------------------------
480: */
481:
482: else
483: {
484: liberation(s_etat_processus, s_objet_argument);
485:
486: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
487: return;
488: }
489:
490: liberation(s_etat_processus, s_objet_argument);
491:
492: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
493: s_objet_resultat) == d_erreur)
494: {
495: return;
496: }
497:
498: return;
499: }
500:
501:
502: /*
503: ================================================================================
504: Fonction 'dot'
505: ================================================================================
506: Entrées : pointeur sur une structure struct_processus
507: --------------------------------------------------------------------------------
508: Sorties :
509: --------------------------------------------------------------------------------
510: Effets de bord : néant
511: ================================================================================
512: */
513:
514: void
515: instruction_dot(struct_processus *s_etat_processus)
516: {
517: integer8 cumul;
518: integer8 tampon;
519:
520: logical1 depassement;
521: logical1 erreur_memoire;
522:
523: struct_objet *s_objet_argument_1;
524: struct_objet *s_objet_argument_2;
525: struct_objet *s_objet_resultat;
526:
527: integer8 i;
528:
529: void *accumulateur;
530:
531: (*s_etat_processus).erreur_execution = d_ex;
532:
533: if ((*s_etat_processus).affichage_arguments == 'Y')
534: {
535: printf("\n DOT ");
536:
537: if ((*s_etat_processus).langue == 'F')
538: {
539: printf("(produit scalaire)\n\n");
540: }
541: else
542: {
543: printf("(scalar product)\n\n");
544: }
545:
546: printf(" 2: %s\n", d_VIN);
547: printf(" 1: %s\n", d_VIN);
548: printf("-> 1: %s, %s\n\n", d_INT, d_REL);
549:
550: printf(" 2: %s, %s\n", d_VIN, d_VRL);
551: printf(" 1: %s, %s\n", d_VIN, d_VRL);
552: printf("-> 1: %s\n\n", d_REL);
553:
554: printf(" 2: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
555: printf(" 1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
556: printf("-> 1: %s\n\n", d_CPL);
557:
558: return;
559: }
560: else if ((*s_etat_processus).test_instruction == 'Y')
561: {
562: (*s_etat_processus).nombre_arguments = -1;
563: return;
564: }
565:
566: if (test_cfsf(s_etat_processus, 31) == d_vrai)
567: {
568: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
569: {
570: return;
571: }
572: }
573:
574: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
575: &s_objet_argument_1) == d_erreur)
576: {
577: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
578: return;
579: }
580:
581: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
582: &s_objet_argument_2) == d_erreur)
583: {
584: liberation(s_etat_processus, s_objet_argument_1);
585:
586: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
587: return;
588: }
589:
590: /*
591: --------------------------------------------------------------------------------
592: Résultat entier
593: --------------------------------------------------------------------------------
594: */
595:
596: if (((*s_objet_argument_1).type == VIN) &&
597: ((*s_objet_argument_2).type == VIN))
598: {
599: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
600: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
601: {
602: liberation(s_etat_processus, s_objet_argument_1);
603: liberation(s_etat_processus, s_objet_argument_2);
604:
605: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
606: return;
607: }
608:
609: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
610: {
611: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
612: return;
613: }
614:
615: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
616: depassement = d_faux;
617:
618: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
619: .taille; i++)
620: {
621: if (depassement_multiplication(&(((integer8 *) (*((struct_vecteur *)
622: (*s_objet_argument_1).objet)).tableau)[i]),
623: &(((integer8 *) (*((struct_vecteur *) (*s_objet_argument_2)
624: .objet)).tableau)[i]), &tampon) == d_erreur)
625: {
626: depassement = d_vrai;
627: break;
628: }
629:
630: if (depassement_addition((integer8 *) (*s_objet_resultat).objet,
631: &tampon, &cumul) == d_erreur)
632: {
633: depassement = d_vrai;
634: break;
635: }
636:
637: (*((integer8 *) (*s_objet_resultat).objet)) = cumul;
638: }
639:
640: if (depassement == d_vrai)
641: {
642: free((*s_objet_resultat).objet);
643: (*s_objet_resultat).type = REL;
644:
645: if (((*s_objet_resultat).objet = malloc(sizeof(real8))) == NULL)
646: {
647: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
648: return;
649: }
650:
651: if ((accumulateur = malloc(((size_t) (*((struct_vecteur *)
652: (*s_objet_argument_1).objet)).taille) * sizeof(real8)))
653: == NULL)
654: {
655: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
656: return;
657: }
658:
659: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
660: .taille; i++)
661: {
662: ((real8 *) accumulateur)[i] = (real8) ((integer8 *)
663: (*((struct_vecteur *) (*s_objet_argument_1)
664: .objet)).tableau)[i] * (real8) ((integer8 *)
665: (*((struct_vecteur *) (*s_objet_argument_2).objet))
666: .tableau)[i];
667: }
668:
669: (*((real8 *) (*s_objet_resultat).objet)) = sommation_vecteur_reel(
670: accumulateur, &((*((struct_vecteur *) (*s_objet_argument_1)
671: .objet)).taille), &erreur_memoire);
672:
673: if (erreur_memoire == d_vrai)
674: {
675: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
676: return;
677: }
678:
679: free(accumulateur);
680: }
681: }
682:
683: /*
684: --------------------------------------------------------------------------------
685: Résultat réel
686: --------------------------------------------------------------------------------
687: */
688:
689: else if (((*s_objet_argument_1).type == VIN) &&
690: ((*s_objet_argument_2).type == VRL))
691: {
692: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
693: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
694: {
695: liberation(s_etat_processus, s_objet_argument_1);
696: liberation(s_etat_processus, s_objet_argument_2);
697:
698: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
699: return;
700: }
701:
702: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
703: {
704: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
705: return;
706: }
707:
708: if ((accumulateur = malloc(((size_t) (*((struct_vecteur *)
709: (*s_objet_argument_1).objet)).taille) * sizeof(real8))) == NULL)
710: {
711: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
712: return;
713: }
714:
715: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
716: .taille; i++)
717: {
718: ((real8 *) accumulateur)[i] = ((real8)
719: ((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1)
720: .objet)).tableau)[i]) * ((real8 *) (*((struct_vecteur *)
721: (*s_objet_argument_2).objet)).tableau)[i];
722: }
723:
724: (*((real8 *) (*s_objet_resultat).objet)) = sommation_vecteur_reel(
725: accumulateur, &((*((struct_vecteur *) (*s_objet_argument_1)
726: .objet)).taille), &erreur_memoire);
727:
728: if (erreur_memoire == d_vrai)
729: {
730: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
731: return;
732: }
733:
734: free(accumulateur);
735: }
736: else if (((*s_objet_argument_1).type == VRL) &&
737: ((*s_objet_argument_2).type == VIN))
738: {
739: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
740: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
741: {
742: liberation(s_etat_processus, s_objet_argument_1);
743: liberation(s_etat_processus, s_objet_argument_2);
744:
745: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
746: return;
747: }
748:
749: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
750: {
751: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
752: return;
753: }
754:
755: if ((accumulateur = malloc(((size_t) (*((struct_vecteur *)
756: (*s_objet_argument_1).objet)).taille) * sizeof(real8))) == NULL)
757: {
758: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
759: return;
760: }
761:
762: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
763: .taille; i++)
764: {
765: ((real8 *) accumulateur)[i] =
766: ((real8 *) (*((struct_vecteur *) (*s_objet_argument_1)
767: .objet)).tableau)[i] * ((real8) ((integer8 *)
768: (*((struct_vecteur *)(*s_objet_argument_2).objet))
769: .tableau)[i]);
770: }
771:
772: (*((real8 *) (*s_objet_resultat).objet)) = sommation_vecteur_reel(
773: accumulateur, &((*((struct_vecteur *) (*s_objet_argument_1)
774: .objet)).taille), &erreur_memoire);
775:
776: if (erreur_memoire == d_vrai)
777: {
778: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
779: return;
780: }
781:
782: free(accumulateur);
783: }
784: else if (((*s_objet_argument_1).type == VRL) &&
785: ((*s_objet_argument_2).type == VRL))
786: {
787: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
788: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
789: {
790: liberation(s_etat_processus, s_objet_argument_1);
791: liberation(s_etat_processus, s_objet_argument_2);
792:
793: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
794: return;
795: }
796:
797: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
798: {
799: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
800: return;
801: }
802:
803: if ((accumulateur = malloc(((size_t) (*((struct_vecteur *)
804: (*s_objet_argument_1).objet)).taille) * sizeof(real8))) == NULL)
805: {
806: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
807: return;
808: }
809:
810: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
811: .taille; i++)
812: {
813: ((real8 *) accumulateur)[i] =
814: ((real8 *) (*((struct_vecteur *) (*s_objet_argument_1)
815: .objet)).tableau)[i] * ((real8 *) (*((struct_vecteur *)
816: (*s_objet_argument_2).objet)).tableau)[i];
817: }
818:
819: (*((real8 *) (*s_objet_resultat).objet)) = sommation_vecteur_reel(
820: accumulateur, &((*((struct_vecteur *) (*s_objet_argument_1)
821: .objet)).taille), &erreur_memoire);
822:
823: if (erreur_memoire == d_vrai)
824: {
825: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
826: return;
827: }
828:
829: free(accumulateur);
830: }
831:
832: /*
833: --------------------------------------------------------------------------------
834: Résultat complexe
835: --------------------------------------------------------------------------------
836: */
837:
838: else if (((*s_objet_argument_1).type == VCX) &&
839: ((*s_objet_argument_2).type == VIN))
840: {
841: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
842: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
843: {
844: liberation(s_etat_processus, s_objet_argument_1);
845: liberation(s_etat_processus, s_objet_argument_2);
846:
847: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
848: return;
849: }
850:
851: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
852: {
853: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
854: return;
855: }
856:
857: if ((accumulateur = malloc(((size_t) (*((struct_vecteur *)
858: (*s_objet_argument_1).objet)).taille) * sizeof(complex16)))
859: == NULL)
860: {
861: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
862: return;
863: }
864:
865: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
866: .taille; i++)
867: {
868: f77multiplicationci_(&(((struct_complexe16 *) (*((struct_vecteur *)
869: (*s_objet_argument_1).objet)).tableau)[i]),
870: &(((integer8 *) (*((struct_vecteur *) (*s_objet_argument_2)
871: .objet)).tableau)[i]), &(((complex16 *) accumulateur)[i]));
872: }
873:
874: (*((complex16 *) (*s_objet_resultat).objet)) =
875: sommation_vecteur_complexe(accumulateur,
876: &((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille),
877: &erreur_memoire);
878:
879: if (erreur_memoire == d_vrai)
880: {
881: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
882: return;
883: }
884:
885: free(accumulateur);
886: }
887: else if (((*s_objet_argument_1).type == VCX) &&
888: ((*s_objet_argument_2).type == VRL))
889: {
890: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
891: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
892: {
893: liberation(s_etat_processus, s_objet_argument_1);
894: liberation(s_etat_processus, s_objet_argument_2);
895:
896: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
897: return;
898: }
899:
900: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
901: {
902: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
903: return;
904: }
905:
906: if ((accumulateur = malloc(((size_t) (*((struct_vecteur *)
907: (*s_objet_argument_1).objet)).taille) * sizeof(complex16)))
908: == NULL)
909: {
910: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
911: return;
912: }
913:
914: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
915: .taille; i++)
916: {
917: f77multiplicationcr_(&(((struct_complexe16 *) (*((struct_vecteur *)
918: (*s_objet_argument_1).objet)).tableau)[i]),
919: &(((real8 *) (*((struct_vecteur *) (*s_objet_argument_2)
920: .objet)).tableau)[i]), &(((complex16 *) accumulateur)[i]));
921: }
922:
923: (*((complex16 *) (*s_objet_resultat).objet)) =
924: sommation_vecteur_complexe(accumulateur,
925: &((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille),
926: &erreur_memoire);
927:
928: if (erreur_memoire == d_vrai)
929: {
930: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
931: return;
932: }
933:
934: free(accumulateur);
935: }
936: else if (((*s_objet_argument_1).type == VCX) &&
937: ((*s_objet_argument_2).type == VCX))
938: {
939: /*
940: * s_argument_2 est conjugué avant d'effectuer le produit
941: */
942:
943: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
944: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
945: {
946: liberation(s_etat_processus, s_objet_argument_1);
947: liberation(s_etat_processus, s_objet_argument_2);
948:
949: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
950: return;
951: }
952:
953: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
954: {
955: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
956: return;
957: }
958:
959: if ((accumulateur = malloc(((size_t) (*((struct_vecteur *)
960: (*s_objet_argument_1).objet)).taille) * sizeof(complex16)))
961: == NULL)
962: {
963: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
964: return;
965: }
966:
967: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
968: .taille; i++)
969: {
970: ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_argument_2)
971: .objet)).tableau)[i].partie_imaginaire =
972: -((struct_complexe16 *) (*((struct_vecteur *)
973: (*s_objet_argument_2).objet)).tableau)[i].partie_imaginaire;
974:
975: f77multiplicationcc_(&(((struct_complexe16 *) (*((struct_vecteur *)
976: (*s_objet_argument_2).objet)).tableau)[i]),
977: &(((struct_complexe16 *) (*((struct_vecteur *)
978: (*s_objet_argument_1).objet)).tableau)[i]),
979: &(((complex16 *) accumulateur)[i]));
980: }
981:
982: (*((complex16 *) (*s_objet_resultat).objet)) =
983: sommation_vecteur_complexe(accumulateur,
984: &((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille),
985: &erreur_memoire);
986:
987: if (erreur_memoire == d_vrai)
988: {
989: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
990: return;
991: }
992:
993: free(accumulateur);
994: }
995: else if (((*s_objet_argument_1).type == VRL) &&
996: ((*s_objet_argument_2).type == VCX))
997: {
998: /*
999: * s_argument_2 est conjugué avant d'effectuer le produit
1000: */
1001:
1002: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
1003: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
1004: {
1005: liberation(s_etat_processus, s_objet_argument_1);
1006: liberation(s_etat_processus, s_objet_argument_2);
1007:
1008: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
1009: return;
1010: }
1011:
1012: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
1013: {
1014: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1015: return;
1016: }
1017:
1018: if ((accumulateur = malloc(((size_t) (*((struct_vecteur *)
1019: (*s_objet_argument_1).objet)).taille) * sizeof(complex16)))
1020: == NULL)
1021: {
1022: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1023: return;
1024: }
1025:
1026: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
1027: .taille; i++)
1028: {
1029: ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_argument_2)
1030: .objet)).tableau)[i].partie_imaginaire =
1031: -((struct_complexe16 *) (*((struct_vecteur *)
1032: (*s_objet_argument_2).objet)).tableau)[i].partie_imaginaire;
1033:
1034: f77multiplicationcr_(&(((struct_complexe16 *) (*((struct_vecteur *)
1035: (*s_objet_argument_2).objet)).tableau)[i]),
1036: &(((real8 *) (*((struct_vecteur *) (*s_objet_argument_1)
1037: .objet)).tableau)[i]), &(((complex16 *) accumulateur)[i]));
1038: }
1039:
1040: (*((complex16 *) (*s_objet_resultat).objet)) =
1041: sommation_vecteur_complexe(accumulateur,
1042: &((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille),
1043: &erreur_memoire);
1044:
1045: if (erreur_memoire == d_vrai)
1046: {
1047: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1048: return;
1049: }
1050:
1051: free(accumulateur);
1052: }
1053: else if (((*s_objet_argument_1).type == VIN) &&
1054: ((*s_objet_argument_2).type == VCX))
1055: {
1056: /*
1057: * s_argument_2 est conjugué avant d'effectuer le produit
1058: */
1059:
1060: if ((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille !=
1061: (*((struct_vecteur *) (*s_objet_argument_2).objet)).taille)
1062: {
1063: liberation(s_etat_processus, s_objet_argument_1);
1064: liberation(s_etat_processus, s_objet_argument_2);
1065:
1066: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
1067: return;
1068: }
1069:
1070: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
1071: {
1072: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1073: return;
1074: }
1075:
1076: if ((accumulateur = malloc(((size_t) (*((struct_vecteur *)
1077: (*s_objet_argument_1).objet)).taille) * sizeof(complex16)))
1078: == NULL)
1079: {
1080: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1081: return;
1082: }
1083:
1084: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument_1).objet))
1085: .taille; i++)
1086: {
1087: ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_argument_2)
1088: .objet)).tableau)[i].partie_imaginaire =
1089: -((struct_complexe16 *) (*((struct_vecteur *)
1090: (*s_objet_argument_2).objet)).tableau)[i].partie_imaginaire;
1091:
1092: f77multiplicationci_(&(((struct_complexe16 *) (*((struct_vecteur *)
1093: (*s_objet_argument_2).objet)).tableau)[i]),
1094: &(((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1)
1095: .objet)).tableau)[i]), &(((complex16 *) accumulateur)[i]));
1096: }
1097:
1098: (*((complex16 *) (*s_objet_resultat).objet)) =
1099: sommation_vecteur_complexe(accumulateur,
1100: &((*((struct_vecteur *) (*s_objet_argument_1).objet)).taille),
1101: &erreur_memoire);
1102:
1103: if (erreur_memoire == d_vrai)
1104: {
1105: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1106: return;
1107: }
1108:
1109: free(accumulateur);
1110: }
1111:
1112: /*
1113: --------------------------------------------------------------------------------
1114: Types d'objets incompatibles avec le calcul d'un produit scalaire
1115: --------------------------------------------------------------------------------
1116: */
1117:
1118: else
1119: {
1120: liberation(s_etat_processus, s_objet_argument_1);
1121: liberation(s_etat_processus, s_objet_argument_2);
1122:
1123: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1124: return;
1125: }
1126:
1127: liberation(s_etat_processus, s_objet_argument_1);
1128: liberation(s_etat_processus, s_objet_argument_2);
1129:
1130: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1131: s_objet_resultat) == d_erreur)
1132: {
1133: return;
1134: }
1135:
1136: return;
1137: }
1138:
1139: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>