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