1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.12
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 'until'
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_until(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 UNTIL ");
46:
47: if ((*s_etat_processus).langue == 'F')
48: {
49: printf("(structure de contrôle)\n\n");
50: printf(" Utilisation :\n\n");
51: }
52: else
53: {
54: printf("(control statement)\n\n");
55: printf(" Usage:\n\n");
56: }
57:
58: printf(" DO\n");
59: printf(" (expression 1)\n");
60: printf(" EXIT\n");
61: printf(" (expression 2)\n");
62: printf(" UNTIL\n");
63: printf(" (clause)\n");
64: printf(" END\n\n");
65:
66: printf(" DO\n");
67: printf(" (expression)\n");
68: printf(" UNTIL\n");
69: printf(" (clause)\n");
70: printf(" END\n");
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: (*(*s_etat_processus).l_base_pile_systeme).clause = 'U';
81:
82: return;
83: }
84:
85:
86: /*
87: ================================================================================
88: Fonction 'utpc'
89: ================================================================================
90: Entrées : pointeur sur une structure struct_processus
91: --------------------------------------------------------------------------------
92: Sorties :
93: --------------------------------------------------------------------------------
94: Effets de bord : néant
95: ================================================================================
96: */
97:
98: void
99: instruction_utpc(struct_processus *s_etat_processus)
100: {
101: integer8 n;
102:
103: real8 x;
104:
105: struct_objet *s_objet_argument_1;
106: struct_objet *s_objet_argument_2;
107: struct_objet *s_objet_resultat;
108:
109: (*s_etat_processus).erreur_execution = d_ex;
110:
111: if ((*s_etat_processus).affichage_arguments == 'Y')
112: {
113: printf("\n UTPC ");
114:
115: if ((*s_etat_processus).langue == 'F')
116: {
117: printf("(loi du Xhi carrée cumulé à droite)\n\n");
118: }
119: else
120: {
121: printf("(upper-tail probability chi-square distribution)\n\n");
122: }
123:
124: printf(" 2: %s\n", d_INT);
125: printf(" 1: %s, %s\n", d_INT, d_REL);
126: printf("-> 1: %s\n", d_REL);
127:
128: return;
129: }
130: else if ((*s_etat_processus).test_instruction == 'Y')
131: {
132: (*s_etat_processus).nombre_arguments = 2;
133: return;
134: }
135:
136: if (test_cfsf(s_etat_processus, 31) == d_vrai)
137: {
138: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
139: {
140: return;
141: }
142: }
143:
144: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
145: &s_objet_argument_1) == d_erreur)
146: {
147: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
148: return;
149: }
150:
151: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
152: &s_objet_argument_2) == d_erreur)
153: {
154: liberation(s_etat_processus, s_objet_argument_1);
155:
156: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
157: return;
158: }
159:
160: if (((*s_objet_argument_2).type == INT) &&
161: (((*s_objet_argument_1).type == REL) ||
162: ((*s_objet_argument_1).type == INT)))
163: {
164: n = (integer4) (*((integer8 *) (*s_objet_argument_2).objet));
165:
166: if (n <= 0)
167: {
168: liberation(s_etat_processus, s_objet_argument_1);
169: liberation(s_etat_processus, s_objet_argument_2);
170:
171: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
172: return;
173: }
174:
175: if ((s_objet_resultat = allocation(s_etat_processus, REL))
176: == NULL)
177: {
178: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
179: return;
180: }
181:
182: if ((*s_objet_argument_1).type == INT)
183: {
184: x = (real8) (*((integer8 *) (*s_objet_argument_1).objet));
185: }
186: else
187: {
188: x = (*((real8 *) (*s_objet_argument_1).objet));
189: }
190:
191: if (x < 0)
192: {
193: (*((real8 *) (*s_objet_resultat).objet)) = 1;
194: }
195: else
196: {
197: f90x2cd(&x, &n, (real8 *) (*s_objet_resultat).objet);
198: }
199: }
200: else
201: {
202: liberation(s_etat_processus, s_objet_argument_1);
203: liberation(s_etat_processus, s_objet_argument_2);
204:
205: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
206: return;
207: }
208:
209: liberation(s_etat_processus, s_objet_argument_1);
210: liberation(s_etat_processus, s_objet_argument_2);
211:
212: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
213: s_objet_resultat) == d_erreur)
214: {
215: return;
216: }
217:
218: return;
219: }
220:
221:
222: /*
223: ================================================================================
224: Fonction 'utpn'
225: ================================================================================
226: Entrées : pointeur sur une structure struct_processus
227: --------------------------------------------------------------------------------
228: Sorties :
229: --------------------------------------------------------------------------------
230: Effets de bord : néant
231: ================================================================================
232: */
233:
234: void
235: instruction_utpn(struct_processus *s_etat_processus)
236: {
237: real8 moyenne;
238: real8 variance;
239: real8 x;
240:
241: struct_objet *s_objet_argument_1;
242: struct_objet *s_objet_argument_2;
243: struct_objet *s_objet_argument_3;
244: struct_objet *s_objet_resultat;
245:
246: (*s_etat_processus).erreur_execution = d_ex;
247:
248: if ((*s_etat_processus).affichage_arguments == 'Y')
249: {
250: printf("\n UTPN ");
251:
252: if ((*s_etat_processus).langue == 'F')
253: {
254: printf("(loi normale cumulée à droite)\n\n");
255: }
256: else
257: {
258: printf("(upper-tail probability normal distribution)\n\n");
259: }
260:
261: printf(" 3: %s, %s\n", d_INT, d_REL);
262: printf(" 2: %s, %s\n", d_INT, d_REL);
263: printf(" 1: %s, %s\n", d_INT, d_REL);
264: printf("-> 1: %s\n", d_REL);
265:
266: return;
267: }
268: else if ((*s_etat_processus).test_instruction == 'Y')
269: {
270: (*s_etat_processus).nombre_arguments = 3;
271: return;
272: }
273:
274: if (test_cfsf(s_etat_processus, 31) == d_vrai)
275: {
276: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
277: {
278: return;
279: }
280: }
281:
282: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
283: &s_objet_argument_1) == d_erreur)
284: {
285: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
286: return;
287: }
288:
289: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
290: &s_objet_argument_2) == d_erreur)
291: {
292: liberation(s_etat_processus, s_objet_argument_1);
293:
294: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
295: return;
296: }
297:
298: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
299: &s_objet_argument_3) == d_erreur)
300: {
301: liberation(s_etat_processus, s_objet_argument_1);
302: liberation(s_etat_processus, s_objet_argument_2);
303:
304: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
305: return;
306: }
307:
308: if ((((*s_objet_argument_1).type == INT) ||
309: ((*s_objet_argument_1).type == REL)) &&
310: (((*s_objet_argument_2).type == INT) ||
311: ((*s_objet_argument_2).type == REL)) &&
312: (((*s_objet_argument_3).type == INT) ||
313: ((*s_objet_argument_3).type == REL)))
314: {
315: if ((s_objet_resultat = allocation(s_etat_processus, REL))
316: == NULL)
317: {
318: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
319: return;
320: }
321:
322: if ((*s_objet_argument_1).type == INT)
323: {
324: x = (real8) (*((integer8 *) (*s_objet_argument_1).objet));
325: }
326: else
327: {
328: x = (*((real8 *) (*s_objet_argument_1).objet));
329: }
330:
331: if ((*s_objet_argument_3).type == INT)
332: {
333: moyenne = (real8) (*((integer8 *) (*s_objet_argument_3).objet));
334: }
335: else
336: {
337: moyenne = (*((real8 *) (*s_objet_argument_3).objet));
338: }
339:
340: if ((*s_objet_argument_2).type == INT)
341: {
342: variance = (real8) (*((integer8 *) (*s_objet_argument_2).objet));
343: }
344: else
345: {
346: variance = (*((real8 *) (*s_objet_argument_2).objet));
347: }
348:
349:
350: if (variance == 0)
351: {
352: (*((real8 *) (*s_objet_resultat).objet)) = 0;
353: }
354: else if (variance > 0)
355: {
356: f90gausscd(&x, &moyenne, &variance,
357: (real8 *) (*s_objet_resultat).objet);
358: }
359: else
360: {
361: liberation(s_etat_processus, s_objet_argument_1);
362: liberation(s_etat_processus, s_objet_argument_2);
363: liberation(s_etat_processus, s_objet_argument_3);
364: liberation(s_etat_processus, s_objet_resultat);
365:
366: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
367: return;
368: }
369: }
370: else
371: {
372: liberation(s_etat_processus, s_objet_argument_1);
373: liberation(s_etat_processus, s_objet_argument_2);
374: liberation(s_etat_processus, s_objet_argument_3);
375:
376: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
377: return;
378: }
379:
380: liberation(s_etat_processus, s_objet_argument_1);
381: liberation(s_etat_processus, s_objet_argument_2);
382: liberation(s_etat_processus, s_objet_argument_3);
383:
384: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
385: s_objet_resultat) == d_erreur)
386: {
387: return;
388: }
389:
390: return;
391: }
392:
393:
394: /*
395: ================================================================================
396: Fonction 'utpf'
397: ================================================================================
398: Entrées : pointeur sur une structure struct_processus
399: --------------------------------------------------------------------------------
400: Sorties :
401: --------------------------------------------------------------------------------
402: Effets de bord : néant
403: ================================================================================
404: */
405:
406: void
407: instruction_utpf(struct_processus *s_etat_processus)
408: {
409: integer8 n1;
410: integer8 n2;
411:
412: real8 x;
413:
414: struct_objet *s_objet_argument_1;
415: struct_objet *s_objet_argument_2;
416: struct_objet *s_objet_argument_3;
417: struct_objet *s_objet_resultat;
418:
419: (*s_etat_processus).erreur_execution = d_ex;
420:
421: if ((*s_etat_processus).affichage_arguments == 'Y')
422: {
423: printf("\n UTPF ");
424:
425: if ((*s_etat_processus).langue == 'F')
426: {
427: printf("(loi F cumulée à droite)\n\n");
428: }
429: else
430: {
431: printf("(upper-tail probability F distribution)\n\n");
432: }
433:
434: printf(" 3: %s\n", d_INT);
435: printf(" 2: %s\n", d_INT);
436: printf(" 1: %s, %s\n", d_INT, d_REL);
437: printf("-> 1: %s\n", d_REL);
438:
439: return;
440: }
441: else if ((*s_etat_processus).test_instruction == 'Y')
442: {
443: (*s_etat_processus).nombre_arguments = 3;
444: return;
445: }
446:
447: if (test_cfsf(s_etat_processus, 31) == d_vrai)
448: {
449: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
450: {
451: return;
452: }
453: }
454:
455: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
456: &s_objet_argument_1) == d_erreur)
457: {
458: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
459: return;
460: }
461:
462: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
463: &s_objet_argument_2) == d_erreur)
464: {
465: liberation(s_etat_processus, s_objet_argument_1);
466:
467: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
468: return;
469: }
470:
471: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
472: &s_objet_argument_3) == d_erreur)
473: {
474: liberation(s_etat_processus, s_objet_argument_1);
475: liberation(s_etat_processus, s_objet_argument_2);
476:
477: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
478: return;
479: }
480:
481: if ((((*s_objet_argument_1).type == INT) ||
482: ((*s_objet_argument_1).type == REL)) &&
483: ((*s_objet_argument_2).type == INT) &&
484: ((*s_objet_argument_3).type == INT))
485: {
486: n1 = (integer4) (*((integer8 *) (*s_objet_argument_3).objet));
487: n2 = (integer4) (*((integer8 *) (*s_objet_argument_2).objet));
488:
489: if ((n1 <= 0) || (n2 <= 0))
490: {
491: liberation(s_etat_processus, s_objet_argument_1);
492: liberation(s_etat_processus, s_objet_argument_2);
493: liberation(s_etat_processus, s_objet_argument_3);
494:
495: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
496: return;
497: }
498:
499: if ((s_objet_resultat = allocation(s_etat_processus, REL))
500: == NULL)
501: {
502: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
503: return;
504: }
505:
506: if ((*s_objet_argument_1).type == INT)
507: {
508: x = (real8) (*((integer8 *) (*s_objet_argument_1).objet));
509: }
510: else
511: {
512: x = (*((real8 *) (*s_objet_argument_1).objet));
513: }
514:
515: if (x < 0)
516: {
517: (*((real8 *) (*s_objet_resultat).objet)) = 1;
518: }
519: else
520: {
521: f90fcd(&x, &n1, &n2, (real8 *) (*s_objet_resultat).objet);
522: }
523: }
524: else
525: {
526: liberation(s_etat_processus, s_objet_argument_1);
527: liberation(s_etat_processus, s_objet_argument_2);
528: liberation(s_etat_processus, s_objet_argument_3);
529:
530: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
531: return;
532: }
533:
534: liberation(s_etat_processus, s_objet_argument_1);
535: liberation(s_etat_processus, s_objet_argument_2);
536: liberation(s_etat_processus, s_objet_argument_3);
537:
538: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
539: s_objet_resultat) == d_erreur)
540: {
541: return;
542: }
543:
544: return;
545: }
546:
547:
548: /*
549: ================================================================================
550: Fonction 'utpt'
551: ================================================================================
552: Entrées : pointeur sur une structure struct_processus
553: --------------------------------------------------------------------------------
554: Sorties :
555: --------------------------------------------------------------------------------
556: Effets de bord : néant
557: ================================================================================
558: */
559:
560: void
561: instruction_utpt(struct_processus *s_etat_processus)
562: {
563: integer8 n;
564:
565: real8 x;
566:
567: struct_objet *s_objet_argument_1;
568: struct_objet *s_objet_argument_2;
569: struct_objet *s_objet_resultat;
570:
571: (*s_etat_processus).erreur_execution = d_ex;
572:
573: if ((*s_etat_processus).affichage_arguments == 'Y')
574: {
575: printf("\n UTPT ");
576:
577: if ((*s_etat_processus).langue == 'F')
578: {
579: printf("(loi du t de Student cumulée à droite)\n\n");
580: }
581: else
582: {
583: printf("(upper-tail probability Student's t distribution)\n\n");
584: }
585:
586: printf(" 2: %s\n", d_INT);
587: printf(" 1: %s, %s\n", d_INT, d_REL);
588: printf("-> 1: %s\n", d_REL);
589:
590: return;
591: }
592: else if ((*s_etat_processus).test_instruction == 'Y')
593: {
594: (*s_etat_processus).nombre_arguments = 2;
595: return;
596: }
597:
598: if (test_cfsf(s_etat_processus, 31) == d_vrai)
599: {
600: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
601: {
602: return;
603: }
604: }
605:
606: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
607: &s_objet_argument_1) == d_erreur)
608: {
609: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
610: return;
611: }
612:
613: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
614: &s_objet_argument_2) == d_erreur)
615: {
616: liberation(s_etat_processus, s_objet_argument_1);
617:
618: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
619: return;
620: }
621:
622: if (((*s_objet_argument_2).type == INT) &&
623: (((*s_objet_argument_1).type == REL) ||
624: ((*s_objet_argument_1).type == INT)))
625: {
626: n = (integer4) (*((integer8 *) (*s_objet_argument_2).objet));
627:
628: if (n <= 0)
629: {
630: liberation(s_etat_processus, s_objet_argument_1);
631: liberation(s_etat_processus, s_objet_argument_2);
632:
633: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
634: return;
635: }
636:
637: if ((s_objet_resultat = allocation(s_etat_processus, REL))
638: == NULL)
639: {
640: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
641: return;
642: }
643:
644: if ((*s_objet_argument_1).type == INT)
645: {
646: x = (real8) (*((integer8 *) (*s_objet_argument_1).objet));
647: }
648: else
649: {
650: x = (*((real8 *) (*s_objet_argument_1).objet));
651: }
652:
653: f90tcd(&x, &n, (real8 *) (*s_objet_resultat).objet);
654: }
655: else
656: {
657: liberation(s_etat_processus, s_objet_argument_1);
658: liberation(s_etat_processus, s_objet_argument_2);
659:
660: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
661: return;
662: }
663:
664: liberation(s_etat_processus, s_objet_argument_1);
665: liberation(s_etat_processus, s_objet_argument_2);
666:
667: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
668: s_objet_resultat) == d_erreur)
669: {
670: return;
671: }
672:
673: return;
674: }
675:
676:
677: /*
678: ================================================================================
679: Fonction 'use'
680: ================================================================================
681: Entrées : pointeur sur une structure struct_processus
682: --------------------------------------------------------------------------------
683: Sorties :
684: --------------------------------------------------------------------------------
685: Effets de bord : néant
686: ================================================================================
687: */
688:
689: void
690: instruction_use(struct_processus *s_etat_processus)
691: {
692: logical1 erreur;
693: logical1 existence;
694: logical1 ouverture;
695:
696: struct_objet *s_objet_argument;
697: struct_objet *s_objet_resultat;
698:
699: unsigned char *tampon;
700:
701: unsigned long unite;
702:
703: void *bibliotheque;
704:
705: (*s_etat_processus).erreur_execution = d_ex;
706:
707: if ((*s_etat_processus).affichage_arguments == 'Y')
708: {
709: printf("\n USE ");
710:
711: if ((*s_etat_processus).langue == 'F')
712: {
713: printf("(insertion d'une bibliothèque dynamique)\n\n");
714: printf("Si le chemin ne comprend pas de '/', la bibliothèque "
715: "est recherchée\n");
716: printf("successivement dans le répertoire courant puis dans %s."
717: "\n\n", d_exec_path);
718: }
719: else
720: {
721: printf("(insert a shared library)\n\n");
722: printf("If this path does not include '/', RPL/2 tries to find "
723: "it in current\n");
724: printf("directory or %s in this order.\n\n", d_exec_path);
725: }
726:
727: printf(" 1: %s\n", d_CHN);
728: printf("-> 1: %s\n", d_SLB);
729:
730: return;
731: }
732: else if ((*s_etat_processus).test_instruction == 'Y')
733: {
734: (*s_etat_processus).nombre_arguments = -1;
735: return;
736: }
737:
738: if (test_cfsf(s_etat_processus, 31) == d_vrai)
739: {
740: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
741: {
742: return;
743: }
744: }
745:
746: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
747: &s_objet_argument) == d_erreur)
748: {
749: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
750: return;
751: }
752:
753: if ((*s_objet_argument).type == CHN)
754: {
755: /*
756: * Si le nom contient un '/', il est traité comme un chemin
757: * absolu. Dans le cas contraire, on essaye successivement
758: * './' puis le répertoire lib de l'installation du langage.
759: */
760:
761: if (index((unsigned char *) (*s_objet_argument).objet, '/') == NULL)
762: {
763: if ((tampon = malloc((strlen((unsigned char *) (*s_objet_argument)
764: .objet) + 3) * sizeof(unsigned char))) == NULL)
765: {
766: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
767: return;
768: }
769:
770: sprintf(tampon, "./%s", (unsigned char *)
771: (*s_objet_argument).objet);
772:
773: erreur = caracteristiques_fichier(s_etat_processus, tampon,
774: &existence, &ouverture, &unite);
775:
776: if (existence != d_faux)
777: {
778: free((unsigned char *) (*s_objet_argument).objet);
779: (*s_objet_argument).objet = tampon;
780: }
781: else
782: {
783: free(tampon);
784:
785: if ((tampon = malloc((strlen((unsigned char *)
786: (*s_objet_argument).objet) + strlen(d_exec_path) + 7)
787: * sizeof(unsigned char))) == NULL)
788: {
789: (*s_etat_processus).erreur_systeme =
790: d_es_allocation_memoire;
791: return;
792: }
793:
794: sprintf(tampon, "/%s/lib/%s", d_exec_path, (unsigned char *)
795: (*s_objet_argument).objet);
796:
797: caracteristiques_fichier(s_etat_processus, tampon,
798: &existence, &ouverture, &unite);
799:
800: if (existence != d_faux)
801: {
802: free((unsigned char *) (*s_objet_argument).objet);
803: (*s_objet_argument).objet = tampon;
804: }
805: else
806: {
807: free(tampon);
808: }
809: }
810: }
811:
812: if ((bibliotheque = chargement_bibliotheque(s_etat_processus,
813: (unsigned char *) (*s_objet_argument).objet)) == NULL)
814: {
815: liberation(s_etat_processus, s_objet_argument);
816: return;
817: }
818:
819: if ((s_objet_resultat = allocation(s_etat_processus, SLB)) == NULL)
820: {
821: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
822: return;
823: }
824:
825: (*((struct_bibliotheque *) (*s_objet_resultat).objet)).descripteur =
826: bibliotheque;
827: (*((struct_bibliotheque *) (*s_objet_resultat).objet)).pid = getpid();
828: (*((struct_bibliotheque *) (*s_objet_resultat).objet)).tid =
829: pthread_self();
830:
831: if (((*((struct_bibliotheque *) (*s_objet_resultat).objet)).nom =
832: malloc((strlen((unsigned char *) (*s_objet_argument).objet)
833: + 1) * sizeof(unsigned char))) == NULL)
834: {
835: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
836: return;
837: }
838:
839: strcpy((*((struct_bibliotheque *) (*s_objet_resultat).objet)).nom,
840: (unsigned char *) (*s_objet_argument).objet);
841:
842: liberation(s_etat_processus, s_objet_argument);
843: }
844: else
845: {
846: liberation(s_etat_processus, s_objet_argument);
847:
848: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
849: return;
850: }
851:
852: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
853: s_objet_resultat) == d_erreur)
854: {
855: return;
856: }
857:
858: return;
859: }
860:
861:
862: /*
863: ================================================================================
864: Fonction 'uchol'
865: ================================================================================
866: Entrées : pointeur sur une structure struct_processus
867: --------------------------------------------------------------------------------
868: Sorties :
869: --------------------------------------------------------------------------------
870: Effets de bord : néant
871: ================================================================================
872: */
873:
874: void
875: instruction_uchol(struct_processus *s_etat_processus)
876: {
877: struct_objet *s_copie_objet;
878: struct_objet *s_objet;
879:
880: (*s_etat_processus).erreur_execution = d_ex;
881:
882: if ((*s_etat_processus).affichage_arguments == 'Y')
883: {
884: printf("\n UCHOL ");
885:
886: if ((*s_etat_processus).langue == 'F')
887: {
888: printf("(décomposition de Cholevski à droite)\n\n");
889: }
890: else
891: {
892: printf("(right Cholevski decomposition)\n\n");
893: }
894:
895: printf(" 1: %s, %s\n", d_MIN, d_MRL);
896: printf("-> 1: %s\n\n", d_MRL);
897:
898: printf(" 1: %s\n", d_MCX);
899: printf("-> 1: %s\n", d_MCX);
900:
901: return;
902: }
903: else if ((*s_etat_processus).test_instruction == 'Y')
904: {
905: (*s_etat_processus).nombre_arguments = -1;
906: return;
907: }
908:
909: if (test_cfsf(s_etat_processus, 31) == d_vrai)
910: {
911: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
912: {
913: return;
914: }
915: }
916:
917: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
918: &s_objet) == d_erreur)
919: {
920: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
921: return;
922: }
923:
924:
925: /*
926: --------------------------------------------------------------------------------
927: Résultat sous la forme de matrices réelles
928: --------------------------------------------------------------------------------
929: */
930:
931: if (((*s_objet).type == MIN) ||
932: ((*s_objet).type == MRL))
933: {
934: if ((*((struct_matrice *) (*s_objet).objet)).nombre_lignes !=
935: (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes)
936: {
937: liberation(s_etat_processus, s_objet);
938:
939: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
940: return;
941: }
942:
943: if ((s_copie_objet = copie_objet(s_etat_processus, s_objet, 'Q'))
944: == NULL)
945: {
946: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
947: return;
948: }
949:
950: liberation(s_etat_processus, s_objet);
951: s_objet = s_copie_objet;
952:
953: factorisation_cholesky(s_etat_processus, (*s_objet).objet, 'U');
954: (*s_objet).type = MRL;
955:
956: if ((*s_etat_processus).erreur_systeme != d_es)
957: {
958: return;
959: }
960:
961: if (((*s_etat_processus).exception != d_ep) ||
962: ((*s_etat_processus).erreur_execution != d_ex))
963: {
964: if ((*s_etat_processus).exception == d_ep_domaine_definition)
965: {
966: (*s_etat_processus).exception =
967: d_ep_matrice_non_definie_positive;
968: }
969:
970: liberation(s_etat_processus, s_objet);
971: return;
972: }
973: }
974:
975: /*
976: --------------------------------------------------------------------------------
977: Résultat sous la forme de matrices complexes
978: --------------------------------------------------------------------------------
979: */
980:
981: else if ((*s_objet).type == MCX)
982: {
983: if ((*((struct_matrice *) (*s_objet).objet)).nombre_lignes !=
984: (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes)
985: {
986: liberation(s_etat_processus, s_objet);
987:
988: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
989: return;
990: }
991:
992: if ((s_copie_objet = copie_objet(s_etat_processus, s_objet, 'Q'))
993: == NULL)
994: {
995: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
996: return;
997: }
998:
999: liberation(s_etat_processus, s_objet);
1000: s_objet = s_copie_objet;
1001:
1002: factorisation_cholesky(s_etat_processus, (*s_objet).objet, 'U');
1003:
1004: if ((*s_etat_processus).erreur_systeme != d_es)
1005: {
1006: return;
1007: }
1008:
1009: if (((*s_etat_processus).exception != d_ep) ||
1010: ((*s_etat_processus).erreur_execution != d_ex))
1011: {
1012: if ((*s_etat_processus).exception == d_ep_domaine_definition)
1013: {
1014: (*s_etat_processus).exception =
1015: d_ep_matrice_non_definie_positive;
1016: }
1017:
1018: liberation(s_etat_processus, s_objet);
1019: return;
1020: }
1021: }
1022:
1023: /*
1024: --------------------------------------------------------------------------------
1025: Type d'argument invalide
1026: --------------------------------------------------------------------------------
1027: */
1028:
1029: else
1030: {
1031: liberation(s_etat_processus, s_objet);
1032:
1033: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1034: return;
1035: }
1036:
1037: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1038: s_objet) == d_erreur)
1039: {
1040: return;
1041: }
1042:
1043: return;
1044: }
1045:
1046:
1047: /*
1048: ================================================================================
1049: Fonction 'unlock'
1050: ================================================================================
1051: Entrées : pointeur sur une structure struct_processus
1052: --------------------------------------------------------------------------------
1053: Sorties :
1054: --------------------------------------------------------------------------------
1055: Effets de bord : néant
1056: ================================================================================
1057: */
1058:
1059: void
1060: instruction_unlock(struct_processus *s_etat_processus)
1061: {
1062: file *descripteur;
1063:
1064: struct flock lock;
1065:
1066: struct_objet *s_objet;
1067:
1068: (*s_etat_processus).erreur_execution = d_ex;
1069:
1070: if ((*s_etat_processus).affichage_arguments == 'Y')
1071: {
1072: printf("\n UNLOCK ");
1073:
1074: if ((*s_etat_processus).langue == 'F')
1075: {
1076: printf("(déverrouillage d'un fichier)\n\n");
1077: }
1078: else
1079: {
1080: printf("(file unlock)\n\n");
1081: }
1082:
1083: printf(" 1: %s\n", d_FCH);
1084:
1085: return;
1086: }
1087: else if ((*s_etat_processus).test_instruction == 'Y')
1088: {
1089: (*s_etat_processus).nombre_arguments = -1;
1090: return;
1091: }
1092:
1093: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1094: {
1095: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1096: {
1097: return;
1098: }
1099: }
1100:
1101: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1102: &s_objet) == d_erreur)
1103: {
1104: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1105: return;
1106: }
1107:
1108: if ((*s_objet).type == FCH)
1109: {
1110: lock.l_type = F_UNLCK;
1111: lock.l_whence = SEEK_SET;
1112: lock.l_start = 0;
1113: lock.l_len = 0;
1114: lock.l_pid = getpid();
1115:
1116: if ((descripteur = descripteur_fichier(s_etat_processus,
1117: (struct_fichier *) (*s_objet).objet)) == NULL)
1118: {
1119: return;
1120: }
1121:
1122: if (fcntl(fileno(descripteur), F_SETLK, &lock) == -1)
1123: {
1124: liberation(s_etat_processus, s_objet);
1125:
1126: (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille;
1127: return;
1128: }
1129: }
1130: else
1131: {
1132: liberation(s_etat_processus, s_objet);
1133:
1134: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1135: return;
1136: }
1137:
1138: return;
1139: }
1140:
1141:
1142: /*
1143: ================================================================================
1144: Fonction 'unprotect'
1145: ================================================================================
1146: Entrées :
1147: --------------------------------------------------------------------------------
1148: Sorties :
1149: --------------------------------------------------------------------------------
1150: Effets de bord : néant
1151: ================================================================================
1152: */
1153:
1154: void
1155: instruction_unprotect(struct_processus *s_etat_processus)
1156: {
1157: struct_liste_chainee *l_element_courant;
1158:
1159: struct_objet *s_objet;
1160:
1161: (*s_etat_processus).erreur_execution = d_ex;
1162:
1163: if ((*s_etat_processus).affichage_arguments == 'Y')
1164: {
1165: printf("\n UNPROTECT ");
1166:
1167: if ((*s_etat_processus).langue == 'F')
1168: {
1169: printf("(déverrouille une variable)\n\n");
1170: }
1171: else
1172: {
1173: printf("(unlock a variable)\n\n");
1174: }
1175:
1176: printf(" 1: %s, %s\n", d_NOM, d_LST);
1177:
1178: return;
1179: }
1180: else if ((*s_etat_processus).test_instruction == 'Y')
1181: {
1182: (*s_etat_processus).nombre_arguments = -1;
1183: return;
1184: }
1185:
1186: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1187: {
1188: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1189: {
1190: return;
1191: }
1192: }
1193:
1194: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1195: &s_objet) == d_erreur)
1196: {
1197: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1198: return;
1199: }
1200:
1201: if ((*s_objet).type == NOM)
1202: {
1203: if (recherche_variable(s_etat_processus, ((*((struct_nom *)
1204: (*s_objet).objet)).nom)) == d_faux)
1205: {
1206: liberation(s_etat_processus, s_objet);
1207:
1208: (*s_etat_processus).erreur_systeme = d_es;
1209: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1210: return;
1211: }
1212:
1213: ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
1214: .position_variable_courante]).variable_verrouillee = d_faux;
1215: }
1216: else if ((*s_objet).type == LST)
1217: {
1218: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
1219:
1220: while(l_element_courant != NULL)
1221: {
1222: if ((*(*l_element_courant).donnee).type != NOM)
1223: {
1224: liberation(s_etat_processus, s_objet);
1225:
1226: (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
1227: return;
1228: }
1229:
1230: if (recherche_variable(s_etat_processus, (*((struct_nom *)
1231: (*(*l_element_courant).donnee).objet)).nom) == d_faux)
1232: {
1233: liberation(s_etat_processus, s_objet);
1234:
1235: (*s_etat_processus).erreur_systeme = d_es;
1236: (*s_etat_processus).erreur_execution =
1237: d_ex_variable_non_definie;
1238: return;
1239: }
1240:
1241: ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
1242: .position_variable_courante]).variable_verrouillee = d_faux;
1243:
1244: l_element_courant = (*l_element_courant).suivant;
1245: }
1246: }
1247: else
1248: {
1249: liberation(s_etat_processus, s_objet);
1250:
1251: (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
1252: return;
1253: }
1254:
1255: liberation(s_etat_processus, s_objet);
1256:
1257: return;
1258: }
1259:
1260:
1261: /*
1262: ================================================================================
1263: Fonction 'ucase'
1264: ================================================================================
1265: Entrées : pointeur sur une structure struct_processus
1266: --------------------------------------------------------------------------------
1267: Sorties :
1268: --------------------------------------------------------------------------------
1269: Effets de bord : néant
1270: ================================================================================
1271: */
1272:
1273: void
1274: instruction_ucase(struct_processus *s_etat_processus)
1275: {
1276: struct_objet *s_objet_argument;
1277: struct_objet *s_objet_resultat;
1278:
1279: unsigned char *ptr;
1280: unsigned char registre;
1281:
1282: (*s_etat_processus).erreur_execution = d_ex;
1283:
1284: if ((*s_etat_processus).affichage_arguments == 'Y')
1285: {
1286: printf("\n UCASE ");
1287:
1288: if ((*s_etat_processus).langue == 'F')
1289: {
1290: printf("(converison d'une chaîne de caractères en majuscules)\n\n");
1291: }
1292: else
1293: {
1294: printf("(convert string to upper case)\n\n");
1295: }
1296:
1297: printf(" 1: %s\n", d_CHN);
1298: return;
1299: }
1300: else if ((*s_etat_processus).test_instruction == 'Y')
1301: {
1302: (*s_etat_processus).nombre_arguments = -1;
1303: return;
1304: }
1305:
1306: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1307: {
1308: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1309: {
1310: return;
1311: }
1312: }
1313:
1314: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1315: &s_objet_argument) == d_erreur)
1316: {
1317: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1318: return;
1319: }
1320:
1321: if ((*s_objet_argument).type == CHN)
1322: {
1323: if ((s_objet_resultat = copie_objet(s_etat_processus,
1324: s_objet_argument, 'O')) == NULL)
1325: {
1326: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1327: return;
1328: }
1329:
1330: liberation(s_etat_processus, s_objet_argument);
1331: ptr = (unsigned char *) (*s_objet_resultat).objet;
1332:
1333: while((*ptr) != d_code_fin_chaine)
1334: {
1335: registre = toupper((*ptr));
1336:
1337: if (tolower(registre) == (*ptr))
1338: {
1339: (*ptr) = registre;
1340: }
1341:
1342: ptr++;
1343: }
1344:
1345: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1346: s_objet_resultat) == d_erreur)
1347: {
1348: return;
1349: }
1350: }
1351: else
1352: {
1353: liberation(s_etat_processus, s_objet_argument);
1354:
1355: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1356: return;
1357: }
1358:
1359: return;
1360: }
1361:
1362: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>