1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.22
4: Copyright (C) 1989-2011 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 'rsd'
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_rsd(struct_processus *s_etat_processus)
40: {
41: struct_liste_chainee *l_element_courant;
42: struct_liste_chainee *registre_pile_last;
43:
44: (*s_etat_processus).erreur_execution = d_ex;
45:
46: if ((*s_etat_processus).affichage_arguments == 'Y')
47: {
48: printf("\n RSD ");
49:
50: if ((*s_etat_processus).langue == 'F')
51: {
52: printf("(calcul d'un tableau résiduel)\n\n");
53: }
54: else
55: {
56: printf("(compute a resudial array)\n\n");
57: }
58:
59: printf(" 3: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
60: printf(" 2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
61: printf(" 1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
62: printf("-> 1: %s, %s ,%s\n\n", d_VIN, d_VRL, d_VCX);
63:
64: printf(" 3: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
65: printf(" 2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
66: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
67: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
68:
69: return;
70: }
71: else if ((*s_etat_processus).test_instruction == 'Y')
72: {
73: (*s_etat_processus).nombre_arguments = -1;
74: return;
75: }
76:
77: /*
78: * Test du type et du nombre des arguments
79: */
80:
81: if ((*s_etat_processus).hauteur_pile_operationnelle < 3)
82: {
83: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
84: return;
85: }
86:
87: l_element_courant = (*s_etat_processus).l_base_pile;
88:
89: if (((*(*l_element_courant).donnee).type != VIN) &&
90: ((*(*l_element_courant).donnee).type != VRL) &&
91: ((*(*l_element_courant).donnee).type != VCX) &&
92: ((*(*l_element_courant).donnee).type != MIN) &&
93: ((*(*l_element_courant).donnee).type != MRL) &&
94: ((*(*l_element_courant).donnee).type != MCX))
95: {
96: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
97: return;
98: }
99:
100: l_element_courant = (*l_element_courant).suivant;
101:
102: if (((*(*l_element_courant).donnee).type != MIN) &&
103: ((*(*l_element_courant).donnee).type != MRL) &&
104: ((*(*l_element_courant).donnee).type != MCX))
105: {
106: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
107: return;
108: }
109:
110: l_element_courant = (*l_element_courant).suivant;
111:
112: if (((*(*l_element_courant).donnee).type != VIN) &&
113: ((*(*l_element_courant).donnee).type != VRL) &&
114: ((*(*l_element_courant).donnee).type != VCX) &&
115: ((*(*l_element_courant).donnee).type != MIN) &&
116: ((*(*l_element_courant).donnee).type != MRL) &&
117: ((*(*l_element_courant).donnee).type != MCX))
118: {
119: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
120: return;
121: }
122:
123: /*
124: * Sauvegarde de la pile LAST courante
125: */
126:
127: registre_pile_last = NULL;
128:
129: if (test_cfsf(s_etat_processus, 31) == d_vrai)
130: {
131: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
132: {
133: return;
134: }
135:
136: registre_pile_last = (*s_etat_processus).l_base_pile_last;
137: (*s_etat_processus).l_base_pile_last = NULL;
138: }
139:
140: instruction_multiplication(s_etat_processus);
141:
142: if (((*s_etat_processus).erreur_systeme != d_es) ||
143: ((*s_etat_processus).erreur_execution != d_ex) ||
144: ((*s_etat_processus).exception != d_ep))
145: {
146: if (test_cfsf(s_etat_processus, 31) == d_vrai)
147: {
148: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
149: {
150: return;
151: }
152: }
153:
154: (*s_etat_processus).l_base_pile_last = registre_pile_last;
155:
156: return;
157: }
158:
159: instruction_moins(s_etat_processus);
160:
161: /*
162: * Restauration de la pile LAST
163: */
164:
165: if (test_cfsf(s_etat_processus, 31) == d_vrai)
166: {
167: /*
168: * Astuce pour libérer l'ancienne pile last...
169: */
170:
171: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
172: {
173: return;
174: }
175:
176: (*s_etat_processus).l_base_pile_last = registre_pile_last;
177: }
178:
179: return;
180: }
181:
182:
183: /*
184: ================================================================================
185: Fonction 'regv'
186: ================================================================================
187: Entrées : pointeur sur une structure struct_processus
188: --------------------------------------------------------------------------------
189: Sorties :
190: --------------------------------------------------------------------------------
191: Effets de bord : néant
192: ================================================================================
193: */
194:
195: void
196: instruction_regv(struct_processus *s_etat_processus)
197: {
198: struct_objet *s_objet_argument;
199: struct_objet *s_objet_resultat_1;
200: struct_objet *s_objet_resultat_2;
201:
202: (*s_etat_processus).erreur_execution = d_ex;
203:
204: if ((*s_etat_processus).affichage_arguments == 'Y')
205: {
206: printf("\n REGV ");
207:
208: if ((*s_etat_processus).langue == 'F')
209: {
210: printf("(valeurs et vecteurs propres droits)\n\n");
211: }
212: else
213: {
214: printf("(eigenvalues and right eigenvectors)\n\n");
215: }
216:
217: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
218: printf("-> 2: %s\n", d_MCX);
219: printf(" 1: %s\n", d_VCX);
220:
221: return;
222: }
223: else if ((*s_etat_processus).test_instruction == 'Y')
224: {
225: (*s_etat_processus).nombre_arguments = -1;
226: return;
227: }
228:
229: if (test_cfsf(s_etat_processus, 31) == d_vrai)
230: {
231: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
232: {
233: return;
234: }
235: }
236:
237: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
238: &s_objet_argument) == d_erreur)
239: {
240: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
241: return;
242: }
243:
244: /*
245: --------------------------------------------------------------------------------
246: L'argument est une matrice carrée
247: --------------------------------------------------------------------------------
248: */
249:
250: if (((*s_objet_argument).type == MIN) ||
251: ((*s_objet_argument).type == MRL) ||
252: ((*s_objet_argument).type == MCX))
253: {
254: if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes !=
255: (*((struct_matrice *) (*s_objet_argument).objet))
256: .nombre_colonnes)
257: {
258: liberation(s_etat_processus, s_objet_argument);
259:
260: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
261: return;
262: }
263:
264: if ((s_objet_resultat_1 = allocation(s_etat_processus, VCX)) == NULL)
265: {
266: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
267: return;
268: }
269:
270: if ((s_objet_resultat_2 = allocation(s_etat_processus, MCX)) == NULL)
271: {
272: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
273: return;
274: }
275:
276: valeurs_propres(s_etat_processus,
277: (struct_matrice *) (*s_objet_argument).objet,
278: (struct_vecteur *) (*s_objet_resultat_1).objet,
279: NULL, (struct_matrice *) (*s_objet_resultat_2).objet);
280:
281: if ((*s_etat_processus).erreur_systeme != d_es)
282: {
283: return;
284: }
285:
286: if (((*s_etat_processus).exception != d_ep) ||
287: ((*s_etat_processus).erreur_execution != d_ex))
288: {
289: liberation(s_etat_processus, s_objet_argument);
290: liberation(s_etat_processus, s_objet_resultat_1);
291: liberation(s_etat_processus, s_objet_resultat_2);
292: return;
293: }
294: }
295:
296: /*
297: --------------------------------------------------------------------------------
298: Type incompatible
299: --------------------------------------------------------------------------------
300: */
301:
302: else
303: {
304: liberation(s_etat_processus, s_objet_argument);
305:
306: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
307: return;
308: }
309:
310: liberation(s_etat_processus, s_objet_argument);
311:
312: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
313: s_objet_resultat_2) == d_erreur)
314: {
315: return;
316: }
317:
318: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
319: s_objet_resultat_1) == d_erreur)
320: {
321: return;
322: }
323:
324: return;
325: }
326:
327:
328: /*
329: ================================================================================
330: Fonction 'rnrm'
331: ================================================================================
332: Entrées : pointeur sur une structure struct_processus
333: --------------------------------------------------------------------------------
334: Sorties :
335: --------------------------------------------------------------------------------
336: Effets de bord : néant
337: ================================================================================
338: */
339:
340: void
341: instruction_rnrm(struct_processus *s_etat_processus)
342: {
343: logical1 depassement;
344: logical1 erreur_memoire;
345:
346: real8 cumul_reel;
347: real8 registre;
348:
349: integer8 cumul_entier;
350: integer8 entier_courant;
351: integer8 tampon;
352:
353: struct_objet *s_objet_argument;
354: struct_objet *s_objet_resultat;
355:
356: unsigned long i;
357: unsigned long j;
358:
359: void *accumulateur;
360:
361: (*s_etat_processus).erreur_execution = d_ex;
362:
363: if ((*s_etat_processus).affichage_arguments == 'Y')
364: {
365: printf("\n RNRM ");
366:
367: if ((*s_etat_processus).langue == 'F')
368: {
369: printf("(norme de ligne)\n\n");
370: }
371: else
372: {
373: printf("(row norm)\n\n");
374: }
375:
376: printf(" 1: %s, %s\n", d_VIN, d_MIN);
377: printf("-> 1: %s, %s\n\n", d_INT, d_REL);
378:
379: printf(" 1: %s, %s, %s, %s\n", d_VRL, d_VCX, d_MRL, d_MCX);
380: printf("-> 1: %s\n", d_REL);
381:
382: return;
383: }
384: else if ((*s_etat_processus).test_instruction == 'Y')
385: {
386: (*s_etat_processus).nombre_arguments = -1;
387: return;
388: }
389:
390: if (test_cfsf(s_etat_processus, 31) == d_vrai)
391: {
392: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
393: {
394: return;
395: }
396: }
397:
398: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
399: &s_objet_argument) == d_erreur)
400: {
401: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
402: return;
403: }
404:
405: /*
406: --------------------------------------------------------------------------------
407: Traitement des vecteurs
408: --------------------------------------------------------------------------------
409: */
410:
411: if ((*s_objet_argument).type == VIN)
412: {
413: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
414: {
415: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
416: return;
417: }
418:
419: (*((integer8 *) (*s_objet_resultat).objet)) = abs(((integer8 *)
420: (*((struct_vecteur *) (*s_objet_argument).objet)).tableau)[0]);
421:
422: for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
423: i++)
424: {
425: if (abs(((integer8 *) (*((struct_vecteur *) (*s_objet_argument)
426: .objet)).tableau)[i]) > (*((integer8 *)
427: (*s_objet_resultat).objet)))
428: {
429: (*((integer8 *) (*s_objet_resultat).objet)) =
430: abs(((integer8 *) (*((struct_vecteur *)
431: (*s_objet_argument).objet)).tableau)[i]);
432: }
433: }
434: }
435: else if ((*s_objet_argument).type == VRL)
436: {
437: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
438: {
439: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
440: return;
441: }
442:
443: (*((real8 *) (*s_objet_resultat).objet)) = fabs(((real8 *)
444: (*((struct_vecteur *) (*s_objet_argument).objet)).tableau)[0]);
445:
446: for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
447: i++)
448: {
449: if (fabs(((real8 *) (*((struct_vecteur *) (*s_objet_argument)
450: .objet)).tableau)[i]) > (*((real8 *)
451: (*s_objet_resultat).objet)))
452: {
453: (*((real8 *) (*s_objet_resultat).objet)) =
454: fabs(((real8 *) (*((struct_vecteur *)
455: (*s_objet_argument).objet)).tableau)[i]);
456: }
457: }
458: }
459: else if ((*s_objet_argument).type == VCX)
460: {
461: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
462: {
463: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
464: return;
465: }
466:
467: f77absc_(&(((struct_complexe16 *) (*((struct_vecteur *)
468: (*s_objet_argument).objet)).tableau)[0]), (real8 *)
469: (*s_objet_resultat).objet);
470:
471: for(i = 1; i < (*((struct_vecteur *) (*s_objet_argument).objet)).taille;
472: i++)
473: {
474: f77absc_(&(((struct_complexe16 *) (*((struct_vecteur *)
475: (*s_objet_argument).objet)).tableau)[i]), ®istre);
476:
477: if (registre > (*((real8 *) (*s_objet_resultat).objet)))
478: {
479: (*((real8 *) (*s_objet_resultat).objet)) = registre;
480: }
481: }
482: }
483:
484: /*
485: --------------------------------------------------------------------------------
486: Traitement des matrices
487: --------------------------------------------------------------------------------
488: */
489:
490: else if ((*s_objet_argument).type == MIN)
491: {
492: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
493: {
494: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
495: return;
496: }
497:
498: cumul_entier = 0;
499: depassement = d_faux;
500:
501: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
502: .nombre_colonnes; j++)
503: {
504: entier_courant = abs(((integer8 **)
505: (*((struct_matrice *) (*s_objet_argument).objet))
506: .tableau)[0][j]);
507:
508: if (depassement_addition(&cumul_entier, &entier_courant, &tampon)
509: == d_erreur)
510: {
511: depassement = d_vrai;
512: break;
513: }
514: }
515:
516: if (depassement == d_faux)
517: {
518: (*((integer8 *) (*s_objet_resultat).objet)) = cumul_entier;
519:
520: for(i = 1; i < (*((struct_matrice *) (*s_objet_argument).objet))
521: .nombre_lignes; i++)
522: {
523: cumul_entier = 0;
524:
525: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
526: .nombre_colonnes; j++)
527: {
528: entier_courant = abs(((integer8 **) (*((struct_matrice *)
529: (*s_objet_argument).objet)).tableau)[i][j]);
530:
531: if (depassement_addition(&cumul_entier, &entier_courant,
532: &tampon) == d_erreur)
533: {
534: depassement = d_vrai;
535: break;
536: }
537:
538: cumul_entier = tampon;
539: }
540:
541: if (depassement == d_vrai)
542: {
543: break;
544: }
545:
546: if (cumul_entier > (*((integer8 *) (*s_objet_resultat).objet)))
547: {
548: (*((integer8 *) (*s_objet_resultat).objet)) = cumul_entier;
549: }
550: }
551: }
552:
553: if (depassement == d_vrai)
554: {
555: /*
556: * Dépassement : il faut refaire le calcul en real*8...
557: */
558:
559: free((*s_objet_resultat).objet);
560: (*s_objet_resultat).type = REL;
561:
562: if (((*s_objet_resultat).objet = malloc(sizeof(real8))) == NULL)
563: {
564: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
565: return;
566: }
567:
568: if ((accumulateur = malloc((*((struct_matrice *)
569: (*s_objet_argument).objet)).nombre_colonnes *
570: sizeof(real8))) == NULL)
571: {
572: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
573: return;
574: }
575:
576: (*((real8 *) (*s_objet_resultat).objet)) = 0;
577:
578: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
579: .nombre_lignes; i++)
580: {
581: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
582: .nombre_colonnes; j++)
583: {
584: ((real8 *) accumulateur)[j] = fabs((real8) ((integer8 **)
585: (*((struct_matrice *) (*s_objet_argument).objet))
586: .tableau)[i][j]);
587: }
588:
589: cumul_reel = sommation_vecteur_reel(accumulateur,
590: &((*((struct_matrice *) (*s_objet_argument).objet))
591: .nombre_colonnes), &erreur_memoire);
592:
593: if (erreur_memoire == d_vrai)
594: {
595: (*s_etat_processus).erreur_systeme =
596: d_es_allocation_memoire;
597: return;
598: }
599:
600: if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
601: {
602: (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
603: }
604: }
605:
606: free(accumulateur);
607: }
608: }
609: else if ((*s_objet_argument).type == MRL)
610: {
611: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
612: {
613: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
614: return;
615: }
616:
617: if ((accumulateur = malloc((*((struct_matrice *)
618: (*s_objet_argument).objet)).nombre_colonnes * sizeof(real8)))
619: == NULL)
620: {
621: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
622: return;
623: }
624:
625: (*((real8 *) (*s_objet_resultat).objet)) = 0;
626:
627: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
628: .nombre_lignes; i++)
629: {
630: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
631: .nombre_colonnes; j++)
632: {
633: ((real8 *) accumulateur)[j] = fabs(((real8 **)
634: (*((struct_matrice *) (*s_objet_argument).objet))
635: .tableau)[i][j]);
636: }
637:
638: cumul_reel = sommation_vecteur_reel(accumulateur,
639: &((*((struct_matrice *) (*s_objet_argument).objet))
640: .nombre_colonnes), &erreur_memoire);
641:
642: if (erreur_memoire == d_vrai)
643: {
644: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
645: return;
646: }
647:
648: if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
649: {
650: (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
651: }
652: }
653:
654: free(accumulateur);
655: }
656: else if ((*s_objet_argument).type == MCX)
657: {
658: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
659: {
660: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
661: return;
662: }
663:
664: if ((accumulateur = malloc((*((struct_matrice *)
665: (*s_objet_argument).objet)).nombre_colonnes * sizeof(real8)))
666: == NULL)
667: {
668: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
669: return;
670: }
671:
672: (*((real8 *) (*s_objet_resultat).objet)) = 0;
673:
674: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
675: .nombre_lignes; i++)
676: {
677: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
678: .nombre_colonnes; j++)
679: {
680: f77absc_(&(((struct_complexe16 **) (*((struct_matrice *)
681: (*s_objet_argument).objet)).tableau)[i][j]),
682: &(((real8 *) accumulateur)[j]));
683: }
684:
685: cumul_reel = sommation_vecteur_reel(accumulateur,
686: &((*((struct_matrice *) (*s_objet_argument).objet))
687: .nombre_colonnes), &erreur_memoire);
688:
689: if (erreur_memoire == d_vrai)
690: {
691: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
692: return;
693: }
694:
695: if (cumul_reel > (*((real8 *) (*s_objet_resultat).objet)))
696: {
697: (*((real8 *) (*s_objet_resultat).objet)) = cumul_reel;
698: }
699: }
700:
701: free(accumulateur);
702: }
703: /*
704: --------------------------------------------------------------------------------
705: Traitement impossible du fait du type de l'argument
706: --------------------------------------------------------------------------------
707: */
708:
709: else
710: {
711: liberation(s_etat_processus, s_objet_argument);
712:
713: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
714: return;
715: }
716:
717: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
718: s_objet_resultat) == d_erreur)
719: {
720: return;
721: }
722:
723: liberation(s_etat_processus, s_objet_argument);
724:
725: return;
726: }
727:
728:
729: /*
730: ================================================================================
731: Fonction 'rceq'
732: ================================================================================
733: Entrées : pointeur sur une structure struct_processus
734: --------------------------------------------------------------------------------
735: Sorties :
736: --------------------------------------------------------------------------------
737: Effets de bord : néant
738: ================================================================================
739: */
740:
741: void
742: instruction_rceq(struct_processus *s_etat_processus)
743: {
744: logical1 presence_variable;
745:
746: long i;
747:
748: struct_objet *s_objet_variable;
749:
750: (*s_etat_processus).erreur_execution = d_ex;
751:
752: if ((*s_etat_processus).affichage_arguments == 'Y')
753: {
754: printf("\n RCEQ ");
755:
756: if ((*s_etat_processus).langue == 'F')
757: {
758: printf("(rappel de la variable EQ)\n\n");
759: }
760: else
761: {
762: printf("(recall EQ variable)\n\n");
763: }
764:
765: printf("-> 1: %s, %s, %s, %s, %s, %s,\n"
766: " %s, %s, %s, %s, %s,\n"
767: " %s, %s, %s, %s, %s,\n"
768: " %s, %s, %s, %s,\n"
769: " %s, %s\n",
770: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
771: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
772: d_SQL, d_SLB, d_PRC, d_MTX);
773:
774: return;
775: }
776: else if ((*s_etat_processus).test_instruction == 'Y')
777: {
778: (*s_etat_processus).nombre_arguments = -1;
779: return;
780: }
781:
782: if (test_cfsf(s_etat_processus, 31) == d_vrai)
783: {
784: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
785: {
786: return;
787: }
788: }
789:
790: if (recherche_variable(s_etat_processus, "EQ") == d_vrai)
791: {
792: i = (*s_etat_processus).position_variable_courante;
793: presence_variable = d_faux;
794:
795: while(i >= 0)
796: {
797: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom, "EQ")
798: == 0) && ((*s_etat_processus).s_liste_variables[i]
799: .niveau == 1))
800: {
801: presence_variable = d_vrai;
802: break;
803: }
804:
805: i--;
806: }
807:
808: (*s_etat_processus).position_variable_courante = i;
809:
810: if (presence_variable == d_faux)
811: {
812: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
813: return;
814: }
815:
816: if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
817: {
818: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
819: return;
820: }
821: }
822: else
823: {
824: (*s_etat_processus).erreur_systeme = d_es;
825: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
826: return;
827: }
828:
829: if ((s_objet_variable = copie_objet(s_etat_processus,
830: ((*s_etat_processus).s_liste_variables)
831: [(*s_etat_processus).position_variable_courante].objet, 'P'))
832: == NULL)
833: {
834: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
835: return;
836: }
837:
838: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
839: s_objet_variable) == d_erreur)
840: {
841: return;
842: }
843:
844: return;
845: }
846:
847:
848: /*
849: ================================================================================
850: Fonction 'res'
851: ================================================================================
852: Entrées : pointeur sur une structure struct_processus
853: --------------------------------------------------------------------------------
854: Sorties :
855: --------------------------------------------------------------------------------
856: Effets de bord : néant
857: ================================================================================
858: */
859:
860: void
861: instruction_res(struct_processus *s_etat_processus)
862: {
863: struct_objet *s_objet;
864:
865: (*s_etat_processus).erreur_execution = d_ex;
866:
867: if ((*s_etat_processus).affichage_arguments == 'Y')
868: {
869: printf("\n RES ");
870:
871: if ((*s_etat_processus).langue == 'F')
872: {
873: printf("(résolution)\n\n");
874: }
875: else
876: {
877: printf("(resolution)\n\n");
878: }
879:
880: printf(" 1: %s, %s\n", d_INT, d_REL);
881:
882: return;
883: }
884: else if ((*s_etat_processus).test_instruction == 'Y')
885: {
886: (*s_etat_processus).nombre_arguments = -1;
887: return;
888: }
889:
890: if (test_cfsf(s_etat_processus, 31) == d_vrai)
891: {
892: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
893: {
894: return;
895: }
896: }
897:
898: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
899: &s_objet) == d_erreur)
900: {
901: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
902: return;
903: }
904:
905: if ((*s_objet).type == INT)
906: {
907: if ((*((integer8 *) (*s_objet).objet)) <= 0)
908: {
909: liberation(s_etat_processus, s_objet);
910:
911: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
912: return;
913: }
914:
915: (*s_etat_processus).resolution = (real8) (*((integer8 *)
916: (*s_objet).objet));
917: }
918: else if ((*s_objet).type == REL)
919: {
920: if ((*((real8 *) (*s_objet).objet)) <= 0)
921: {
922: liberation(s_etat_processus, s_objet);
923:
924: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
925: return;
926: }
927:
928: (*s_etat_processus).resolution = (*((real8 *) (*s_objet).objet));
929: }
930: else
931: {
932: liberation(s_etat_processus, s_objet);
933:
934: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
935: return;
936: }
937:
938: liberation(s_etat_processus, s_objet);
939: return;
940: }
941:
942:
943: /*
944: ================================================================================
945: Fonction 'recall'
946: ================================================================================
947: Entrées : pointeur sur une structure struct_processus
948: --------------------------------------------------------------------------------
949: Sorties :
950: --------------------------------------------------------------------------------
951: Effets de bord : néant
952: ================================================================================
953: */
954:
955: void
956: instruction_recall(struct_processus *s_etat_processus)
957: {
958: file *pipe;
959: file *fichier;
960:
961: int caractere;
962: int ios;
963:
964: logical1 drapeau_fin;
965: logical1 indicateur_48;
966: logical1 presence_chaine;
967:
968: long i;
969: long nombre_caracteres_source;
970:
971: struct_objet *s_objet;
972:
973: unsigned char autorisation_empilement_programme;
974: unsigned char *chaine;
975: unsigned char *commande;
976: unsigned char *executable_candidat;
977:
978: # ifndef OS2
979: unsigned char *instructions = "%s/bin/rpliconv %s "
980: "`%s/bin/rplfile "
981: "-m %s/share/rplfiles -i %s | "
982: "%s/bin/rplawk "
983: "'{ print $3; }' | %s/bin/rplawk -F= '{ if "
984: "($2 != \"\") printf(\"-f %%s\", $2); }'` "
985: "-t `locale charmap` | %s/bin/%s -o %s";
986: # else
987: unsigned char *instructions = BOURNE_SHELL
988: " -c \"%s/bin/rpliconv %s "
989: "`%s/bin/rplfile "
990: "-m %s/share/rplfiles -i %s | "
991: "%s/bin/rplawk "
992: "'{ print $3; }' | %s/bin/rplawk -F= '{ if "
993: "($2 != \\\"\\\") printf(\\\"-f %%s\\\", "
994: "$2); }'` -t `" d_locale
995: "` | %s/bin/%s -o %s\"";
996: # endif
997:
998: unsigned char *nom_fichier_temporaire;
999: unsigned char *tampon_definitions_chainees;
1000: unsigned char *tampon_instruction_courante;
1001:
1002: unsigned long position_courante;
1003:
1004: (*s_etat_processus).erreur_execution = d_ex;
1005:
1006: if ((*s_etat_processus).affichage_arguments == 'Y')
1007: {
1008: printf("\n RECALL ");
1009:
1010: if ((*s_etat_processus).langue == 'F')
1011: {
1012: printf("(rappel d'une variable stockée sur disque)\n\n");
1013: }
1014: else
1015: {
1016: printf("(recall a variable stored on disk)\n\n");
1017: }
1018:
1019: printf(" 1: %s\n", d_CHN);
1020: printf("-> 1: %s, %s, %s, %s, %s, %s,\n"
1021: " %s, %s, %s, %s, %s,\n"
1022: " %s, %s, %s, %s, %s\n",
1023: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
1024: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN);
1025:
1026: return;
1027: }
1028: else if ((*s_etat_processus).test_instruction == 'Y')
1029: {
1030: (*s_etat_processus).nombre_arguments = -1;
1031: return;
1032: }
1033:
1034: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1035: {
1036: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1037: {
1038: return;
1039: }
1040: }
1041:
1042: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1043: &s_objet) == d_erreur)
1044: {
1045: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1046: return;
1047: }
1048:
1049: if ((*s_objet).type == CHN)
1050: {
1051: if ((fichier = fopen((unsigned char *) (*s_objet).objet, "r")) == NULL)
1052: {
1053: liberation(s_etat_processus, s_objet);
1054:
1055: (*s_etat_processus).erreur_execution = d_ex_erreur_fichier;
1056: return;
1057: }
1058:
1059: if (fclose(fichier) != 0)
1060: {
1061: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1062: return;
1063: }
1064:
1065: if ((nom_fichier_temporaire = creation_nom_fichier(s_etat_processus,
1066: (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
1067: {
1068: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1069: return;
1070: }
1071:
1072: if ((*s_etat_processus).rpl_home == NULL)
1073: {
1074: if ((commande = malloc((strlen(ds_preprocesseur) +
1075: (2 * strlen((unsigned char *) (*s_objet).objet)) +
1076: (6 * strlen(d_exec_path)) +
1077: strlen(nom_fichier_temporaire) + strlen(instructions) - 19)
1078: * sizeof(unsigned char))) == NULL)
1079: {
1080: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1081: return;
1082: }
1083:
1084: sprintf(commande, instructions, d_exec_path,
1085: (unsigned char *) (*s_objet).objet,
1086: d_exec_path, d_exec_path,
1087: (unsigned char *) (*s_objet).objet,
1088: d_exec_path, d_exec_path,
1089: d_exec_path, ds_preprocesseur, nom_fichier_temporaire);
1090:
1091: if (alsprintf(&executable_candidat, "%s/bin/rpliconv",
1092: d_exec_path) < 0)
1093: {
1094: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1095: return;
1096: }
1097:
1098: if (controle(s_etat_processus, executable_candidat, "md5",
1099: rpliconv_md5) != d_vrai)
1100: {
1101: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1102: return;
1103: }
1104:
1105: if (controle(s_etat_processus, executable_candidat, "sha1",
1106: rpliconv_sha1) != d_vrai)
1107: {
1108: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1109: return;
1110: }
1111:
1112: free(executable_candidat);
1113:
1114: if (alsprintf(&executable_candidat, "%s/bin/rplfile",
1115: d_exec_path) < 0)
1116: {
1117: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1118: return;
1119: }
1120:
1121: if (controle(s_etat_processus, executable_candidat, "md5",
1122: rplfile_md5) != d_vrai)
1123: {
1124: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1125: return;
1126: }
1127:
1128: if (controle(s_etat_processus, executable_candidat, "sha1",
1129: rplfile_sha1) != d_vrai)
1130: {
1131: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1132: return;
1133: }
1134:
1135: free(executable_candidat);
1136:
1137: if (alsprintf(&executable_candidat, "%s/bin/rplpp",
1138: d_exec_path) < 0)
1139: {
1140: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1141: return;
1142: }
1143:
1144: if (controle(s_etat_processus, executable_candidat, "md5",
1145: rplpp_md5) != d_vrai)
1146: {
1147: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1148: return;
1149: }
1150:
1151: if (controle(s_etat_processus, executable_candidat, "sha1",
1152: rplpp_sha1) != d_vrai)
1153: {
1154: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1155: return;
1156: }
1157:
1158: free(executable_candidat);
1159:
1160: if (alsprintf(&executable_candidat, "%s/bin/rplawk",
1161: d_exec_path) < 0)
1162: {
1163: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1164: return;
1165: }
1166:
1167: if (controle(s_etat_processus, executable_candidat, "md5",
1168: rplawk_md5) != d_vrai)
1169: {
1170: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1171: return;
1172: }
1173:
1174: if (controle(s_etat_processus, executable_candidat, "sha1",
1175: rplawk_sha1) != d_vrai)
1176: {
1177: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1178: return;
1179: }
1180:
1181: free(executable_candidat);
1182: }
1183: else
1184: {
1185: if ((commande = malloc((strlen(ds_preprocesseur) +
1186: (2 * strlen((unsigned char *) (*s_objet).objet)) +
1187: (6 * strlen((*s_etat_processus).rpl_home)) +
1188: strlen(nom_fichier_temporaire) + strlen(instructions) - 19)
1189: * sizeof(unsigned char))) == NULL)
1190: {
1191: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1192: return;
1193: }
1194:
1195: sprintf(commande, instructions, (*s_etat_processus).rpl_home,
1196: (unsigned char *) (*s_objet).objet,
1197: (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home,
1198: (unsigned char *) (*s_objet).objet,
1199: (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home,
1200: (*s_etat_processus).rpl_home, ds_preprocesseur,
1201: nom_fichier_temporaire);
1202:
1203: if (alsprintf(&executable_candidat, "%s/bin/rpliconv",
1204: (*s_etat_processus).rpl_home) < 0)
1205: {
1206: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1207: return;
1208: }
1209:
1210: if (controle(s_etat_processus, executable_candidat, "md5",
1211: rpliconv_md5) != d_vrai)
1212: {
1213: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1214: return;
1215: }
1216:
1217: if (controle(s_etat_processus, executable_candidat, "sha1",
1218: rpliconv_sha1) != d_vrai)
1219: {
1220: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1221: return;
1222: }
1223:
1224: free(executable_candidat);
1225:
1226: if (alsprintf(&executable_candidat, "%s/bin/rplfile",
1227: (*s_etat_processus).rpl_home) < 0)
1228: {
1229: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1230: return;
1231: }
1232:
1233: if (controle(s_etat_processus, executable_candidat, "md5",
1234: rplfile_md5) != d_vrai)
1235: {
1236: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1237: return;
1238: }
1239:
1240: if (controle(s_etat_processus, executable_candidat, "sha1",
1241: rplfile_sha1) != d_vrai)
1242: {
1243: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1244: return;
1245: }
1246:
1247: free(executable_candidat);
1248:
1249: if (alsprintf(&executable_candidat, "%s/bin/rplpp",
1250: (*s_etat_processus).rpl_home) < 0)
1251: {
1252: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1253: return;
1254: }
1255:
1256: if (controle(s_etat_processus, executable_candidat, "md5",
1257: rplpp_md5) != d_vrai)
1258: {
1259: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1260: return;
1261: }
1262:
1263: if (controle(s_etat_processus, executable_candidat, "sha1",
1264: rplpp_sha1) != d_vrai)
1265: {
1266: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1267: return;
1268: }
1269:
1270: free(executable_candidat);
1271:
1272: if (alsprintf(&executable_candidat, "%s/bin/rplawk",
1273: d_exec_path) < 0)
1274: {
1275: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1276: return;
1277: }
1278:
1279: if (controle(s_etat_processus, executable_candidat, "md5",
1280: rplawk_md5) != d_vrai)
1281: {
1282: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1283: return;
1284: }
1285:
1286: if (controle(s_etat_processus, executable_candidat, "sha1",
1287: rplawk_sha1) != d_vrai)
1288: {
1289: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
1290: return;
1291: }
1292:
1293: free(executable_candidat);
1294: }
1295:
1296: if ((pipe = popen(commande, "r")) == NULL)
1297: {
1298: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1299: return;
1300: }
1301:
1302: if ((ios = pclose(pipe)) != EXIT_SUCCESS)
1303: {
1304: liberation(s_etat_processus, s_objet);
1305: free(commande);
1306:
1307: (*s_etat_processus).erreur_execution = d_ex_erreur_fichier;
1308: return;
1309: }
1310: else if (ios == -1)
1311: {
1312: (*s_etat_processus).erreur_systeme = d_es_processus;
1313: return;
1314: }
1315:
1316: free(commande);
1317:
1318: nombre_caracteres_source = 0;
1319:
1320: if ((pipe = fopen(nom_fichier_temporaire, "r")) == NULL)
1321: {
1322: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1323: return;
1324: }
1325:
1326: while(getc(pipe) != EOF)
1327: {
1328: nombre_caracteres_source++;
1329: }
1330:
1331: if (nombre_caracteres_source == 0)
1332: {
1333: if (fclose(pipe) == -1)
1334: {
1335: (*s_etat_processus).erreur_systeme = d_es_processus;
1336: return;
1337: }
1338:
1339: liberation(s_etat_processus, s_objet);
1340:
1341: if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
1342: {
1343: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1344: return;
1345: }
1346:
1347: free(nom_fichier_temporaire);
1348:
1349: (*s_etat_processus).erreur_execution = d_ex_fichier_vide;
1350: return;
1351: }
1352:
1353: if ((chaine = malloc((nombre_caracteres_source + 1)
1354: * sizeof(unsigned char))) == NULL)
1355: {
1356: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1357: return;
1358: }
1359:
1360: rewind(pipe);
1361:
1362: i = 0;
1363: drapeau_fin = d_faux;
1364: presence_chaine = d_faux;
1365:
1366: while(drapeau_fin == d_faux)
1367: {
1368: if ((caractere = getc(pipe)) != EOF)
1369: {
1370: if ((caractere == d_code_retour_chariot) ||
1371: (caractere == d_code_tabulation) ||
1372: ((caractere == d_code_espace) &&
1373: (presence_chaine == d_faux)))
1374: {
1375: do
1376: {
1377: caractere = getc(pipe);
1378: } while(((caractere == d_code_retour_chariot) ||
1379: (caractere == d_code_tabulation) ||
1380: ((caractere == d_code_espace) &&
1381: (presence_chaine == d_faux))) &&
1382: (caractere != EOF));
1383:
1384: if (caractere != EOF)
1385: {
1386: chaine[i++] = d_code_espace;
1387: }
1388: else
1389: {
1390: drapeau_fin = d_vrai;
1391: }
1392: }
1393:
1394: if ((chaine[i] = caractere) == '\"')
1395: {
1396: if (i > 0)
1397: {
1398: if (chaine[i - 1] != '\\')
1399: {
1400: presence_chaine = (presence_chaine == d_faux)
1401: ? d_vrai : d_faux;
1402: }
1403: }
1404:
1405: i++;
1406: }
1407: else
1408: {
1409: i++;
1410: }
1411: }
1412: else
1413: {
1414: drapeau_fin = d_vrai;
1415: }
1416: }
1417:
1418: if ((caractere == EOF) && (i > 0))
1419: {
1420: i--;
1421: }
1422:
1423: chaine[i] = d_code_fin_chaine;
1424:
1425: if (fclose(pipe) != 0)
1426: {
1427: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1428: return;
1429: }
1430:
1431: indicateur_48 = test_cfsf(s_etat_processus, 48);
1432: cf(s_etat_processus, 48);
1433:
1434: tampon_definitions_chainees = (*s_etat_processus).definitions_chainees;
1435: tampon_instruction_courante = (*s_etat_processus).instruction_courante;
1436: position_courante = (*s_etat_processus).position_courante;
1437: autorisation_empilement_programme = (*s_etat_processus)
1438: .autorisation_empilement_programme;
1439:
1440: (*s_etat_processus).instruction_courante = NULL;
1441:
1442: if (((*s_etat_processus).definitions_chainees = transliteration(
1443: s_etat_processus, chaine, "UTF-8", d_locale)) == NULL)
1444: {
1445: if (indicateur_48 == d_vrai)
1446: {
1447: sf(s_etat_processus, 48);
1448: }
1449: else
1450: {
1451: cf(s_etat_processus, 48);
1452: }
1453:
1454: if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
1455: {
1456: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1457: return;
1458: }
1459:
1460: free(nom_fichier_temporaire);
1461: free((*s_etat_processus).instruction_courante);
1462: free(chaine);
1463:
1464: (*s_etat_processus).position_courante = position_courante;
1465: (*s_etat_processus).instruction_courante =
1466: tampon_instruction_courante;
1467: (*s_etat_processus).definitions_chainees =
1468: tampon_definitions_chainees;
1469: (*s_etat_processus).autorisation_empilement_programme =
1470: autorisation_empilement_programme;
1471:
1472: liberation(s_etat_processus, s_objet);
1473: return;
1474: }
1475:
1476: (*s_etat_processus).autorisation_empilement_programme = 'Y';
1477: (*s_etat_processus).position_courante = 0;
1478:
1479: if (analyse_syntaxique(s_etat_processus) == d_erreur)
1480: {
1481: if (indicateur_48 == d_vrai)
1482: {
1483: sf(s_etat_processus, 48);
1484: }
1485: else
1486: {
1487: cf(s_etat_processus, 48);
1488: }
1489:
1490: if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
1491: {
1492: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1493: return;
1494: }
1495:
1496: free(nom_fichier_temporaire);
1497: free((*s_etat_processus).instruction_courante);
1498: free((*s_etat_processus).definitions_chainees);
1499: free(chaine);
1500:
1501: (*s_etat_processus).position_courante = position_courante;
1502: (*s_etat_processus).instruction_courante =
1503: tampon_instruction_courante;
1504: (*s_etat_processus).definitions_chainees =
1505: tampon_definitions_chainees;
1506: (*s_etat_processus).autorisation_empilement_programme =
1507: autorisation_empilement_programme;
1508:
1509: liberation(s_etat_processus, s_objet);
1510: return;
1511: }
1512:
1513: (*s_etat_processus).position_courante = 0;
1514:
1515: if (recherche_instruction_suivante(s_etat_processus) !=
1516: d_absence_erreur)
1517: {
1518: if (indicateur_48 == d_vrai)
1519: {
1520: sf(s_etat_processus, 48);
1521: }
1522: else
1523: {
1524: cf(s_etat_processus, 48);
1525: }
1526:
1527: if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
1528: {
1529: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1530: return;
1531: }
1532:
1533: free(nom_fichier_temporaire);
1534: free((*s_etat_processus).instruction_courante);
1535: free((*s_etat_processus).definitions_chainees);
1536: free(chaine);
1537:
1538: (*s_etat_processus).position_courante = position_courante;
1539: (*s_etat_processus).instruction_courante =
1540: tampon_instruction_courante;
1541: (*s_etat_processus).definitions_chainees =
1542: tampon_definitions_chainees;
1543: (*s_etat_processus).autorisation_empilement_programme =
1544: autorisation_empilement_programme;
1545:
1546: liberation(s_etat_processus, s_objet);
1547: return;
1548: }
1549:
1550: recherche_type(s_etat_processus);
1551:
1552: while((*s_etat_processus).definitions_chainees
1553: [(*s_etat_processus).position_courante] != d_code_fin_chaine)
1554: {
1555: if ((*s_etat_processus).definitions_chainees
1556: [(*s_etat_processus).position_courante++] != d_code_espace)
1557: {
1558: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1559: }
1560: }
1561:
1562: free((*s_etat_processus).instruction_courante);
1563: free((*s_etat_processus).definitions_chainees);
1564: free(chaine);
1565:
1566: (*s_etat_processus).position_courante = position_courante;
1567: (*s_etat_processus).instruction_courante =
1568: tampon_instruction_courante;
1569: (*s_etat_processus).definitions_chainees =
1570: tampon_definitions_chainees;
1571: (*s_etat_processus).autorisation_empilement_programme =
1572: autorisation_empilement_programme;
1573:
1574: if (indicateur_48 == d_vrai)
1575: {
1576: sf(s_etat_processus, 48);
1577: }
1578: else
1579: {
1580: cf(s_etat_processus, 48);
1581: }
1582:
1583: if (destruction_fichier(nom_fichier_temporaire) == d_erreur)
1584: {
1585: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1586: return;
1587: }
1588:
1589: free(nom_fichier_temporaire);
1590: }
1591: else
1592: {
1593: liberation(s_etat_processus, s_objet);
1594:
1595: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1596: return;
1597: }
1598:
1599: liberation(s_etat_processus, s_objet);
1600: return;
1601: }
1602:
1603:
1604: /*
1605: ================================================================================
1606: Fonction 'rcws'
1607: ================================================================================
1608: Entrées : pointeur sur une structure struct_processus
1609: --------------------------------------------------------------------------------
1610: Sorties :
1611: --------------------------------------------------------------------------------
1612: Effets de bord : néant
1613: ================================================================================
1614: */
1615:
1616: void
1617: instruction_rcws(struct_processus *s_etat_processus)
1618: {
1619: struct_objet *s_objet_resultat;
1620:
1621: unsigned long i;
1622: unsigned long j;
1623: unsigned long longueur;
1624:
1625: (*s_etat_processus).erreur_execution = d_ex;
1626:
1627: if ((*s_etat_processus).affichage_arguments == 'Y')
1628: {
1629: printf("\n RCWS ");
1630:
1631: if ((*s_etat_processus).langue == 'F')
1632: {
1633: printf("(rappel de la longueur des entiers binaires)\n\n");
1634: }
1635: else
1636: {
1637: printf("(recall the length of the binary integers)\n\n");
1638: }
1639:
1640: printf("-> 1: %s\n", d_INT);
1641:
1642: return;
1643: }
1644: else if ((*s_etat_processus).test_instruction == 'Y')
1645: {
1646: (*s_etat_processus).nombre_arguments = -1;
1647: return;
1648: }
1649:
1650: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1651: {
1652: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1653: {
1654: return;
1655: }
1656: }
1657:
1658: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1659: {
1660: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1661: return;
1662: }
1663:
1664: longueur = 1;
1665: j = 1;
1666:
1667: for(i = 37; i <= 42; i++)
1668: {
1669: longueur += (test_cfsf(s_etat_processus, (unsigned char) i)
1670: == d_vrai) ? j : 0;
1671: j *= 2;
1672: }
1673:
1674: (*((integer8 *) (*s_objet_resultat).objet)) = longueur;
1675:
1676: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1677: s_objet_resultat) == d_erreur)
1678: {
1679: return;
1680: }
1681:
1682: return;
1683: }
1684:
1685:
1686: /*
1687: ================================================================================
1688: Fonction 'rcls'
1689: ================================================================================
1690: Entrées : pointeur sur une structure struct_processus
1691: --------------------------------------------------------------------------------
1692: Sorties :
1693: --------------------------------------------------------------------------------
1694: Effets de bord : néant
1695: ================================================================================
1696: */
1697:
1698: void
1699: instruction_rcls(struct_processus *s_etat_processus)
1700: {
1701: logical1 presence_variable;
1702:
1703: long i;
1704:
1705: struct_objet *s_objet_variable;
1706:
1707: (*s_etat_processus).erreur_execution = d_ex;
1708:
1709: if ((*s_etat_processus).affichage_arguments == 'Y')
1710: {
1711: printf("\n RCLS ");
1712:
1713: if ((*s_etat_processus).langue == 'F')
1714: {
1715: printf("(rappel de la variable %s)\n\n", ds_sdat);
1716: }
1717: else
1718: {
1719: printf("(recall %s variable)\n\n", ds_sdat);
1720: }
1721:
1722: printf("-> 1: %s, %s, %s, %s, %s, %s,\n"
1723: " %s, %s, %s, %s, %s,\n"
1724: " %s, %s, %s, %s, %s,\n"
1725: " %s\n",
1726: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
1727: d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
1728:
1729: return;
1730: }
1731: else if ((*s_etat_processus).test_instruction == 'Y')
1732: {
1733: (*s_etat_processus).nombre_arguments = -1;
1734: return;
1735: }
1736:
1737: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1738: {
1739: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1740: {
1741: return;
1742: }
1743: }
1744:
1745: if (recherche_variable(s_etat_processus, ds_sdat) == d_vrai)
1746: {
1747: i = (*s_etat_processus).position_variable_courante;
1748: presence_variable = d_faux;
1749:
1750: while(i >= 0)
1751: {
1752: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom, ds_sdat)
1753: == 0) && ((*s_etat_processus).s_liste_variables[i]
1754: .niveau == 1))
1755: {
1756: presence_variable = d_vrai;
1757: break;
1758: }
1759:
1760: i--;
1761: }
1762:
1763: (*s_etat_processus).position_variable_courante = i;
1764:
1765: if (presence_variable == d_faux)
1766: {
1767: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1768: return;
1769: }
1770:
1771: if ((*s_etat_processus).s_liste_variables[i].objet == NULL)
1772: {
1773: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
1774: return;
1775: }
1776: }
1777: else
1778: {
1779: (*s_etat_processus).erreur_systeme = d_es;
1780: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1781: return;
1782: }
1783:
1784: if ((s_objet_variable = copie_objet(s_etat_processus,
1785: ((*s_etat_processus).s_liste_variables)
1786: [(*s_etat_processus).position_variable_courante].objet, 'O'))
1787: == NULL)
1788: {
1789: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1790: return;
1791: }
1792:
1793: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1794: s_objet_variable) == d_erreur)
1795: {
1796: return;
1797: }
1798:
1799: return;
1800: }
1801:
1802: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>