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