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