1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.36
4: Copyright (C) 1989-2025 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 '->'
29: ================================================================================
30: Entrées : structure processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_fleche(struct_processus *s_etat_processus)
40: {
41: struct_liste_chainee *l_element_courant;
42: struct_liste_chainee *l_emplacement_valeurs;
43:
44: struct_objet *s_objet;
45: struct_objet *s_objet_elementaire;
46: struct_objet *s_expression_algebrique;
47:
48: struct_variable s_variable;
49:
50: struct_variable_partagee s_variable_partagee;
51: struct_variable_statique s_variable_statique;
52:
53: logical1 fin_scrutation;
54: logical1 presence_expression_algebrique;
55:
56: pthread_mutexattr_t attributs_mutex;
57:
58: union_position_variable position_variable;
59:
60: unsigned char instruction_valide;
61: unsigned char *tampon;
62: unsigned char test_instruction;
63:
64: integer8 i;
65: integer8 nombre_variables;
66:
67: void (*fonction)();
68:
69: (*s_etat_processus).erreur_execution = d_ex;
70:
71: if ((*s_etat_processus).affichage_arguments == 'Y')
72: {
73: printf("\n -> ");
74:
75: if ((*s_etat_processus).langue == 'F')
76: {
77: printf("(création de variables locales)\n\n");
78: }
79: else
80: {
81: printf("(create local variables)\n\n");
82: }
83:
84: printf(" n: %s, %s, %s, %s, %s, %s,\n"
85: " %s, %s, %s, %s, %s,\n"
86: " %s, %s, %s, %s, %s,\n"
87: " %s, %s, %s, %s,\n"
88: " %s, %s, %s\n",
89: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
90: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
91: d_SQL, d_SLB, d_PRC, d_MTX, d_REC);
92: printf(" ...\n");
93: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
94: " %s, %s, %s, %s, %s,\n"
95: " %s, %s, %s, %s, %s,\n"
96: " %s, %s, %s, %s,\n"
97: " %s, %s, %s\n",
98: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
99: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
100: d_SQL, d_SLB, d_PRC, d_MTX, d_REC);
101:
102: if ((*s_etat_processus).langue == 'F')
103: {
104: printf(" Utilisation :\n\n");
105: }
106: else
107: {
108: printf(" Usage:\n\n");
109: }
110:
111: printf(" -> (variables) %s\n\n", d_RPN);
112:
113: printf(" -> (variables) %s\n\n", d_ALG);
114:
115: printf(" -> (variables) %s\n", d_NOM);
116:
117: return;
118: }
119: else if ((*s_etat_processus).test_instruction == 'Y')
120: {
121: (*s_etat_processus).nombre_arguments = -1;
122: return;
123: }
124:
125: if (test_cfsf(s_etat_processus, 31) == d_vrai)
126: {
127: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
128: {
129: return;
130: }
131: }
132:
133: (*s_etat_processus).autorisation_empilement_programme = 'N';
134:
135: /*
136: --------------------------------------------------------------------------------
137: Boucler jusqu'au prochain '<<' ou jusqu'à la prochaine expression algébrique
138: --------------------------------------------------------------------------------
139: */
140:
141: test_instruction = (*s_etat_processus).test_instruction;
142: instruction_valide = (*s_etat_processus).instruction_valide;
143: presence_expression_algebrique = d_faux;
144:
145: if ((*s_etat_processus).debug == d_vrai)
146: if (((*s_etat_processus).type_debug &
147: d_debug_variables) != 0)
148: {
149: if ((*s_etat_processus).langue == 'F')
150: {
151: printf("[%d] Recherche des variables locales\n", (int) getpid());
152: }
153: else
154: {
155: printf("[%d] Searching for local variables\n", (int) getpid());
156: }
157:
158: fflush(stdout);
159: }
160:
161: nombre_variables = 0;
162:
163: if ((*s_etat_processus).mode_execution_programme == 'Y')
164: {
165: /*
166: * Le programme est exécuté normalement.
167: */
168:
169: tampon = (*s_etat_processus).instruction_courante;
170:
171: do
172: {
173: if (recherche_instruction_suivante(s_etat_processus) == d_erreur)
174: {
175: (*s_etat_processus).instruction_courante = tampon;
176: return;
177: }
178:
179: if (strcmp((*s_etat_processus).instruction_courante, "<<") == 0)
180: {
181: fin_scrutation = d_vrai;
182: (*s_etat_processus).test_instruction = 'N';
183: }
184: else
185: {
186: fin_scrutation = d_faux;
187: (*s_etat_processus).test_instruction = 'Y';
188: }
189:
190: analyse(s_etat_processus, NULL);
191:
192: if ((*s_etat_processus).instruction_valide == 'N')
193: {
194: (*s_etat_processus).type_en_cours = NON;
195: recherche_type(s_etat_processus);
196:
197: if ((*s_etat_processus).erreur_execution != d_ex)
198: {
199: (*s_etat_processus).instruction_courante = tampon;
200: return;
201: }
202:
203: if ((*(*(*s_etat_processus).l_base_pile).donnee).type == ALG)
204: {
205: (*s_etat_processus).niveau_courant++;
206: fin_scrutation = d_vrai;
207: presence_expression_algebrique = d_vrai;
208:
209: if (depilement(s_etat_processus, &((*s_etat_processus)
210: .l_base_pile), &s_expression_algebrique)
211: == d_erreur)
212: {
213: (*s_etat_processus).erreur_execution =
214: d_ex_manque_argument;
215: (*s_etat_processus).instruction_courante = tampon;
216: return;
217: }
218: }
219: else if ((*(*(*s_etat_processus).l_base_pile).donnee)
220: .type != NOM)
221: {
222: (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
223: (*s_etat_processus).instruction_courante = tampon;
224: return;
225: }
226: else if ((*((struct_nom *) (*(*(*s_etat_processus).l_base_pile)
227: .donnee).objet)).symbole == d_vrai)
228: {
229: (*s_etat_processus).niveau_courant++;
230: fin_scrutation = d_vrai;
231: presence_expression_algebrique = d_vrai;
232:
233: if (depilement(s_etat_processus, &((*s_etat_processus)
234: .l_base_pile), &s_expression_algebrique)
235: == d_erreur)
236: {
237: (*s_etat_processus).erreur_execution =
238: d_ex_manque_argument;
239: (*s_etat_processus).instruction_courante = tampon;
240: return;
241: }
242: }
243: else
244: {
245: nombre_variables = nombre_variables + 1;
246: }
247: }
248: else
249: {
250: if (fin_scrutation == d_faux)
251: {
252: (*s_etat_processus).erreur_execution = d_ex_nom_reserve;
253: (*s_etat_processus).instruction_courante = tampon;
254: return;
255: }
256: }
257:
258: free((*s_etat_processus).instruction_courante);
259: } while(fin_scrutation == d_faux);
260:
261: (*s_etat_processus).instruction_courante = tampon;
262: }
263: else
264: {
265: /*
266: * Une expression est en cours d'évaluation.
267: */
268:
269: l_element_courant = (*(*s_etat_processus).expression_courante).suivant;
270: tampon = (*s_etat_processus).instruction_courante;
271:
272: do
273: {
274: if ((*(*l_element_courant).donnee).type == FCT)
275: {
276: fonction = (*((struct_fonction *) (*(*l_element_courant)
277: .donnee).objet)).fonction;
278:
279: if (fonction == instruction_vers_niveau_superieur)
280: {
281: fin_scrutation = d_vrai;
282: (*s_etat_processus).test_instruction = 'N';
283:
284: analyse(s_etat_processus,
285: instruction_vers_niveau_superieur);
286: }
287: else
288: {
289: (*s_etat_processus).expression_courante = l_element_courant;
290: (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
291: return;
292: }
293: }
294: else if ((*(*l_element_courant).donnee).type == ALG)
295: {
296: (*s_etat_processus).niveau_courant++;
297: fin_scrutation = d_vrai;
298: presence_expression_algebrique = d_vrai;
299:
300: s_expression_algebrique = (*l_element_courant).donnee;
301: }
302: else if ((*(*l_element_courant).donnee).type != NOM)
303: {
304: (*s_etat_processus).expression_courante = l_element_courant;
305: (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
306: return;
307: }
308: else if ((*((struct_nom *) (*(*l_element_courant).donnee).objet))
309: .symbole == d_vrai)
310: {
311: (*s_etat_processus).niveau_courant++;
312: fin_scrutation = d_vrai;
313: presence_expression_algebrique = d_vrai;
314:
315: s_expression_algebrique = (*l_element_courant).donnee;
316: }
317: else
318: {
319: if ((s_objet_elementaire = copie_objet(s_etat_processus,
320: (*l_element_courant).donnee, 'P')) == NULL)
321: {
322: (*s_etat_processus).expression_courante = l_element_courant;
323: (*s_etat_processus).erreur_systeme =
324: d_es_allocation_memoire;
325: return;
326: }
327:
328: if (empilement(s_etat_processus, &((*s_etat_processus)
329: .l_base_pile), s_objet_elementaire) == d_erreur)
330: {
331: (*s_etat_processus).expression_courante = l_element_courant;
332: return;
333: }
334:
335: nombre_variables = nombre_variables + 1;
336: fin_scrutation = d_faux;
337: }
338:
339: (*s_etat_processus).expression_courante = l_element_courant;
340: l_element_courant = (*l_element_courant).suivant;
341: } while((fin_scrutation == d_faux) && (l_element_courant != NULL));
342:
343: (*s_etat_processus).objet_courant =
344: (*(*s_etat_processus).expression_courante).donnee;
345: (*s_etat_processus).instruction_courante = tampon;
346:
347: if (fin_scrutation == d_faux)
348: {
349: (*s_etat_processus).erreur_execution = d_ex_erreur_evaluation;
350: return;
351: }
352: }
353:
354: if (nombre_variables < 1)
355: {
356: (*s_etat_processus).erreur_execution = d_ex_absence_variable;
357: return;
358: }
359:
360: if ((*s_etat_processus).debug == d_vrai)
361: if (((*s_etat_processus).type_debug &
362: d_debug_variables) != 0)
363: {
364: if ((*s_etat_processus).langue == 'F')
365: {
366: printf("[%d] Nombre de variables de niveau %lld : %lld\n",
367: (int) getpid(),
368: (*s_etat_processus).niveau_courant, nombre_variables);
369: }
370: else
371: {
372: printf("[%d] Number of level %lld variables : %lld\n",
373: (int) getpid(),
374: (*s_etat_processus).niveau_courant, nombre_variables);
375: }
376:
377: fflush(stdout);
378: }
379:
380: l_emplacement_valeurs = (*s_etat_processus).l_base_pile;
381:
382: for(i = 0; i < nombre_variables; i++)
383: {
384: if (l_emplacement_valeurs == NULL)
385: {
386: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
387: return;
388: }
389:
390: l_emplacement_valeurs = (*l_emplacement_valeurs).suivant;
391: }
392:
393: l_element_courant = l_emplacement_valeurs;
394:
395: for(i = 0; i < nombre_variables; i++)
396: {
397: if (l_element_courant == NULL)
398: {
399: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
400: return;
401: }
402:
403: l_element_courant = (*l_element_courant).suivant;
404: }
405:
406: for(i = 0; i < nombre_variables; i++)
407: {
408: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
409: &s_objet) == d_erreur)
410: {
411: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
412: return;
413: }
414:
415: if ((s_variable.nom = malloc((strlen(
416: (*((struct_nom *) (*s_objet).objet)).nom) + 1) *
417: sizeof(unsigned char))) == NULL)
418: {
419: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
420: return;
421: }
422:
423: strcpy(s_variable.nom, (*((struct_nom *) (*s_objet).objet)).nom);
424:
425: if ((*s_etat_processus).debug == d_vrai)
426: if (((*s_etat_processus).type_debug &
427: d_debug_variables) != 0)
428: {
429: printf("[%d] Variable %s\n", (int) getpid(), s_variable.nom);
430: fflush(stdout);
431: }
432:
433: s_variable.niveau = (*s_etat_processus).niveau_courant;
434:
435: // Si le drapeau creation_variables_statiques est positionné,
436: // on recherche une entrée dans la table des variables statiques.
437: // Si cette entrée existe, on affecte à la variable créée l'objet
438: // contenu dans la table des variables statiques. Dans le cas contraire,
439: // on crée une entrée dans la table des variables statiques avec
440: // ce qui se trouve dans la pile.
441:
442: if ((*s_etat_processus).l_base_pile_systeme == NULL)
443: {
444: (*s_etat_processus).erreur_systeme = d_es_pile_vide;
445: return;
446: }
447:
448: /*
449: * Vérification de l'unicité de la variable pour un niveau donné
450: */
451:
452: if (recherche_variable(s_etat_processus, s_variable.nom) == d_vrai)
453: {
454: if ((*s_etat_processus).niveau_courant ==
455: (*(*s_etat_processus).pointeur_variable_courante).niveau)
456: {
457: liberation(s_etat_processus, s_objet);
458: free(s_variable.nom);
459:
460: (*s_etat_processus).erreur_execution = d_ex_creation_variable;
461: return;
462: }
463: }
464:
465: (*s_etat_processus).erreur_systeme = d_es;
466:
467: if ((*(*s_etat_processus).l_base_pile_systeme)
468: .creation_variables_statiques == d_vrai)
469: {
470: if ((*s_etat_processus).mode_execution_programme == 'Y')
471: {
472: position_variable.adresse =
473: (*s_etat_processus).position_courante;
474: }
475: else
476: {
477: position_variable.pointeur =
478: (*s_etat_processus).objet_courant;
479: }
480:
481: if (recherche_variable_statique(s_etat_processus, s_variable.nom,
482: position_variable,
483: ((*s_etat_processus).mode_execution_programme == 'Y')
484: ? 'P' : 'E') != NULL)
485: {
486: // Variable statique à utiliser
487:
488: if ((*s_etat_processus).mode_execution_programme == 'Y')
489: {
490: s_variable.origine = 'P';
491: }
492: else
493: {
494: s_variable.origine = 'E';
495: }
496:
497: s_variable.objet = (*(*s_etat_processus)
498: .pointeur_variable_statique_courante).objet;
499: (*(*s_etat_processus).pointeur_variable_statique_courante)
500: .objet = NULL;
501: }
502: else
503: {
504: // Variable statique à créer
505:
506: s_variable_statique.objet = NULL;
507: (*s_etat_processus).erreur_systeme = d_es;
508:
509: if ((s_variable_statique.nom = malloc((strlen(s_variable.nom)
510: + 1) * sizeof(unsigned char))) == NULL)
511: {
512: (*s_etat_processus).erreur_systeme =
513: d_es_allocation_memoire;
514: return;
515: }
516:
517: strcpy(s_variable_statique.nom, s_variable.nom);
518:
519: if ((*s_etat_processus).mode_execution_programme == 'Y')
520: {
521: s_variable_statique.origine = 'P';
522: s_variable_statique.niveau = 0;
523: s_variable_statique.variable_statique.adresse =
524: (*s_etat_processus).position_courante;
525: }
526: else
527: {
528: s_variable_statique.origine = 'E';
529:
530: /*
531: * Si la variable est appelée depuis une expression
532: * compilée (variable de niveau 0), la variable statique
533: * est persistante (niveau 0). Dans le cas contraire, elle
534: * est persistante à l'expression (niveau courant).
535: */
536:
537: if ((*s_etat_processus).evaluation_expression_compilee
538: == 'Y')
539: {
540: s_variable_statique.niveau = 0;
541: }
542: else
543: {
544: s_variable_statique.niveau =
545: (*s_etat_processus).niveau_courant;
546: }
547:
548: s_variable_statique.variable_statique.pointeur =
549: (*s_etat_processus).objet_courant;
550: }
551:
552: if (creation_variable_statique(s_etat_processus,
553: &s_variable_statique) == d_erreur)
554: {
555: return;
556: }
557:
558: s_variable.objet = (*l_emplacement_valeurs).donnee;
559: (*l_emplacement_valeurs).donnee = NULL;
560: }
561: }
562: else if ((*(*s_etat_processus).l_base_pile_systeme)
563: .creation_variables_partagees == d_vrai)
564: {
565: if ((*s_etat_processus).mode_execution_programme == 'Y')
566: {
567: position_variable.adresse =
568: (*s_etat_processus).position_courante;
569: }
570: else
571: {
572: position_variable.pointeur =
573: (*s_etat_processus).objet_courant;
574: }
575:
576: if (pthread_mutex_lock(&mutex_creation_variable_partagee) != 0)
577: {
578: (*s_etat_processus).erreur_systeme = d_es_processus;
579: return;
580: }
581:
582: if (recherche_variable_partagee(s_etat_processus, s_variable.nom,
583: position_variable,
584: ((*s_etat_processus).mode_execution_programme == 'Y')
585: ? 'P' : 'E') != NULL)
586: {
587: // Variable partagée à utiliser
588:
589: if (pthread_mutex_unlock(&mutex_creation_variable_partagee)
590: != 0)
591: {
592: (*s_etat_processus).erreur_systeme = d_es_processus;
593: return;
594: }
595:
596: if (pthread_mutex_unlock(&((*(*s_etat_processus)
597: .pointeur_variable_partagee_courante).mutex)) != 0)
598: {
599: (*s_etat_processus).erreur_systeme = d_es_processus;
600: return;
601: }
602:
603: // Les champs niveau, variable_statique, variable_partagee
604: // et variable_verrouillee sont renseignés lors de l'appel
605: // à la fonction creation_variable().
606:
607: if ((*s_etat_processus).mode_execution_programme == 'Y')
608: {
609: s_variable.origine = 'P';
610: }
611: else
612: {
613: s_variable.origine = 'E';
614: }
615:
616: s_variable.objet = NULL;
617: }
618: else
619: {
620: // Variable partagée à créer
621:
622: (*s_etat_processus).erreur_systeme = d_es;
623:
624: if ((s_variable_partagee.nom = malloc((strlen(s_variable.nom)
625: + 1) * sizeof(unsigned char))) == NULL)
626: {
627: (*s_etat_processus).erreur_systeme =
628: d_es_allocation_memoire;
629: return;
630: }
631:
632: strcpy(s_variable_partagee.nom, s_variable.nom);
633:
634: if ((*s_etat_processus).mode_execution_programme == 'Y')
635: {
636: s_variable_partagee.origine = 'P';
637: s_variable_partagee.niveau = 0;
638: s_variable_partagee.variable_partagee.adresse =
639: (*s_etat_processus).position_courante;
640: }
641: else
642: {
643: s_variable_partagee.origine = 'E';
644:
645: /*
646: * Si la variable est appelée depuis une expression
647: * compilée (variable de niveau 0), la variable statique
648: * est persistante (niveau 0). Dans le cas contraire, elle
649: * est persistante à l'expression (niveau courant).
650: */
651:
652: if ((*s_etat_processus).evaluation_expression_compilee
653: == 'Y')
654: {
655: s_variable_partagee.niveau = 0;
656: }
657: else
658: {
659: s_variable_partagee.niveau =
660: (*s_etat_processus).niveau_courant;
661: }
662:
663: s_variable_partagee.variable_partagee.pointeur =
664: (*s_etat_processus).objet_courant;
665: }
666:
667: // Création du mutex
668:
669: pthread_mutexattr_init(&attributs_mutex);
670: pthread_mutexattr_settype(&attributs_mutex,
671: PTHREAD_MUTEX_RECURSIVE);
672: pthread_mutex_init(&(s_variable_partagee.mutex),
673: &attributs_mutex);
674: pthread_mutexattr_destroy(&attributs_mutex);
675:
676: s_variable_partagee.objet = (*l_emplacement_valeurs).donnee;
677: (*l_emplacement_valeurs).donnee = NULL;
678:
679: if (creation_variable_partagee(s_etat_processus,
680: &s_variable_partagee) == d_erreur)
681: {
682: return;
683: }
684:
685: s_variable.objet = NULL;
686:
687: if (pthread_mutex_unlock(&mutex_creation_variable_partagee)
688: != 0)
689: {
690: (*s_etat_processus).erreur_systeme = d_es_processus;
691: return;
692: }
693: }
694: }
695: else
696: {
697: s_variable.objet = (*l_emplacement_valeurs).donnee;
698: (*l_emplacement_valeurs).donnee = NULL;
699: }
700:
701: l_emplacement_valeurs = (*l_emplacement_valeurs).suivant;
702:
703: if (creation_variable(s_etat_processus, &s_variable,
704: ((*(*s_etat_processus).l_base_pile_systeme)
705: .creation_variables_statiques == d_vrai) ? 'S' : 'V',
706: ((*(*s_etat_processus).l_base_pile_systeme)
707: .creation_variables_partagees == d_vrai) ? 'S' : 'P')
708: == d_erreur)
709: {
710: return;
711: }
712:
713: liberation(s_etat_processus, s_objet);
714: }
715:
716: // Les prochaines variables créées seront forcément du type volatile et
717: // seront obligatoirement privées.
718:
719: if ((*s_etat_processus).l_base_pile_systeme == NULL)
720: {
721: (*s_etat_processus).erreur_systeme = d_es_pile_vide;
722: return;
723: }
724:
725: (*(*s_etat_processus).l_base_pile_systeme).creation_variables_statiques
726: = d_faux;
727: (*(*s_etat_processus).l_base_pile_systeme).creation_variables_partagees
728: = d_faux;
729:
730: for(i = 0; i < nombre_variables; i++)
731: {
732: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
733: &s_objet) == d_erreur)
734: {
735: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
736: return;
737: }
738:
739: liberation(s_etat_processus, s_objet);
740: }
741:
742: (*s_etat_processus).test_instruction = test_instruction;
743: (*s_etat_processus).instruction_valide = instruction_valide;
744:
745: /*
746: * Traitement le cas échéant de l'expression algébrique
747: */
748:
749: if (presence_expression_algebrique == d_vrai)
750: {
751: // Si l'expression algébrique est réduite à un simple nom, il
752: // s'agit toujours d'un nom symbolique. Il faut alors lui retirer
753: // son caractère de constante symbolique pour faire remonter les
754: // erreurs de type 'variable indéfinie'.
755:
756: if ((*s_expression_algebrique).type == NOM)
757: {
758: (*((struct_nom *) (*s_expression_algebrique).objet)).symbole =
759: d_faux;
760: }
761:
762: evaluation(s_etat_processus, s_expression_algebrique, 'N');
763:
764: if ((*s_expression_algebrique).type == NOM)
765: {
766: (*((struct_nom *) (*s_expression_algebrique).objet)).symbole =
767: d_vrai;
768: }
769:
770: if ((*s_etat_processus).mode_execution_programme == 'Y')
771: {
772: liberation(s_etat_processus, s_expression_algebrique);
773: }
774:
775: (*s_etat_processus).autorisation_empilement_programme = 'Y';
776: (*s_etat_processus).niveau_courant--;
777:
778: if (retrait_variables_par_niveau(s_etat_processus) == d_erreur)
779: {
780: return;
781: }
782: }
783:
784: return;
785: }
786:
787:
788: /*
789: ================================================================================
790: Fonction '->list'
791: ================================================================================
792: Entrées : structure processus
793: --------------------------------------------------------------------------------
794: Sorties :
795: --------------------------------------------------------------------------------
796: Effets de bord : néant
797: ================================================================================
798: */
799:
800: void
801: instruction_fleche_list(struct_processus *s_etat_processus)
802: {
803: struct_liste_chainee *l_element_courant;
804:
805: struct_objet *s_objet;
806:
807: integer8 i;
808: integer8 nombre_elements;
809:
810: (*s_etat_processus).erreur_execution = d_ex;
811:
812: if ((*s_etat_processus).affichage_arguments == 'Y')
813: {
814: printf("\n ->LIST ");
815:
816: if ((*s_etat_processus).langue == 'F')
817: {
818: printf("(création d'une liste)\n\n");
819: }
820: else
821: {
822: printf("(create list)\n\n");
823: }
824:
825: printf(" n: %s, %s, %s, %s, %s, %s,\n"
826: " %s, %s, %s, %s, %s,\n"
827: " %s, %s, %s, %s, %s,\n"
828: " %s, %s\n",
829: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
830: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
831: printf(" ...\n");
832: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
833: " %s, %s, %s, %s, %s,\n"
834: " %s, %s, %s, %s, %s,\n"
835: " %s, %s\n",
836: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
837: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
838: printf(" 1: %s\n", d_INT);
839: printf("-> 1: %s\n", d_LST);
840:
841: return;
842: }
843: else if ((*s_etat_processus).test_instruction == 'Y')
844: {
845: (*s_etat_processus).nombre_arguments = -1;
846: return;
847: }
848:
849: if (test_cfsf(s_etat_processus, 31) == d_vrai)
850: {
851: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
852: {
853: return;
854: }
855: }
856:
857: if ((*s_etat_processus).hauteur_pile_operationnelle == 0)
858: {
859: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
860: return;
861: }
862:
863: if ((*(*(*s_etat_processus).l_base_pile).donnee).type != INT)
864: {
865: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
866: return;
867: }
868:
869: nombre_elements = (*((integer8 *) (*(*(*s_etat_processus).l_base_pile)
870: .donnee).objet));
871:
872: if (nombre_elements < 0)
873: {
874:
875: /*
876: -- Opération absurde autorisée sur le calculateur HP-28S -----------------------
877: */
878:
879: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
880: return;
881: }
882:
883: if (nombre_elements >= (*s_etat_processus).hauteur_pile_operationnelle)
884: {
885: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
886: return;
887: }
888:
889: if (test_cfsf(s_etat_processus, 31) == d_vrai)
890: {
891: if (empilement_pile_last(s_etat_processus, nombre_elements + 1)
892: == d_erreur)
893: {
894: return;
895: }
896: }
897:
898: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
899: &s_objet) == d_erreur)
900: {
901: return;
902: }
903:
904: liberation(s_etat_processus, s_objet);
905: l_element_courant = NULL;
906:
907: for(i = 0; i < nombre_elements; i++)
908: {
909: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
910: &s_objet) == d_erreur)
911: {
912: return;
913: }
914:
915: if (empilement(s_etat_processus, &l_element_courant, s_objet)
916: == d_erreur)
917: {
918: return;
919: }
920: }
921:
922: if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
923: {
924: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
925: return;
926: }
927:
928: (*s_objet).objet = (void *) l_element_courant;
929:
930: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
931: s_objet) == d_erreur)
932: {
933: return;
934: }
935:
936: return;
937: }
938:
939:
940: /*
941: ================================================================================
942: Fonction 'for'
943: ================================================================================
944: Entrées : structure processus
945: --------------------------------------------------------------------------------
946: Sorties :
947: --------------------------------------------------------------------------------
948: Effets de bord : néant
949: ================================================================================
950: */
951:
952: void
953: instruction_for(struct_processus *s_etat_processus)
954: {
955: struct_objet *s_objet_1;
956: struct_objet *s_objet_2;
957: struct_objet *s_objet_3;
958:
959: struct_variable s_variable;
960:
961: unsigned char instruction_valide;
962: unsigned char *tampon;
963: unsigned char test_instruction;
964:
965: (*s_etat_processus).erreur_execution = d_ex;
966:
967: if ((*s_etat_processus).affichage_arguments == 'Y')
968: {
969: printf("\n FOR ");
970:
971: if ((*s_etat_processus).langue == 'F')
972: {
973: printf("(boucle définie avec compteur)\n\n");
974: }
975: else
976: {
977: printf("(define a counter-based loop)\n\n");
978: }
979:
980: if ((*s_etat_processus).langue == 'F')
981: {
982: printf(" Utilisation :\n\n");
983: }
984: else
985: {
986: printf(" Usage:\n\n");
987: }
988:
989: printf(" %s/%s %s/%s FOR (variable)\n", d_INT, d_REL,
990: d_INT, d_REL);
991: printf(" (expression)\n");
992: printf(" [EXIT]/[CYCLE]\n");
993: printf(" ...\n");
994: printf(" NEXT\n\n");
995:
996: printf(" %s/%s %s/%s FOR (variable)\n", d_INT, d_REL,
997: d_INT, d_REL);
998: printf(" (expression)\n");
999: printf(" [EXIT]/[CYCLE]\n");
1000: printf(" ...\n");
1001: printf(" %s/%s STEP\n", d_INT, d_REL);
1002:
1003: return;
1004: }
1005: else if ((*s_etat_processus).test_instruction == 'Y')
1006: {
1007: (*s_etat_processus).nombre_arguments = -1;
1008: return;
1009: }
1010:
1011: if ((*s_etat_processus).erreur_systeme != d_es)
1012: {
1013: return;
1014: }
1015:
1016: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1017: {
1018: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1019: {
1020: return;
1021: }
1022: }
1023:
1024: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1025: &s_objet_1) == d_erreur)
1026: {
1027: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1028: return;
1029: }
1030:
1031: if (((*s_objet_1).type != INT) &&
1032: ((*s_objet_1).type != REL))
1033: {
1034: liberation(s_etat_processus, s_objet_1);
1035:
1036: (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
1037: return;
1038: }
1039:
1040: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1041: &s_objet_2) == d_erreur)
1042: {
1043: liberation(s_etat_processus, s_objet_1);
1044:
1045: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1046: return;
1047: }
1048:
1049: if (((*s_objet_2).type != INT) && ((*s_objet_2).type != REL))
1050: {
1051: liberation(s_etat_processus, s_objet_1);
1052: liberation(s_etat_processus, s_objet_2);
1053:
1054: (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
1055: return;
1056: }
1057:
1058: empilement_pile_systeme(s_etat_processus);
1059:
1060: if ((*s_etat_processus).erreur_systeme != d_es)
1061: {
1062: return;
1063: }
1064:
1065: if ((*s_etat_processus).mode_execution_programme == 'Y')
1066: {
1067: tampon = (*s_etat_processus).instruction_courante;
1068: test_instruction = (*s_etat_processus).test_instruction;
1069: instruction_valide = (*s_etat_processus).instruction_valide;
1070: (*s_etat_processus).test_instruction = 'Y';
1071:
1072: if (recherche_instruction_suivante(s_etat_processus) == d_erreur)
1073: {
1074: return;
1075: }
1076:
1077: analyse(s_etat_processus, NULL);
1078:
1079: if ((*s_etat_processus).instruction_valide == 'Y')
1080: {
1081: liberation(s_etat_processus, s_objet_1);
1082: liberation(s_etat_processus, s_objet_2);
1083:
1084: free((*s_etat_processus).instruction_courante);
1085: (*s_etat_processus).instruction_courante = tampon;
1086: (*s_etat_processus).instruction_valide = instruction_valide;
1087: (*s_etat_processus).test_instruction = test_instruction;
1088:
1089: depilement_pile_systeme(s_etat_processus);
1090:
1091: (*s_etat_processus).erreur_execution = d_ex_nom_reserve;
1092: return;
1093: }
1094:
1095: (*s_etat_processus).type_en_cours = NON;
1096: recherche_type(s_etat_processus);
1097:
1098: free((*s_etat_processus).instruction_courante);
1099: (*s_etat_processus).instruction_courante = tampon;
1100: (*s_etat_processus).instruction_valide = instruction_valide;
1101: (*s_etat_processus).test_instruction = test_instruction;
1102:
1103: if ((*s_etat_processus).erreur_execution != d_ex)
1104: {
1105: liberation(s_etat_processus, s_objet_1);
1106: liberation(s_etat_processus, s_objet_2);
1107:
1108: depilement_pile_systeme(s_etat_processus);
1109: return;
1110: }
1111:
1112: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1113: &s_objet_3) == d_erreur)
1114: {
1115: liberation(s_etat_processus, s_objet_1);
1116: liberation(s_etat_processus, s_objet_2);
1117:
1118: depilement_pile_systeme(s_etat_processus);
1119:
1120: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1121: return;
1122: }
1123:
1124: (*(*s_etat_processus).l_base_pile_systeme)
1125: .origine_routine_evaluation = 'N';
1126: }
1127: else
1128: {
1129: if ((*s_etat_processus).expression_courante == NULL)
1130: {
1131: depilement_pile_systeme(s_etat_processus);
1132: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1133: return;
1134: }
1135:
1136: (*s_etat_processus).expression_courante = (*(*s_etat_processus)
1137: .expression_courante).suivant;
1138:
1139: if ((s_objet_3 = copie_objet(s_etat_processus,
1140: (*(*s_etat_processus).expression_courante)
1141: .donnee, 'P')) == NULL)
1142: {
1143: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1144: return;
1145: }
1146:
1147: (*(*s_etat_processus).l_base_pile_systeme)
1148: .origine_routine_evaluation = 'Y';
1149: }
1150:
1151: if ((*s_objet_3).type != NOM)
1152: {
1153: liberation(s_etat_processus, s_objet_1);
1154: liberation(s_etat_processus, s_objet_2);
1155:
1156: depilement_pile_systeme(s_etat_processus);
1157:
1158: (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
1159: return;
1160: }
1161: else if ((*((struct_nom *) (*s_objet_3).objet)).symbole == d_vrai)
1162: {
1163: liberation(s_etat_processus, s_objet_1);
1164: liberation(s_etat_processus, s_objet_2);
1165:
1166: depilement_pile_systeme(s_etat_processus);
1167:
1168: (*s_etat_processus).erreur_execution = d_ex_erreur_traitement_boucle;
1169: return;
1170: }
1171:
1172: (*s_etat_processus).niveau_courant++;
1173:
1174: if ((s_variable.nom = malloc((strlen(
1175: (*((struct_nom *) (*s_objet_3).objet)).nom) + 1) *
1176: sizeof(unsigned char))) == NULL)
1177: {
1178: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1179: return;
1180: }
1181:
1182: strcpy(s_variable.nom, (*((struct_nom *) (*s_objet_3).objet)).nom);
1183: s_variable.niveau = (*s_etat_processus).niveau_courant;
1184: s_variable.objet = s_objet_2;
1185:
1186: if (creation_variable(s_etat_processus, &s_variable, 'V', 'P') == d_erreur)
1187: {
1188: return;
1189: }
1190:
1191: liberation(s_etat_processus, s_objet_3);
1192:
1193: (*(*s_etat_processus).l_base_pile_systeme).limite_indice_boucle = s_objet_1;
1194:
1195: if ((*s_etat_processus).mode_execution_programme == 'Y')
1196: {
1197: (*(*s_etat_processus).l_base_pile_systeme).adresse_retour =
1198: (*s_etat_processus).position_courante;
1199: }
1200: else
1201: {
1202: (*(*s_etat_processus).l_base_pile_systeme).pointeur_objet_retour =
1203: (*s_etat_processus).expression_courante;
1204: }
1205:
1206: (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'F';
1207:
1208: if (((*(*s_etat_processus).l_base_pile_systeme).nom_variable =
1209: malloc((strlen(s_variable.nom) + 1) *
1210: sizeof(unsigned char))) == NULL)
1211: {
1212: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1213: return;
1214: }
1215:
1216: strcpy((*(*s_etat_processus).l_base_pile_systeme).nom_variable,
1217: s_variable.nom);
1218:
1219: return;
1220: }
1221:
1222:
1223: /*
1224: ================================================================================
1225: Fonction 'fc?'
1226: ================================================================================
1227: Entrées : structure processus
1228: --------------------------------------------------------------------------------
1229: Sorties :
1230: --------------------------------------------------------------------------------
1231: Effets de bord : néant
1232: ================================================================================
1233: */
1234:
1235: void
1236: instruction_fc_test(struct_processus *s_etat_processus)
1237: {
1238: struct_objet *s_objet_argument;
1239: struct_objet *s_objet_resultat;
1240:
1241: (*s_etat_processus).erreur_execution = d_ex;
1242:
1243: if ((*s_etat_processus).affichage_arguments == 'Y')
1244: {
1245: printf("\n FC? ");
1246:
1247: if ((*s_etat_processus).langue == 'F')
1248: {
1249: printf("(teste si un drapeau est désarmé)\n\n");
1250: }
1251: else
1252: {
1253: printf("(test if flag is clear)\n\n");
1254: }
1255:
1256: printf(" 1: %s\n", d_INT);
1257: printf("-> 1: %s\n", d_INT);
1258:
1259: return;
1260: }
1261: else if ((*s_etat_processus).test_instruction == 'Y')
1262: {
1263: (*s_etat_processus).nombre_arguments = -1;
1264: return;
1265: }
1266:
1267: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1268: {
1269: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1270: {
1271: return;
1272: }
1273: }
1274:
1275: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1276: &s_objet_argument) == d_erreur)
1277: {
1278: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1279: return;
1280: }
1281:
1282: if ((*s_objet_argument).type == INT)
1283: {
1284: if (((*((integer8 *) (*s_objet_argument).objet)) < 1) ||
1285: ((*((integer8 *) (*s_objet_argument).objet)) > 64))
1286: {
1287: liberation(s_etat_processus, s_objet_argument);
1288:
1289: (*s_etat_processus).erreur_execution = d_ex_drapeau_inexistant;
1290: return;
1291: }
1292:
1293: if ((s_objet_resultat = allocation(s_etat_processus, INT))
1294: == NULL)
1295: {
1296: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1297: return;
1298: }
1299:
1300: if (test_cfsf(s_etat_processus, (unsigned char) (*((integer8 *)
1301: (*s_objet_argument).objet))) == d_vrai)
1302: {
1303: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
1304: }
1305: else
1306: {
1307: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1308: }
1309: }
1310: else
1311: {
1312: liberation(s_etat_processus, s_objet_argument);
1313:
1314: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1315: return;
1316: }
1317:
1318: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1319: s_objet_resultat) == d_erreur)
1320: {
1321: return;
1322: }
1323:
1324: liberation(s_etat_processus, s_objet_argument);
1325:
1326: return;
1327: }
1328:
1329:
1330: /*
1331: ================================================================================
1332: Fonction 'fs?'
1333: ================================================================================
1334: Entrées : structure processus
1335: --------------------------------------------------------------------------------
1336: Sorties :
1337: --------------------------------------------------------------------------------
1338: Effets de bord : néant
1339: ================================================================================
1340: */
1341:
1342: void
1343: instruction_fs_test(struct_processus *s_etat_processus)
1344: {
1345: struct_objet *s_objet_argument;
1346: struct_objet *s_objet_resultat;
1347:
1348: (*s_etat_processus).erreur_execution = d_ex;
1349:
1350: if ((*s_etat_processus).affichage_arguments == 'Y')
1351: {
1352: printf("\n FS? ");
1353:
1354: if ((*s_etat_processus).langue == 'F')
1355: {
1356: printf("(teste si un drapeau est armé)\n\n");
1357: }
1358: else
1359: {
1360: printf("(test if flag is set)\n\n");
1361: }
1362:
1363: printf(" 1: %s\n", d_INT);
1364: printf("-> 1: %s\n", d_INT);
1365:
1366: return;
1367: }
1368: else if ((*s_etat_processus).test_instruction == 'Y')
1369: {
1370: (*s_etat_processus).nombre_arguments = -1;
1371: return;
1372: }
1373:
1374: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1375: {
1376: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1377: {
1378: return;
1379: }
1380: }
1381:
1382: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1383: &s_objet_argument) == d_erreur)
1384: {
1385: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1386: return;
1387: }
1388:
1389: if ((*s_objet_argument).type == INT)
1390: {
1391: if (((*((integer8 *) (*s_objet_argument).objet)) < 1) ||
1392: ((*((integer8 *) (*s_objet_argument).objet)) > 64))
1393: {
1394: liberation(s_etat_processus, s_objet_argument);
1395:
1396: (*s_etat_processus).erreur_execution = d_ex_drapeau_inexistant;
1397: return;
1398: }
1399:
1400: if ((s_objet_resultat = allocation(s_etat_processus, INT))
1401: == NULL)
1402: {
1403: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1404: return;
1405: }
1406:
1407: if (test_cfsf(s_etat_processus, (unsigned char) (*((integer8 *)
1408: (*s_objet_argument).objet))) == d_vrai)
1409: {
1410: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1411: }
1412: else
1413: {
1414: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
1415: }
1416: }
1417: else
1418: {
1419: liberation(s_etat_processus, s_objet_argument);
1420:
1421: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1422: return;
1423: }
1424:
1425: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1426: s_objet_resultat) == d_erreur)
1427: {
1428: return;
1429: }
1430:
1431: liberation(s_etat_processus, s_objet_argument);
1432:
1433: return;
1434: }
1435:
1436:
1437: /*
1438: ================================================================================
1439: Fonction 'fs?s'
1440: ================================================================================
1441: Entrées : structure processus
1442: --------------------------------------------------------------------------------
1443: Sorties :
1444: --------------------------------------------------------------------------------
1445: Effets de bord : néant
1446: ================================================================================
1447: */
1448:
1449: void
1450: instruction_fs_test_s(struct_processus *s_etat_processus)
1451: {
1452: (*s_etat_processus).erreur_execution = d_ex;
1453:
1454: if ((*s_etat_processus).affichage_arguments == 'Y')
1455: {
1456: printf("\n FS?S ");
1457:
1458: if ((*s_etat_processus).langue == 'F')
1459: {
1460: printf("(teste si un drapeau est armé et arme le drapeau)\n\n");
1461: }
1462: else
1463: {
1464: printf("(test if flag is set and set flag)\n\n");
1465: }
1466:
1467: printf(" 1: %s\n", d_INT);
1468: printf("-> 1: %s\n", d_INT);
1469:
1470: return;
1471: }
1472: else if ((*s_etat_processus).test_instruction == 'Y')
1473: {
1474: (*s_etat_processus).nombre_arguments = -1;
1475: return;
1476: }
1477:
1478: instruction_dup(s_etat_processus);
1479:
1480: if (((*s_etat_processus).erreur_systeme != d_es) ||
1481: ((*s_etat_processus).erreur_execution != d_ex))
1482: {
1483: return;
1484: }
1485:
1486: instruction_fs_test(s_etat_processus);
1487:
1488: if (((*s_etat_processus).erreur_systeme != d_es) ||
1489: ((*s_etat_processus).erreur_execution != d_ex))
1490: {
1491: return;
1492: }
1493:
1494: if (((*s_etat_processus).erreur_systeme != d_es) ||
1495: ((*s_etat_processus).erreur_execution != d_ex))
1496: {
1497: return;
1498: }
1499:
1500: instruction_swap(s_etat_processus);
1501:
1502: if (((*s_etat_processus).erreur_systeme != d_es) ||
1503: ((*s_etat_processus).erreur_execution != d_ex))
1504: {
1505: return;
1506: }
1507:
1508: instruction_sf(s_etat_processus);
1509:
1510: return;
1511: }
1512:
1513:
1514: /*
1515: ================================================================================
1516: Fonction 'fs?c'
1517: ================================================================================
1518: Entrées : structure processus
1519: --------------------------------------------------------------------------------
1520: Sorties :
1521: --------------------------------------------------------------------------------
1522: Effets de bord : néant
1523: ================================================================================
1524: */
1525:
1526: void
1527: instruction_fs_test_c(struct_processus *s_etat_processus)
1528: {
1529: (*s_etat_processus).erreur_execution = d_ex;
1530:
1531: if ((*s_etat_processus).affichage_arguments == 'Y')
1532: {
1533: printf("\n FS?C ");
1534:
1535: if ((*s_etat_processus).langue == 'F')
1536: {
1537: printf("(teste si un drapeau est armé et désarme le drapeau)\n\n");
1538: }
1539: else
1540: {
1541: printf("(test if flag is set and clear flag)\n\n");
1542: }
1543:
1544: printf(" 1: %s\n", d_INT);
1545: printf("-> 1: %s\n", d_INT);
1546:
1547: return;
1548: }
1549: else if ((*s_etat_processus).test_instruction == 'Y')
1550: {
1551: (*s_etat_processus).nombre_arguments = -1;
1552: return;
1553: }
1554:
1555: instruction_dup(s_etat_processus);
1556:
1557: if (((*s_etat_processus).erreur_systeme != d_es) ||
1558: ((*s_etat_processus).erreur_execution != d_ex))
1559: {
1560: return;
1561: }
1562:
1563: instruction_fs_test(s_etat_processus);
1564:
1565: if (((*s_etat_processus).erreur_systeme != d_es) ||
1566: ((*s_etat_processus).erreur_execution != d_ex))
1567: {
1568: return;
1569: }
1570:
1571: if (((*s_etat_processus).erreur_systeme != d_es) ||
1572: ((*s_etat_processus).erreur_execution != d_ex))
1573: {
1574: return;
1575: }
1576:
1577: instruction_swap(s_etat_processus);
1578:
1579: if (((*s_etat_processus).erreur_systeme != d_es) ||
1580: ((*s_etat_processus).erreur_execution != d_ex))
1581: {
1582: return;
1583: }
1584:
1585: instruction_cf(s_etat_processus);
1586:
1587: return;
1588: }
1589:
1590:
1591: /*
1592: ================================================================================
1593: Fonction 'fc?s'
1594: ================================================================================
1595: Entrées : structure processus
1596: --------------------------------------------------------------------------------
1597: Sorties :
1598: --------------------------------------------------------------------------------
1599: Effets de bord : néant
1600: ================================================================================
1601: */
1602:
1603: void
1604: instruction_fc_test_s(struct_processus *s_etat_processus)
1605: {
1606: (*s_etat_processus).erreur_execution = d_ex;
1607:
1608: if ((*s_etat_processus).affichage_arguments == 'Y')
1609: {
1610: printf("\n FC?S ");
1611:
1612: if ((*s_etat_processus).langue == 'F')
1613: {
1614: printf("(teste si un drapeau est désarmé et arme le drapeau)\n\n");
1615: }
1616: else
1617: {
1618: printf("(test if flag is clear and set flag)\n\n");
1619: }
1620:
1621: printf(" 1: %s\n", d_INT);
1622: printf("-> 1: %s\n", d_INT);
1623:
1624: return;
1625: }
1626: else if ((*s_etat_processus).test_instruction == 'Y')
1627: {
1628: (*s_etat_processus).nombre_arguments = -1;
1629: return;
1630: }
1631:
1632: instruction_dup(s_etat_processus);
1633:
1634: if (((*s_etat_processus).erreur_systeme != d_es) ||
1635: ((*s_etat_processus).erreur_execution != d_ex))
1636: {
1637: return;
1638: }
1639:
1640: instruction_fc_test(s_etat_processus);
1641:
1642: if (((*s_etat_processus).erreur_systeme != d_es) ||
1643: ((*s_etat_processus).erreur_execution != d_ex))
1644: {
1645: return;
1646: }
1647:
1648: if (((*s_etat_processus).erreur_systeme != d_es) ||
1649: ((*s_etat_processus).erreur_execution != d_ex))
1650: {
1651: return;
1652: }
1653:
1654: instruction_swap(s_etat_processus);
1655:
1656: if (((*s_etat_processus).erreur_systeme != d_es) ||
1657: ((*s_etat_processus).erreur_execution != d_ex))
1658: {
1659: return;
1660: }
1661:
1662: instruction_sf(s_etat_processus);
1663:
1664: return;
1665: }
1666:
1667:
1668: /*
1669: ================================================================================
1670: Fonction 'fc?c'
1671: ================================================================================
1672: Entrées : structure processus
1673: --------------------------------------------------------------------------------
1674: Sorties :
1675: --------------------------------------------------------------------------------
1676: Effets de bord : néant
1677: ================================================================================
1678: */
1679:
1680: void
1681: instruction_fc_test_c(struct_processus *s_etat_processus)
1682: {
1683: (*s_etat_processus).erreur_execution = d_ex;
1684:
1685: if ((*s_etat_processus).affichage_arguments == 'Y')
1686: {
1687: printf("\n FC?C ");
1688:
1689: if ((*s_etat_processus).langue == 'F')
1690: {
1691: printf("(teste si un drapeau est désarmé et désarme le drapeau)"
1692: "\n\n");
1693: }
1694: else
1695: {
1696: printf("(test if flag is clear and clear flag)\n\n");
1697: }
1698:
1699: printf(" 1: %s\n", d_INT);
1700: printf("-> 1: %s\n", d_INT);
1701:
1702: return;
1703: }
1704: else if ((*s_etat_processus).test_instruction == 'Y')
1705: {
1706: (*s_etat_processus).nombre_arguments = -1;
1707: return;
1708: }
1709:
1710: instruction_dup(s_etat_processus);
1711:
1712: if (((*s_etat_processus).erreur_systeme != d_es) ||
1713: ((*s_etat_processus).erreur_execution != d_ex))
1714: {
1715: return;
1716: }
1717:
1718: instruction_fc_test(s_etat_processus);
1719:
1720: if (((*s_etat_processus).erreur_systeme != d_es) ||
1721: ((*s_etat_processus).erreur_execution != d_ex))
1722: {
1723: return;
1724: }
1725:
1726: if (((*s_etat_processus).erreur_systeme != d_es) ||
1727: ((*s_etat_processus).erreur_execution != d_ex))
1728: {
1729: return;
1730: }
1731:
1732: instruction_swap(s_etat_processus);
1733:
1734: if (((*s_etat_processus).erreur_systeme != d_es) ||
1735: ((*s_etat_processus).erreur_execution != d_ex))
1736: {
1737: return;
1738: }
1739:
1740: instruction_cf(s_etat_processus);
1741:
1742: return;
1743: }
1744:
1745:
1746: /*
1747: ================================================================================
1748: Fonction 'fact'
1749: ================================================================================
1750: Entrées :
1751: --------------------------------------------------------------------------------
1752: Sorties :
1753: --------------------------------------------------------------------------------
1754: Effets de bord : néant
1755: ================================================================================
1756: */
1757:
1758: void
1759: instruction_fact(struct_processus *s_etat_processus)
1760: {
1761: logical1 depassement;
1762:
1763: real8 produit;
1764:
1765: integer8 i;
1766: integer8 ifact;
1767: integer8 tampon;
1768:
1769: struct_liste_chainee *l_element_courant;
1770: struct_liste_chainee *l_element_precedent;
1771:
1772: struct_objet *s_copie_argument;
1773: struct_objet *s_objet_argument;
1774: struct_objet *s_objet_resultat;
1775:
1776: (*s_etat_processus).erreur_execution = d_ex;
1777:
1778: if ((*s_etat_processus).affichage_arguments == 'Y')
1779: {
1780: printf("\n FACT ");
1781:
1782: if ((*s_etat_processus).langue == 'F')
1783: {
1784: printf("(factorielle)\n\n");
1785: }
1786: else
1787: {
1788: printf("(factorial)\n\n");
1789: }
1790:
1791: printf(" 1: %s\n", d_INT);
1792: printf("-> 1: %s, %s\n\n", d_INT, d_REL);
1793:
1794: printf(" 1: %s, %s\n", d_NOM, d_ALG);
1795: printf("-> 1: %s\n\n", d_ALG);
1796:
1797: printf(" 1: %s\n", d_RPN);
1798: printf("-> 1: %s\n", d_RPN);
1799:
1800: return;
1801: }
1802: else if ((*s_etat_processus).test_instruction == 'Y')
1803: {
1804: (*s_etat_processus).nombre_arguments = 1;
1805: return;
1806: }
1807:
1808: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1809: {
1810: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1811: {
1812: return;
1813: }
1814: }
1815:
1816: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1817: &s_objet_argument) == d_erreur)
1818: {
1819: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1820: return;
1821: }
1822:
1823: /*
1824: --------------------------------------------------------------------------------
1825: Calcul de la factorielle d'un entier (résultat réel)
1826: --------------------------------------------------------------------------------
1827: */
1828:
1829: if ((*s_objet_argument).type == INT)
1830: {
1831: if ((*((integer8 *) (*s_objet_argument).objet)) < 0)
1832: {
1833: if (test_cfsf(s_etat_processus, 59) == d_vrai)
1834: {
1835: liberation(s_etat_processus, s_objet_argument);
1836:
1837: (*s_etat_processus).exception = d_ep_overflow;
1838: return;
1839: }
1840: else
1841: {
1842: if ((s_objet_resultat = allocation(s_etat_processus, REL))
1843: == NULL)
1844: {
1845: (*s_etat_processus).erreur_systeme =
1846: d_es_allocation_memoire;
1847: return;
1848: }
1849:
1850: (*((real8 *) (*s_objet_resultat).objet)) =
1851: ((double) 1) / ((double) 0);
1852: }
1853: }
1854: else
1855: {
1856: ifact = 1;
1857: depassement = d_faux;
1858:
1859: for (i = 1; i <= (*((integer8 *) (*s_objet_argument).objet)); i++)
1860: {
1861: if (depassement_multiplication(&ifact, &i, &tampon) == d_erreur)
1862: {
1863: depassement = d_vrai;
1864: break;
1865: }
1866:
1867: ifact = tampon;
1868: }
1869:
1870: if (depassement == d_faux)
1871: {
1872: if ((s_objet_resultat = allocation(s_etat_processus, INT))
1873: == NULL)
1874: {
1875: (*s_etat_processus).erreur_systeme =
1876: d_es_allocation_memoire;
1877: return;
1878: }
1879:
1880: (*((integer8 *) (*s_objet_resultat).objet)) = ifact;
1881: }
1882: else
1883: {
1884: produit = 1;
1885:
1886: for (i = 1; i <= (*((integer8 *) (*s_objet_argument).objet));
1887: i++)
1888: {
1889: produit *= (real8) i;
1890: }
1891:
1892: if ((s_objet_resultat = allocation(s_etat_processus, REL))
1893: == NULL)
1894: {
1895: (*s_etat_processus).erreur_systeme =
1896: d_es_allocation_memoire;
1897: return;
1898: }
1899:
1900: (*((real8 *) (*s_objet_resultat).objet)) = produit;
1901: }
1902: }
1903: }
1904:
1905: /*
1906: --------------------------------------------------------------------------------
1907: Factorielle d'un nom
1908: --------------------------------------------------------------------------------
1909: */
1910:
1911: else if ((*s_objet_argument).type == NOM)
1912: {
1913: if ((s_objet_resultat = allocation(s_etat_processus, ALG))
1914: == NULL)
1915: {
1916: (*s_etat_processus).erreur_systeme =
1917: d_es_allocation_memoire;
1918: return;
1919: }
1920:
1921: if (((*s_objet_resultat).objet =
1922: allocation_maillon(s_etat_processus)) == NULL)
1923: {
1924: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1925: return;
1926: }
1927:
1928: l_element_courant = (*s_objet_resultat).objet;
1929:
1930: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1931: == NULL)
1932: {
1933: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1934: return;
1935: }
1936:
1937: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1938: .nombre_arguments = 0;
1939: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1940: .fonction = instruction_vers_niveau_superieur;
1941:
1942: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1943: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1944: {
1945: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1946: return;
1947: }
1948:
1949: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1950: .nom_fonction, "<<");
1951:
1952: if (((*l_element_courant).suivant =
1953: allocation_maillon(s_etat_processus)) == NULL)
1954: {
1955: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1956: return;
1957: }
1958:
1959: l_element_courant = (*l_element_courant).suivant;
1960: (*l_element_courant).donnee = s_objet_argument;
1961:
1962: if (((*l_element_courant).suivant =
1963: allocation_maillon(s_etat_processus)) == NULL)
1964: {
1965: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1966: return;
1967: }
1968:
1969: l_element_courant = (*l_element_courant).suivant;
1970:
1971: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1972: == NULL)
1973: {
1974: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1975: return;
1976: }
1977:
1978: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1979: .nombre_arguments = 1;
1980: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1981: .fonction = instruction_fact;
1982:
1983: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1984: .nom_fonction = malloc(5 * sizeof(unsigned char))) == NULL)
1985: {
1986: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1987: return;
1988: }
1989:
1990: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1991: .nom_fonction, "FACT");
1992:
1993: if (((*l_element_courant).suivant =
1994: allocation_maillon(s_etat_processus)) == NULL)
1995: {
1996: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1997: return;
1998: }
1999:
2000: l_element_courant = (*l_element_courant).suivant;
2001:
2002: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2003: == NULL)
2004: {
2005: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2006: return;
2007: }
2008:
2009: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2010: .nombre_arguments = 0;
2011: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2012: .fonction = instruction_vers_niveau_inferieur;
2013:
2014: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2015: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
2016: {
2017: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2018: return;
2019: }
2020:
2021: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2022: .nom_fonction, ">>");
2023:
2024: (*l_element_courant).suivant = NULL;
2025: s_objet_argument = NULL;
2026: }
2027:
2028: /*
2029: --------------------------------------------------------------------------------
2030: Factorielle d'une expression
2031: --------------------------------------------------------------------------------
2032: */
2033:
2034: else if (((*s_objet_argument).type == ALG) ||
2035: ((*s_objet_argument).type == RPN))
2036: {
2037: if ((s_copie_argument = copie_objet(s_etat_processus,
2038: s_objet_argument, 'N')) == NULL)
2039: {
2040: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2041: return;
2042: }
2043:
2044: l_element_courant = (struct_liste_chainee *)
2045: (*s_copie_argument).objet;
2046: l_element_precedent = l_element_courant;
2047:
2048: while((*l_element_courant).suivant != NULL)
2049: {
2050: l_element_precedent = l_element_courant;
2051: l_element_courant = (*l_element_courant).suivant;
2052: }
2053:
2054: if (((*l_element_precedent).suivant =
2055: allocation_maillon(s_etat_processus)) == NULL)
2056: {
2057: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2058: return;
2059: }
2060:
2061: if (((*(*l_element_precedent).suivant).donnee =
2062: allocation(s_etat_processus, FCT)) == NULL)
2063: {
2064: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2065: return;
2066: }
2067:
2068: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2069: .donnee).objet)).nombre_arguments = 1;
2070: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2071: .donnee).objet)).fonction = instruction_fact;
2072:
2073: if (((*((struct_fonction *) (*(*(*l_element_precedent)
2074: .suivant).donnee).objet)).nom_fonction =
2075: malloc(5 * sizeof(unsigned char))) == NULL)
2076: {
2077: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2078: return;
2079: }
2080:
2081: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
2082: .suivant).donnee).objet)).nom_fonction, "FACT");
2083:
2084: (*(*l_element_precedent).suivant).suivant = l_element_courant;
2085:
2086: s_objet_resultat = s_copie_argument;
2087: }
2088:
2089: /*
2090: --------------------------------------------------------------------------------
2091: Factorielle impossible à réaliser
2092: --------------------------------------------------------------------------------
2093: */
2094:
2095: else
2096: {
2097: liberation(s_etat_processus, s_objet_argument);
2098:
2099: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2100: return;
2101: }
2102:
2103: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2104: s_objet_resultat) == d_erreur)
2105: {
2106: return;
2107: }
2108:
2109: liberation(s_etat_processus, s_objet_argument);
2110:
2111: return;
2112: }
2113:
2114:
2115: /*
2116: ================================================================================
2117: Fonction 'floor'
2118: ================================================================================
2119: Entrées :
2120: --------------------------------------------------------------------------------
2121: Sorties :
2122: --------------------------------------------------------------------------------
2123: Effets de bord : néant
2124: ================================================================================
2125: */
2126:
2127: void
2128: instruction_floor(struct_processus *s_etat_processus)
2129: {
2130: struct_liste_chainee *l_element_courant;
2131: struct_liste_chainee *l_element_precedent;
2132:
2133: struct_objet *s_copie_argument;
2134: struct_objet *s_objet_argument;
2135: struct_objet *s_objet_resultat;
2136:
2137: (*s_etat_processus).erreur_execution = d_ex;
2138:
2139: if ((*s_etat_processus).affichage_arguments == 'Y')
2140: {
2141: printf("\n FLOOR ");
2142:
2143: if ((*s_etat_processus).langue == 'F')
2144: {
2145: printf("(valeur plancher)\n\n");
2146: }
2147: else
2148: {
2149: printf("(floor value)\n\n");
2150: }
2151:
2152: printf(" 1: %s\n", d_INT);
2153: printf("-> 1: %s\n\n", d_INT);
2154:
2155: printf(" 1: %s\n", d_REL);
2156: printf("-> 1: %s, %s\n\n", d_INT, d_REL);
2157:
2158: printf(" 1: %s, %s\n", d_NOM, d_ALG);
2159: printf("-> 1: %s\n\n", d_ALG);
2160:
2161: printf(" 1: %s\n", d_RPN);
2162: printf("-> 1: %s\n", d_RPN);
2163:
2164: return;
2165: }
2166: else if ((*s_etat_processus).test_instruction == 'Y')
2167: {
2168: (*s_etat_processus).nombre_arguments = 1;
2169: return;
2170: }
2171:
2172: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2173: {
2174: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
2175: {
2176: return;
2177: }
2178: }
2179:
2180: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2181: &s_objet_argument) == d_erreur)
2182: {
2183: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2184: return;
2185: }
2186:
2187: /*
2188: --------------------------------------------------------------------------------
2189: Plancher d'un entier
2190: --------------------------------------------------------------------------------
2191: */
2192:
2193: if ((*s_objet_argument).type == INT)
2194: {
2195: s_objet_resultat = s_objet_argument;
2196: s_objet_argument = NULL;
2197: }
2198:
2199: /*
2200: --------------------------------------------------------------------------------
2201: Plancher d'un réel
2202: --------------------------------------------------------------------------------
2203: */
2204:
2205: else if ((*s_objet_argument).type == REL)
2206: {
2207: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
2208: {
2209: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2210: return;
2211: }
2212:
2213: (*((integer8 *) (*s_objet_resultat).objet)) = (integer8)
2214: floor((*((real8 *) (*s_objet_argument).objet)));
2215:
2216: if (!((((*((integer8 *) (*s_objet_resultat).objet)) <
2217: (*((real8 *) (*s_objet_argument).objet))) && (((*((integer8 *)
2218: (*s_objet_resultat).objet)) + 1) > (*((real8 *)
2219: (*s_objet_argument).objet))))))
2220: {
2221: free((*s_objet_resultat).objet);
2222:
2223: if (((*s_objet_resultat).objet = malloc(sizeof(real8))) == NULL)
2224: {
2225: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2226: return;
2227: }
2228:
2229: (*s_objet_resultat).type = REL;
2230: (*((real8 *) (*s_objet_resultat).objet)) =
2231: ceil((*((real8 *) (*s_objet_argument).objet)));
2232: }
2233: }
2234:
2235: /*
2236: --------------------------------------------------------------------------------
2237: Plancher d'un nom
2238: --------------------------------------------------------------------------------
2239: */
2240:
2241: else if ((*s_objet_argument).type == NOM)
2242: {
2243: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
2244: {
2245: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2246: return;
2247: }
2248:
2249: if (((*s_objet_resultat).objet =
2250: allocation_maillon(s_etat_processus)) == NULL)
2251: {
2252: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2253: return;
2254: }
2255:
2256: l_element_courant = (*s_objet_resultat).objet;
2257:
2258: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2259: == NULL)
2260: {
2261: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2262: return;
2263: }
2264:
2265: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2266: .nombre_arguments = 0;
2267: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2268: .fonction = instruction_vers_niveau_superieur;
2269:
2270: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2271: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
2272: {
2273: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2274: return;
2275: }
2276:
2277: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2278: .nom_fonction, "<<");
2279:
2280: if (((*l_element_courant).suivant =
2281: allocation_maillon(s_etat_processus)) == NULL)
2282: {
2283: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2284: return;
2285: }
2286:
2287: l_element_courant = (*l_element_courant).suivant;
2288: (*l_element_courant).donnee = s_objet_argument;
2289:
2290: if (((*l_element_courant).suivant =
2291: allocation_maillon(s_etat_processus)) == NULL)
2292: {
2293: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2294: return;
2295: }
2296:
2297: l_element_courant = (*l_element_courant).suivant;
2298:
2299: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2300: == NULL)
2301: {
2302: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2303: return;
2304: }
2305:
2306: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2307: .nombre_arguments = 1;
2308: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2309: .fonction = instruction_floor;
2310:
2311: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2312: .nom_fonction = malloc(6 * sizeof(unsigned char))) == NULL)
2313: {
2314: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2315: return;
2316: }
2317:
2318: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2319: .nom_fonction, "FLOOR");
2320:
2321: if (((*l_element_courant).suivant =
2322: allocation_maillon(s_etat_processus)) == NULL)
2323: {
2324: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2325: return;
2326: }
2327:
2328: l_element_courant = (*l_element_courant).suivant;
2329:
2330: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2331: == NULL)
2332: {
2333: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2334: return;
2335: }
2336:
2337: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2338: .nombre_arguments = 0;
2339: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2340: .fonction = instruction_vers_niveau_inferieur;
2341:
2342: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2343: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
2344: {
2345: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2346: return;
2347: }
2348:
2349: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2350: .nom_fonction, ">>");
2351:
2352: (*l_element_courant).suivant = NULL;
2353: s_objet_argument = NULL;
2354: }
2355:
2356: /*
2357: --------------------------------------------------------------------------------
2358: Plancher d'une expression
2359: --------------------------------------------------------------------------------
2360: */
2361:
2362: else if (((*s_objet_argument).type == ALG) ||
2363: ((*s_objet_argument).type == RPN))
2364: {
2365: if ((s_copie_argument = copie_objet(s_etat_processus,
2366: s_objet_argument, 'N')) == NULL)
2367: {
2368: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2369: return;
2370: }
2371:
2372: l_element_courant = (struct_liste_chainee *)
2373: (*s_copie_argument).objet;
2374: l_element_precedent = l_element_courant;
2375:
2376: while((*l_element_courant).suivant != NULL)
2377: {
2378: l_element_precedent = l_element_courant;
2379: l_element_courant = (*l_element_courant).suivant;
2380: }
2381:
2382: if (((*l_element_precedent).suivant =
2383: allocation_maillon(s_etat_processus)) == NULL)
2384: {
2385: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2386: return;
2387: }
2388:
2389: if (((*(*l_element_precedent).suivant).donnee =
2390: allocation(s_etat_processus, FCT)) == NULL)
2391: {
2392: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2393: return;
2394: }
2395:
2396: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2397: .donnee).objet)).nombre_arguments = 1;
2398: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2399: .donnee).objet)).fonction = instruction_floor;
2400:
2401: if (((*((struct_fonction *) (*(*(*l_element_precedent)
2402: .suivant).donnee).objet)).nom_fonction =
2403: malloc(6 * sizeof(unsigned char))) == NULL)
2404: {
2405: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2406: return;
2407: }
2408:
2409: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
2410: .suivant).donnee).objet)).nom_fonction, "FLOOR");
2411:
2412: (*(*l_element_precedent).suivant).suivant = l_element_courant;
2413:
2414: s_objet_resultat = s_copie_argument;
2415: }
2416:
2417: /*
2418: --------------------------------------------------------------------------------
2419: Fonction floor impossible à réaliser
2420: --------------------------------------------------------------------------------
2421: */
2422:
2423: else
2424: {
2425: liberation(s_etat_processus, s_objet_argument);
2426:
2427: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2428: return;
2429: }
2430:
2431: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2432: s_objet_resultat) == d_erreur)
2433: {
2434: return;
2435: }
2436:
2437: liberation(s_etat_processus, s_objet_argument);
2438:
2439: return;
2440: }
2441:
2442:
2443: /*
2444: ================================================================================
2445: Fonction 'fp'
2446: ================================================================================
2447: Entrées :
2448: --------------------------------------------------------------------------------
2449: Sorties :
2450: --------------------------------------------------------------------------------
2451: Effets de bord : néant
2452: ================================================================================
2453: */
2454:
2455: void
2456: instruction_fp(struct_processus *s_etat_processus)
2457: {
2458: struct_liste_chainee *l_element_courant;
2459: struct_liste_chainee *l_element_precedent;
2460:
2461: struct_objet *s_copie_argument;
2462: struct_objet *s_objet_argument;
2463: struct_objet *s_objet_resultat;
2464:
2465: (*s_etat_processus).erreur_execution = d_ex;
2466:
2467: if ((*s_etat_processus).affichage_arguments == 'Y')
2468: {
2469: printf("\n FP ");
2470:
2471: if ((*s_etat_processus).langue == 'F')
2472: {
2473: printf("(part fractionnaire)\n\n");
2474: }
2475: else
2476: {
2477: printf("(fractional part)\n\n");
2478: }
2479:
2480: printf(" 1: %s, %s\n", d_INT, d_REL);
2481: printf("-> 1: %s\n\n", d_REL);
2482:
2483: printf(" 1: %s, %s\n", d_NOM, d_ALG);
2484: printf("-> 1: %s\n\n", d_ALG);
2485:
2486: printf(" 1: %s\n", d_RPN);
2487: printf("-> 1: %s\n", d_RPN);
2488:
2489: return;
2490: }
2491: else if ((*s_etat_processus).test_instruction == 'Y')
2492: {
2493: (*s_etat_processus).nombre_arguments = 1;
2494: return;
2495: }
2496:
2497: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2498: {
2499: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
2500: {
2501: return;
2502: }
2503: }
2504:
2505: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2506: &s_objet_argument) == d_erreur)
2507: {
2508: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2509: return;
2510: }
2511:
2512: /*
2513: --------------------------------------------------------------------------------
2514: fp d'un entier
2515: --------------------------------------------------------------------------------
2516: */
2517:
2518: if ((*s_objet_argument).type == INT)
2519: {
2520: if ((s_objet_resultat = allocation(s_etat_processus, REL))
2521: == NULL)
2522: {
2523: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2524: return;
2525: }
2526:
2527: (*((real8 *) (*s_objet_resultat).objet)) = 0;
2528: }
2529:
2530: /*
2531: --------------------------------------------------------------------------------
2532: fp d'un réel
2533: --------------------------------------------------------------------------------
2534: */
2535:
2536: else if ((*s_objet_argument).type == REL)
2537: {
2538: if ((s_objet_resultat = allocation(s_etat_processus, REL))
2539: == NULL)
2540: {
2541: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2542: return;
2543: }
2544:
2545: if ((*((real8 *) (*s_objet_argument).objet)) > 0)
2546: {
2547: (*((real8 *) (*s_objet_resultat).objet)) =
2548: (*((real8 *) (*s_objet_argument).objet)) -
2549: floor((*((real8 *) (*s_objet_argument).objet)));
2550: }
2551: else
2552: {
2553: (*((real8 *) (*s_objet_resultat).objet)) =
2554: (*((real8 *) (*s_objet_argument).objet)) -
2555: ceil((*((real8 *) (*s_objet_argument).objet)));
2556: }
2557: }
2558:
2559: /*
2560: --------------------------------------------------------------------------------
2561: fp d'un nom
2562: --------------------------------------------------------------------------------
2563: */
2564:
2565: else if ((*s_objet_argument).type == NOM)
2566: {
2567: if ((s_objet_resultat = allocation(s_etat_processus, ALG))
2568: == NULL)
2569: {
2570: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2571: return;
2572: }
2573:
2574: if (((*s_objet_resultat).objet =
2575: allocation_maillon(s_etat_processus)) == NULL)
2576: {
2577: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2578: return;
2579: }
2580:
2581: l_element_courant = (*s_objet_resultat).objet;
2582:
2583: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2584: == NULL)
2585: {
2586: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2587: return;
2588: }
2589:
2590: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2591: .nombre_arguments = 0;
2592: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2593: .fonction = instruction_vers_niveau_superieur;
2594:
2595: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2596: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
2597: {
2598: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2599: return;
2600: }
2601:
2602: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2603: .nom_fonction, "<<");
2604:
2605: if (((*l_element_courant).suivant =
2606: allocation_maillon(s_etat_processus)) == NULL)
2607: {
2608: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2609: return;
2610: }
2611:
2612: l_element_courant = (*l_element_courant).suivant;
2613: (*l_element_courant).donnee = s_objet_argument;
2614:
2615: if (((*l_element_courant).suivant =
2616: allocation_maillon(s_etat_processus)) == NULL)
2617: {
2618: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2619: return;
2620: }
2621:
2622: l_element_courant = (*l_element_courant).suivant;
2623:
2624: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2625: == NULL)
2626: {
2627: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2628: return;
2629: }
2630:
2631: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2632: .nombre_arguments = 1;
2633: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2634: .fonction = instruction_fp;
2635:
2636: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2637: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
2638: {
2639: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2640: return;
2641: }
2642:
2643: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2644: .nom_fonction, "FP");
2645:
2646: if (((*l_element_courant).suivant =
2647: allocation_maillon(s_etat_processus)) == NULL)
2648: {
2649: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2650: return;
2651: }
2652:
2653: l_element_courant = (*l_element_courant).suivant;
2654:
2655: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
2656: == NULL)
2657: {
2658: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2659: return;
2660: }
2661:
2662: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2663: .nombre_arguments = 0;
2664: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2665: .fonction = instruction_vers_niveau_inferieur;
2666:
2667: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2668: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
2669: {
2670: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2671: return;
2672: }
2673:
2674: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
2675: .nom_fonction, ">>");
2676:
2677: (*l_element_courant).suivant = NULL;
2678: s_objet_argument = NULL;
2679: }
2680:
2681: /*
2682: --------------------------------------------------------------------------------
2683: fp d'une expression
2684: --------------------------------------------------------------------------------
2685: */
2686:
2687: else if (((*s_objet_argument).type == ALG) ||
2688: ((*s_objet_argument).type == RPN))
2689: {
2690: if ((s_copie_argument = copie_objet(s_etat_processus,
2691: s_objet_argument, 'N')) == NULL)
2692: {
2693: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2694: return;
2695: }
2696:
2697: l_element_courant = (struct_liste_chainee *)
2698: (*s_copie_argument).objet;
2699: l_element_precedent = l_element_courant;
2700:
2701: while((*l_element_courant).suivant != NULL)
2702: {
2703: l_element_precedent = l_element_courant;
2704: l_element_courant = (*l_element_courant).suivant;
2705: }
2706:
2707: if (((*l_element_precedent).suivant =
2708: allocation_maillon(s_etat_processus)) == NULL)
2709: {
2710: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2711: return;
2712: }
2713:
2714: if (((*(*l_element_precedent).suivant).donnee =
2715: allocation(s_etat_processus, FCT)) == NULL)
2716: {
2717: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2718: return;
2719: }
2720:
2721: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2722: .donnee).objet)).nombre_arguments = 1;
2723: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
2724: .donnee).objet)).fonction = instruction_fp;
2725:
2726: if (((*((struct_fonction *) (*(*(*l_element_precedent)
2727: .suivant).donnee).objet)).nom_fonction =
2728: malloc(3 * sizeof(unsigned char))) == NULL)
2729: {
2730: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2731: return;
2732: }
2733:
2734: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
2735: .suivant).donnee).objet)).nom_fonction, "FP");
2736:
2737: (*(*l_element_precedent).suivant).suivant = l_element_courant;
2738:
2739: s_objet_resultat = s_copie_argument;
2740: }
2741:
2742: /*
2743: --------------------------------------------------------------------------------
2744: Fonction fp impossible à réaliser
2745: --------------------------------------------------------------------------------
2746: */
2747:
2748: else
2749: {
2750: liberation(s_etat_processus, s_objet_argument);
2751:
2752: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2753: return;
2754: }
2755:
2756: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2757: s_objet_resultat) == d_erreur)
2758: {
2759: return;
2760: }
2761:
2762: liberation(s_etat_processus, s_objet_argument);
2763:
2764: return;
2765: }
2766:
2767:
2768: /*
2769: ================================================================================
2770: Fonction 'fix'
2771: ================================================================================
2772: Entrées : pointeur sur une struct_processus
2773: --------------------------------------------------------------------------------
2774: Sorties :
2775: --------------------------------------------------------------------------------
2776: Effets de bord : néant
2777: ================================================================================
2778: */
2779:
2780: void
2781: instruction_fix(struct_processus *s_etat_processus)
2782: {
2783: struct_objet *s_objet_argument;
2784: struct_objet *s_objet;
2785:
2786: logical1 i43;
2787: logical1 i44;
2788:
2789: unsigned char *valeur_binaire;
2790:
2791: unsigned long i;
2792: unsigned long j;
2793:
2794: (*s_etat_processus).erreur_execution = d_ex;
2795:
2796: if ((*s_etat_processus).affichage_arguments == 'Y')
2797: {
2798: printf("\n FIX ");
2799:
2800: if ((*s_etat_processus).langue == 'F')
2801: {
2802: printf("(format virgule fixe)\n\n");
2803: }
2804: else
2805: {
2806: printf("(fixed point format)\n\n");
2807: }
2808:
2809: printf(" 1: %s\n", d_INT);
2810:
2811: return;
2812: }
2813: else if ((*s_etat_processus).test_instruction == 'Y')
2814: {
2815: (*s_etat_processus).nombre_arguments = -1;
2816: return;
2817: }
2818:
2819: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2820: {
2821: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
2822: {
2823: return;
2824: }
2825: }
2826:
2827: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2828: &s_objet_argument) == d_erreur)
2829: {
2830: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2831: return;
2832: }
2833:
2834: if ((*s_objet_argument).type == INT)
2835: {
2836: if (((*((integer8 *) (*s_objet_argument).objet)) >= 0) &&
2837: ((*((integer8 *) (*s_objet_argument).objet)) <= 15))
2838: {
2839: if ((s_objet = allocation(s_etat_processus, BIN)) == NULL)
2840: {
2841: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2842: return;
2843: }
2844:
2845: (*((logical8 *) (*s_objet).objet)) = (logical8)
2846: (*((integer8 *) (*s_objet_argument).objet));
2847:
2848: i43 = test_cfsf(s_etat_processus, 43);
2849: i44 = test_cfsf(s_etat_processus, 44);
2850:
2851: sf(s_etat_processus, 44);
2852: cf(s_etat_processus, 43);
2853:
2854: if ((valeur_binaire = formateur(s_etat_processus, 0, s_objet))
2855: == NULL)
2856: {
2857: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2858: return;
2859: }
2860:
2861: if (i43 == d_vrai)
2862: {
2863: sf(s_etat_processus, 43);
2864: }
2865: else
2866: {
2867: cf(s_etat_processus, 43);
2868: }
2869:
2870: if (i44 == d_vrai)
2871: {
2872: sf(s_etat_processus, 44);
2873: }
2874: else
2875: {
2876: cf(s_etat_processus, 44);
2877: }
2878:
2879: for(j = 53, i = strlen(valeur_binaire) - 2; i >= 2; i--)
2880: {
2881: if (valeur_binaire[i] == '0')
2882: {
2883: cf(s_etat_processus, (unsigned char) j++);
2884: }
2885: else
2886: {
2887: sf(s_etat_processus, (unsigned char) j++);
2888: }
2889: }
2890:
2891: for(; j <= 56; cf(s_etat_processus, (unsigned char) j++));
2892:
2893: sf(s_etat_processus, 49);
2894: cf(s_etat_processus, 50);
2895:
2896: free(valeur_binaire);
2897: liberation(s_etat_processus, s_objet);
2898: }
2899: else
2900: {
2901: liberation(s_etat_processus, s_objet_argument);
2902:
2903: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
2904: return;
2905: }
2906: }
2907: else
2908: {
2909: liberation(s_etat_processus, s_objet_argument);
2910:
2911: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2912: return;
2913: }
2914:
2915: liberation(s_etat_processus, s_objet_argument);
2916:
2917: return;
2918: }
2919:
2920: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>