1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.10
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 'rad'
29: ================================================================================
30: Entrées : structure processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_rad(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 RAD ");
46:
47: if ((*s_etat_processus).langue == 'F')
48: {
49: printf("(arguments en radians)\n\n");
50: printf(" Aucun argument\n");
51: }
52: else
53: {
54: printf("(radians)\n\n");
55: printf(" No argument\n");
56: }
57:
58: return;
59: }
60: else if ((*s_etat_processus).test_instruction == 'Y')
61: {
62: (*s_etat_processus).nombre_arguments = -1;
63: return;
64: }
65:
66: sf(s_etat_processus, 60);
67:
68: return;
69: }
70:
71:
72: /*
73: ================================================================================
74: Fonction 'roll'
75: ================================================================================
76: Entrées : structure processus
77: --------------------------------------------------------------------------------
78: Sorties :
79: --------------------------------------------------------------------------------
80: Effets de bord : néant
81: ================================================================================
82: */
83:
84: void
85: instruction_roll(struct_processus *s_etat_processus)
86: {
87: struct_liste_chainee *l_liste1;
88: struct_liste_chainee *l_liste2;
89:
90: struct_objet *s_objet;
91:
92: unsigned long i;
93:
94: (*s_etat_processus).erreur_execution = d_ex;
95:
96: if ((*s_etat_processus).affichage_arguments == 'Y')
97: {
98: printf("\n ROLL ");
99:
100: if ((*s_etat_processus).langue == 'F')
101: {
102: printf("(défilement d'un objet vers le haut)\n\n");
103: }
104: else
105: {
106: printf("(roll up objects on stack)\n\n");
107: }
108:
109: printf(" n+1: %s, %s, %s, %s, %s, %s,\n"
110: " %s, %s, %s, %s, %s,\n"
111: " %s, %s, %s, %s, %s,\n"
112: " %s, %s, %s, %s,\n"
113: " %s, %s\n",
114: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
115: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
116: d_SQL, d_SLB, d_PRC, d_MTX);
117: printf(" ...\n");
118: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
119: " %s, %s, %s, %s, %s,\n"
120: " %s, %s, %s, %s, %s,\n"
121: " %s, %s, %s, %s,\n"
122: " %s, %s\n",
123: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
124: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
125: d_SQL, d_SLB, d_PRC, d_MTX);
126: printf(" 1: %s\n", d_INT);
127: printf("-> n: %s, %s, %s, %s, %s, %s,\n"
128: " %s, %s, %s, %s, %s,\n"
129: " %s, %s, %s, %s, %s,\n"
130: " %s, %s, %s, %s,\n"
131: " %s, %s\n",
132: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
133: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
134: d_SQL, d_SLB, d_PRC, d_MTX);
135: printf(" ...\n");
136: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
137: " %s, %s, %s, %s, %s,\n"
138: " %s, %s, %s, %s, %s,\n"
139: " %s, %s, %s, %s,\n"
140: " %s, %s\n",
141: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
142: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
143: d_SQL, d_SLB, d_PRC, d_MTX);
144:
145: return;
146: }
147: else if ((*s_etat_processus).test_instruction == 'Y')
148: {
149: (*s_etat_processus).nombre_arguments = -1;
150: return;
151: }
152:
153: if (test_cfsf(s_etat_processus, 31) == d_vrai)
154: {
155: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
156: {
157: return;
158: }
159: }
160:
161: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
162: &s_objet) == d_erreur)
163: {
164: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
165: return;
166: }
167:
168: if ((*s_objet).type != INT)
169: {
170: liberation(s_etat_processus, s_objet);
171:
172: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
173: return;
174: }
175:
176: if ((*((integer8 *) (*s_objet).objet)) <= 0)
177: {
178:
179: /*
180: -- Opération absurde autorisée sur le calculateur HP-28S -----------------------
181: */
182:
183: liberation(s_etat_processus, s_objet);
184:
185: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
186: return;
187: }
188:
189: if ((*((integer8 *) (*s_objet).objet)) > (integer8) (*s_etat_processus)
190: .hauteur_pile_operationnelle)
191: {
192: liberation(s_etat_processus, s_objet);
193:
194: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
195: return;
196: }
197:
198: if ((*((integer8 *) (*s_objet).objet)) > 1)
199: {
200: l_liste1 = (*s_etat_processus).l_base_pile;
201:
202: for(i = 2; i < (unsigned long) (*((integer8 *) (*s_objet).objet)); i++)
203: {
204: l_liste1 = (*l_liste1).suivant;
205: }
206:
207: l_liste2 = (*l_liste1).suivant;
208: (*l_liste1).suivant = (*l_liste2).suivant;
209: (*l_liste2).suivant = (*s_etat_processus).l_base_pile;
210: (*s_etat_processus).l_base_pile = l_liste2;
211: }
212:
213: liberation(s_etat_processus, s_objet);
214:
215: return;
216: }
217:
218:
219: /*
220: ================================================================================
221: Fonction 'rolld'
222: ================================================================================
223: Entrées : structure processus
224: --------------------------------------------------------------------------------
225: Sorties :
226: --------------------------------------------------------------------------------
227: Effets de bord : néant
228: ================================================================================
229: */
230:
231: void
232: instruction_rolld(struct_processus *s_etat_processus)
233: {
234: struct_liste_chainee *l_liste1;
235: struct_liste_chainee *l_liste2;
236:
237: struct_objet *s_objet;
238:
239: unsigned long i;
240:
241: (*s_etat_processus).erreur_execution = d_ex;
242:
243: if ((*s_etat_processus).affichage_arguments == 'Y')
244: {
245: printf("\n ROLLD ");
246:
247: if ((*s_etat_processus).langue == 'F')
248: {
249: printf("(défilement d'un objet vers le bas)\n\n");
250: }
251: else
252: {
253: printf("(roll down objects on stack)\n\n");
254: }
255:
256: printf(" n+1: %s, %s, %s, %s, %s, %s,\n"
257: " %s, %s, %s, %s, %s,\n"
258: " %s, %s, %s, %s, %s,\n"
259: " %s, %s, %s, %s,\n"
260: " %s, %s\n",
261: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
262: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
263: d_SQL, d_SLB, d_PRC, d_MTX);
264: printf(" ...\n");
265: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
266: " %s, %s, %s, %s, %s,\n"
267: " %s, %s, %s, %s, %s,\n"
268: " %s, %s, %s, %s,\n"
269: " %s, %s\n",
270: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
271: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
272: d_SQL, d_SLB, d_PRC, d_MTX);
273: printf(" 1: %s\n", d_INT);
274: printf("-> n: %s, %s, %s, %s, %s, %s,\n"
275: " %s, %s, %s, %s, %s,\n"
276: " %s, %s, %s, %s, %s,\n"
277: " %s, %s, %s, %s,\n"
278: " %s, %s\n",
279: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
280: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
281: d_SQL, d_SLB, d_PRC, d_MTX);
282: printf(" ...\n");
283: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
284: " %s, %s, %s, %s, %s,\n"
285: " %s, %s, %s, %s, %s,\n"
286: " %s, %s, %s, %s,\n"
287: " %s, %s\n",
288: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
289: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
290: d_SQL, d_SLB, d_PRC, d_MTX);
291:
292: return;
293: }
294: else if ((*s_etat_processus).test_instruction == 'Y')
295: {
296: (*s_etat_processus).nombre_arguments = -1;
297: return;
298: }
299:
300: if (test_cfsf(s_etat_processus, 31) == d_vrai)
301: {
302: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
303: {
304: return;
305: }
306: }
307:
308: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
309: &s_objet) == d_erreur)
310: {
311: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
312: return;
313: }
314:
315: if ((*s_objet).type != INT)
316: {
317: liberation(s_etat_processus, s_objet);
318:
319: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
320: return;
321: }
322:
323: if ((*((integer8 *) (*s_objet).objet)) <= 0)
324: {
325:
326: /*
327: -- Opération absurde autorisée sur le calculateur HP-28S -----------------------
328: */
329:
330: liberation(s_etat_processus, s_objet);
331:
332: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
333: return;
334: }
335:
336: if ((*((integer8 *) (*s_objet).objet)) > (integer8) (*s_etat_processus)
337: .hauteur_pile_operationnelle)
338: {
339: liberation(s_etat_processus, s_objet);
340:
341: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
342: return;
343: }
344:
345: if ((*((integer8 *) (*s_objet).objet)) > 1)
346: {
347: l_liste1 = (*s_etat_processus).l_base_pile;
348:
349: for(i = 1; i < (unsigned long) (*((integer8 *) (*s_objet).objet)); i++)
350: {
351: l_liste1 = (*l_liste1).suivant;
352: }
353:
354: l_liste2 = (*s_etat_processus).l_base_pile;
355: (*s_etat_processus).l_base_pile = (*(*s_etat_processus)
356: .l_base_pile).suivant;
357: (*l_liste2).suivant = (*l_liste1).suivant;
358: (*l_liste1).suivant = l_liste2;
359: }
360:
361: liberation(s_etat_processus, s_objet);
362:
363: return;
364: }
365:
366:
367: /*
368: ================================================================================
369: Fonction 'rot'
370: ================================================================================
371: Entrées : structure processus
372: --------------------------------------------------------------------------------
373: Sorties :
374: --------------------------------------------------------------------------------
375: Effets de bord : néant
376: ================================================================================
377: */
378:
379: void
380: instruction_rot(struct_processus *s_etat_processus)
381: {
382: struct_liste_chainee *l_liste1;
383: struct_liste_chainee *l_liste2;
384:
385: (*s_etat_processus).erreur_execution = d_ex;
386:
387: if ((*s_etat_processus).affichage_arguments == 'Y')
388: {
389: printf("\n ROT ");
390:
391: if ((*s_etat_processus).langue == 'F')
392: {
393: printf("(rotation)\n\n");
394: }
395: else
396: {
397: printf("(rotation)\n");
398: }
399:
400: printf(" 3: %s, %s, %s, %s, %s, %s,\n"
401: " %s, %s, %s, %s, %s,\n"
402: " %s, %s, %s, %s, %s,\n"
403: " %s, %s, %s, %s,\n"
404: " %s, %s\n",
405: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
406: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
407: d_SQL, d_SLB, d_PRC, d_MTX);
408: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
409: " %s, %s, %s, %s, %s,\n"
410: " %s, %s, %s, %s, %s,\n"
411: " %s, %s, %s, %s,\n"
412: " %s, %s\n",
413: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
414: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
415: d_SQL, d_SLB, d_PRC, d_MTX);
416: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
417: " %s, %s, %s, %s, %s,\n"
418: " %s, %s, %s, %s, %s,\n"
419: " %s, %s, %s, %s,\n"
420: " %s, %s\n",
421: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
422: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
423: d_SQL, d_SLB, d_PRC, d_MTX);
424: printf("-> 3: %s, %s, %s, %s, %s, %s,\n"
425: " %s, %s, %s, %s, %s,\n"
426: " %s, %s, %s, %s, %s,\n"
427: " %s, %s, %s, %s,\n"
428: " %s, %s\n",
429: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
430: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
431: d_SQL, d_SLB, d_PRC, d_MTX);
432: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
433: " %s, %s, %s, %s, %s,\n"
434: " %s, %s, %s, %s, %s,\n"
435: " %s, %s, %s, %s,\n"
436: " %s, %s\n",
437: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
438: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
439: d_SQL, d_SLB, d_PRC, d_MTX);
440: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
441: " %s, %s, %s, %s, %s,\n"
442: " %s, %s, %s, %s, %s,\n"
443: " %s, %s, %s, %s,\n"
444: " %s, %s\n",
445: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
446: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
447: d_SQL, d_SLB, d_PRC, d_MTX);
448:
449: return;
450: }
451: else if ((*s_etat_processus).test_instruction == 'Y')
452: {
453: (*s_etat_processus).nombre_arguments = -1;
454: return;
455: }
456:
457: if (test_cfsf(s_etat_processus, 31) == d_vrai)
458: {
459: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
460: {
461: return;
462: }
463: }
464:
465: if ((*s_etat_processus).hauteur_pile_operationnelle < 3)
466: {
467: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
468: return;
469: }
470:
471: l_liste1 = (*(*s_etat_processus).l_base_pile).suivant;
472: l_liste2 = (*l_liste1).suivant;
473: (*l_liste1).suivant = (*l_liste2).suivant;
474: (*l_liste2).suivant = (*s_etat_processus).l_base_pile;
475: (*s_etat_processus).l_base_pile = l_liste2;
476:
477: return;
478: }
479:
480:
481: /*
482: ================================================================================
483: Fonction 'repeat'
484: ================================================================================
485: Entrées : structure processus
486: --------------------------------------------------------------------------------
487: Sorties :
488: --------------------------------------------------------------------------------
489: Effets de bord : néant
490: ================================================================================
491: */
492:
493: void
494: instruction_repeat(struct_processus *s_etat_processus)
495: {
496: struct_objet *s_objet;
497:
498: logical1 condition;
499: logical1 drapeau_fin;
500: logical1 execution;
501:
502: struct_liste_chainee *s_registre;
503:
504: unsigned char *instruction_majuscule;
505: unsigned char *tampon;
506:
507: unsigned long niveau;
508:
509: void (*fonction)();
510:
511: (*s_etat_processus).erreur_execution = d_ex;
512:
513: if ((*s_etat_processus).affichage_arguments == 'Y')
514: {
515: printf("\n REPEAT ");
516:
517: if ((*s_etat_processus).langue == 'F')
518: {
519: printf("(structure de contrôle)\n\n");
520: printf(" Utilisation :\n\n");
521: }
522: else
523: {
524: printf("(control statement)\n\n");
525: printf(" Usage:\n\n");
526: }
527:
528: printf(" WHILE\n");
529: printf(" (clause)\n");
530: printf(" REPEAT\n");
531: printf(" (expression 1)\n");
532: printf(" EXIT\n");
533: printf(" (expression 2)\n");
534: printf(" END\n\n");
535:
536: printf(" WHILE\n");
537: printf(" (clause)\n");
538: printf(" REPEAT\n");
539: printf(" (expression)\n");
540: printf(" END\n");
541:
542: return;
543: }
544: else if ((*s_etat_processus).test_instruction == 'Y')
545: {
546: (*s_etat_processus).nombre_arguments = -1;
547: return;
548: }
549:
550: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
551: &s_objet) == d_erreur)
552: {
553: return;
554: }
555:
556: if (((*s_objet).type == INT) ||
557: ((*s_objet).type == REL))
558: {
559: if ((*s_objet).type == INT)
560: {
561: condition = ((*((integer8 *) (*s_objet).objet)) == 0)
562: ? d_faux : d_vrai;
563: }
564: else
565: {
566: condition = ((*((real8 *) (*s_objet).objet)) == 0)
567: ? d_faux : d_vrai;
568: }
569:
570: if (condition == d_faux)
571: {
572: niveau = 0;
573: (*(*s_etat_processus).l_base_pile_systeme).clause = 'M';
574: drapeau_fin = d_faux;
575:
576: if ((*s_etat_processus).mode_execution_programme == 'Y')
577: {
578: tampon = (*s_etat_processus).instruction_courante;
579:
580: do
581: {
582: if (recherche_instruction_suivante(s_etat_processus) !=
583: d_absence_erreur)
584: {
585: liberation(s_etat_processus, s_objet);
586:
587: if ((*s_etat_processus).instruction_courante != NULL)
588: {
589: free((*s_etat_processus).instruction_courante);
590: }
591:
592: (*s_etat_processus).instruction_courante = tampon;
593: (*s_etat_processus).erreur_execution =
594: d_ex_erreur_traitement_condition;
595: return;
596: }
597:
598: if ((instruction_majuscule = conversion_majuscule(
599: (*s_etat_processus).instruction_courante)) == NULL)
600: {
601: liberation(s_etat_processus, s_objet);
602:
603: free((*s_etat_processus).instruction_courante);
604: (*s_etat_processus).instruction_courante = tampon;
605: (*s_etat_processus).erreur_systeme =
606: d_es_allocation_memoire;
607: return;
608: }
609:
610:
611: if (niveau == 0)
612: {
613: if ((strcmp(instruction_majuscule, "END") == 0)
614: || (strcmp(instruction_majuscule, "ELSE") == 0)
615: || (strcmp(instruction_majuscule, "ELSEIF")
616: == 0))
617: {
618: (*s_etat_processus).position_courante -= (strlen(
619: instruction_majuscule) + 1);
620: drapeau_fin = d_vrai;
621: }
622: else
623: {
624: drapeau_fin = d_faux;
625: }
626: }
627: else
628: {
629: drapeau_fin = d_faux;
630: }
631:
632: if ((strcmp(instruction_majuscule, "CASE") == 0) ||
633: (strcmp(instruction_majuscule, "DO") == 0) ||
634: (strcmp(instruction_majuscule, "IF") == 0) ||
635: (strcmp(instruction_majuscule, "IFERR") == 0) ||
636: (strcmp(instruction_majuscule, "SELECT") == 0)
637: || (strcmp(instruction_majuscule, "WHILE")
638: == 0))
639: {
640: niveau++;
641: }
642: else if (strcmp(instruction_majuscule, "END") == 0)
643: {
644: niveau--;
645: }
646:
647: free(instruction_majuscule);
648: free((*s_etat_processus).instruction_courante);
649: } while(drapeau_fin == d_faux);
650:
651: (*s_etat_processus).instruction_courante = tampon;
652: }
653: else
654: {
655: /*
656: * Vérification du pointeur de prédiction de saut
657: */
658:
659: if (pthread_mutex_lock(&((*(*(*s_etat_processus)
660: .expression_courante).donnee).mutex)) != 0)
661: {
662: (*s_etat_processus).erreur_systeme = d_es_processus;
663: return;
664: }
665:
666: if ((*((struct_fonction *) (*(*(*s_etat_processus)
667: .expression_courante).donnee).objet)).prediction_saut
668: != NULL)
669: {
670: s_registre = (*s_etat_processus).expression_courante;
671:
672: (*s_etat_processus).expression_courante =
673: (struct_liste_chainee *)
674: (*((struct_fonction *) (*(*(*s_etat_processus)
675: .expression_courante).donnee).objet))
676: .prediction_saut;
677: fonction = (*((struct_fonction *)
678: (*(*(*s_etat_processus).expression_courante)
679: .donnee).objet)).fonction;
680: execution = (*((struct_fonction *)
681: (*(*s_registre).donnee).objet))
682: .prediction_execution;
683:
684: if (pthread_mutex_unlock(&((*(*s_registre).donnee).mutex))
685: != 0)
686: {
687: (*s_etat_processus).erreur_systeme = d_es_processus;
688: return;
689: }
690:
691: if (execution == d_vrai)
692: {
693: fonction(s_etat_processus);
694: }
695: }
696: else
697: {
698: if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
699: .expression_courante).donnee).mutex)) != 0)
700: {
701: (*s_etat_processus).erreur_systeme = d_es_processus;
702: return;
703: }
704:
705: s_registre = (*s_etat_processus).expression_courante;
706: execution = d_faux;
707:
708: do
709: {
710: if (((*s_etat_processus).expression_courante =
711: (*(*s_etat_processus)
712: .expression_courante).suivant) == NULL)
713: {
714: liberation(s_etat_processus, s_objet);
715:
716: (*s_etat_processus).erreur_execution =
717: d_ex_erreur_traitement_condition;
718: return;
719: }
720:
721: if ((*(*(*s_etat_processus).expression_courante)
722: .donnee).type == FCT)
723: {
724: fonction = (*((struct_fonction *)
725: (*(*(*s_etat_processus).expression_courante)
726: .donnee).objet)).fonction;
727:
728: if (niveau == 0)
729: {
730: if ((fonction == instruction_end) ||
731: (fonction == instruction_else) ||
732: (fonction == instruction_elseif))
733: {
734: fonction(s_etat_processus);
735: execution = d_vrai;
736: drapeau_fin = d_vrai;
737: }
738: else
739: {
740: drapeau_fin = d_faux;
741: }
742: }
743: else
744: {
745: drapeau_fin = d_faux;
746: }
747:
748: if ((fonction == instruction_case) ||
749: (fonction == instruction_do) ||
750: (fonction == instruction_if) ||
751: (fonction == instruction_iferr) ||
752: (fonction == instruction_select) ||
753: (fonction == instruction_while))
754: {
755: niveau++;
756: }
757: else if (fonction == instruction_end)
758: {
759: niveau--;
760: }
761: }
762: } while(drapeau_fin == d_faux);
763:
764: if (pthread_mutex_lock(&((*(*(*s_etat_processus)
765: .expression_courante).donnee).mutex)) != 0)
766: {
767: (*s_etat_processus).erreur_systeme = d_es_processus;
768: return;
769: }
770:
771: (*((struct_fonction *) (*(*s_registre).donnee).objet))
772: .prediction_saut = (*s_etat_processus)
773: .expression_courante;
774: (*((struct_fonction *) (*(*s_registre).donnee).objet))
775: .prediction_execution = execution;
776:
777: if (pthread_mutex_unlock(&((*(*(*s_etat_processus)
778: .expression_courante).donnee).mutex)) != 0)
779: {
780: (*s_etat_processus).erreur_systeme = d_es_processus;
781: return;
782: }
783: }
784: }
785: }
786: }
787: else
788: {
789: liberation(s_etat_processus, s_objet);
790:
791: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
792: return;
793: }
794:
795: liberation(s_etat_processus, s_objet);
796:
797: return;
798: }
799:
800:
801: /*
802: ================================================================================
803: Fonction 'rclf'
804: ================================================================================
805: Entrées : structure processus
806: --------------------------------------------------------------------------------
807: Sorties :
808: --------------------------------------------------------------------------------
809: Effets de bord : néant
810: ================================================================================
811: */
812:
813: void
814: instruction_rclf(struct_processus *s_etat_processus)
815: {
816: struct_objet *s_objet_resultat;
817:
818: t_8_bits masque;
819:
820: unsigned char indice_bit;
821: unsigned char indice_bloc;
822: unsigned char indice_drapeau;
823: unsigned char taille_bloc;
824:
825: unsigned long i;
826:
827: (*s_etat_processus).erreur_execution = d_ex;
828:
829: if ((*s_etat_processus).affichage_arguments == 'Y')
830: {
831: printf("\n RCLF ");
832:
833: if ((*s_etat_processus).langue == 'F')
834: {
835: printf("(renvoie les drapeaux d'état)\n\n");
836: }
837: else
838: {
839: printf("(recall flags)\n\n");
840: }
841:
842: printf("-> 1: %s\n", d_BIN);
843:
844: return;
845: }
846: else if ((*s_etat_processus).test_instruction == 'Y')
847: {
848: (*s_etat_processus).nombre_arguments = -1;
849: return;
850: }
851:
852: if (test_cfsf(s_etat_processus, 31) == d_vrai)
853: {
854: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
855: {
856: return;
857: }
858: }
859:
860: if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL)
861: {
862: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
863: return;
864: }
865:
866: (*((logical8 *) (*s_objet_resultat).objet)) = 0;
867: taille_bloc = sizeof(t_8_bits) * 8;
868:
869: for(i = 1; i <= 64; i++)
870: {
871: indice_drapeau = i - 1;
872: indice_bloc = indice_drapeau / taille_bloc;
873: indice_bit = indice_drapeau % taille_bloc;
874: masque = ((t_8_bits) 1) << (taille_bloc - indice_bit - 1);
875:
876: if (((*s_etat_processus).drapeaux_etat[indice_bloc] & masque) != 0)
877: {
878: (*((logical8 *) (*s_objet_resultat).objet)) |=
879: ((logical8) 1) << indice_drapeau;
880: }
881: }
882:
883: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
884: s_objet_resultat) == d_erreur)
885: {
886: return;
887: }
888:
889: return;
890: }
891:
892:
893: /*
894: ================================================================================
895: Fonction 'rcl'
896: ================================================================================
897: Entrées : structure processus
898: -------------------------------------------------------------------------------
899: Sorties :
900: --------------------------------------------------------------------------------
901: Effets de bord : néant
902: ================================================================================
903: */
904:
905: void
906: instruction_rcl(struct_processus *s_etat_processus)
907: {
908: logical1 presence_variable;
909:
910: long i;
911:
912: struct_objet *s_objet;
913: struct_objet *s_objet_variable;
914:
915: (*s_etat_processus).erreur_execution = d_ex;
916:
917: if ((*s_etat_processus).affichage_arguments == 'Y')
918: {
919: printf("\n RCL ");
920:
921: if ((*s_etat_processus).langue == 'F')
922: {
923: printf("(renvoie le contenu d'une variable globale)\n\n");
924: }
925: else
926: {
927: printf("(recall global variable)\n\n");
928: }
929:
930: printf(" 1: %s\n", d_NOM);
931: printf("-> 1: %s, %s, %s, %s, %s, %s,\n"
932: " %s, %s, %s, %s, %s,\n"
933: " %s, %s, %s, %s, %s,\n"
934: " %s, %s, %s, %s,\n"
935: " %s, %s\n",
936: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
937: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
938: d_SQL, d_SLB, d_PRC, d_MTX);
939:
940: return;
941: }
942: else if ((*s_etat_processus).test_instruction == 'Y')
943: {
944: (*s_etat_processus).nombre_arguments = -1;
945: return;
946: }
947:
948: if (test_cfsf(s_etat_processus, 31) == d_vrai)
949: {
950: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
951: {
952: return;
953: }
954: }
955:
956: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
957: &s_objet) == d_erreur)
958: {
959: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
960: return;
961: }
962:
963: if ((*s_objet).type != NOM)
964: {
965: liberation(s_etat_processus, s_objet);
966:
967: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
968: return;
969: }
970:
971: if (recherche_variable(s_etat_processus, (*((struct_nom *)
972: (*s_objet).objet)).nom) == d_faux)
973: {
974: liberation(s_etat_processus, s_objet);
975:
976: (*s_etat_processus).erreur_systeme = d_es;
977: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
978: return;
979: }
980:
981: i = (*s_etat_processus).position_variable_courante;
982: presence_variable = d_faux;
983:
984: while(i >= 0)
985: {
986: if ((strcmp((*s_etat_processus).s_liste_variables[i].nom,
987: (*((struct_nom *) (*s_objet).objet)).nom) == 0) &&
988: ((*s_etat_processus).s_liste_variables[i].niveau == 1))
989: {
990: presence_variable = d_vrai;
991: break;
992: }
993:
994: i--;
995: }
996:
997: (*s_etat_processus).position_variable_courante = i;
998:
999: if (presence_variable == d_faux)
1000: {
1001: liberation(s_etat_processus, s_objet);
1002:
1003: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1004: return;
1005: }
1006:
1007: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
1008: .position_variable_courante].objet == NULL)
1009: {
1010: liberation(s_etat_processus, s_objet);
1011:
1012: (*s_etat_processus).erreur_systeme = d_es;
1013: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
1014: return;
1015: }
1016:
1017: if ((s_objet_variable = copie_objet(s_etat_processus,
1018: ((*s_etat_processus).s_liste_variables)
1019: [(*s_etat_processus).position_variable_courante].objet, 'P'))
1020: == NULL)
1021: {
1022: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1023: return;
1024: }
1025:
1026: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1027: s_objet_variable) == d_erreur)
1028: {
1029: return;
1030: }
1031:
1032: liberation(s_etat_processus, s_objet);
1033:
1034: return;
1035: }
1036:
1037:
1038: /*
1039: ================================================================================
1040: Fonction 'rand'
1041: ================================================================================
1042: Entrées : structure processus
1043: -------------------------------------------------------------------------------
1044: Sorties :
1045: --------------------------------------------------------------------------------
1046: Effets de bord : néant
1047: ================================================================================
1048: */
1049:
1050: void
1051: instruction_rand(struct_processus *s_etat_processus)
1052: {
1053: struct_objet *s_objet;
1054:
1055: (*s_etat_processus).erreur_execution = d_ex;
1056:
1057: if ((*s_etat_processus).affichage_arguments == 'Y')
1058: {
1059: printf("\n RAND ");
1060:
1061: if ((*s_etat_processus).langue == 'F')
1062: {
1063: printf("(variable aléatoire uniforme)\n\n");
1064: }
1065: else
1066: {
1067: printf("(uniform random number)\n\n");
1068: }
1069:
1070: printf("-> 1: %s\n", d_REL);
1071:
1072: return;
1073: }
1074: else if ((*s_etat_processus).test_instruction == 'Y')
1075: {
1076: (*s_etat_processus).nombre_arguments = -1;
1077: return;
1078: }
1079:
1080: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1081: {
1082: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1083: {
1084: return;
1085: }
1086: }
1087:
1088: if ((*s_etat_processus).generateur_aleatoire == NULL)
1089: {
1090: initialisation_generateur_aleatoire(s_etat_processus, d_vrai, 0);
1091: }
1092:
1093: if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
1094: {
1095: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1096: return;
1097: }
1098:
1099: (*((real8 *) (*s_objet).objet)) = gsl_rng_uniform(
1100: (*s_etat_processus).generateur_aleatoire);
1101:
1102: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1103: s_objet) == d_erreur)
1104: {
1105: return;
1106: }
1107:
1108: return;
1109: }
1110:
1111:
1112: /*
1113: ================================================================================
1114: Fonction 'rdz'
1115: ================================================================================
1116: Entrées : structure processus
1117: -------------------------------------------------------------------------------
1118: Sorties :
1119: --------------------------------------------------------------------------------
1120: Effets de bord : néant
1121: ================================================================================
1122: */
1123:
1124: void
1125: instruction_rdz(struct_processus *s_etat_processus)
1126: {
1127: struct_objet *s_objet;
1128:
1129: (*s_etat_processus).erreur_execution = d_ex;
1130:
1131: if ((*s_etat_processus).affichage_arguments == 'Y')
1132: {
1133: printf("\n RDZ ");
1134:
1135: if ((*s_etat_processus).langue == 'F')
1136: {
1137: printf("(racine des nombres aléatoires)\n\n");
1138: }
1139: else
1140: {
1141: printf("(random seed)\n\n");
1142: }
1143:
1144: printf(" 1: %s\n", d_INT);
1145:
1146: return;
1147: }
1148: else if ((*s_etat_processus).test_instruction == 'Y')
1149: {
1150: (*s_etat_processus).nombre_arguments = -1;
1151: return;
1152: }
1153:
1154: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1155: {
1156: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1157: {
1158: return;
1159: }
1160: }
1161:
1162: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1163: &s_objet) == d_erreur)
1164: {
1165: return;
1166: }
1167:
1168: if ((*s_objet).type == INT)
1169: {
1170: initialisation_generateur_aleatoire(s_etat_processus, d_faux,
1171: (unsigned long int) (*((integer8 *) (*s_objet).objet)));
1172: }
1173: else
1174: {
1175: liberation(s_etat_processus, s_objet);
1176:
1177: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1178: return;
1179: }
1180:
1181: liberation(s_etat_processus, s_objet);
1182: }
1183:
1184:
1185: /*
1186: ================================================================================
1187: Fonction 'rnd'
1188: ================================================================================
1189: Entrées : structure processus
1190: --------------------------------------------------------------------------------
1191: Sorties :
1192: --------------------------------------------------------------------------------
1193: Effets de bord : néant
1194: ================================================================================
1195: */
1196:
1197: void
1198: instruction_rnd(struct_processus *s_etat_processus)
1199: {
1200: struct_objet *s_objet_argument;
1201:
1202: unsigned char *instruction_courante;
1203:
1204: (*s_etat_processus).erreur_execution = d_ex;
1205:
1206: if ((*s_etat_processus).affichage_arguments == 'Y')
1207: {
1208: printf("\n RND ");
1209:
1210: if ((*s_etat_processus).langue == 'F')
1211: {
1212: printf("(arrondi)\n\n");
1213: }
1214: else
1215: {
1216: printf("(rounding)\n\n");
1217: }
1218:
1219: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
1220: " %s, %s, %s\n",
1221: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
1222: printf("-> 1: %s, %s, %s, %s, %s, %s,\n"
1223: " %s, %s, %s\n",
1224: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
1225:
1226: return;
1227: }
1228: else if ((*s_etat_processus).test_instruction == 'Y')
1229: {
1230: (*s_etat_processus).nombre_arguments = 1;
1231: return;
1232: }
1233:
1234: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1235: {
1236: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1237: {
1238: return;
1239: }
1240: }
1241:
1242: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1243: &s_objet_argument) == d_erreur)
1244: {
1245: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1246: return;
1247: }
1248:
1249: if (((*s_objet_argument).type == INT) ||
1250: ((*s_objet_argument).type == REL) ||
1251: ((*s_objet_argument).type == CPL) ||
1252: ((*s_objet_argument).type == VIN) ||
1253: ((*s_objet_argument).type == VRL) ||
1254: ((*s_objet_argument).type == VCX) ||
1255: ((*s_objet_argument).type == MIN) ||
1256: ((*s_objet_argument).type == MRL) ||
1257: ((*s_objet_argument).type == MCX))
1258: {
1259: instruction_courante = (*s_etat_processus).instruction_courante;
1260:
1261: if (((*s_etat_processus).instruction_courante =
1262: formateur(s_etat_processus, 0, s_objet_argument)) == NULL)
1263: {
1264: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1265: (*s_etat_processus).instruction_courante = instruction_courante;
1266: return;
1267: }
1268:
1269: recherche_type(s_etat_processus);
1270:
1271: free((*s_etat_processus).instruction_courante);
1272: (*s_etat_processus).instruction_courante = instruction_courante;
1273:
1274: if ((*s_etat_processus).erreur_systeme != d_es)
1275: {
1276: return;
1277: }
1278:
1279: if ((*s_etat_processus).erreur_execution != d_ex)
1280: {
1281: liberation(s_etat_processus, s_objet_argument);
1282: return;
1283: }
1284: }
1285: else
1286: {
1287: liberation(s_etat_processus, s_objet_argument);
1288:
1289: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1290: return;
1291: }
1292:
1293: liberation(s_etat_processus, s_objet_argument);
1294:
1295: return;
1296: }
1297:
1298:
1299: /*
1300: ================================================================================
1301: Fonction 'r->c'
1302: ================================================================================
1303: Entrées : structure processus
1304: --------------------------------------------------------------------------------
1305: Sorties :
1306: --------------------------------------------------------------------------------
1307: Effets de bord : néant
1308: ================================================================================
1309: */
1310:
1311: void
1312: instruction_r_vers_c(struct_processus *s_etat_processus)
1313: {
1314: struct_objet *s_objet_argument_1;
1315: struct_objet *s_objet_argument_2;
1316: struct_objet *s_objet_resultat;
1317:
1318: unsigned long i;
1319: unsigned long j;
1320:
1321: (*s_etat_processus).erreur_execution = d_ex;
1322:
1323: if ((*s_etat_processus).affichage_arguments == 'Y')
1324: {
1325: printf("\n R->C ");
1326:
1327: if ((*s_etat_processus).langue == 'F')
1328: {
1329: printf("(réel vers complexe)\n\n");
1330: }
1331: else
1332: {
1333: printf("(real to complex)\n\n");
1334: }
1335:
1336: printf(" 2: %s, %s\n", d_INT, d_REL);
1337: printf(" 1: %s, %s\n", d_INT, d_REL);
1338: printf("-> 1: %s\n\n", d_CPL);
1339:
1340: printf(" 2: %s, %s\n", d_VIN, d_VRL);
1341: printf(" 1: %s, %s\n", d_VIN, d_VRL);
1342: printf("-> 1: %s\n\n", d_VCX);
1343:
1344: printf(" 2: %s, %s\n", d_MIN, d_MRL);
1345: printf(" 1: %s, %s\n", d_MIN, d_MRL);
1346: printf("-> 1: %s\n", d_MCX);
1347:
1348: return;
1349: }
1350: else if ((*s_etat_processus).test_instruction == 'Y')
1351: {
1352: (*s_etat_processus).nombre_arguments = -1;
1353: return;
1354: }
1355:
1356: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1357: {
1358: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1359: {
1360: return;
1361: }
1362: }
1363:
1364: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1365: &s_objet_argument_1) == d_erreur)
1366: {
1367: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1368: return;
1369: }
1370:
1371: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1372: &s_objet_argument_2) == d_erreur)
1373: {
1374: liberation(s_etat_processus, s_objet_argument_1);
1375:
1376: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1377: return;
1378: }
1379:
1380: /*
1381: --------------------------------------------------------------------------------
1382: Formation d'un complexe à partir de deux réels
1383: --------------------------------------------------------------------------------
1384: */
1385:
1386: if ((((*s_objet_argument_1).type == INT) ||
1387: ((*s_objet_argument_1).type == REL)) &&
1388: (((*s_objet_argument_2).type == INT) ||
1389: ((*s_objet_argument_2).type == REL)))
1390: {
1391: if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL)
1392: {
1393: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1394: return;
1395: }
1396:
1397: if ((*s_objet_argument_1).type == INT)
1398: {
1399: (*((struct_complexe16 *) (*s_objet_resultat).objet))
1400: .partie_imaginaire =
1401: (*((integer8 *) (*s_objet_argument_1).objet));
1402: }
1403: else
1404: {
1405: (*((struct_complexe16 *) (*s_objet_resultat).objet))
1406: .partie_imaginaire =
1407: (*((real8 *) (*s_objet_argument_1).objet));
1408: }
1409:
1410: if ((*s_objet_argument_2).type == INT)
1411: {
1412: (*((struct_complexe16 *) (*s_objet_resultat).objet))
1413: .partie_reelle =
1414: (*((integer8 *) (*s_objet_argument_2).objet));
1415: }
1416: else
1417: {
1418: (*((struct_complexe16 *) (*s_objet_resultat).objet))
1419: .partie_reelle =
1420: (*((real8 *) (*s_objet_argument_2).objet));
1421: }
1422: }
1423:
1424: /*
1425: --------------------------------------------------------------------------------
1426: Formation à partir de deux vecteurs
1427: --------------------------------------------------------------------------------
1428: */
1429:
1430: else if ((((*s_objet_argument_1).type == VIN) ||
1431: ((*s_objet_argument_1).type == VRL)) &&
1432: (((*s_objet_argument_2).type == VIN) ||
1433: ((*s_objet_argument_2).type == VRL)))
1434: {
1435: if ((*(((struct_vecteur *) (*s_objet_argument_1).objet))).taille !=
1436: (*(((struct_vecteur *) (*s_objet_argument_2).objet))).taille)
1437: {
1438: liberation(s_etat_processus, s_objet_argument_1);
1439: liberation(s_etat_processus, s_objet_argument_2);
1440:
1441: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
1442: return;
1443: }
1444:
1445: if ((s_objet_resultat = allocation(s_etat_processus, VCX)) == NULL)
1446: {
1447: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1448: return;
1449: }
1450:
1451: (*((struct_vecteur *) (*s_objet_resultat).objet)).taille =
1452: (*((struct_vecteur *) (*s_objet_argument_1).objet)).taille;
1453:
1454: if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau =
1455: malloc((*(((struct_vecteur *) (*s_objet_resultat)
1456: .objet))).taille * sizeof(struct_complexe16))) == NULL)
1457: {
1458: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1459: return;
1460: }
1461:
1462: for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument_1).objet)))
1463: .taille; i++)
1464: {
1465: if ((*s_objet_argument_1).type == VIN)
1466: {
1467: ((struct_complexe16 *) (*((struct_vecteur *)
1468: (*s_objet_resultat).objet)).tableau)[i]
1469: .partie_imaginaire = ((integer8 *)
1470: (*((struct_vecteur *) (*s_objet_argument_1).objet))
1471: .tableau)[i];
1472: }
1473: else
1474: {
1475: ((struct_complexe16 *) (*((struct_vecteur *)
1476: (*s_objet_resultat).objet)).tableau)[i]
1477: .partie_imaginaire = ((real8 *)
1478: (*((struct_vecteur *) (*s_objet_argument_1).objet))
1479: .tableau)[i];
1480: }
1481:
1482: if ((*s_objet_argument_2).type == VIN)
1483: {
1484: ((struct_complexe16 *) (*((struct_vecteur *)
1485: (*s_objet_resultat).objet)).tableau)[i]
1486: .partie_reelle = ((integer8 *)
1487: (*((struct_vecteur *) (*s_objet_argument_2).objet))
1488: .tableau)[i];
1489: }
1490: else
1491: {
1492: ((struct_complexe16 *) (*((struct_vecteur *)
1493: (*s_objet_resultat).objet)).tableau)[i]
1494: .partie_reelle = ((real8 *)
1495: (*((struct_vecteur *) (*s_objet_argument_2).objet))
1496: .tableau)[i];
1497: }
1498: }
1499: }
1500:
1501: /*
1502: --------------------------------------------------------------------------------
1503: Formation à partir de deux matrices
1504: --------------------------------------------------------------------------------
1505: */
1506:
1507: else if ((((*s_objet_argument_1).type == MIN) ||
1508: ((*s_objet_argument_1).type == MRL)) &&
1509: (((*s_objet_argument_2).type == MIN) ||
1510: ((*s_objet_argument_2).type == MRL)))
1511: {
1512: if (((*(((struct_matrice *) (*s_objet_argument_1).objet)))
1513: .nombre_lignes != (*(((struct_matrice *) (*s_objet_argument_2)
1514: .objet))).nombre_lignes) || ((*(((struct_matrice *)
1515: (*s_objet_argument_1).objet))).nombre_colonnes !=
1516: (*(((struct_matrice *) (*s_objet_argument_2).objet)))
1517: .nombre_lignes))
1518: {
1519: liberation(s_etat_processus, s_objet_argument_1);
1520: liberation(s_etat_processus, s_objet_argument_2);
1521:
1522: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
1523: return;
1524: }
1525:
1526: if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
1527: {
1528: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1529: return;
1530: }
1531:
1532: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
1533: (*((struct_matrice *) (*s_objet_argument_1).objet))
1534: .nombre_lignes;
1535: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
1536: (*((struct_matrice *) (*s_objet_argument_1).objet))
1537: .nombre_colonnes;
1538:
1539: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
1540: malloc((*(((struct_matrice *) (*s_objet_resultat)
1541: .objet))).nombre_lignes * sizeof(struct_complexe16 *))) == NULL)
1542: {
1543: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1544: return;
1545: }
1546:
1547: for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument_1).objet)))
1548: .nombre_lignes; i++)
1549: {
1550: if ((((struct_complexe16 **) (*((struct_matrice *)
1551: (*s_objet_resultat).objet)).tableau)[i] =
1552: malloc((*((struct_matrice *)
1553: (*s_objet_resultat).objet)).nombre_colonnes *
1554: sizeof(struct_complexe16))) == NULL)
1555: {
1556: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1557: return;
1558: }
1559:
1560: for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument_1).objet)))
1561: .nombre_colonnes; j++)
1562: {
1563: if ((*s_objet_argument_1).type == MIN)
1564: {
1565: ((struct_complexe16 **) (*((struct_matrice *)
1566: (*s_objet_resultat).objet)).tableau)[i][j]
1567: .partie_imaginaire = ((integer8 **)
1568: (*((struct_matrice *) (*s_objet_argument_1).objet))
1569: .tableau)[i][j];
1570: }
1571: else
1572: {
1573: ((struct_complexe16 **) (*((struct_matrice *)
1574: (*s_objet_resultat).objet)).tableau)[i][j]
1575: .partie_imaginaire = ((real8 **)
1576: (*((struct_matrice *) (*s_objet_argument_1).objet))
1577: .tableau)[i][j];
1578: }
1579:
1580: if ((*s_objet_argument_2).type == MIN)
1581: {
1582: ((struct_complexe16 **) (*((struct_matrice *)
1583: (*s_objet_resultat).objet)).tableau)[i][j]
1584: .partie_reelle = ((integer8 **)
1585: (*((struct_matrice *) (*s_objet_argument_2).objet))
1586: .tableau)[i][j];
1587: }
1588: else
1589: {
1590: ((struct_complexe16 **) (*((struct_matrice *)
1591: (*s_objet_resultat).objet)).tableau)[i][j]
1592: .partie_reelle = ((real8 **)
1593: (*((struct_matrice *) (*s_objet_argument_2).objet))
1594: .tableau)[i][j];
1595: }
1596: }
1597: }
1598: }
1599:
1600: /*
1601: --------------------------------------------------------------------------------
1602: Formation impossible
1603: --------------------------------------------------------------------------------
1604: */
1605:
1606: else
1607: {
1608: liberation(s_etat_processus, s_objet_argument_1);
1609: liberation(s_etat_processus, s_objet_argument_2);
1610:
1611: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1612: return;
1613: }
1614:
1615: liberation(s_etat_processus, s_objet_argument_1);
1616: liberation(s_etat_processus, s_objet_argument_2);
1617:
1618: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1619: s_objet_resultat) == d_erreur)
1620: {
1621: return;
1622: }
1623:
1624: return;
1625: }
1626:
1627:
1628: /*
1629: ================================================================================
1630: Fonction 're'
1631: ================================================================================
1632: Entrées : structure processus
1633: --------------------------------------------------------------------------------
1634: Sorties :
1635: --------------------------------------------------------------------------------
1636: Effets de bord : néant
1637: ================================================================================
1638: */
1639:
1640: void
1641: instruction_re(struct_processus *s_etat_processus)
1642: {
1643: struct_liste_chainee *l_element_courant;
1644: struct_liste_chainee *l_element_precedent;
1645:
1646: struct_objet *s_copie_argument;
1647: struct_objet *s_objet_argument;
1648: struct_objet *s_objet_resultat;
1649:
1650: unsigned long i;
1651: unsigned long j;
1652:
1653: (*s_etat_processus).erreur_execution = d_ex;
1654:
1655: if ((*s_etat_processus).affichage_arguments == 'Y')
1656: {
1657: printf("\n RE ");
1658:
1659: if ((*s_etat_processus).langue == 'F')
1660: {
1661: printf("(partie réelle)\n\n");
1662: }
1663: else
1664: {
1665: printf("(real part)\n\n");
1666: }
1667:
1668: printf(" 1: %s, %s\n", d_INT, d_REL);
1669: printf("-> 1: %s\n\n", d_INT);
1670:
1671: printf(" 1: %s\n", d_CPL);
1672: printf("-> 1: %s\n\n", d_REL);
1673:
1674: printf(" 1: %s, %s\n", d_VIN, d_VRL);
1675: printf("-> 1: %s\n\n", d_VIN);
1676:
1677: printf(" 1: %s\n", d_VCX);
1678: printf("-> 1: %s\n\n", d_VRL);
1679:
1680: printf(" 1: %s, %s\n", d_MIN, d_MRL);
1681: printf("-> 1: %s\n\n", d_MIN);
1682:
1683: printf(" 1: %s\n", d_MCX);
1684: printf("-> 1: %s\n\n", d_MRL);
1685:
1686: printf(" 1: %s, %s\n", d_NOM, d_ALG);
1687: printf("-> 1: %s\n\n", d_ALG);
1688:
1689: printf(" 1: %s\n", d_RPN);
1690: printf("-> 1: %s\n", d_RPN);
1691:
1692: return;
1693: }
1694: else if ((*s_etat_processus).test_instruction == 'Y')
1695: {
1696: (*s_etat_processus).nombre_arguments = 1;
1697: return;
1698: }
1699:
1700: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1701: {
1702: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1703: {
1704: return;
1705: }
1706: }
1707:
1708: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1709: &s_objet_argument) == d_erreur)
1710: {
1711: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1712: return;
1713: }
1714:
1715: /*
1716: --------------------------------------------------------------------------------
1717: Partie réelle d'un entier ou d'un réel
1718: --------------------------------------------------------------------------------
1719: */
1720:
1721: if (((*s_objet_argument).type == INT) ||
1722: ((*s_objet_argument).type == REL))
1723: {
1724: s_objet_resultat = s_objet_argument;
1725: s_objet_argument = NULL;
1726: }
1727:
1728: /*
1729: --------------------------------------------------------------------------------
1730: Partie réelle d'un complexe
1731: --------------------------------------------------------------------------------
1732: */
1733:
1734: else if ((*s_objet_argument).type == CPL)
1735: {
1736: if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
1737: {
1738: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1739: return;
1740: }
1741:
1742: (*((real8 *) (*s_objet_resultat).objet)) =
1743: (*((struct_complexe16 *) (*s_objet_argument).objet))
1744: .partie_reelle;
1745: }
1746:
1747: /*
1748: --------------------------------------------------------------------------------
1749: Partie réelle d'un vecteur
1750: --------------------------------------------------------------------------------
1751: */
1752:
1753: else if (((*s_objet_argument).type == VIN) ||
1754: ((*s_objet_argument).type == VRL))
1755: {
1756: s_objet_resultat = s_objet_argument;
1757: s_objet_argument = NULL;
1758: }
1759: else if ((*s_objet_argument).type == VCX)
1760: {
1761: if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
1762: {
1763: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1764: return;
1765: }
1766:
1767: if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau =
1768: malloc((*(((struct_vecteur *) (*s_objet_argument)
1769: .objet))).taille * sizeof(real8))) == NULL)
1770: {
1771: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1772: return;
1773: }
1774:
1775: (*((struct_vecteur *) (*s_objet_resultat).objet)).taille =
1776: (*(((struct_vecteur *) (*s_objet_argument).objet))).taille;
1777:
1778: for(i = 0; i < (*(((struct_vecteur *) (*s_objet_argument).objet)))
1779: .taille; i++)
1780: {
1781: ((real8 *) (*((struct_vecteur *) (*s_objet_resultat).objet))
1782: .tableau)[i] = ((struct_complexe16 *) (*((struct_vecteur *)
1783: (*s_objet_argument).objet)).tableau)[i].partie_reelle;
1784: }
1785: }
1786:
1787: /*
1788: --------------------------------------------------------------------------------
1789: Partie réelle d'une matrice
1790: --------------------------------------------------------------------------------
1791: */
1792:
1793: else if (((*s_objet_argument).type == MIN) ||
1794: ((*s_objet_argument).type == MRL))
1795: {
1796: s_objet_resultat = s_objet_argument;
1797: s_objet_argument = NULL;
1798: }
1799: else if ((*s_objet_argument).type == MCX)
1800: {
1801: if ((s_objet_resultat = allocation(s_etat_processus, MRL)) == NULL)
1802: {
1803: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1804: return;
1805: }
1806:
1807: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
1808: malloc((*(((struct_matrice *) (*s_objet_argument)
1809: .objet))).nombre_lignes * sizeof(real8 *))) == NULL)
1810: {
1811: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1812: return;
1813: }
1814:
1815: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
1816: (*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes;
1817: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
1818: (*((struct_matrice *) (*s_objet_argument).objet))
1819: .nombre_colonnes;
1820:
1821: for(i = 0; i < (*(((struct_matrice *) (*s_objet_argument).objet)))
1822: .nombre_lignes; i++)
1823: {
1824: if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat)
1825: .objet)).tableau)[i] = malloc(
1826: (*(((struct_matrice *) (*s_objet_argument).objet)))
1827: .nombre_colonnes * sizeof(real8))) == NULL)
1828: {
1829: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1830: return;
1831: }
1832:
1833: for(j = 0; j < (*(((struct_matrice *) (*s_objet_argument).objet)))
1834: .nombre_colonnes; j++)
1835: {
1836: ((real8 **) (*((struct_matrice *) (*s_objet_resultat).objet))
1837: .tableau)[i][j] = ((struct_complexe16 **)
1838: (*((struct_matrice *) (*s_objet_argument).objet))
1839: .tableau)[i][j].partie_reelle;
1840: }
1841: }
1842: }
1843:
1844: /*
1845: --------------------------------------------------------------------------------
1846: Partie réelle d'un nom
1847: --------------------------------------------------------------------------------
1848: */
1849:
1850: else if ((*s_objet_argument).type == NOM)
1851: {
1852: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
1853: {
1854: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1855: return;
1856: }
1857:
1858: if (((*s_objet_resultat).objet =
1859: allocation_maillon(s_etat_processus)) == NULL)
1860: {
1861: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1862: return;
1863: }
1864:
1865: l_element_courant = (*s_objet_resultat).objet;
1866:
1867: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1868: == NULL)
1869: {
1870: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1871: return;
1872: }
1873:
1874: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1875: .nombre_arguments = 0;
1876: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1877: .fonction = instruction_vers_niveau_superieur;
1878:
1879: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1880: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1881: {
1882: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1883: return;
1884: }
1885:
1886: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1887: .nom_fonction, "<<");
1888:
1889: if (((*l_element_courant).suivant =
1890: allocation_maillon(s_etat_processus)) == NULL)
1891: {
1892: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1893: return;
1894: }
1895:
1896: l_element_courant = (*l_element_courant).suivant;
1897: (*l_element_courant).donnee = s_objet_argument;
1898:
1899: if (((*l_element_courant).suivant =
1900: allocation_maillon(s_etat_processus)) == NULL)
1901: {
1902: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1903: return;
1904: }
1905:
1906: l_element_courant = (*l_element_courant).suivant;
1907:
1908: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1909: == NULL)
1910: {
1911: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1912: return;
1913: }
1914:
1915: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1916: .nombre_arguments = 1;
1917: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1918: .fonction = instruction_re;
1919:
1920: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1921: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1922: {
1923: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1924: return;
1925: }
1926:
1927: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1928: .nom_fonction, "RE");
1929:
1930: if (((*l_element_courant).suivant =
1931: allocation_maillon(s_etat_processus)) == NULL)
1932: {
1933: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1934: return;
1935: }
1936:
1937: l_element_courant = (*l_element_courant).suivant;
1938:
1939: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1940: == NULL)
1941: {
1942: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1943: return;
1944: }
1945:
1946: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1947: .nombre_arguments = 0;
1948: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1949: .fonction = instruction_vers_niveau_inferieur;
1950:
1951: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1952: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1953: {
1954: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1955: return;
1956: }
1957:
1958: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1959: .nom_fonction, ">>");
1960:
1961: (*l_element_courant).suivant = NULL;
1962: s_objet_argument = NULL;
1963: }
1964:
1965: /*
1966: --------------------------------------------------------------------------------
1967: Partie réelle d'une expression
1968: --------------------------------------------------------------------------------
1969: */
1970:
1971: else if (((*s_objet_argument).type == ALG) ||
1972: ((*s_objet_argument).type == RPN))
1973: {
1974: if ((s_copie_argument = copie_objet(s_etat_processus,
1975: s_objet_argument, 'N')) == NULL)
1976: {
1977: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1978: return;
1979: }
1980:
1981: l_element_courant = (struct_liste_chainee *)
1982: (*s_copie_argument).objet;
1983: l_element_precedent = l_element_courant;
1984:
1985: while((*l_element_courant).suivant != NULL)
1986: {
1987: l_element_precedent = l_element_courant;
1988: l_element_courant = (*l_element_courant).suivant;
1989: }
1990:
1991: if (((*l_element_precedent).suivant =
1992: allocation_maillon(s_etat_processus)) == NULL)
1993: {
1994: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1995: return;
1996: }
1997:
1998: if (((*(*l_element_precedent).suivant).donnee =
1999: allocation(s_etat_processus, FCT)) == NULL)
2000: {
2001: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2002: return;
2003: }
2004:
2005: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2006: .donnee).objet)).nombre_arguments = 1;
2007: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2008: .donnee).objet)).fonction = instruction_re;
2009:
2010: if (((*((struct_fonction *) (*(*(*l_element_precedent)
2011: .suivant).donnee).objet)).nom_fonction =
2012: malloc(3 * sizeof(unsigned char))) == NULL)
2013: {
2014: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2015: return;
2016: }
2017:
2018: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
2019: .suivant).donnee).objet)).nom_fonction, "RE");
2020:
2021: (*(*l_element_precedent).suivant).suivant = l_element_courant;
2022:
2023: s_objet_resultat = s_copie_argument;
2024: }
2025:
2026: /*
2027: --------------------------------------------------------------------------------
2028: Réalisation impossible de la fonction partie réelle
2029: --------------------------------------------------------------------------------
2030: */
2031:
2032: else
2033: {
2034: liberation(s_etat_processus, s_objet_argument);
2035:
2036: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2037: return;
2038: }
2039:
2040: liberation(s_etat_processus, s_objet_argument);
2041:
2042: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2043: s_objet_resultat) == d_erreur)
2044: {
2045: return;
2046: }
2047:
2048: return;
2049: }
2050:
2051:
2052: /*
2053: ================================================================================
2054: Fonction 'r->p'
2055: ================================================================================
2056: Entrées : pointeur sur une structure struct_processus
2057: --------------------------------------------------------------------------------
2058: Sorties :
2059: --------------------------------------------------------------------------------
2060: Effets de bord : néant
2061: ================================================================================
2062: */
2063:
2064: void
2065: instruction_r_vers_p(struct_processus *s_etat_processus)
2066: {
2067: struct_liste_chainee *l_element_courant;
2068: struct_liste_chainee *l_element_precedent;
2069:
2070: struct_objet *s_copie_argument;
2071: struct_objet *s_objet_argument;
2072: struct_objet *s_objet_resultat;
2073:
2074: (*s_etat_processus).erreur_execution = d_ex;
2075:
2076: if ((*s_etat_processus).affichage_arguments == 'Y')
2077: {
2078: printf("\n P->R ");
2079:
2080: if ((*s_etat_processus).langue == 'F')
2081: {
2082: printf("(coordonnées polaires vers cartésiennes)\n\n");
2083: }
2084: else
2085: {
2086: printf("(polar to cartesian coordinates)\n\n");
2087: }
2088:
2089: printf(" 1: %s, %s, %s\n", d_INT, d_REL, d_CPL);
2090: printf("-> 1: %s\n\n", d_CPL);
2091:
2092: printf(" 1: %s, %s\n", d_NOM, d_ALG);
2093: printf("-> 1: %s\n\n", d_ALG);
2094:
2095: printf(" 1: %s\n", d_RPN);
2096: printf("-> 1: %s\n", d_RPN);
2097:
2098: return;
2099: }
2100: else if ((*s_etat_processus).test_instruction == 'Y')
2101: {
2102: (*s_etat_processus).nombre_arguments = -1;
2103: return;
2104: }
2105:
2106: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2107: {
2108: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
2109: {
2110: return;
2111: }
2112: }
2113:
2114: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2115: &s_objet_argument) == d_erreur)
2116: {
2117: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2118: return;
2119: }
2120:
2121: /*
2122: --------------------------------------------------------------------------------
2123: Conversion d'un entier ou d'un réel
2124: --------------------------------------------------------------------------------
2125: */
2126:
2127: if (((*s_objet_argument).type == INT) ||
2128: ((*s_objet_argument).type == REL))
2129: {
2130: if ((s_objet_resultat = allocation(s_etat_processus, CPL))
2131: == NULL)
2132: {
2133: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2134: return;
2135: }
2136:
2137: if ((*s_objet_argument).type == INT)
2138: {
2139: (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle
2140: = (*((integer8 *) (*s_objet_argument).objet));
2141: }
2142: else
2143: {
2144: (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle
2145: = (*((real8 *) (*s_objet_argument).objet));
2146: }
2147:
2148: (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_imaginaire
2149: = 0;
2150: }
2151:
2152: /*
2153: --------------------------------------------------------------------------------
2154: Conversion d'un complexe
2155: --------------------------------------------------------------------------------
2156: */
2157:
2158: else if ((*s_objet_argument).type == CPL)
2159: {
2160: if ((s_objet_resultat = allocation(s_etat_processus, CPL))
2161: == NULL)
2162: {
2163: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2164: return;
2165: }
2166:
2167: f77absc_(((struct_complexe16 *) (*s_objet_argument).objet),
2168: &((*((struct_complexe16 *) (*s_objet_resultat).objet))
2169: .partie_reelle));
2170:
2171: (*((struct_complexe16 *) (*s_objet_resultat).objet))
2172: .partie_imaginaire = atan2((*((struct_complexe16 *)
2173: (*s_objet_argument).objet)).partie_imaginaire,
2174: (*((struct_complexe16 *) (*s_objet_argument).objet))
2175: .partie_reelle);
2176:
2177: if (test_cfsf(s_etat_processus, 60) == d_faux)
2178: {
2179: conversion_radians_vers_degres(&((*((struct_complexe16 *)
2180: (*s_objet_resultat).objet)).partie_imaginaire));
2181: }
2182: }
2183:
2184: /*
2185: --------------------------------------------------------------------------------
2186: Conversion d'un nom
2187: --------------------------------------------------------------------------------
2188: */
2189:
2190: else if ((*s_objet_argument).type == NOM)
2191: {
2192: if ((s_objet_resultat = allocation(s_etat_processus, ALG))
2193: == NULL)
2194: {
2195: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2196: return;
2197: }
2198:
2199: if (((*s_objet_resultat).objet =
2200: allocation_maillon(s_etat_processus)) == NULL)
2201: {
2202: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2203: return;
2204: }
2205:
2206: l_element_courant = (*s_objet_resultat).objet;
2207:
2208: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2209: == NULL)
2210: {
2211: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2212: return;
2213: }
2214:
2215: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2216: .nombre_arguments = 0;
2217: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2218: .fonction = instruction_vers_niveau_superieur;
2219:
2220: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2221: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
2222: {
2223: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2224: return;
2225: }
2226:
2227: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2228: .nom_fonction, "<<");
2229:
2230: if (((*l_element_courant).suivant =
2231: allocation_maillon(s_etat_processus)) == NULL)
2232: {
2233: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2234: return;
2235: }
2236:
2237: l_element_courant = (*l_element_courant).suivant;
2238: (*l_element_courant).donnee = s_objet_argument;
2239:
2240: if (((*l_element_courant).suivant =
2241: allocation_maillon(s_etat_processus)) == NULL)
2242: {
2243: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2244: return;
2245: }
2246:
2247: l_element_courant = (*l_element_courant).suivant;
2248:
2249: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2250: == NULL)
2251: {
2252: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2253: return;
2254: }
2255:
2256: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2257: .nombre_arguments = 1;
2258: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2259: .fonction = instruction_r_vers_p;
2260:
2261: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2262: .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
2263: {
2264: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2265: return;
2266: }
2267:
2268: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2269: .nom_fonction, "R->P");
2270:
2271: if (((*l_element_courant).suivant =
2272: allocation_maillon(s_etat_processus)) == NULL)
2273: {
2274: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2275: return;
2276: }
2277:
2278: l_element_courant = (*l_element_courant).suivant;
2279:
2280: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2281: == NULL)
2282: {
2283: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2284: return;
2285: }
2286:
2287: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2288: .nombre_arguments = 0;
2289: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2290: .fonction = instruction_vers_niveau_inferieur;
2291:
2292: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2293: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
2294: {
2295: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2296: return;
2297: }
2298:
2299: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2300: .nom_fonction, ">>");
2301:
2302: (*l_element_courant).suivant = NULL;
2303: s_objet_argument = NULL;
2304: }
2305:
2306: /*
2307: --------------------------------------------------------------------------------
2308: Conversion d'une expression
2309: --------------------------------------------------------------------------------
2310: */
2311:
2312: else if (((*s_objet_argument).type == ALG) ||
2313: ((*s_objet_argument).type == RPN))
2314: {
2315: if ((s_copie_argument = copie_objet(s_etat_processus,
2316: s_objet_argument, 'N')) == NULL)
2317: {
2318: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2319: return;
2320: }
2321:
2322: l_element_courant = (struct_liste_chainee *)
2323: (*s_copie_argument).objet;
2324: l_element_precedent = l_element_courant;
2325:
2326: while((*l_element_courant).suivant != NULL)
2327: {
2328: l_element_precedent = l_element_courant;
2329: l_element_courant = (*l_element_courant).suivant;
2330: }
2331:
2332: if (((*l_element_precedent).suivant =
2333: allocation_maillon(s_etat_processus)) == NULL)
2334: {
2335: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2336: return;
2337: }
2338:
2339: if (((*(*l_element_precedent).suivant).donnee =
2340: allocation(s_etat_processus, FCT)) == NULL)
2341: {
2342: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2343: return;
2344: }
2345:
2346: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2347: .donnee).objet)).nombre_arguments = 1;
2348: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2349: .donnee).objet)).fonction = instruction_r_vers_p;
2350:
2351: if (((*((struct_fonction *) (*(*(*l_element_precedent)
2352: .suivant).donnee).objet)).nom_fonction =
2353: malloc(5 * sizeof(unsigned char))) == NULL)
2354: {
2355: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2356: return;
2357: }
2358:
2359: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
2360: .suivant).donnee).objet)).nom_fonction, "R->P");
2361:
2362: (*(*l_element_precedent).suivant).suivant = l_element_courant;
2363:
2364: s_objet_resultat = s_copie_argument;
2365: }
2366:
2367: /*
2368: --------------------------------------------------------------------------------
2369: Réalisation impossible de la fonction R->P
2370: --------------------------------------------------------------------------------
2371: */
2372:
2373: else
2374: {
2375: liberation(s_etat_processus, s_objet_argument);
2376:
2377: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2378: return;
2379: }
2380:
2381: liberation(s_etat_processus, s_objet_argument);
2382:
2383: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2384: s_objet_resultat) == d_erreur)
2385: {
2386: return;
2387: }
2388:
2389: return;
2390: }
2391:
2392: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>