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: Boucle principale de l'interpréteur RPL/2
29: ================================================================================
30: Entrées : structure sur l'état du processus
31: --------------------------------------------------------------------------------
32: Sorties : Néant
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: logical1
39: sequenceur(struct_processus *s_etat_processus)
40: {
41: struct_liste_chainee *l_element_courant;
42:
43: struct_objet *s_objet;
44: struct_objet *s_sous_objet;
45:
46: logical1 drapeau_appel_definition;
47: logical1 drapeau_fin;
48: logical1 drapeau_then;
49: logical1 erreur;
50:
51: static logical1 completion_valide = d_faux;
52:
53: struct sigaction action;
54: struct sigaction action_defaut;
55: struct sigaction action_defaut2;
56:
57: unsigned char *instruction_majuscule;
58: unsigned char *ligne;
59: unsigned char *message;
60: unsigned char *registre;
61: unsigned char *tampon;
62: unsigned char tampon_retour;
63: unsigned char *t_ligne;
64:
65: unsigned long i;
66: unsigned long j;
67: unsigned long niveau;
68: unsigned long position_courante;
69:
70: (*s_etat_processus).retour_routine_evaluation = 'N';
71:
72: if ((*s_etat_processus).debug == d_vrai)
73: if (((*s_etat_processus).type_debug &
74: d_debug_appels_fonctions) != 0)
75: {
76: if ((*s_etat_processus).niveau_recursivite != 0)
77: {
78: if ((*s_etat_processus).langue == 'F')
79: {
80: printf("[%d] Exécution récursive de niveau %lu\n",
81: (int) getpid(), (*s_etat_processus).niveau_recursivite);
82: }
83: else
84: {
85: printf("[%d] %lu level recursive execution\n",
86: (int) getpid(), (*s_etat_processus).niveau_recursivite);
87: }
88: }
89: else
90: {
91: if ((*s_etat_processus).langue == 'F')
92: {
93: printf("[%d] Exécution\n", (int) getpid());
94: }
95: else
96: {
97: printf("[%d] Execution\n", (int) getpid());
98: }
99: }
100:
101: fflush(stdout);
102: }
103:
104: /*
105: --------------------------------------------------------------------------------
106: Boucle de l'interpréteur RPL/2
107: On boucle tant qu'on n'a pas une bonne raison de sortir...
108: --------------------------------------------------------------------------------
109: */
110:
111: i = 0;
112: j = 0;
113:
114: do
115: {
116: drapeau_appel_definition = d_faux;
117:
118: /*
119: --------------------------------------------------------------------------------
120: Recherche de l'instruction suivante dans les définitions chaînées
121: --------------------------------------------------------------------------------
122: */
123:
124: if ((erreur = recherche_instruction_suivante(s_etat_processus))
125: == d_erreur)
126: {
127: return(d_erreur);
128: }
129:
130: if (((*s_etat_processus).debug_programme == d_vrai) &&
131: ((*s_etat_processus).niveau_recursivite == 0))
132: {
133: /*
134: * Traitement de la commande HALT (debug)
135: */
136:
137: action.sa_handler = SIG_IGN;
138: action.sa_flags = SA_NODEFER | SA_ONSTACK;
139:
140: (*s_etat_processus).execution_pas_suivant = d_faux;
141: (*s_etat_processus).traitement_instruction_halt = d_vrai;
142:
143: if (completion_valide == d_faux)
144: {
145: initialisation_completion();
146: completion_valide = d_vrai;
147: }
148:
149: while((*s_etat_processus).execution_pas_suivant == d_faux)
150: {
151: if ((*s_etat_processus).hauteur_pile_operationnelle != 0)
152: {
153: fprintf(stdout, "\n");
154: }
155:
156: affichage_pile(s_etat_processus, (*s_etat_processus)
157: .l_base_pile, 1);
158:
159: if ((*s_etat_processus).mode_interactif == 'N')
160: {
161: printf("[%d] Instruction : %s\n", (int) getpid(),
162: (*s_etat_processus).instruction_courante);
163: fflush(stdout);
164: }
165:
166: if (sigaction(SIGINT, &action, &action_defaut) != 0)
167: {
168: (*s_etat_processus).erreur_systeme = d_es_signal;
169: return(d_erreur);
170: }
171:
172: if (sigaction(SIGTSTP, &action, &action_defaut2) != 0)
173: {
174: (*s_etat_processus).erreur_systeme = d_es_signal;
175: return(d_erreur);
176: }
177:
178: (*s_etat_processus).var_volatile_requete_arret = 0;
179: (*s_etat_processus).var_volatile_requete_arret2 = 0;
180:
181: flockfile(stdin);
182: flockfile(stdout);
183:
184: ligne = readline("RPL/2> ");
185:
186: funlockfile(stdin);
187: funlockfile(stdout);
188:
189: if ((*s_etat_processus).var_volatile_requete_arret != 0)
190: {
191: (*s_etat_processus).requete_arret = 'Y';
192: break;
193: }
194:
195: if (ligne != NULL)
196: {
197: if ((t_ligne = transliteration(s_etat_processus, ligne,
198: (*s_etat_processus).localisation, d_locale))
199: == NULL)
200: {
201: return(d_erreur);
202: }
203:
204: free(ligne);
205: ligne = t_ligne;
206:
207: if ((ligne = compactage(ligne)) == NULL)
208: {
209: (*s_etat_processus).erreur_systeme =
210: d_es_allocation_memoire;
211: return(d_erreur);
212: }
213: }
214:
215: if (sigaction(SIGINT, &action_defaut, NULL) != 0)
216: {
217: (*s_etat_processus).erreur_systeme = d_es_signal;
218: return(d_erreur);
219: }
220:
221: if (sigaction(SIGTSTP, &action_defaut2, NULL) != 0)
222: {
223: (*s_etat_processus).erreur_systeme = d_es_signal;
224: return(d_erreur);
225: }
226:
227: if (ligne == NULL)
228: {
229: if ((ligne = (unsigned char *) malloc(6 *
230: sizeof(unsigned char))) == NULL)
231: {
232: (*s_etat_processus).erreur_systeme =
233: d_es_allocation_memoire;
234: return(d_erreur);
235: }
236:
237: sprintf(ligne, "abort");
238: fprintf(stdout, "%s\n", ligne);
239: }
240: else if (((*ligne) == d_code_fin_chaine) &&
241: ((*s_etat_processus).l_base_pile != NULL))
242: {
243: free(ligne);
244:
245: if ((ligne = (unsigned char *) malloc(4 *
246: sizeof(unsigned char))) == NULL)
247: {
248: (*s_etat_processus).erreur_systeme =
249: d_es_allocation_memoire;
250: return(d_erreur);
251: }
252:
253: sprintf(ligne, "dup");
254: }
255:
256: add_history(ligne);
257: stifle_history(ds_longueur_historique);
258:
259: position_courante = (*s_etat_processus).position_courante;
260: tampon = (*s_etat_processus).definitions_chainees;
261: registre = (*s_etat_processus).instruction_courante;
262: (*s_etat_processus).definitions_chainees = ligne;
263:
264: if (analyse_syntaxique(s_etat_processus) == d_absence_erreur)
265: {
266: (*s_etat_processus).instruction_courante = registre;
267: (*s_etat_processus).position_courante = position_courante;
268: (*s_etat_processus).definitions_chainees = tampon;
269:
270: if ((tampon = (unsigned char *) malloc((strlen(ligne) + 7) *
271: sizeof(unsigned char))) == NULL)
272: {
273: (*s_etat_processus).erreur_systeme =
274: d_es_allocation_memoire;
275: return(d_erreur);
276: }
277:
278: sprintf(tampon, "<< %s >>", ligne);
279:
280: free(ligne);
281: ligne = tampon;
282:
283: tampon = (*s_etat_processus).instruction_courante;
284: (*s_etat_processus).instruction_courante = ligne;
285: recherche_type(s_etat_processus);
286:
287: if ((((*s_etat_processus).erreur_execution != d_ex) ||
288: ((*s_etat_processus).erreur_systeme != d_es)) &&
289: ((*s_etat_processus).invalidation_message_erreur
290: == d_faux))
291: {
292: if ((*s_etat_processus).erreur_execution != d_ex)
293: {
294: (*s_etat_processus).erreur_scrutation = d_vrai;
295: }
296:
297: if (test_cfsf(s_etat_processus, 51) == d_faux)
298: {
299: printf("%s", ds_beep);
300: }
301:
302: if ((message = messages(s_etat_processus)) == NULL)
303: {
304: return(d_erreur);
305: }
306:
307: printf("%s [%d]\n", message, (int) getpid());
308:
309: free(message);
310:
311: (*s_etat_processus).erreur_execution = d_ex;
312:
313: if ((*s_etat_processus).erreur_systeme != d_es)
314: {
315: return(d_erreur);
316: }
317: }
318: else
319: {
320: tampon_retour = (*(*s_etat_processus)
321: .l_base_pile_systeme).retour_definition;
322: (*(*s_etat_processus).l_base_pile_systeme)
323: .retour_definition = 'Y';
324:
325: if (depilement(s_etat_processus, &((*s_etat_processus)
326: .l_base_pile), &s_objet) == d_erreur)
327: {
328: if (test_cfsf(s_etat_processus, 51) == d_faux)
329: {
330: printf("%s", ds_beep);
331: }
332:
333: if ((*s_etat_processus).langue == 'F')
334: {
335: printf("+++Erreur : Défaut d'argument\n");
336: }
337: else
338: {
339: printf("+++Error : Too few arguments\n");
340: }
341:
342: (*(*s_etat_processus).l_base_pile_systeme)
343: .retour_definition = tampon_retour;
344:
345: fflush(stdout);
346: }
347: else if (evaluation(s_etat_processus, s_objet, 'I') ==
348: d_erreur)
349: {
350: (*(*s_etat_processus).l_base_pile_systeme)
351: .retour_definition = tampon_retour;
352:
353: if ((*s_etat_processus).erreur_systeme != d_es)
354: {
355: if (test_cfsf(s_etat_processus, 51) == d_faux)
356: {
357: printf("%s", ds_beep);
358: }
359:
360: if ((message = messages(s_etat_processus))
361: == NULL)
362: {
363: return(d_erreur);
364: }
365:
366: printf("%s [%d]\n", message, (int) getpid());
367: free(message);
368:
369: return(d_erreur);
370: }
371: else if ((*s_etat_processus)
372: .invalidation_message_erreur == d_faux)
373: {
374: (*s_etat_processus).erreur_execution =
375: (*s_etat_processus)
376: .derniere_erreur_evaluation;
377:
378: if (test_cfsf(s_etat_processus, 51) == d_faux)
379: {
380: printf("%s", ds_beep);
381: }
382:
383: if ((message = messages(s_etat_processus))
384: == NULL)
385: {
386: return(d_erreur);
387: }
388:
389: printf("%s [%d]\n", message, (int) getpid());
390: free(message);
391:
392: if (test_cfsf(s_etat_processus, 31) == d_vrai)
393: {
394: l_element_courant = (*s_etat_processus)
395: .l_base_pile_last;
396:
397: while(l_element_courant != NULL)
398: {
399: if ((s_sous_objet = copie_objet(
400: s_etat_processus,
401: (*l_element_courant).donnee,
402: 'P')) == NULL)
403: {
404: (*s_etat_processus).erreur_systeme =
405: d_es_allocation_memoire;
406: return(d_erreur);
407: }
408:
409: if (empilement(s_etat_processus,
410: &((*s_etat_processus)
411: .l_base_pile),
412: s_sous_objet) == d_erreur)
413: {
414: return(d_erreur);
415: }
416:
417: l_element_courant = (*l_element_courant)
418: .suivant;
419: }
420: }
421:
422: (*s_etat_processus).erreur_execution = d_ex;
423: (*s_etat_processus).exception = d_ep;
424: }
425:
426: liberation(s_etat_processus, s_objet);
427: }
428: else
429: {
430: liberation(s_etat_processus, s_objet);
431: }
432:
433: (*(*s_etat_processus).l_base_pile_systeme)
434: .retour_definition = tampon_retour;
435: }
436:
437: (*s_etat_processus).instruction_courante = tampon;
438: }
439: else if ((*s_etat_processus).invalidation_message_erreur
440: == d_faux)
441: {
442: (*s_etat_processus).instruction_courante = registre;
443: (*s_etat_processus).position_courante = position_courante;
444: (*s_etat_processus).definitions_chainees = tampon;
445:
446: if (test_cfsf(s_etat_processus, 51) == d_faux)
447: {
448: printf("%s", ds_beep);
449: }
450:
451: if ((message = messages(s_etat_processus)) == NULL)
452: {
453: free(ligne);
454: return(d_erreur);
455: }
456:
457: free(message);
458:
459: if ((*s_etat_processus).langue == 'F')
460: {
461: printf("+++Erreur : Erreur de syntaxe\n");
462: }
463: else
464: {
465: printf("+++Error : Syntax error\n");
466: }
467:
468: fflush(stdout);
469: }
470:
471: free(ligne);
472: }
473:
474: (*s_etat_processus).traitement_instruction_halt = d_faux;
475: }
476:
477: if ((*s_etat_processus).debug == d_vrai)
478: if (((*s_etat_processus).type_debug &
479: d_debug_fonctions_intrinseques) != 0)
480: {
481: if ((*s_etat_processus).langue == 'F')
482: {
483: printf("[%d] Instruction %s\n",
484: (int) getpid(),
485: (*s_etat_processus).instruction_courante);
486: }
487: else
488: {
489: printf("[%d] %s instruction\n",
490: (int) getpid(),
491: (*s_etat_processus).instruction_courante);
492: }
493:
494: fflush(stdout);
495: }
496:
497: /*
498: --------------------------------------------------------------------------------
499: Dans le cas où une instruction est retournée, celle-ci est évaluée. Dans le
500: cas contraire, l'interpréteur renvoie un message d'erreur et s'interrompt.
501: --------------------------------------------------------------------------------
502: */
503:
504: if (erreur == d_absence_erreur)
505: {
506:
507: /*
508: --------------------------------------------------------------------------------
509: Scrutation des mots clef du langage RPL/2 et exécution le cas échéant
510: de l'action associée.
511: --------------------------------------------------------------------------------
512: */
513:
514: analyse(s_etat_processus, NULL);
515:
516: if ((*s_etat_processus).traitement_cycle_exit != 'N')
517: {
518: switch((*s_etat_processus).traitement_cycle_exit)
519: {
520: case 'C' :
521: {
522: instruction_cycle(s_etat_processus);
523: break;
524: }
525:
526: case 'E' :
527: {
528: instruction_exit(s_etat_processus);
529: break;
530: }
531: }
532: }
533:
534: if ((*s_etat_processus).instruction_valide == 'N')
535: {
536:
537: /*
538: --------------------------------------------------------------------------------
539: L'instruction ne correspond pas à l'un des mots clef du langage RPL/2.
540: --------------------------------------------------------------------------------
541: */
542:
543: if ((recherche_variable(s_etat_processus,
544: (*s_etat_processus).instruction_courante) ==
545: d_vrai) && ((*s_etat_processus)
546: .autorisation_evaluation_nom == 'Y'))
547: {
548: if (((*s_etat_processus).s_liste_variables
549: [(*s_etat_processus)
550: .position_variable_courante]).objet == NULL)
551: {
552:
553: /*
554: --------------------------------------------------------------------------------
555: L'instruction est une variable partagée
556: --------------------------------------------------------------------------------
557: */
558:
559: if ((*s_etat_processus).debug == d_vrai)
560: if (((*s_etat_processus).type_debug &
561: d_debug_variables) != 0)
562: {
563: if ((*s_etat_processus).langue == 'F')
564: {
565: printf("[%d] Empilement de la variable "
566: "partagée %s de type %d\n",
567: (int) getpid(),
568: (*s_etat_processus)
569: .instruction_courante,
570: (*((*s_etat_processus).s_liste_variables
571: [(*s_etat_processus)
572: .position_variable_courante]).objet)
573: .type);
574: }
575: else
576: {
577: printf("[%d] Pushing %s as %d type shared "
578: "variable \n", (int) getpid(),
579: (*s_etat_processus)
580: .instruction_courante,
581: (*((*s_etat_processus).s_liste_variables
582: [(*s_etat_processus)
583: .position_variable_courante]).objet)
584: .type);
585: }
586:
587: fflush(stdout);
588: }
589:
590: if (pthread_mutex_lock(&((*(*s_etat_processus)
591: .s_liste_variables_partagees).mutex)) != 0)
592: {
593: (*s_etat_processus).erreur_systeme =
594: d_es_processus;
595: return(d_erreur);
596: }
597:
598: if (recherche_variable_partagee(s_etat_processus,
599: ((*s_etat_processus).s_liste_variables
600: [(*s_etat_processus)
601: .position_variable_courante]).nom,
602: ((*s_etat_processus).s_liste_variables
603: [(*s_etat_processus)
604: .position_variable_courante])
605: .variable_partagee, 'P') == d_vrai)
606: {
607: // La variable existe.
608:
609: if ((s_objet = copie_objet(s_etat_processus,
610: (*(*s_etat_processus)
611: .s_liste_variables_partagees)
612: .table[(*(*s_etat_processus)
613: .s_liste_variables_partagees)
614: .position_variable].objet, 'P'))
615: == NULL)
616: {
617: (*s_etat_processus).erreur_systeme =
618: d_es_allocation_memoire;
619: return(d_erreur);
620: }
621:
622: if (pthread_mutex_unlock(&((*(*s_etat_processus)
623: .s_liste_variables_partagees).mutex))
624: != 0)
625: {
626: (*s_etat_processus).erreur_systeme =
627: d_es_processus;
628: return(d_erreur);
629: }
630:
631: if (empilement(s_etat_processus,
632: &((*s_etat_processus).l_base_pile),
633: s_objet) == d_erreur)
634: {
635: (*s_etat_processus).erreur_systeme =
636: d_es_allocation_memoire;
637: return(d_erreur);
638: }
639: }
640: else
641: {
642: // La variable n'existe plus.
643:
644: (*s_etat_processus).erreur_systeme = d_es;
645:
646: if (pthread_mutex_unlock(&((*(*s_etat_processus)
647: .s_liste_variables_partagees).mutex))
648: != 0)
649: {
650: (*s_etat_processus).erreur_systeme =
651: d_es_processus;
652: return(d_erreur);
653: }
654:
655: recherche_type(s_etat_processus);
656: }
657: }
658:
659: /*
660: --------------------------------------------------------------------------------
661: L'instruction est une variable automatique (évaluation lors de l'empilement).
662: --------------------------------------------------------------------------------
663: */
664:
665: else if ((*((*s_etat_processus).s_liste_variables
666: [(*s_etat_processus).position_variable_courante])
667: .objet).type == ADR)
668: {
669:
670: /*
671: --------------------------------------------------------------------------------
672: L'instruction est une variable de type 'adresse' pointant sur une
673: définition. Un branchement est effectué à cette adresse.
674: --------------------------------------------------------------------------------
675: */
676:
677: if ((*s_etat_processus).debug == d_vrai)
678: if (((*s_etat_processus).type_debug &
679: d_debug_appels_fonctions) != 0)
680: {
681: if ((*s_etat_processus).langue == 'F')
682: {
683: printf("[%d] Branchement à la"
684: " définition %s\n", (int) getpid(),
685: (*s_etat_processus)
686: .instruction_courante);
687: }
688: else
689: {
690: printf("[%d] Execution : "
691: "Branching at %s definition\n",
692: (int) getpid(), (*s_etat_processus)
693: .instruction_courante);
694: }
695:
696: fflush(stdout);
697: }
698:
699: (*s_etat_processus).autorisation_empilement_programme =
700: 'N';
701:
702: empilement_pile_systeme(s_etat_processus);
703:
704: if ((*s_etat_processus).erreur_systeme != d_es)
705: {
706: erreur = d_erreur;
707: }
708: else
709: {
710: if ((*s_etat_processus).profilage == d_vrai)
711: {
712: profilage(s_etat_processus,
713: (*s_etat_processus)
714: .instruction_courante);
715:
716: if ((*s_etat_processus).erreur_systeme != d_es)
717: {
718: return(d_erreur);
719: }
720: }
721:
722: (*(*s_etat_processus).l_base_pile_systeme)
723: .adresse_retour = (*s_etat_processus)
724: .position_courante;
725:
726: (*(*s_etat_processus).l_base_pile_systeme)
727: .retour_definition = 'Y';
728:
729: (*(*s_etat_processus).l_base_pile_systeme)
730: .niveau_courant = (*s_etat_processus)
731: .niveau_courant;
732:
733: (*s_etat_processus).position_courante =
734: (*((unsigned long *)
735: ((*((*s_etat_processus).s_liste_variables
736: [(*s_etat_processus)
737: .position_variable_courante]
738: .objet)).objet)));
739:
740: drapeau_appel_definition = d_vrai;
741: }
742: }
743: else
744: {
745: if ((*s_etat_processus).debug == d_vrai)
746: if (((*s_etat_processus).type_debug &
747: d_debug_variables) != 0)
748: {
749: if ((*s_etat_processus).langue == 'F')
750: {
751: printf("[%d] Empilement de la variable "
752: "%s de type %d\n",
753: (int) getpid(),
754: (*s_etat_processus)
755: .instruction_courante,
756: (*((*s_etat_processus).s_liste_variables
757: [(*s_etat_processus)
758: .position_variable_courante]).objet)
759: .type);
760: }
761: else
762: {
763: printf("[%d] Pushing %s as %d type variable "
764: "\n", (int) getpid(),
765: (*s_etat_processus)
766: .instruction_courante,
767: (*((*s_etat_processus).s_liste_variables
768: [(*s_etat_processus)
769: .position_variable_courante]).objet)
770: .type);
771: }
772:
773: fflush(stdout);
774: }
775:
776: if ((s_objet = copie_objet(s_etat_processus,
777: ((*s_etat_processus)
778: .s_liste_variables[(*s_etat_processus)
779: .position_variable_courante]).objet, 'P'))
780: == NULL)
781: {
782: (*s_etat_processus).erreur_systeme =
783: d_es_allocation_memoire;
784: return(d_erreur);
785: }
786:
787: if (empilement(s_etat_processus,
788: &((*s_etat_processus).l_base_pile),
789: s_objet) == d_erreur)
790: {
791: (*s_etat_processus).erreur_systeme =
792: d_es_allocation_memoire;
793: return(d_erreur);
794: }
795: }
796: }
797: else
798: {
799:
800: /*
801: --------------------------------------------------------------------------------
802: L'instruction est une donnée à empiler.
803: --------------------------------------------------------------------------------
804: */
805:
806: (*s_etat_processus).erreur_systeme = d_es;
807: recherche_type(s_etat_processus);
808: }
809: }
810: else if (((*s_etat_processus).test_instruction == 'Y') &&
811: ((*s_etat_processus).instruction_valide == 'Y'))
812: {
813:
814: /*
815: --------------------------------------------------------------------------------
816: Permet de traiter les fonctions dans les objets de type liste
817: --------------------------------------------------------------------------------
818: */
819:
820: if ((instruction_majuscule = conversion_majuscule(
821: (*s_etat_processus).instruction_courante)) == NULL)
822: {
823: (*s_etat_processus).erreur_systeme =
824: d_es_allocation_memoire;
825: return(d_erreur);
826: }
827:
828: if ((strcmp((*s_etat_processus).instruction_courante, "<<")
829: != 0) && (strcmp((*s_etat_processus)
830: .instruction_courante, ">>") != 0))
831: {
832: if ((s_objet = (struct_objet *) malloc(
833: sizeof(struct_objet))) == NULL)
834: {
835: (*s_etat_processus).erreur_systeme =
836: d_es_allocation_memoire;
837: return(d_erreur);
838: }
839:
840: initialisation_objet(s_objet);
841: (*s_objet).type = FCT;
842:
843: if (((*s_objet).objet = allocation(s_etat_processus, FCT))
844: == NULL)
845: {
846: (*s_etat_processus).erreur_systeme =
847: d_es_allocation_memoire;
848: return(d_erreur);
849: }
850:
851: (*((struct_fonction *) (*s_objet).objet))
852: .nombre_arguments = 0;
853:
854: if ((*s_etat_processus).instruction_intrinseque == 'Y')
855: {
856: if (((*((struct_fonction *) (*s_objet).objet))
857: .nom_fonction = conversion_majuscule(
858: (*s_etat_processus).instruction_courante))
859: == NULL)
860: {
861: (*s_etat_processus).erreur_systeme =
862: d_es_allocation_memoire;
863: return(d_erreur);
864: }
865: }
866: else
867: {
868: if (((*((struct_fonction *) (*s_objet).objet))
869: .nom_fonction = (unsigned char *) malloc(
870: (strlen((*s_etat_processus)
871: .instruction_courante)
872: + 1) * sizeof(unsigned char))) == NULL)
873: {
874: (*s_etat_processus).erreur_systeme =
875: d_es_allocation_memoire;
876: return(d_erreur);
877: }
878:
879: strcpy((*((struct_fonction *) (*s_objet).objet))
880: .nom_fonction, (*s_etat_processus)
881: .instruction_courante);
882: }
883:
884: (*((struct_fonction *) (*s_objet).objet)).fonction =
885: analyse_instruction(s_etat_processus,
886: (*s_etat_processus).instruction_courante);
887:
888: if (empilement(s_etat_processus,
889: &((*s_etat_processus).l_base_pile), s_objet) ==
890: d_erreur)
891: {
892: (*s_etat_processus).erreur_systeme =
893: d_es_allocation_memoire;
894: return(d_erreur);
895: }
896: }
897: else
898: {
899: (*s_etat_processus).test_instruction = 'N';
900: analyse(s_etat_processus, NULL);
901: (*s_etat_processus).test_instruction = 'Y';
902: }
903:
904: free(instruction_majuscule);
905: }
906:
907: erreur |= (((*s_etat_processus).erreur_execution != d_ex)
908: ? d_erreur : d_absence_erreur);
909: }
910: else
911: {
912: printf("\n");
913:
914: if ((*s_etat_processus).langue == 'F')
915: {
916: printf("+++Erreur : Argument %s invalide\n",
917: (*s_etat_processus).instruction_courante);
918: }
919: else
920: {
921: printf("+++Error : Invalid %s argument\n",
922: (*s_etat_processus).instruction_courante);
923: }
924:
925: fflush(stdout);
926:
927: return(d_erreur);
928: }
929:
930: /*
931: --------------------------------------------------------------------------------
932: Traitement des arrêts simples
933: --------------------------------------------------------------------------------
934: */
935:
936: if ((*s_etat_processus).var_volatile_requete_arret2 != 0)
937: {
938: if ((*s_etat_processus).debug_programme == d_vrai)
939: {
940: (*s_etat_processus).var_volatile_requete_arret2 = 0;
941: }
942: else
943: {
944: if ((*s_etat_processus).var_volatile_requete_arret2 == -1)
945: {
946: if (strncmp(getenv("LANG"), "fr", 2) == 0)
947: {
948: printf("[%d] Arrêt\n", (int) getpid());
949: }
950: else
951: {
952: printf("[%d] Break\n", (int) getpid());
953: }
954:
955: (*s_etat_processus).var_volatile_requete_arret2 = 1;
956:
957: fflush(stdout);
958: }
959:
960: if ((*s_etat_processus).niveau_recursivite == 0)
961: {
962: (*s_etat_processus).debug_programme = d_vrai;
963: (*s_etat_processus).var_volatile_requete_arret2 = 0;
964: }
965: }
966: }
967:
968: /*
969: * On ne sort pas du debugger en cas d'une erreur sur un programme
970: * en cours de débogage.
971: */
972:
973: if ((((*s_etat_processus).erreur_execution != d_ex) ||
974: ((*s_etat_processus).exception != d_ep)) &&
975: ((*s_etat_processus).debug_programme == d_vrai))
976: {
977: if (test_cfsf(s_etat_processus, 31) == d_vrai)
978: {
979: l_element_courant = (*s_etat_processus).l_base_pile_last;
980:
981: while(l_element_courant != NULL)
982: {
983: if ((s_objet = copie_objet(s_etat_processus,
984: (*l_element_courant).donnee, 'P')) == NULL)
985: {
986: (*s_etat_processus).erreur_systeme =
987: d_es_allocation_memoire;
988: return(d_erreur);
989: }
990:
991: if (empilement(s_etat_processus, &((*s_etat_processus)
992: .l_base_pile), s_objet) == d_erreur)
993: {
994: return(d_erreur);
995: }
996:
997: l_element_courant = (*l_element_courant).suivant;
998: }
999: }
1000:
1001: if (test_cfsf(s_etat_processus, 51) == d_faux)
1002: {
1003: printf("%s", ds_beep);
1004: }
1005:
1006: if ((message = messages(s_etat_processus)) == NULL)
1007: {
1008: return(d_erreur);
1009: }
1010:
1011: printf("%s [%d]\n", message, (int) getpid());
1012:
1013: free(message);
1014:
1015: (*s_etat_processus).erreur_execution = d_ex;
1016: (*s_etat_processus).exception = d_ep;
1017: erreur = d_absence_erreur;
1018:
1019: (*s_etat_processus).position_courante -=
1020: strlen((*s_etat_processus).instruction_courante);
1021: }
1022:
1023: /*
1024: --------------------------------------------------------------------------------
1025: Test de fin d'exécution du programme RPL/2
1026: --------------------------------------------------------------------------------
1027: */
1028:
1029: if (((*s_etat_processus).niveau_courant == 0) &&
1030: (drapeau_appel_definition != d_vrai))
1031: {
1032: drapeau_fin = d_vrai;
1033: }
1034: else if ((*s_etat_processus).requete_arret == 'Y')
1035: {
1036: drapeau_fin = d_vrai;
1037: }
1038: else if (((*s_etat_processus).var_volatile_requete_arret != 0)
1039: && ((*s_etat_processus).debug_programme == d_faux))
1040: {
1041: drapeau_fin = d_vrai;
1042:
1043: if ((*s_etat_processus).erreur_systeme == d_es)
1044: {
1045: erreur = d_absence_erreur;
1046: }
1047: }
1048: else if ((*s_etat_processus).arret_si_exception == d_vrai)
1049: {
1050: drapeau_fin = d_faux;
1051:
1052: if ((*s_etat_processus).exception != d_ep)
1053: {
1054: erreur = d_erreur;
1055: }
1056: else if ((*s_etat_processus).erreur_systeme != d_es)
1057: {
1058: erreur = d_erreur;
1059: }
1060: }
1061: else if ((*s_etat_processus).arret_si_exception == d_faux)
1062: {
1063: if ((message = messages(s_etat_processus)) == NULL)
1064: {
1065: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1066: return(d_erreur);
1067: }
1068:
1069: free(message);
1070:
1071: drapeau_fin = d_faux;
1072:
1073: /*
1074: --------------------------------------------------------------------------------
1075: Traitement des exceptions
1076: --------------------------------------------------------------------------------
1077: */
1078:
1079: if ((*s_etat_processus).erreur_systeme != d_es)
1080: {
1081: erreur = d_erreur;
1082: }
1083: else if (((*s_etat_processus).exception != d_ep) ||
1084: ((*s_etat_processus).erreur_execution != d_ex))
1085: {
1086: tampon = (*s_etat_processus).instruction_courante;
1087:
1088: while((*(*s_etat_processus).l_base_pile_systeme).clause != 'R')
1089: {
1090: erreur = recherche_instruction_suivante(s_etat_processus);
1091:
1092: if (erreur == d_erreur)
1093: {
1094: return(d_erreur);
1095: }
1096:
1097: if (recherche_variable(s_etat_processus,
1098: (*s_etat_processus).instruction_courante) == d_vrai)
1099: {
1100: if (((*s_etat_processus).s_liste_variables
1101: [(*s_etat_processus)
1102: .position_variable_courante]).objet == NULL)
1103: {
1104: // Variable partagée
1105: }
1106: else if ((*((*s_etat_processus).s_liste_variables
1107: [(*s_etat_processus)
1108: .position_variable_courante]).objet).type ==
1109: ADR)
1110: {
1111: empilement_pile_systeme(s_etat_processus);
1112:
1113: if ((*s_etat_processus).erreur_systeme != d_es)
1114: {
1115: return(d_erreur);
1116: }
1117:
1118: (*(*s_etat_processus).l_base_pile_systeme)
1119: .adresse_retour = (*s_etat_processus)
1120: .position_courante;
1121:
1122: (*(*s_etat_processus).l_base_pile_systeme)
1123: .retour_definition = 'Y';
1124:
1125: (*(*s_etat_processus).l_base_pile_systeme)
1126: .niveau_courant = (*s_etat_processus)
1127: .niveau_courant;
1128:
1129: (*s_etat_processus).position_courante =
1130: (*((unsigned long *)
1131: ((*((*s_etat_processus).s_liste_variables
1132: [(*s_etat_processus)
1133: .position_variable_courante]
1134: .objet)).objet)));
1135:
1136: (*s_etat_processus)
1137: .autorisation_empilement_programme = 'N';
1138: }
1139: }
1140: else
1141: {
1142: (*s_etat_processus).erreur_systeme = d_es;
1143: instruction_majuscule = conversion_majuscule(
1144: (*s_etat_processus).instruction_courante);
1145:
1146: if (instruction_majuscule == NULL)
1147: {
1148: return(d_erreur);
1149: }
1150:
1151: /*
1152: * Traitement de la pile système par les
1153: * différentes instructions.
1154: */
1155:
1156: if ((strcmp(instruction_majuscule, "IF") == 0) ||
1157: (strcmp(instruction_majuscule, "IFERR") == 0) ||
1158: (strcmp(instruction_majuscule, "DO") == 0) ||
1159: (strcmp(instruction_majuscule, "WHILE") == 0) ||
1160: (strcmp(instruction_majuscule, "FOR") == 0) ||
1161: (strcmp(instruction_majuscule, "START") == 0) ||
1162: (strcmp(instruction_majuscule, "SELECT") == 0)
1163: || (strcmp(instruction_majuscule, "CASE") == 0)
1164: || (strcmp(instruction_majuscule, "<<") == 0))
1165: {
1166: if (strcmp(instruction_majuscule, "<<") == 0)
1167: {
1168: analyse(s_etat_processus, NULL);
1169: }
1170: else
1171: {
1172: empilement_pile_systeme(s_etat_processus);
1173:
1174: if ((*s_etat_processus).erreur_systeme != d_es)
1175: {
1176: return(d_erreur);
1177: }
1178: }
1179: }
1180: else if ((strcmp(instruction_majuscule, "END") == 0) ||
1181: (strcmp(instruction_majuscule, "NEXT") == 0) ||
1182: (strcmp(instruction_majuscule, "STEP") == 0) ||
1183: (strcmp(instruction_majuscule, ">>") == 0))
1184: {
1185: if (strcmp(instruction_majuscule, ">>") == 0)
1186: {
1187: analyse(s_etat_processus, NULL);
1188:
1189: if ((*(*s_etat_processus).l_base_pile_systeme)
1190: .origine_routine_evaluation == 'Y')
1191: {
1192: free(instruction_majuscule);
1193: free((*s_etat_processus)
1194: .instruction_courante);
1195:
1196: (*s_etat_processus).instruction_courante =
1197: tampon;
1198:
1199: return(d_absence_erreur);
1200: }
1201: }
1202: else
1203: {
1204: depilement_pile_systeme(s_etat_processus);
1205:
1206: if ((*s_etat_processus).erreur_systeme != d_es)
1207: {
1208: return(d_erreur);
1209: }
1210: }
1211: }
1212:
1213: free(instruction_majuscule);
1214: }
1215:
1216: free((*s_etat_processus).instruction_courante);
1217: }
1218:
1219: drapeau_then = d_faux;
1220: niveau = 0;
1221:
1222: do
1223: {
1224: erreur = recherche_instruction_suivante(s_etat_processus);
1225:
1226: if (erreur == d_erreur)
1227: {
1228: return(d_erreur);
1229: }
1230:
1231: instruction_majuscule = conversion_majuscule(
1232: (*s_etat_processus).instruction_courante);
1233:
1234: if (instruction_majuscule == NULL)
1235: {
1236: return(d_erreur);
1237: }
1238:
1239: if ((strcmp(instruction_majuscule, "IF") == 0) ||
1240: (strcmp(instruction_majuscule, "IFERR") == 0) ||
1241: (strcmp(instruction_majuscule, "DO") == 0) ||
1242: (strcmp(instruction_majuscule, "WHILE") == 0) ||
1243: (strcmp(instruction_majuscule, "FOR") == 0) ||
1244: (strcmp(instruction_majuscule, "START") == 0) ||
1245: (strcmp(instruction_majuscule, "SELECT") == 0)
1246: || (strcmp(instruction_majuscule, "CASE") == 0)
1247: || (strcmp(instruction_majuscule, "<<") == 0))
1248: {
1249: niveau++;
1250: }
1251: else if ((strcmp(instruction_majuscule, "END") == 0) ||
1252: (strcmp(instruction_majuscule, "NEXT") == 0) ||
1253: (strcmp(instruction_majuscule, "STEP") == 0) ||
1254: (strcmp(instruction_majuscule, ">>") == 0))
1255: {
1256: niveau--;
1257: }
1258:
1259: drapeau_then = ((strcmp(instruction_majuscule, "THEN") == 0)
1260: && (niveau == 0)) ? d_vrai : d_faux;
1261:
1262: free(instruction_majuscule);
1263: free((*s_etat_processus).instruction_courante);
1264: } while(drapeau_then == d_faux);
1265:
1266: (*s_etat_processus).position_courante -= 5;
1267: (*s_etat_processus).instruction_courante = tampon;
1268: (*(*s_etat_processus).l_base_pile_systeme).clause = 'X';
1269:
1270: erreur = d_absence_erreur;
1271: (*s_etat_processus).exception = d_ep;
1272: (*s_etat_processus).erreur_execution = d_ex;
1273: }
1274: }
1275: else
1276: {
1277: drapeau_fin = d_faux;
1278: }
1279:
1280: if (erreur == d_absence_erreur)
1281: {
1282: free((*s_etat_processus).instruction_courante);
1283: }
1284: } while((erreur == d_absence_erreur) &&
1285: ((*s_etat_processus).position_courante <
1286: (*s_etat_processus).longueur_definitions_chainees) &&
1287: (drapeau_fin == d_faux) &&
1288: ((*s_etat_processus).retour_routine_evaluation == 'N'));
1289:
1290: /*
1291: --------------------------------------------------------------------------------
1292: Messages d'erreur à afficher le cas échéant
1293: --------------------------------------------------------------------------------
1294: */
1295:
1296: if ((erreur != d_absence_erreur) && ((*s_etat_processus)
1297: .invalidation_message_erreur == d_faux))
1298: {
1299: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1300: {
1301: l_element_courant = (*s_etat_processus).l_base_pile_last;
1302:
1303: while(l_element_courant != NULL)
1304: {
1305: if ((s_objet = copie_objet(s_etat_processus,
1306: (*l_element_courant).donnee, 'P')) == NULL)
1307: {
1308: (*s_etat_processus).erreur_systeme =
1309: d_es_allocation_memoire;
1310: return(d_erreur);
1311: }
1312:
1313: if (empilement(s_etat_processus, &((*s_etat_processus)
1314: .l_base_pile), s_objet) == d_erreur)
1315: {
1316: return(d_erreur);
1317: }
1318:
1319: l_element_courant = (*l_element_courant).suivant;
1320: }
1321: }
1322:
1323: if (test_cfsf(s_etat_processus, 51) == d_faux)
1324: {
1325: printf("%s", ds_beep);
1326: }
1327:
1328: if ((message = messages(s_etat_processus)) == NULL)
1329: {
1330: return(d_erreur);
1331: }
1332:
1333: printf("%s [%d]\n", message, (int) getpid());
1334:
1335: free(message);
1336: free((*s_etat_processus).instruction_courante);
1337:
1338: if ((*s_etat_processus).var_volatile_processus_pere == 0)
1339: {
1340: kill((*s_etat_processus).pid_processus_pere, SIGALRM);
1341: }
1342: else
1343: {
1344: (*s_etat_processus).var_volatile_alarme = -1;
1345: }
1346:
1347: return(d_erreur);
1348: }
1349:
1350: return(d_absence_erreur);
1351: }
1352:
1353: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>