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