![]() ![]() | ![]() |
1.1 bertrand 1: /*
2: ================================================================================
1.6 ! bertrand 3: RPL/2 (R) version 4.0.14
1.1 bertrand 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 'getc'
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_getc(struct_processus *s_etat_processus)
40: {
41: logical1 presence_variable;
42: logical1 variable_partagee;
43:
44: struct_liste_chainee *l_element_courant;
45:
46: struct_objet *s_objet_argument_1;
47: struct_objet *s_objet_argument_2;
48: struct_objet *s_objet_resultat;
49:
50: unsigned long i;
51: unsigned long j;
52: unsigned long colonne;
53: unsigned long nombre_colonnes;
54:
55: (*s_etat_processus).erreur_execution = d_ex;
56:
57: if ((*s_etat_processus).affichage_arguments == 'Y')
58: {
59: printf("\n GETC ");
60:
61: if ((*s_etat_processus).langue == 'F')
62: {
63: printf("(prend une colonne)\n\n");
64: }
65: else
66: {
67: printf("(get column)\n\n");
68: }
69:
70: printf(" 2: %s, %s, %s, %s\n", d_MIN, d_MRL, d_MCX, d_NOM);
71: printf(" 1: %s\n", d_LST);
72: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
73:
74: return;
75: }
76: else if ((*s_etat_processus).test_instruction == 'Y')
77: {
78: (*s_etat_processus).nombre_arguments = -1;
79: return;
80: }
81:
82: if (test_cfsf(s_etat_processus, 31) == d_vrai)
83: {
84: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
85: {
86: return;
87: }
88: }
89:
90: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
91: &s_objet_argument_1) == d_erreur)
92: {
93: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
94: return;
95: }
96:
97: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
98: &s_objet_argument_2) == d_erreur)
99: {
100: liberation(s_etat_processus, s_objet_argument_1);
101:
102: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
103: return;
104: }
105:
106: if ((*s_objet_argument_2).type == NOM)
107: {
108: if (recherche_variable(s_etat_processus, (*((struct_nom *)
109: (*s_objet_argument_2).objet)).nom) == d_faux)
110: {
111: liberation(s_etat_processus, s_objet_argument_1);
112: liberation(s_etat_processus, s_objet_argument_2);
113:
114: (*s_etat_processus).erreur_systeme = d_es;
115: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
116:
117: return;
118: }
119:
120: liberation(s_etat_processus, s_objet_argument_2);
121:
122: s_objet_argument_2 = (*s_etat_processus).s_liste_variables
123: [(*s_etat_processus).position_variable_courante].objet;
124: presence_variable = d_vrai;
125:
126: if (s_objet_argument_2 == NULL)
127: {
128: // Variable partagée
129:
130: if (pthread_mutex_lock(&((*(*s_etat_processus)
131: .s_liste_variables_partagees).mutex)) != 0)
132: {
133: (*s_etat_processus).erreur_systeme = d_es_processus;
134: return;
135: }
136:
137: if (recherche_variable_partagee(s_etat_processus,
138: (*s_etat_processus).s_liste_variables
139: [(*s_etat_processus).position_variable_courante].nom,
140: (*s_etat_processus).s_liste_variables
141: [(*s_etat_processus).position_variable_courante]
142: .variable_partagee, (*s_etat_processus).s_liste_variables
143: [(*s_etat_processus).position_variable_courante].origine)
144: == d_faux)
145: {
146: if (pthread_mutex_unlock(&((*(*s_etat_processus)
147: .s_liste_variables_partagees).mutex)) != 0)
148: {
149: (*s_etat_processus).erreur_systeme = d_es_processus;
150: return;
151: }
152:
153: liberation(s_etat_processus, s_objet_argument_1);
154:
155: (*s_etat_processus).erreur_systeme = d_es;
156: (*s_etat_processus).erreur_execution =
157: d_ex_variable_non_definie;
158:
159: return;
160: }
161:
162: s_objet_argument_2 = (*(*s_etat_processus)
163: .s_liste_variables_partagees).table
164: [(*(*s_etat_processus).s_liste_variables_partagees)
165: .position_variable].objet;
166: variable_partagee = d_vrai;
167: }
168: else
169: {
170: variable_partagee = d_faux;
171: }
172: }
173: else
174: {
175: presence_variable = d_faux;
176: variable_partagee = d_faux;
177: }
178:
179: if (((*s_objet_argument_2).type == MIN) ||
180: ((*s_objet_argument_2).type == MRL) ||
181: ((*s_objet_argument_2).type == MCX))
182: {
183: if ((*s_objet_argument_1).type == LST)
184: {
185: l_element_courant = (struct_liste_chainee *)
186: (*s_objet_argument_1).objet;
187: nombre_colonnes = 0;
188:
189: while(l_element_courant != NULL)
190: {
191: if ((*(*l_element_courant).donnee).type != INT)
192: {
193: liberation(s_etat_processus, s_objet_argument_1);
194:
195: if (variable_partagee == d_vrai)
196: {
197: if (pthread_mutex_unlock(&((*(*s_etat_processus)
198: .s_liste_variables_partagees).mutex)) != 0)
199: {
200: (*s_etat_processus).erreur_systeme = d_es_processus;
201: return;
202: }
203: }
204:
205: if (presence_variable == d_faux)
206: {
207: liberation(s_etat_processus, s_objet_argument_2);
208: }
209:
210: (*s_etat_processus).erreur_execution =
211: d_ex_erreur_type_argument;
212: return;
213: }
214:
215: if (((*((integer8 *) (*(*l_element_courant).donnee).objet))
216: <= 0) || ((*((integer8 *) (*(*l_element_courant).donnee)
217: .objet)) > (integer8) (*((struct_matrice *)
218: (*s_objet_argument_2).objet)).nombre_colonnes))
219: {
220: liberation(s_etat_processus, s_objet_argument_1);
221:
222: if (variable_partagee == d_vrai)
223: {
224: if (pthread_mutex_unlock(&((*(*s_etat_processus)
225: .s_liste_variables_partagees).mutex)) != 0)
226: {
227: (*s_etat_processus).erreur_systeme = d_es_processus;
228: return;
229: }
230: }
231:
232: if (presence_variable == d_faux)
233: {
234: liberation(s_etat_processus, s_objet_argument_2);
235: }
236:
237: (*s_etat_processus).erreur_execution =
238: d_ex_argument_invalide;
239: return;
240: }
241:
242: nombre_colonnes++;
243: l_element_courant = (*l_element_courant).suivant;
244: }
245:
246: if (nombre_colonnes == 0)
247: {
248: liberation(s_etat_processus, s_objet_argument_1);
249:
250: if (variable_partagee == d_vrai)
251: {
252: if (pthread_mutex_unlock(&((*(*s_etat_processus)
253: .s_liste_variables_partagees).mutex)) != 0)
254: {
255: (*s_etat_processus).erreur_systeme = d_es_processus;
256: return;
257: }
258: }
259:
260: if (presence_variable == d_faux)
261: {
262: liberation(s_etat_processus, s_objet_argument_2);
263: }
264:
265: (*s_etat_processus).erreur_execution =
266: d_ex_erreur_type_argument;
267: return;
268: }
269:
270: if ((s_objet_resultat = allocation(s_etat_processus,
271: (*s_objet_argument_2).type)) == NULL)
272: {
273: if (variable_partagee == d_vrai)
274: {
275: if (pthread_mutex_unlock(&((*(*s_etat_processus)
276: .s_liste_variables_partagees).mutex)) != 0)
277: {
278: (*s_etat_processus).erreur_systeme = d_es_processus;
279: return;
280: }
281: }
282:
283: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
284: return;
285: }
286:
287: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
288: nombre_colonnes;
289: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
290: (*((struct_matrice *) (*s_objet_argument_2).objet))
291: .nombre_lignes;
292:
293: switch((*((struct_matrice *) (*s_objet_resultat).objet)).type)
294: {
295: case 'I' :
296: {
297: (*s_objet_resultat).type = MIN;
298:
299: if (((*((struct_matrice *) (*s_objet_resultat).objet))
300: .tableau = malloc((*((struct_matrice *)
301: (*s_objet_resultat).objet)).nombre_lignes *
302: sizeof(integer8 *))) == NULL)
303: {
304: if (variable_partagee == d_vrai)
305: {
306: if (pthread_mutex_unlock(&((*(*s_etat_processus)
307: .s_liste_variables_partagees).mutex)) != 0)
308: {
309: (*s_etat_processus).erreur_systeme =
310: d_es_processus;
311: return;
312: }
313: }
314:
315: (*s_etat_processus).erreur_systeme =
316: d_es_allocation_memoire;
317: return;
318: }
319:
320: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
321: .objet)).nombre_lignes; i++)
322: {
323: if (((*((struct_matrice *) (*s_objet_resultat).objet))
324: .tableau[i] = malloc(nombre_colonnes *
325: sizeof(integer8))) == NULL)
326: {
327: if (variable_partagee == d_vrai)
328: {
329: if (pthread_mutex_unlock(&((*(*s_etat_processus)
330: .s_liste_variables_partagees).mutex))
331: != 0)
332: {
333: (*s_etat_processus).erreur_systeme =
334: d_es_processus;
335: return;
336: }
337: }
338:
339: (*s_etat_processus).erreur_systeme =
340: d_es_allocation_memoire;
341: return;
342: }
343:
344: }
345:
346: l_element_courant = (struct_liste_chainee *)
347: (*s_objet_argument_1).objet;
348: j = 0;
349:
350: while(l_element_courant != NULL)
351: {
352: colonne = (*((integer8 *) (*(*l_element_courant).donnee)
353: .objet)) - 1;
354:
355: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
356: .objet)).nombre_lignes; i++)
357: {
358: ((integer8 **) (*((struct_matrice *)
359: (*s_objet_resultat).objet)).tableau)[i][j] =
360: ((integer8 **) (*((struct_matrice *)
361: (*s_objet_argument_2).objet))
362: .tableau)[i][colonne];
363: }
364:
365: l_element_courant = (*l_element_courant).suivant;
366: j++;
367: }
368:
369: break;
370: }
371:
372: case 'R' :
373: {
374: (*s_objet_resultat).type = MRL;
375:
376: if (((*((struct_matrice *) (*s_objet_resultat).objet))
377: .tableau = malloc((*((struct_matrice *)
378: (*s_objet_resultat).objet)).nombre_lignes *
379: sizeof(real8 *))) == NULL)
380: {
381: if (variable_partagee == d_vrai)
382: {
383: if (pthread_mutex_unlock(&((*(*s_etat_processus)
384: .s_liste_variables_partagees).mutex)) != 0)
385: {
386: (*s_etat_processus).erreur_systeme =
387: d_es_processus;
388: return;
389: }
390: }
391:
392: (*s_etat_processus).erreur_systeme =
393: d_es_allocation_memoire;
394: return;
395: }
396:
397: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
398: .objet)).nombre_lignes; i++)
399: {
400: if (((*((struct_matrice *) (*s_objet_resultat).objet))
401: .tableau[i] = malloc(nombre_colonnes *
402: sizeof(real8))) == NULL)
403: {
404: if (variable_partagee == d_vrai)
405: {
406: if (pthread_mutex_unlock(&((*(*s_etat_processus)
407: .s_liste_variables_partagees).mutex))
408: != 0)
409: {
410: (*s_etat_processus).erreur_systeme =
411: d_es_processus;
412: return;
413: }
414: }
415:
416: (*s_etat_processus).erreur_systeme =
417: d_es_allocation_memoire;
418: return;
419: }
420:
421: }
422:
423: l_element_courant = (struct_liste_chainee *)
424: (*s_objet_argument_1).objet;
425: j = 0;
426:
427: while(l_element_courant != NULL)
428: {
429: colonne = (*((integer8 *) (*(*l_element_courant).donnee)
430: .objet)) - 1;
431:
432: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
433: .objet)).nombre_lignes; i++)
434: {
435: ((real8 **) (*((struct_matrice *)
436: (*s_objet_resultat).objet)).tableau)[i][j] =
437: ((real8 **) (*((struct_matrice *)
438: (*s_objet_argument_2).objet))
439: .tableau)[i][colonne];
440: }
441:
442: l_element_courant = (*l_element_courant).suivant;
443: j++;
444: }
445:
446: break;
447: }
448:
449: case 'C' :
450: {
451: (*s_objet_resultat).type = MCX;
452:
453: if (((*((struct_matrice *) (*s_objet_resultat).objet))
454: .tableau = malloc((*((struct_matrice *)
455: (*s_objet_resultat).objet)).nombre_lignes *
456: sizeof(complex16 *))) == NULL)
457: {
458: if (variable_partagee == d_vrai)
459: {
460: if (pthread_mutex_unlock(&((*(*s_etat_processus)
461: .s_liste_variables_partagees).mutex)) != 0)
462: {
463: (*s_etat_processus).erreur_systeme =
464: d_es_processus;
465: return;
466: }
467: }
468:
469: (*s_etat_processus).erreur_systeme =
470: d_es_allocation_memoire;
471: return;
472: }
473:
474: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
475: .objet)).nombre_lignes; i++)
476: {
477: if (((*((struct_matrice *) (*s_objet_resultat).objet))
478: .tableau[i] = malloc(nombre_colonnes *
479: sizeof(complex16))) == NULL)
480: {
481: if (variable_partagee == d_vrai)
482: {
483: if (pthread_mutex_unlock(&((*(*s_etat_processus)
484: .s_liste_variables_partagees).mutex))
485: != 0)
486: {
487: (*s_etat_processus).erreur_systeme =
488: d_es_processus;
489: return;
490: }
491: }
492:
493: (*s_etat_processus).erreur_systeme =
494: d_es_allocation_memoire;
495: return;
496: }
497:
498: }
499:
500: l_element_courant = (struct_liste_chainee *)
501: (*s_objet_argument_1).objet;
502: j = 0;
503:
504: while(l_element_courant != NULL)
505: {
506: colonne = (*((integer8 *) (*(*l_element_courant).donnee)
507: .objet)) - 1;
508:
509: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat)
510: .objet)).nombre_lignes; i++)
511: {
512: ((complex16 **) (*((struct_matrice *)
513: (*s_objet_resultat).objet)).tableau)[i][j]
514: .partie_reelle =
515: ((complex16 **) (*((struct_matrice *)
516: (*s_objet_argument_2).objet))
517: .tableau)[i][colonne].partie_reelle;
518: ((complex16 **) (*((struct_matrice *)
519: (*s_objet_resultat).objet)).tableau)[i][j]
520: .partie_imaginaire =
521: ((complex16 **) (*((struct_matrice *)
522: (*s_objet_argument_2).objet))
523: .tableau)[i][colonne].partie_imaginaire;
524: }
525:
526: l_element_courant = (*l_element_courant).suivant;
527: j++;
528: }
529:
530: break;
531: }
532: }
533: }
534: else
535: {
536: liberation(s_etat_processus, s_objet_argument_1);
537:
538: if (variable_partagee == d_vrai)
539: {
540: if (pthread_mutex_unlock(&((*(*s_etat_processus)
541: .s_liste_variables_partagees).mutex)) != 0)
542: {
543: (*s_etat_processus).erreur_systeme =
544: d_es_processus;
545: return;
546: }
547: }
548:
549: if (presence_variable == d_faux)
550: {
551: liberation(s_etat_processus, s_objet_argument_2);
552: }
553:
554: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
555: return;
556: }
557: }
558: else
559: {
560: liberation(s_etat_processus, s_objet_argument_1);
561:
562: if (variable_partagee == d_vrai)
563: {
564: if (pthread_mutex_unlock(&((*(*s_etat_processus)
565: .s_liste_variables_partagees).mutex)) != 0)
566: {
567: (*s_etat_processus).erreur_systeme =
568: d_es_processus;
569: return;
570: }
571: }
572:
573: if (presence_variable == d_faux)
574: {
575: liberation(s_etat_processus, s_objet_argument_2);
576: }
577:
578: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
579: return;
580: }
581:
582: liberation(s_etat_processus, s_objet_argument_1);
583:
584: if (variable_partagee == d_vrai)
585: {
586: if (pthread_mutex_unlock(&((*(*s_etat_processus)
587: .s_liste_variables_partagees).mutex)) != 0)
588: {
589: (*s_etat_processus).erreur_systeme =
590: d_es_processus;
591: return;
592: }
593: }
594:
595: if (presence_variable == d_faux)
596: {
597: liberation(s_etat_processus, s_objet_argument_2);
598: }
599:
600: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
601: s_objet_resultat) == d_erreur)
602: {
603: return;
604: }
605:
606: return;
607: }
608:
609:
610: /*
611: ================================================================================
612: Fonction 'getr'
613: ================================================================================
614: Entrées : pointeur sur une structure struct_processus
615: --------------------------------------------------------------------------------
616: Sorties :
617: --------------------------------------------------------------------------------
618: Effets de bord : néant
619: ================================================================================
620: */
621:
622: void
623: instruction_getr(struct_processus *s_etat_processus)
624: {
625: logical1 presence_variable;
626: logical1 variable_partagee;
627:
628: struct_liste_chainee *l_element_courant;
629:
630: struct_objet *s_objet_argument_1;
631: struct_objet *s_objet_argument_2;
632: struct_objet *s_objet_resultat;
633:
634: unsigned long i;
635: unsigned long j;
636: unsigned long ligne;
637: unsigned long nombre_lignes;
638:
639: (*s_etat_processus).erreur_execution = d_ex;
640:
641: if ((*s_etat_processus).affichage_arguments == 'Y')
642: {
643: printf("\n GETR ");
644:
645: if ((*s_etat_processus).langue == 'F')
646: {
647: printf("(prend une ligne)\n\n");
648: }
649: else
650: {
651: printf("(get row)\n\n");
652: }
653:
654: printf(" 2: %s, %s, %s, %s\n", d_MIN, d_MRL, d_MCX, d_NOM);
655: printf(" 1: %s\n", d_LST);
656: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
657:
658: return;
659: }
660: else if ((*s_etat_processus).test_instruction == 'Y')
661: {
662: (*s_etat_processus).nombre_arguments = -1;
663: return;
664: }
665:
666: if (test_cfsf(s_etat_processus, 31) == d_vrai)
667: {
668: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
669: {
670: return;
671: }
672: }
673:
674: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
675: &s_objet_argument_1) == d_erreur)
676: {
677: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
678: return;
679: }
680:
681: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
682: &s_objet_argument_2) == d_erreur)
683: {
684: liberation(s_etat_processus, s_objet_argument_1);
685:
686: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
687: return;
688: }
689:
690: if ((*s_objet_argument_2).type == NOM)
691: {
692: if (recherche_variable(s_etat_processus, (*((struct_nom *)
693: (*s_objet_argument_2).objet)).nom) == d_faux)
694: {
695: (*s_etat_processus).erreur_systeme = d_es;
696: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
697:
698: return;
699: }
700:
701: liberation(s_etat_processus, s_objet_argument_2);
702:
703: s_objet_argument_2 = (*s_etat_processus).s_liste_variables
704: [(*s_etat_processus).position_variable_courante].objet;
705: presence_variable = d_vrai;
706:
707: if (s_objet_argument_2 == NULL)
708: {
709: // Variable partagée
710:
711: if (pthread_mutex_lock(&((*(*s_etat_processus)
712: .s_liste_variables_partagees).mutex)) != 0)
713: {
714: (*s_etat_processus).erreur_systeme = d_es_processus;
715: return;
716: }
717:
718: if (recherche_variable_partagee(s_etat_processus,
719: (*s_etat_processus).s_liste_variables
720: [(*s_etat_processus).position_variable_courante].nom,
721: (*s_etat_processus).s_liste_variables
722: [(*s_etat_processus).position_variable_courante]
723: .variable_partagee, (*s_etat_processus).s_liste_variables
724: [(*s_etat_processus).position_variable_courante].origine)
725: == d_faux)
726: {
727: if (pthread_mutex_unlock(&((*(*s_etat_processus)
728: .s_liste_variables_partagees).mutex)) != 0)
729: {
730: (*s_etat_processus).erreur_systeme = d_es_processus;
731: return;
732: }
733:
734: liberation(s_etat_processus, s_objet_argument_1);
735:
736: (*s_etat_processus).erreur_systeme = d_es;
737: (*s_etat_processus).erreur_execution =
738: d_ex_variable_non_definie;
739:
740: return;
741: }
742:
743: s_objet_argument_2 = (*(*s_etat_processus)
744: .s_liste_variables_partagees).table
745: [(*(*s_etat_processus).s_liste_variables_partagees)
746: .position_variable].objet;
747: variable_partagee = d_vrai;
748: }
749: else
750: {
751: variable_partagee = d_faux;
752: }
753: }
754: else
755: {
756: presence_variable = d_faux;
757: variable_partagee = d_faux;
758: }
759:
760: if (((*s_objet_argument_2).type == MIN) ||
761: ((*s_objet_argument_2).type == MRL) ||
762: ((*s_objet_argument_2).type == MCX))
763: {
764: if ((*s_objet_argument_1).type == LST)
765: {
766: l_element_courant = (struct_liste_chainee *)
767: (*s_objet_argument_1).objet;
768: nombre_lignes = 0;
769:
770: while(l_element_courant != NULL)
771: {
772: if ((*(*l_element_courant).donnee).type != INT)
773: {
774: liberation(s_etat_processus, s_objet_argument_1);
775:
776: if (variable_partagee == d_vrai)
777: {
778: if (pthread_mutex_unlock(&((*(*s_etat_processus)
779: .s_liste_variables_partagees).mutex)) != 0)
780: {
781: (*s_etat_processus).erreur_systeme =
782: d_es_processus;
783: return;
784: }
785: }
786:
787: if (presence_variable == d_faux)
788: {
789: liberation(s_etat_processus, s_objet_argument_2);
790: }
791:
792: (*s_etat_processus).erreur_execution =
793: d_ex_erreur_type_argument;
794: return;
795: }
796:
797: if (((*((integer8 *) (*(*l_element_courant).donnee).objet))
798: <= 0) || ((*((integer8 *) (*(*l_element_courant).donnee)
799: .objet)) > (integer8) (*((struct_matrice *)
800: (*s_objet_argument_2).objet)).nombre_lignes))
801: {
802: liberation(s_etat_processus, s_objet_argument_1);
803:
804: if (variable_partagee == d_vrai)
805: {
806: if (pthread_mutex_unlock(&((*(*s_etat_processus)
807: .s_liste_variables_partagees).mutex)) != 0)
808: {
809: (*s_etat_processus).erreur_systeme =
810: d_es_processus;
811: return;
812: }
813: }
814:
815: if (presence_variable == d_faux)
816: {
817: liberation(s_etat_processus, s_objet_argument_2);
818: }
819:
820: (*s_etat_processus).erreur_execution =
821: d_ex_argument_invalide;
822: return;
823: }
824:
825: nombre_lignes++;
826: l_element_courant = (*l_element_courant).suivant;
827: }
828:
829: if (nombre_lignes == 0)
830: {
831: liberation(s_etat_processus, s_objet_argument_1);
832:
833: if (variable_partagee == d_vrai)
834: {
835: if (pthread_mutex_unlock(&((*(*s_etat_processus)
836: .s_liste_variables_partagees).mutex)) != 0)
837: {
838: (*s_etat_processus).erreur_systeme =
839: d_es_processus;
840: return;
841: }
842: }
843:
844: if (presence_variable == d_faux)
845: {
846: liberation(s_etat_processus, s_objet_argument_2);
847: }
848:
849: (*s_etat_processus).erreur_execution =
850: d_ex_erreur_type_argument;
851: return;
852: }
853:
854: if ((s_objet_resultat = allocation(s_etat_processus,
855: (*s_objet_argument_2).type)) == NULL)
856: {
857: if (variable_partagee == d_vrai)
858: {
859: if (pthread_mutex_unlock(&((*(*s_etat_processus)
860: .s_liste_variables_partagees).mutex)) != 0)
861: {
862: (*s_etat_processus).erreur_systeme =
863: d_es_processus;
864: return;
865: }
866: }
867:
868: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
869: return;
870: }
871:
872: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
873: nombre_lignes;
874: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
875: (*((struct_matrice *) (*s_objet_argument_2).objet))
876: .nombre_colonnes;
877:
878: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
879: malloc(nombre_lignes * sizeof(void *))) == NULL)
880: {
881: if (variable_partagee == d_vrai)
882: {
883: if (pthread_mutex_unlock(&((*(*s_etat_processus)
884: .s_liste_variables_partagees).mutex)) != 0)
885: {
886: (*s_etat_processus).erreur_systeme =
887: d_es_processus;
888: return;
889: }
890: }
891:
892: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
893: return;
894: }
895:
896: switch((*((struct_matrice *) (*s_objet_resultat).objet)).type)
897: {
898: case 'I' :
899: {
900: (*s_objet_resultat).type = MIN;
901:
902: l_element_courant = (struct_liste_chainee *)
903: (*s_objet_argument_1).objet;
904: i = 0;
905:
906: while(l_element_courant != NULL)
907: {
908: ligne = (*((integer8 *) (*(*l_element_courant).donnee)
909: .objet)) - 1;
910:
911: if (((*((struct_matrice *) (*s_objet_resultat).objet))
912: .tableau[i] = malloc((*((struct_matrice *)
913: (*s_objet_resultat).objet)).nombre_colonnes *
914: sizeof(integer8))) == NULL)
915: {
916: if (variable_partagee == d_vrai)
917: {
918: if (pthread_mutex_unlock(&((*(*s_etat_processus)
919: .s_liste_variables_partagees).mutex))
920: != 0)
921: {
922: (*s_etat_processus).erreur_systeme =
923: d_es_processus;
924: return;
925: }
926: }
927:
928: (*s_etat_processus).erreur_systeme =
929: d_es_allocation_memoire;
930: return;
931: }
932:
933: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat)
934: .objet)).nombre_colonnes; j++)
935: {
936: ((integer8 **) (*((struct_matrice *)
937: (*s_objet_resultat).objet)).tableau)[i][j] =
938: ((integer8 **) (*((struct_matrice *)
939: (*s_objet_argument_2).objet))
940: .tableau)[ligne][j];
941: }
942:
943: l_element_courant = (*l_element_courant).suivant;
944: i++;
945: }
946:
947: break;
948: }
949:
950: case 'R' :
951: {
952: (*s_objet_resultat).type = MRL;
953:
954: l_element_courant = (struct_liste_chainee *)
955: (*s_objet_argument_1).objet;
956: i = 0;
957:
958: while(l_element_courant != NULL)
959: {
960: ligne = (*((integer8 *) (*(*l_element_courant).donnee)
961: .objet)) - 1;
962:
963: if (((*((struct_matrice *) (*s_objet_resultat).objet))
964: .tableau[i] = malloc((*((struct_matrice *)
965: (*s_objet_resultat).objet)).nombre_colonnes *
966: sizeof(real8))) == NULL)
967: {
968: if (variable_partagee == d_vrai)
969: {
970: if (pthread_mutex_unlock(&((*(*s_etat_processus)
971: .s_liste_variables_partagees).mutex))
972: != 0)
973: {
974: (*s_etat_processus).erreur_systeme =
975: d_es_processus;
976: return;
977: }
978: }
979:
980: (*s_etat_processus).erreur_systeme =
981: d_es_allocation_memoire;
982: return;
983: }
984:
985: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat)
986: .objet)).nombre_colonnes; j++)
987: {
988: ((real8 **) (*((struct_matrice *)
989: (*s_objet_resultat).objet)).tableau)[i][j] =
990: ((real8 **) (*((struct_matrice *)
991: (*s_objet_argument_2).objet))
992: .tableau)[ligne][j];
993: }
994:
995: l_element_courant = (*l_element_courant).suivant;
996: i++;
997: }
998:
999: break;
1000: }
1001:
1002: case 'C' :
1003: {
1004: (*s_objet_resultat).type = MCX;
1005:
1006: l_element_courant = (struct_liste_chainee *)
1007: (*s_objet_argument_1).objet;
1008: i = 0;
1009:
1010: while(l_element_courant != NULL)
1011: {
1012: ligne = (*((integer8 *) (*(*l_element_courant).donnee)
1013: .objet)) - 1;
1014:
1015: if (((*((struct_matrice *) (*s_objet_resultat).objet))
1016: .tableau[i] = malloc((*((struct_matrice *)
1017: (*s_objet_resultat).objet)).nombre_colonnes *
1018: sizeof(complex16))) == NULL)
1019: {
1020: if (variable_partagee == d_vrai)
1021: {
1022: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1023: .s_liste_variables_partagees).mutex))
1024: != 0)
1025: {
1026: (*s_etat_processus).erreur_systeme =
1027: d_es_processus;
1028: return;
1029: }
1030: }
1031:
1032: (*s_etat_processus).erreur_systeme =
1033: d_es_allocation_memoire;
1034: return;
1035: }
1036:
1037: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat)
1038: .objet)).nombre_colonnes; j++)
1039: {
1040: ((complex16 **) (*((struct_matrice *)
1041: (*s_objet_resultat).objet)).tableau)[i][j]
1042: .partie_reelle =
1043: ((complex16 **) (*((struct_matrice *)
1044: (*s_objet_argument_2).objet))
1045: .tableau)[ligne][j].partie_reelle;
1046: ((complex16 **) (*((struct_matrice *)
1047: (*s_objet_resultat).objet)).tableau)[i][j]
1048: .partie_imaginaire =
1049: ((complex16 **) (*((struct_matrice *)
1050: (*s_objet_argument_2).objet))
1051: .tableau)[ligne][j].partie_imaginaire;
1052: }
1053:
1054: l_element_courant = (*l_element_courant).suivant;
1055: i++;
1056: }
1057:
1058: break;
1059: }
1060: }
1061: }
1062: else
1063: {
1064: liberation(s_etat_processus, s_objet_argument_1);
1065:
1066: if (variable_partagee == d_vrai)
1067: {
1068: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1069: .s_liste_variables_partagees).mutex))
1070: != 0)
1071: {
1072: (*s_etat_processus).erreur_systeme =
1073: d_es_processus;
1074: return;
1075: }
1076: }
1077:
1078: if (presence_variable == d_faux)
1079: {
1080: liberation(s_etat_processus, s_objet_argument_2);
1081: }
1082:
1083: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1084: return;
1085: }
1086: }
1087: else
1088: {
1089: liberation(s_etat_processus, s_objet_argument_1);
1090:
1091: if (variable_partagee == d_vrai)
1092: {
1093: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1094: .s_liste_variables_partagees).mutex))
1095: != 0)
1096: {
1097: (*s_etat_processus).erreur_systeme =
1098: d_es_processus;
1099: return;
1100: }
1101: }
1102:
1103: if (presence_variable == d_faux)
1104: {
1105: liberation(s_etat_processus, s_objet_argument_2);
1106: }
1107:
1108: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1109: return;
1110: }
1111:
1112: liberation(s_etat_processus, s_objet_argument_1);
1113:
1114: if (variable_partagee == d_vrai)
1115: {
1116: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1117: .s_liste_variables_partagees).mutex))
1118: != 0)
1119: {
1120: (*s_etat_processus).erreur_systeme =
1121: d_es_processus;
1122: return;
1123: }
1124: }
1125:
1126: if (presence_variable == d_faux)
1127: {
1128: liberation(s_etat_processus, s_objet_argument_2);
1129: }
1130:
1131: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1132: s_objet_resultat) == d_erreur)
1133: {
1134: return;
1135: }
1136:
1137: return;
1138: }
1139:
1140:
1141: /*
1142: ================================================================================
1143: Fonction 'gamma'
1144: ================================================================================
1145: Entrées : pointeur sur une structure struct_processus
1146: --------------------------------------------------------------------------------
1147: Sorties :
1148: --------------------------------------------------------------------------------
1149: Effets de bord : néant
1150: ================================================================================
1151: */
1152:
1153: void
1154: instruction_gamma(struct_processus *s_etat_processus)
1155: {
1156: double argument_imaginaire;
1157: double argument_reel;
1158:
1159: gsl_sf_result argument;
1160: gsl_sf_result ln_module;
1161: gsl_sf_result resultat;
1162:
1163: int statut;
1164:
1165: struct_liste_chainee *l_element_courant;
1166: struct_liste_chainee *l_element_precedent;
1167:
1168: struct_objet *s_copie_argument;
1169: struct_objet *s_objet_argument;
1170: struct_objet *s_objet_resultat;
1171:
1172: (*s_etat_processus).erreur_execution = d_ex;
1173:
1174: if ((*s_etat_processus).affichage_arguments == 'Y')
1175: {
1176: printf("\n GAMMA ");
1177:
1178: if ((*s_etat_processus).langue == 'F')
1179: {
1180: printf("(fonction gamma)\n\n");
1181: }
1182: else
1183: {
1184: printf("(gamma function)\n\n");
1185: }
1186:
1187: printf(" 1: %s, %s\n", d_INT, d_REL);
1188: printf("-> 1: %s\n\n", d_REL);
1189:
1190: printf(" 1: %s\n", d_CPL);
1191: printf("-> 1: %s\n\n", d_CPL);
1192:
1193: printf(" 1: %s, %s\n", d_NOM, d_ALG);
1194: printf("-> 1: %s\n\n", d_ALG);
1195:
1196: printf(" 1: %s\n", d_RPN);
1197: printf("-> 1: %s\n", d_RPN);
1198:
1199: return;
1200: }
1201: else if ((*s_etat_processus).test_instruction == 'Y')
1202: {
1203: (*s_etat_processus).nombre_arguments = 1;
1204: return;
1205: }
1206:
1207: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1208: {
1209: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1210: {
1211: return;
1212: }
1213: }
1214:
1215: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1216: &s_objet_argument) == d_erreur)
1217: {
1218: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1219: return;
1220: }
1221:
1222: statut = GSL_SUCCESS;
1223:
1224: /*
1225: --------------------------------------------------------------------------------
1226: Entier ou réel
1227: --------------------------------------------------------------------------------
1228: */
1229:
1230: if (((*s_objet_argument).type == INT) ||
1231: ((*s_objet_argument).type == REL))
1232: {
1233: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
1234: {
1235: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1236: return;
1237: }
1238:
1239: if ((*s_objet_argument).type == INT)
1240: {
1241: argument_reel = (*((integer8 *) (*s_objet_argument).objet));
1242: }
1243: else
1244: {
1245: argument_reel = (*((real8 *) (*s_objet_argument).objet));
1246: }
1247:
1248: statut = gsl_sf_gamma_e(argument_reel, &resultat);
1249:
1250: (*((real8 *) (*s_objet_resultat).objet)) = resultat.val;
1251: }
1252:
1253: /*
1254: --------------------------------------------------------------------------------
1255: Complexe
1256: --------------------------------------------------------------------------------
1257: */
1258:
1259: else if ((*s_objet_argument).type == CPL)
1260: {
1261: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
1262: {
1263: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1264: return;
1265: }
1266:
1267: argument_reel = (*((complex16 *) (*s_objet_argument).objet))
1268: .partie_reelle;
1269: argument_imaginaire = (*((complex16 *) (*s_objet_argument).objet))
1270: .partie_imaginaire;
1271:
1272: statut = gsl_sf_lngamma_complex_e(argument_reel, argument_imaginaire,
1273: &ln_module, &argument);
1274:
1275: (*((complex16 *) (*s_objet_resultat).objet)).partie_reelle =
1276: exp(ln_module.val) * cos(argument.val);
1277: (*((complex16 *) (*s_objet_resultat).objet)).partie_imaginaire =
1278: exp(ln_module.val) * sin(argument.val);
1279: }
1280:
1281: /*
1282: --------------------------------------------------------------------------------
1283: Nom
1284: --------------------------------------------------------------------------------
1285: */
1286:
1287: else if ((*s_objet_argument).type == NOM)
1288: {
1289: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
1290: {
1291: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1292: return;
1293: }
1294:
1295: if (((*s_objet_resultat).objet =
1296: allocation_maillon(s_etat_processus)) == NULL)
1297: {
1298: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1299: return;
1300: }
1301:
1302: l_element_courant = (*s_objet_resultat).objet;
1303:
1304: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1305: == NULL)
1306: {
1307: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1308: return;
1309: }
1310:
1311: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1312: .nombre_arguments = 0;
1313: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1314: .fonction = instruction_vers_niveau_superieur;
1315:
1316: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1317: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1318: {
1319: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1320: return;
1321: }
1322:
1323: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1324: .nom_fonction, "<<");
1325:
1326: if (((*l_element_courant).suivant =
1327: allocation_maillon(s_etat_processus)) == NULL)
1328: {
1329: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1330: return;
1331: }
1332:
1333: l_element_courant = (*l_element_courant).suivant;
1334: (*l_element_courant).donnee = s_objet_argument;
1335:
1336: if (((*l_element_courant).suivant =
1337: allocation_maillon(s_etat_processus)) == NULL)
1338: {
1339: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1340: return;
1341: }
1342:
1343: l_element_courant = (*l_element_courant).suivant;
1344:
1345: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1346: == NULL)
1347: {
1348: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1349: return;
1350: }
1351:
1352: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1353: .nombre_arguments = 1;
1354: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1355: .fonction = instruction_gamma;
1356:
1357: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1358: .nom_fonction = malloc(6 * sizeof(unsigned char))) == NULL)
1359: {
1360: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1361: return;
1362: }
1363:
1364: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1365: .nom_fonction, "GAMMA");
1366:
1367: if (((*l_element_courant).suivant =
1368: allocation_maillon(s_etat_processus)) == NULL)
1369: {
1370: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1371: return;
1372: }
1373:
1374: l_element_courant = (*l_element_courant).suivant;
1375:
1376: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1377: == NULL)
1378: {
1379: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1380: return;
1381: }
1382:
1383: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1384: .nombre_arguments = 0;
1385: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1386: .fonction = instruction_vers_niveau_inferieur;
1387:
1388: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1389: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1390: {
1391: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1392: return;
1393: }
1394:
1395: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1396: .nom_fonction, ">>");
1397:
1398: (*l_element_courant).suivant = NULL;
1399: s_objet_argument = NULL;
1400: }
1401:
1402: /*
1403: --------------------------------------------------------------------------------
1404: Expression
1405: --------------------------------------------------------------------------------
1406: */
1407:
1408: else if (((*s_objet_argument).type == ALG) ||
1409: ((*s_objet_argument).type == RPN))
1410: {
1411: if ((s_copie_argument = copie_objet(s_etat_processus,
1412: s_objet_argument, 'N')) == NULL)
1413: {
1414: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1415: return;
1416: }
1417:
1418: l_element_courant = (struct_liste_chainee *)
1419: (*s_copie_argument).objet;
1420: l_element_precedent = l_element_courant;
1421:
1422: while((*l_element_courant).suivant != NULL)
1423: {
1424: l_element_precedent = l_element_courant;
1425: l_element_courant = (*l_element_courant).suivant;
1426: }
1427:
1428: if (((*l_element_precedent).suivant =
1429: allocation_maillon(s_etat_processus)) == NULL)
1430: {
1431: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1432: return;
1433: }
1434:
1435: if (((*(*l_element_precedent).suivant).donnee =
1436: allocation(s_etat_processus, FCT)) == NULL)
1437: {
1438: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1439: return;
1440: }
1441:
1442: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1443: .donnee).objet)).nombre_arguments = 1;
1444: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
1445: .donnee).objet)).fonction = instruction_gamma;
1446:
1447: if (((*((struct_fonction *) (*(*(*l_element_precedent)
1448: .suivant).donnee).objet)).nom_fonction =
1449: malloc(6 * sizeof(unsigned char))) == NULL)
1450: {
1451: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1452: return;
1453: }
1454:
1455: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
1456: .suivant).donnee).objet)).nom_fonction, "GAMMA");
1457:
1458: (*(*l_element_precedent).suivant).suivant = l_element_courant;
1459:
1460: s_objet_resultat = s_copie_argument;
1461: }
1462:
1463: /*
1464: --------------------------------------------------------------------------------
1465: Argument absurde
1466: --------------------------------------------------------------------------------
1467: */
1468:
1469: else
1470: {
1471: liberation(s_etat_processus, s_objet_argument);
1472:
1473: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1474: return;
1475: }
1476:
1477: if (statut != GSL_SUCCESS)
1478: {
1479: traitement_asynchrone_exceptions_gsl(s_etat_processus);
1480: liberation(s_etat_processus, s_objet_resultat);
1481: }
1482: else
1483: {
1484: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1485: s_objet_resultat) == d_erreur)
1486: {
1487: return;
1488: }
1489: }
1490:
1491: liberation(s_etat_processus, s_objet_argument);
1492:
1493: return;
1494: }
1495:
1496: // vim: ts=4