1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.36
4: Copyright (C) 1989-2025 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl-conv.h"
24:
25:
26: /*
27: ================================================================================
28: Procédure de vérification syntaxique du source et de précompilation
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: - renvoi : erreur
34: --------------------------------------------------------------------------------
35: Effets de bord :
36: ================================================================================
37: */
38:
39: logical1
40: compilation(struct_processus *s_etat_processus)
41: {
42: struct_objet *s_objet;
43:
44: struct_variable *s_variable;
45:
46: unsigned char apostrophe_ouverte;
47: unsigned char apostrophe_ouverte_registre;
48: unsigned char caractere_courant;
49: unsigned char caractere_precedent;
50: unsigned char caractere_suivant;
51: unsigned char *definition;
52: unsigned char fermeture_definition;
53: unsigned char guillemet_ouvert;
54: unsigned char ouverture_definition;
55: unsigned char position_debut_nom_definition_valide;
56:
57: integer8 *adresse;
58: integer8 i;
59: integer8 niveau_definition;
60: integer8 niveau_definition_registre;
61: integer8 position_courante;
62: integer8 position_debut_nom_definition;
63: integer8 position_fin_nom_definition;
64: integer8 validation;
65: integer8 validation_registre;
66:
67: (*s_etat_processus).erreur_compilation = d_ec;
68: (*s_etat_processus).erreur_systeme = d_es;
69: (*s_etat_processus).erreur_execution = d_ex;
70: (*s_etat_processus).exception = d_ep;
71: (*s_etat_processus).arret_si_exception = d_vrai;
72:
73: (*s_etat_processus).position_courante = 0;
74:
75: /*
76: --------------------------------------------------------------------------------
77: Recheche des définitions
78: --------------------------------------------------------------------------------
79: */
80:
81: niveau_definition = 0;
82: niveau_definition_registre = 0;
83: position_courante = 0;
84: position_debut_nom_definition = 0;
85: validation = 0;
86:
87: apostrophe_ouverte = d_faux;
88: apostrophe_ouverte_registre = d_faux;
89: guillemet_ouvert = d_faux;
90: position_debut_nom_definition_valide = d_faux;
91:
92: if ((*s_etat_processus).debug == d_vrai)
93: if (((*s_etat_processus).type_debug & d_debug_analyse) != 0)
94: {
95: printf("\n");
96: printf("[%d] Compilation\n", (int) getpid());
97: fflush(stdout);
98: }
99:
100: while((*s_etat_processus).definitions_chainees[position_courante] !=
101: d_code_fin_chaine)
102: {
103: caractere_courant = (*s_etat_processus)
104: .definitions_chainees[position_courante];
105:
106: fermeture_definition = d_faux;
107: ouverture_definition = d_faux;
108:
109: if (position_courante >= 1)
110: {
111: if (position_courante >= 2)
112: {
113: if (((*s_etat_processus).definitions_chainees
114: [position_courante - 2] == '\\') &&
115: ((*s_etat_processus).definitions_chainees
116: [position_courante - 1] == '\\'))
117: {
118: caractere_precedent = '*';
119: }
120: else
121: {
122: caractere_precedent = (*s_etat_processus)
123: .definitions_chainees[position_courante - 1];
124: }
125: }
126: else
127: {
128: caractere_precedent = (*s_etat_processus)
129: .definitions_chainees[position_courante - 1];
130: }
131: }
132: else
133: {
134: caractere_precedent = ' ';
135: }
136:
137: caractere_suivant = (*s_etat_processus)
138: .definitions_chainees[position_courante + 1];
139:
140: if (caractere_suivant == d_code_fin_chaine)
141: {
142: caractere_suivant = ' ';
143: }
144:
145: if ((caractere_courant == '[') || (caractere_courant == '{'))
146: {
147: validation++;
148: }
149: else if ((caractere_courant == ']') || (caractere_courant == '}'))
150: {
151: validation--;
152: }
153: else if (caractere_courant == '\'')
154: {
155: if (apostrophe_ouverte == d_faux)
156: {
157: validation++;
158: apostrophe_ouverte = d_vrai;
159: }
160: else
161: {
162: validation--;
163: apostrophe_ouverte = d_faux;
164: }
165: }
166: else if (caractere_courant == '"')
167: {
168: if (caractere_precedent != '\\')
169: {
170: swap((void *) &validation, (void *) &validation_registre,
171: sizeof(validation));
172: swap((void *) &apostrophe_ouverte,
173: (void *) &apostrophe_ouverte_registre,
174: sizeof(apostrophe_ouverte));
175: swap((void *) &niveau_definition,
176: (void *) &niveau_definition_registre,
177: sizeof(niveau_definition));
178:
179: guillemet_ouvert = (guillemet_ouvert == d_faux)
180: ? d_vrai : d_faux;
181: }
182: }
183: else if ((caractere_courant == '<') &&
184: (caractere_precedent == ' ') &&
185: (caractere_suivant == '<'))
186: {
187: if ((*s_etat_processus)
188: .definitions_chainees[position_courante + 2] == ' ')
189: {
190: niveau_definition++;
191: ouverture_definition = d_vrai;
192: }
193: }
194: else if ((caractere_courant == '>') &&
195: (caractere_precedent == ' ') &&
196: (caractere_suivant == '>'))
197: {
198: if (((*s_etat_processus)
199: .definitions_chainees[position_courante + 2] == ' ') ||
200: ((*s_etat_processus).definitions_chainees
201: [position_courante + 2] == d_code_fin_chaine))
202: {
203: if (niveau_definition == 0)
204: {
205: (*s_etat_processus).erreur_compilation =
206: d_ec_niveau_definition_negatif;
207: return(d_erreur);
208: }
209: else
210: {
211: niveau_definition--;
212: fermeture_definition = d_vrai;
213: position_courante++;
214: }
215: }
216: }
217:
218: if ((niveau_definition == 0) && (guillemet_ouvert == d_faux) &&
219: (caractere_courant != ' ') && (fermeture_definition == d_faux))
220: {
221: if (position_debut_nom_definition_valide == d_faux)
222: {
223: position_debut_nom_definition_valide = d_vrai;
224: position_debut_nom_definition = position_courante;
225: }
226: }
227:
228: if (((niveau_definition == 1) && (ouverture_definition == d_vrai)) &&
229: (position_debut_nom_definition_valide == d_vrai))
230: {
231: position_fin_nom_definition = position_courante - 1;
232: position_debut_nom_definition_valide = d_faux;
233:
234: while((*s_etat_processus).definitions_chainees
235: [position_fin_nom_definition] == ' ')
236: {
237: position_fin_nom_definition--;
238: }
239:
240: i = position_debut_nom_definition;
241:
242: while(i <= position_fin_nom_definition)
243: {
244: if ((*s_etat_processus).definitions_chainees[i] == ' ')
245: {
246: (*s_etat_processus).erreur_compilation =
247: d_ec_nom_definition_invalide;
248: return(d_erreur);
249: }
250: else
251: {
252: i++;
253: }
254: }
255:
256: s_objet = allocation(s_etat_processus, ADR);
257: s_variable = (struct_variable *)
258: malloc(sizeof(struct_variable));
259: adresse = (*s_objet).objet;
260: definition = (unsigned char *) malloc(((size_t)
261: (position_fin_nom_definition -
262: position_debut_nom_definition + 2)) *
263: sizeof(unsigned char));
264:
265: if ((s_objet == NULL) || (s_variable == NULL) ||
266: (adresse == NULL) || definition == NULL)
267: {
268: (*s_etat_processus).erreur_systeme =
269: d_es_allocation_memoire;
270: return(d_erreur);
271: }
272: else
273: {
274: (*adresse) = position_fin_nom_definition + 1;
275:
276: (*s_variable).nom = definition;
277: (*s_variable).niveau = (*s_etat_processus).niveau_courant;
278: (*s_variable).objet = s_objet;
279:
280: i = position_debut_nom_definition;
281:
282: while(i <= position_fin_nom_definition)
283: {
284: if ((*s_etat_processus).pointeurs_caracteres_variables
285: [(*s_etat_processus).definitions_chainees[i]] < 0)
286: {
287: free(s_variable);
288:
289: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
290: return(d_erreur);
291: }
292:
293: *(definition++) = (*s_etat_processus)
294: .definitions_chainees[i++];
295: }
296:
297: *definition = d_code_fin_chaine;
298:
299: if (recherche_variable(s_etat_processus, (*s_variable).nom)
300: == d_vrai)
301: {
302: free(s_variable);
303:
304: if ((*s_etat_processus).langue == 'F')
305: {
306: printf("+++Attention : Plusieurs définitions de"
307: " même nom\n");
308: }
309: else
310: {
311: printf("+++Warning : Same name for several"
312: " definitions\n");
313: }
314:
315: fflush(stdout);
316: return(d_erreur);
317: }
318:
319: (*s_etat_processus).erreur_systeme = d_es;
320: creation_variable(s_etat_processus, s_variable, 'V', 'P');
321:
322: if ((*s_etat_processus).erreur_systeme != d_es)
323: {
324: free(s_variable);
325: return(d_erreur);
326: }
327:
328: if ((*s_etat_processus).debug == d_vrai)
329: if (((*s_etat_processus).type_debug & d_debug_analyse) != 0)
330: {
331: if ((*s_etat_processus).langue == 'F')
332: {
333: printf("[%d] Compilation : Définition %s ($ %016lX) "
334: "\n", (int) getpid(), (*s_variable).nom,
335: (*adresse));
336: }
337: else
338: {
339: printf("[%d] Compilation : %s definition ($ %016lX) "
340: "\n", (int) getpid(), (*s_variable).nom,
341: (*adresse));
342: }
343:
344: fflush(stdout);
345: }
346: }
347:
348: free(s_variable);
349: }
350:
351: position_courante++;
352: }
353:
354: return(analyse_syntaxique(s_etat_processus));
355: }
356:
357:
358: /*
359: ================================================================================
360: Procédure de d'analyse syntaxique du source
361: ================================================================================
362: Entrées :
363: --------------------------------------------------------------------------------
364: Sorties :
365: - renvoi : erreur
366: --------------------------------------------------------------------------------
367: Effets de bord :
368: ================================================================================
369: */
370:
371: enum t_condition { AN_IF = 1, AN_IFERR, AN_THEN, AN_ELSE, AN_ELSEIF,
372: AN_END, AN_DO, AN_UNTIL, AN_WHILE, AN_REPEAT, AN_SELECT,
373: AN_CASE, AN_DEFAULT, AN_UP, AN_DOWN, AN_FOR, AN_START,
374: AN_NEXT, AN_STEP, AN_CRITICAL, AN_FORALL };
375:
376: typedef struct pile
377: {
378: enum t_condition condition;
379: struct pile *suivant;
380: } struct_pile_analyse;
381:
382: static inline struct_pile_analyse *
383: empilement_analyse(struct_processus *s_etat_processus,
384: struct_pile_analyse *ancienne_base,
385: enum t_condition condition)
386: {
387: struct_pile_analyse *nouvelle_base;
388:
389: if ((nouvelle_base = malloc(sizeof(struct_pile_analyse))) == NULL)
390: {
391: return(NULL);
392: }
393:
394: (*nouvelle_base).suivant = ancienne_base;
395: (*nouvelle_base).condition = condition;
396:
397: return(nouvelle_base);
398: }
399:
400: static inline struct_pile_analyse *
401: depilement_analyse(struct_processus *s_etat_processus,
402: struct_pile_analyse *ancienne_base)
403: {
404: struct_pile_analyse *nouvelle_base;
405:
406: if (ancienne_base == NULL)
407: {
408: return(NULL);
409: }
410:
411: nouvelle_base = (*ancienne_base).suivant;
412: free(ancienne_base);
413:
414: return(nouvelle_base);
415: }
416:
417: static inline logical1
418: test_analyse(struct_pile_analyse *l_base_pile, enum t_condition condition)
419: {
420: if (l_base_pile == NULL)
421: {
422: return(d_faux);
423: }
424:
425: return(((*l_base_pile).condition == condition) ? d_vrai : d_faux);
426: }
427:
428: static inline void
429: liberation_analyse(struct_processus *s_etat_processus,
430: struct_pile_analyse *l_base_pile)
431: {
432: struct_pile_analyse *l_nouvelle_base_pile;
433:
434: while(l_base_pile != NULL)
435: {
436: l_nouvelle_base_pile = (*l_base_pile).suivant;
437: free(l_base_pile);
438: l_base_pile = l_nouvelle_base_pile;
439: }
440:
441: return;
442: }
443:
444: logical1
445: analyse_syntaxique(struct_processus *s_etat_processus)
446: {
447: unsigned char *instruction;
448: unsigned char registre;
449:
450: struct_pile_analyse *l_base_pile;
451: struct_pile_analyse *l_nouvelle_base_pile;
452:
453: l_base_pile = NULL;
454: l_nouvelle_base_pile = NULL;
455:
456: if ((*s_etat_processus).debug == d_vrai)
457: if (((*s_etat_processus).type_debug & d_debug_analyse) != 0)
458: {
459: if ((*s_etat_processus).langue == 'F')
460: {
461: printf("[%d] Analyse\n", (int) getpid());
462: }
463: else
464: {
465: printf("[%d] Analysis\n", (int) getpid());
466: }
467:
468: fflush(stdout);
469: }
470:
471: (*s_etat_processus).position_courante = 0;
472: registre = (*s_etat_processus).autorisation_empilement_programme;
473: (*s_etat_processus).autorisation_empilement_programme = 'N';
474:
475: /*
476: --------------------------------------------------------------------------------
477: Analyse structurelle
478: --------------------------------------------------------------------------------
479: */
480:
481: while((*s_etat_processus).definitions_chainees
482: [(*s_etat_processus).position_courante] != d_code_fin_chaine)
483: {
484: if (recherche_instruction_suivante(s_etat_processus) !=
485: d_absence_erreur)
486: {
487: liberation_analyse(s_etat_processus, l_base_pile);
488:
489: (*s_etat_processus).autorisation_empilement_programme = registre;
490: return(d_erreur);
491: }
492:
493: if ((instruction = conversion_majuscule(s_etat_processus,
494: (*s_etat_processus).instruction_courante)) == NULL)
495: {
496: liberation_analyse(s_etat_processus, l_base_pile);
497:
498: (*s_etat_processus).autorisation_empilement_programme = registre;
499: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
500: return(d_erreur);
501: }
502:
503: if (strcmp(instruction, "IF") == 0)
504: {
505: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
506: l_base_pile, AN_IF)) == NULL)
507: {
508: liberation_analyse(s_etat_processus, l_base_pile);
509:
510: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
511: return(d_erreur);
512: }
513:
514: l_base_pile = l_nouvelle_base_pile;
515: (*l_base_pile).condition = AN_IF;
516: }
517: else if (strcmp(instruction, "IFERR") == 0)
518: {
519: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
520: l_base_pile, AN_IFERR)) == NULL)
521: {
522: liberation_analyse(s_etat_processus, l_base_pile);
523:
524: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
525: return(d_erreur);
526: }
527:
528: l_base_pile = l_nouvelle_base_pile;
529: }
530: else if (strcmp(instruction, "CRITICAL") == 0)
531: {
532: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
533: l_base_pile, AN_CRITICAL)) == NULL)
534: {
535: liberation_analyse(s_etat_processus, l_base_pile);
536:
537: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
538: return(d_erreur);
539: }
540:
541: l_base_pile = l_nouvelle_base_pile;
542: }
543: else if (strcmp(instruction, "THEN") == 0)
544: {
545: if ((test_analyse(l_base_pile, AN_IF) == d_faux) &&
546: (test_analyse(l_base_pile, AN_ELSEIF) == d_faux) &&
547: (test_analyse(l_base_pile, AN_CASE) == d_faux) &&
548: (test_analyse(l_base_pile, AN_IFERR) == d_faux))
549: {
550: liberation_analyse(s_etat_processus, l_base_pile);
551:
552: (*s_etat_processus).autorisation_empilement_programme =
553: registre;
554:
555: (*s_etat_processus).erreur_compilation =
556: d_ec_erreur_instruction_then;
557: return(d_erreur);
558: }
559:
560: (*l_base_pile).condition = AN_THEN;
561: }
562: else if (strcmp(instruction, "ELSE") == 0)
563: {
564: if (test_analyse(l_base_pile, AN_THEN) == d_faux)
565: {
566: liberation_analyse(s_etat_processus, l_base_pile);
567:
568: (*s_etat_processus).autorisation_empilement_programme =
569: registre;
570:
571: (*s_etat_processus).erreur_compilation =
572: d_ec_erreur_instruction_else;
573: return(d_erreur);
574: }
575:
576: (*l_base_pile).condition = AN_ELSE;
577: }
578: else if (strcmp(instruction, "ELSEIF") == 0)
579: {
580: if (test_analyse(l_base_pile, AN_THEN) == d_faux)
581: {
582: liberation_analyse(s_etat_processus, l_base_pile);
583:
584: (*s_etat_processus).autorisation_empilement_programme =
585: registre;
586:
587: (*s_etat_processus).erreur_compilation =
588: d_ec_erreur_instruction_elseif;
589: return(d_erreur);
590: }
591:
592: (*l_base_pile).condition = AN_ELSEIF;
593: }
594: else if (strcmp(instruction, "END") == 0)
595: {
596: if ((test_analyse(l_base_pile, AN_UNTIL) == d_faux) &&
597: (test_analyse(l_base_pile, AN_REPEAT) == d_faux) &&
598: (test_analyse(l_base_pile, AN_DEFAULT) == d_faux) &&
599: (test_analyse(l_base_pile, AN_SELECT) == d_faux) &&
600: (test_analyse(l_base_pile, AN_THEN) == d_faux) &&
601: (test_analyse(l_base_pile, AN_CRITICAL) == d_faux) &&
602: (test_analyse(l_base_pile, AN_ELSE) == d_faux))
603: {
604: liberation_analyse(s_etat_processus, l_base_pile);
605:
606: (*s_etat_processus).autorisation_empilement_programme =
607: registre;
608:
609: (*s_etat_processus).erreur_compilation =
610: d_ec_erreur_instruction_end;
611: return(d_erreur);
612: }
613:
614: l_base_pile = depilement_analyse(s_etat_processus, l_base_pile);
615: }
616: else if (strcmp(instruction, "DO") == 0)
617: {
618: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
619: l_base_pile, AN_DO)) == NULL)
620: {
621: liberation_analyse(s_etat_processus, l_base_pile);
622:
623: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
624: return(d_erreur);
625: }
626:
627: l_base_pile = l_nouvelle_base_pile;
628: }
629: else if (strcmp(instruction, "UNTIL") == 0)
630: {
631: if (test_analyse(l_base_pile, AN_DO) == d_faux)
632: {
633: liberation_analyse(s_etat_processus, l_base_pile);
634:
635: (*s_etat_processus).autorisation_empilement_programme =
636: registre;
637:
638: (*s_etat_processus).erreur_compilation =
639: d_ec_erreur_instruction_until;
640: return(d_erreur);
641: }
642:
643: (*l_base_pile).condition = AN_UNTIL;
644: }
645: else if (strcmp(instruction, "WHILE") == 0)
646: {
647: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
648: l_base_pile, AN_WHILE)) == NULL)
649: {
650: liberation_analyse(s_etat_processus, l_base_pile);
651:
652: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
653: return(d_erreur);
654: }
655:
656: l_base_pile = l_nouvelle_base_pile;
657: }
658: else if (strcmp(instruction, "REPEAT") == 0)
659: {
660: if (test_analyse(l_base_pile, AN_WHILE) == d_faux)
661: {
662: liberation_analyse(s_etat_processus, l_base_pile);
663:
664: (*s_etat_processus).autorisation_empilement_programme =
665: registre;
666:
667: (*s_etat_processus).erreur_compilation =
668: d_ec_erreur_instruction_while;
669: return(d_erreur);
670: }
671:
672: (*l_base_pile).condition = AN_REPEAT;
673: }
674: else if (strcmp(instruction, "SELECT") == 0)
675: {
676: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
677: l_base_pile, AN_SELECT)) == NULL)
678: {
679: liberation_analyse(s_etat_processus, l_base_pile);
680:
681: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
682: return(d_erreur);
683: }
684:
685: l_base_pile = l_nouvelle_base_pile;
686: }
687: else if (strcmp(instruction, "CASE") == 0)
688: {
689: if (test_analyse(l_base_pile, AN_SELECT) == d_faux)
690: {
691: liberation_analyse(s_etat_processus, l_base_pile);
692:
693: (*s_etat_processus).autorisation_empilement_programme =
694: registre;
695:
696: (*s_etat_processus).erreur_compilation =
697: d_ec_erreur_instruction_case;
698: return(d_erreur);
699: }
700:
701: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
702: l_base_pile, AN_CASE)) == NULL)
703: {
704: liberation_analyse(s_etat_processus, l_base_pile);
705:
706: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
707: return(d_erreur);
708: }
709:
710: l_base_pile = l_nouvelle_base_pile;
711: }
712: else if (strcmp(instruction, "DEFAULT") == 0)
713: {
714: if (test_analyse(l_base_pile, AN_SELECT) == d_faux)
715: {
716: liberation_analyse(s_etat_processus, l_base_pile);
717:
718: (*s_etat_processus).autorisation_empilement_programme =
719: registre;
720:
721: (*s_etat_processus).erreur_compilation =
722: d_ec_erreur_instruction_select;
723: return(d_erreur);
724: }
725:
726: (*l_base_pile).condition = AN_DEFAULT;
727: }
728: else if (strcmp(instruction, "<<") == 0)
729: {
730: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
731: l_base_pile, AN_UP)) == NULL)
732: {
733: liberation_analyse(s_etat_processus, l_base_pile);
734:
735: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
736: return(d_erreur);
737: }
738:
739: l_base_pile = l_nouvelle_base_pile;
740: }
741: else if (strcmp(instruction, ">>") == 0)
742: {
743: if (test_analyse(l_base_pile, AN_UP) == d_faux)
744: {
745: liberation_analyse(s_etat_processus, l_base_pile);
746:
747: (*s_etat_processus).autorisation_empilement_programme =
748: registre;
749:
750: (*s_etat_processus).erreur_compilation =
751: d_ec_source_incoherent;
752: return(d_erreur);
753: }
754:
755: l_base_pile = depilement_analyse(s_etat_processus, l_base_pile);
756: }
757: else if (strcmp(instruction, "FOR") == 0)
758: {
759: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
760: l_base_pile, AN_FOR)) == NULL)
761: {
762: liberation_analyse(s_etat_processus, l_base_pile);
763:
764: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
765: return(d_erreur);
766: }
767:
768: l_base_pile = l_nouvelle_base_pile;
769: }
770: else if (strcmp(instruction, "START") == 0)
771: {
772: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
773: l_base_pile, AN_START)) == NULL)
774: {
775: liberation_analyse(s_etat_processus, l_base_pile);
776:
777: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
778: return(d_erreur);
779: }
780:
781: l_base_pile = l_nouvelle_base_pile;
782: }
783: else if (strcmp(instruction, "FORALL") == 0)
784: {
785: if ((l_nouvelle_base_pile = empilement_analyse(s_etat_processus,
786: l_base_pile, AN_FORALL)) == NULL)
787: {
788: liberation_analyse(s_etat_processus, l_base_pile);
789:
790: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
791: return(d_erreur);
792: }
793:
794: l_base_pile = l_nouvelle_base_pile;
795: }
796: else if (strcmp(instruction, "NEXT") == 0)
797: {
798: if ((test_analyse(l_base_pile, AN_FOR) == d_faux) &&
799: (test_analyse(l_base_pile, AN_FORALL) == d_faux) &&
800: (test_analyse(l_base_pile, AN_START) == d_faux))
801: {
802: liberation_analyse(s_etat_processus, l_base_pile);
803:
804: (*s_etat_processus).autorisation_empilement_programme =
805: registre;
806:
807: (*s_etat_processus).erreur_compilation =
808: d_ec_erreur_boucle_definie;
809: return(d_erreur);
810: }
811:
812: l_base_pile = depilement_analyse(s_etat_processus, l_base_pile);
813: }
814: else if (strcmp(instruction, "STEP") == 0)
815: {
816: if ((test_analyse(l_base_pile, AN_FOR) == d_faux) &&
817: (test_analyse(l_base_pile, AN_START) == d_faux))
818: {
819: liberation_analyse(s_etat_processus, l_base_pile);
820:
821: (*s_etat_processus).autorisation_empilement_programme =
822: registre;
823:
824: (*s_etat_processus).erreur_compilation =
825: d_ec_erreur_boucle_definie;
826: return(d_erreur);
827: }
828:
829: l_base_pile = depilement_analyse(s_etat_processus, l_base_pile);
830: }
831:
832: // Invalidation de l'instruction courante dans le fichier rpl-core
833: free((*s_etat_processus).instruction_courante);
834: (*s_etat_processus).instruction_courante = NULL;
835: free(instruction);
836: }
837:
838: (*s_etat_processus).autorisation_empilement_programme = registre;
839:
840: if (l_base_pile != NULL)
841: {
842: liberation_analyse(s_etat_processus, l_base_pile);
843:
844: (*s_etat_processus).autorisation_empilement_programme = registre;
845: (*s_etat_processus).erreur_compilation = d_ec_source_incoherent;
846: return(d_erreur);
847: }
848:
849: return(d_absence_erreur);
850: }
851:
852:
853: /*
854: ================================================================================
855: Routine d'échange de deux variables
856: ================================================================================
857: Entrées :
858: - pointeurs génériques sur les deux variables,
859: - longueur en octet des objets à permuter.
860: --------------------------------------------------------------------------------
861: Sorties : idem.
862: --------------------------------------------------------------------------------
863: Effets de bord : néant.
864: ================================================================================
865: */
866:
867: void
868: swap(void *variable_1, void *variable_2, integer8 taille)
869: {
870: register unsigned char *t_var_1;
871: register unsigned char *t_var_2;
872: register unsigned char variable_temporaire;
873:
874: register integer8 i;
875:
876: t_var_1 = (unsigned char *) variable_1;
877: t_var_2 = (unsigned char *) variable_2;
878:
879: for(i = 0; i < taille; i++)
880: {
881: variable_temporaire = (*t_var_1);
882: (*(t_var_1++)) = (*t_var_2);
883: (*(t_var_2++)) = variable_temporaire;
884: }
885:
886: return;
887: }
888:
889:
890: /*
891: ================================================================================
892: Routine recherchant l'instruction suivante dans le programme compilé
893: ================================================================================
894: Entrée :
895: --------------------------------------------------------------------------------
896: Sortie :
897: --------------------------------------------------------------------------------
898: Effets de bord : néant.
899: ================================================================================
900: */
901:
902: logical1
903: recherche_instruction_suivante(struct_processus *s_etat_processus)
904: {
905: return(recherche_instruction_suivante_recursive(s_etat_processus, 0));
906: }
907:
908: logical1
909: recherche_instruction_suivante_recursive(struct_processus *s_etat_processus,
910: integer8 recursivite)
911: {
912: enum t_type registre_type_en_cours;
913:
914: logical1 drapeau_fin_objet;
915: logical1 erreur;
916:
917: int erreur_analyse;
918: int erreur_format;
919:
920: integer8 nombre_caracteres;
921: integer8 (*__type_parse)(struct_processus *, void **);
922:
923:
924: unsigned char base_binaire;
925: unsigned char caractere_fin;
926: unsigned char *pointeur_caractere_courant;
927: unsigned char *pointeur_caractere_destination;
928: unsigned char *pointeur_debut_instruction;
929: unsigned char *pointeur_fin_instruction;
930:
931: signed long niveau;
932:
933: struct_liste_chainee *l_element_courant;
934:
935: erreur_analyse = d_ex;
936: erreur_format = d_ex;
937: erreur = d_absence_erreur;
938:
939: switch((*s_etat_processus).type_en_cours)
940: {
941: case RPN:
942: {
943: caractere_fin = '>';
944: break;
945: }
946:
947: case LST:
948: {
949: caractere_fin = '}';
950: break;
951: }
952:
953: case TBL:
954: case REC:
955: {
956: caractere_fin = ']';
957: break;
958: }
959:
960: default:
961: {
962: caractere_fin = d_code_espace;
963: break;
964: }
965: }
966:
967: drapeau_fin_objet = d_faux;
968: niveau = 0;
969:
970: pointeur_caractere_courant = (*s_etat_processus).definitions_chainees +
971: (*s_etat_processus).position_courante;
972:
973: while(((*pointeur_caractere_courant) == d_code_espace) &&
974: ((*pointeur_caractere_courant) != d_code_fin_chaine))
975: {
976: pointeur_caractere_courant++;
977: }
978:
979: if ((*pointeur_caractere_courant) == d_code_fin_chaine)
980: {
981: (*s_etat_processus).instruction_courante = (unsigned char *)
982: malloc(sizeof(unsigned char));
983:
984: if ((*s_etat_processus).instruction_courante == NULL)
985: {
986: erreur = d_erreur;
987: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
988: }
989: else
990: {
991: erreur = d_absence_erreur;
992: (*(*s_etat_processus).instruction_courante) = d_code_fin_chaine;
993: (*s_etat_processus).position_courante = pointeur_caractere_courant
994: - (*s_etat_processus).definitions_chainees;
995: }
996:
997: return(erreur);
998: }
999:
1000: /*
1001: * On regarde s'il existe des fonctions permettant de parser
1002: * les objets dans les bibliothèques externes.
1003: */
1004:
1005: l_element_courant = (*s_etat_processus).s_bibliotheques;
1006: (*s_etat_processus).position_courante = pointeur_caractere_courant
1007: - (*s_etat_processus).definitions_chainees;
1008:
1009: while(l_element_courant != NULL)
1010: {
1011: if ((__type_parse = dlsym((*((struct_bibliotheque *)
1012: (*l_element_courant).donnee)).descripteur, "__type_parse"))
1013: != NULL)
1014: {
1015: // Une fonction declareTypeExtension(parse) se trouve dans la
1016: // bibliothèque. Si cette fonction renvoie une valeur non nulle,
1017: // elle a réussi à parser correctement un objet.
1018:
1019: if ((nombre_caracteres = __type_parse(s_etat_processus, NULL)) != 0)
1020: {
1021: if (((*s_etat_processus).instruction_courante =
1022: malloc((((unsigned) nombre_caracteres) + 1)
1023: * sizeof(unsigned char))) == NULL)
1024: {
1025: (*s_etat_processus).erreur_systeme =
1026: d_es_allocation_memoire;
1027: return(d_erreur);
1028: }
1029:
1030: strncpy((*s_etat_processus).instruction_courante,
1031: (*s_etat_processus).definitions_chainees +
1032: (*s_etat_processus).position_courante,
1033: (unsigned) nombre_caracteres);
1034: (*s_etat_processus).instruction_courante[nombre_caracteres]
1035: = d_code_fin_chaine;
1036:
1037: (*s_etat_processus).position_courante += nombre_caracteres;
1038: return(erreur);
1039: }
1040: }
1041:
1042: l_element_courant = (*l_element_courant).suivant;
1043: }
1044:
1045: pointeur_debut_instruction = pointeur_caractere_courant;
1046:
1047: while(((*pointeur_caractere_courant) != d_code_espace) &&
1048: ((*pointeur_caractere_courant) != d_code_fin_chaine) &&
1049: (drapeau_fin_objet == d_faux) &&
1050: (erreur_analyse == d_ex) && (erreur_format == d_ex))
1051: {
1052: switch(*pointeur_caractere_courant++)
1053: {
1054: case ']' :
1055: case '}' :
1056: {
1057: break;
1058: }
1059:
1060: case ')' :
1061: {
1062: erreur_format = d_ex_syntaxe;
1063: break;
1064: }
1065:
1066: case '"' :
1067: {
1068: if (pointeur_debut_instruction !=
1069: (pointeur_caractere_courant - 1))
1070: {
1071: erreur_format = d_ex_syntaxe;
1072: }
1073:
1074: while((*pointeur_caractere_courant != '"') &&
1075: ((*pointeur_caractere_courant) != d_code_fin_chaine))
1076: {
1077: if (*pointeur_caractere_courant == '\\')
1078: {
1079: pointeur_caractere_courant++;
1080:
1081: switch(*pointeur_caractere_courant)
1082: {
1083: case '\\' :
1084: case '"' :
1085: {
1086: pointeur_caractere_courant++;
1087: break;
1088: }
1089: }
1090: }
1091: else
1092: {
1093: pointeur_caractere_courant++;
1094: }
1095: }
1096:
1097: if ((*pointeur_caractere_courant) != '"')
1098: {
1099: erreur_analyse = d_ex_syntaxe;
1100: }
1101:
1102: if (erreur_analyse == d_ex)
1103: {
1104: pointeur_caractere_courant++;
1105: }
1106:
1107: drapeau_fin_objet = d_vrai;
1108: break;
1109: }
1110:
1111: case '\'' :
1112: {
1113: if (pointeur_debut_instruction !=
1114: (pointeur_caractere_courant - 1))
1115: {
1116: erreur_format = d_ex_syntaxe;
1117: }
1118:
1119: while(((*pointeur_caractere_courant) != '\'') &&
1120: ((*pointeur_caractere_courant) != d_code_fin_chaine))
1121: {
1122: if ((*pointeur_caractere_courant) == '(')
1123: {
1124: niveau++;
1125: }
1126: else if ((*pointeur_caractere_courant) == ')')
1127: {
1128: niveau--;
1129: }
1130:
1131: pointeur_caractere_courant++;
1132: }
1133:
1134: if ((*pointeur_caractere_courant) != '\'')
1135: {
1136: erreur_analyse = d_ex_syntaxe;
1137: }
1138: else if (niveau != 0)
1139: {
1140: erreur_analyse = d_ex_syntaxe;
1141: }
1142:
1143: if (erreur_analyse == d_ex)
1144: {
1145: pointeur_caractere_courant++;
1146: }
1147:
1148: drapeau_fin_objet = d_vrai;
1149: break;
1150: }
1151:
1152: case '(' :
1153: {
1154: if (pointeur_debut_instruction !=
1155: (pointeur_caractere_courant - 1))
1156: {
1157: erreur_format = d_ex_syntaxe;
1158: }
1159:
1160: while(((*pointeur_caractere_courant) != ')') &&
1161: ((*pointeur_caractere_courant) != d_code_fin_chaine)
1162: && (erreur_analyse == d_ex))
1163: {
1164: switch(*pointeur_caractere_courant)
1165: {
1166: case '0' :
1167: case '1' :
1168: case '2' :
1169: case '3' :
1170: case '4' :
1171: case '5' :
1172: case '6' :
1173: case '7' :
1174: case '8' :
1175: case '9' :
1176: case 'e' :
1177: case 'E' :
1178: case ',' :
1179: case '.' :
1180: case ' ' :
1181: case '-' :
1182: case '+' :
1183: case ')' :
1184: {
1185: break;
1186: }
1187:
1188: default :
1189: {
1190: erreur_analyse = d_ex_syntaxe;
1191: break;
1192: }
1193: }
1194:
1195: pointeur_caractere_courant++;
1196: }
1197:
1198: if ((*pointeur_caractere_courant) != ')')
1199: {
1200: erreur_analyse = d_ex_syntaxe;
1201: }
1202:
1203: if (erreur_analyse == d_ex)
1204: {
1205: pointeur_caractere_courant++;
1206: }
1207:
1208: drapeau_fin_objet = d_vrai;
1209: break;
1210: }
1211:
1212: case '#' :
1213: {
1214: if (pointeur_debut_instruction !=
1215: (pointeur_caractere_courant - 1))
1216: {
1217: erreur_format = d_ex_syntaxe;
1218: }
1219:
1220: while(((*pointeur_caractere_courant) != 'b') &&
1221: ((*pointeur_caractere_courant) != 'o') &&
1222: ((*pointeur_caractere_courant) != 'd') &&
1223: ((*pointeur_caractere_courant) != 'h') &&
1224: ((*pointeur_caractere_courant) !=
1225: d_code_fin_chaine) &&
1226: (erreur_analyse == d_ex))
1227: {
1228: switch(*pointeur_caractere_courant)
1229: {
1230: case ' ' :
1231: case '0' :
1232: case '1' :
1233: case '2' :
1234: case '3' :
1235: case '4' :
1236: case '5' :
1237: case '6' :
1238: case '7' :
1239: case '8' :
1240: case '9' :
1241: case 'A' :
1242: case 'B' :
1243: case 'C' :
1244: case 'D' :
1245: case 'E' :
1246: case 'F' :
1247: case 'b' :
1248: case 'o' :
1249: case 'd' :
1250: case 'h' :
1251: {
1252: break;
1253: }
1254:
1255: default :
1256: {
1257: erreur_analyse = d_ex_syntaxe;
1258: break;
1259: }
1260: }
1261:
1262: pointeur_caractere_courant++;
1263: }
1264:
1265: base_binaire = (*pointeur_caractere_courant);
1266: pointeur_caractere_courant++;
1267:
1268: if (((*pointeur_caractere_courant) != d_code_fin_chaine) &&
1269: ((*pointeur_caractere_courant) != d_code_espace) &&
1270: ((*pointeur_caractere_courant) != caractere_fin))
1271: {
1272: erreur_analyse = d_ex_syntaxe;
1273: }
1274: else
1275: {
1276: pointeur_caractere_courant = pointeur_debut_instruction + 1;
1277:
1278: switch(base_binaire)
1279: {
1280: case 'b' :
1281: case 'o' :
1282: case 'd' :
1283: case 'h' :
1284: {
1285: break;
1286: }
1287:
1288: default :
1289: {
1290: erreur_analyse = d_ex_syntaxe;
1291: break;
1292: }
1293: }
1294: }
1295:
1296: while(((*pointeur_caractere_courant) != base_binaire) &&
1297: ((*pointeur_caractere_courant) != d_code_fin_chaine) &&
1298: (erreur_analyse == d_ex))
1299: {
1300: if (base_binaire == 'b')
1301: {
1302: switch(*pointeur_caractere_courant)
1303: {
1304: case ' ' :
1305: case '0' :
1306: case '1' :
1307: {
1308: break;
1309: }
1310:
1311: default :
1312: {
1313: erreur_analyse = d_ex_syntaxe;
1314: break;
1315: }
1316: }
1317: }
1318: else if (base_binaire == 'o')
1319: {
1320: switch(*pointeur_caractere_courant)
1321: {
1322: case ' ' :
1323: case '0' :
1324: case '1' :
1325: case '2' :
1326: case '3' :
1327: case '4' :
1328: case '5' :
1329: case '6' :
1330: case '7' :
1331: {
1332: break;
1333: }
1334:
1335: default :
1336: {
1337: erreur_analyse = d_ex_syntaxe;
1338: break;
1339: }
1340: }
1341: }
1342: else if (base_binaire == 'd')
1343: {
1344: switch(*pointeur_caractere_courant)
1345: {
1346: case ' ' :
1347: case '0' :
1348: case '1' :
1349: case '2' :
1350: case '3' :
1351: case '4' :
1352: case '5' :
1353: case '6' :
1354: case '7' :
1355: case '8' :
1356: case '9' :
1357: {
1358: break;
1359: }
1360:
1361: default :
1362: {
1363: erreur_analyse = d_ex_syntaxe;
1364: break;
1365: }
1366: }
1367: }
1368: else if (base_binaire != 'h')
1369: {
1370: erreur_analyse = d_ex_syntaxe;
1371: }
1372:
1373: pointeur_caractere_courant++;
1374: }
1375:
1376: if (erreur_analyse == d_ex)
1377: {
1378: pointeur_caractere_courant++;
1379: }
1380:
1381: drapeau_fin_objet = d_vrai;
1382: break;
1383: }
1384:
1385: case '{' :
1386: {
1387: if (pointeur_debut_instruction !=
1388: (pointeur_caractere_courant - 1))
1389: {
1390: erreur_format = d_ex_syntaxe;
1391: }
1392:
1393: niveau = 1;
1394:
1395: while((niveau != 0) && ((*pointeur_caractere_courant) !=
1396: d_code_fin_chaine))
1397: {
1398: (*s_etat_processus).position_courante =
1399: pointeur_caractere_courant
1400: - (*s_etat_processus).definitions_chainees;
1401:
1402: registre_type_en_cours = (*s_etat_processus).type_en_cours;
1403: (*s_etat_processus).type_en_cours = LST;
1404:
1405: if (recherche_instruction_suivante_recursive(
1406: s_etat_processus, recursivite + 1) == d_erreur)
1407: {
1408: (*s_etat_processus).type_en_cours =
1409: registre_type_en_cours;
1410:
1411: if ((*s_etat_processus).instruction_courante
1412: != NULL)
1413: {
1414: free((*s_etat_processus).instruction_courante);
1415: (*s_etat_processus).instruction_courante = NULL;
1416: }
1417:
1418: return(d_erreur);
1419: }
1420:
1421: (*s_etat_processus).type_en_cours = registre_type_en_cours;
1422: pointeur_caractere_courant =
1423: (*s_etat_processus).definitions_chainees +
1424: (*s_etat_processus).position_courante;
1425:
1426: if (strcmp((*s_etat_processus).instruction_courante, "}")
1427: == 0)
1428: {
1429: niveau--;
1430: }
1431:
1432: free((*s_etat_processus).instruction_courante);
1433: }
1434:
1435: if (niveau != 0)
1436: {
1437: erreur_analyse = d_ex_syntaxe;
1438: }
1439:
1440: drapeau_fin_objet = d_vrai;
1441: break;
1442: }
1443:
1444: case '[' :
1445: {
1446: if (pointeur_debut_instruction !=
1447: (pointeur_caractere_courant - 1))
1448: {
1449: erreur_format = d_ex_syntaxe;
1450: }
1451:
1452: niveau = 1;
1453:
1454: while((niveau > 0) && ((*pointeur_caractere_courant) !=
1455: d_code_fin_chaine) && (erreur_analyse == d_ex))
1456: {
1457: switch(*pointeur_caractere_courant)
1458: {
1459: case '[' :
1460: {
1461: niveau++;
1462: break;
1463: }
1464:
1465: case ']' :
1466: {
1467: niveau--;
1468: break;
1469: }
1470:
1471: case '0' :
1472: case '1' :
1473: case '2' :
1474: case '3' :
1475: case '4' :
1476: case '5' :
1477: case '6' :
1478: case '7' :
1479: case '8' :
1480: case '9' :
1481: case '+' :
1482: case '-' :
1483: case 'e' :
1484: case 'E' :
1485: case '.' :
1486: case ',' :
1487: case '(' :
1488: case ')' :
1489: case ' ' :
1490: {
1491: break;
1492: }
1493:
1494: default :
1495: {
1496: erreur_analyse = d_ex_syntaxe;
1497: break;
1498: }
1499: }
1500:
1501: if (niveau < 0)
1502: {
1503: erreur_analyse = d_ex_syntaxe;
1504: }
1505: else if (niveau > 2)
1506: {
1507: erreur_format = d_ex_syntaxe;
1508: }
1509:
1510: pointeur_caractere_courant++;
1511: }
1512:
1513: if (niveau != 0)
1514: {
1515: erreur_analyse = d_ex_syntaxe;
1516: }
1517:
1518: drapeau_fin_objet = d_vrai;
1519: break;
1520: }
1521:
1522: case '<' :
1523: {
1524: if (((*s_etat_processus).autorisation_empilement_programme
1525: == 'Y') && ((*pointeur_caractere_courant) == '<'))
1526: { // Cas << >>
1527: if (pointeur_debut_instruction !=
1528: (pointeur_caractere_courant - 1))
1529: {
1530: erreur_format = d_ex_syntaxe;
1531: }
1532:
1533: pointeur_caractere_courant++;
1534: drapeau_fin_objet = d_faux;
1535:
1536: while(((*pointeur_caractere_courant) != d_code_fin_chaine)
1537: && (erreur_format == d_absence_erreur))
1538: {
1539: while((*pointeur_caractere_courant) == d_code_espace)
1540: {
1541: pointeur_caractere_courant++;
1542: }
1543:
1544: if (((*pointeur_caractere_courant) == '>') &&
1545: ((*(pointeur_caractere_courant - 1)) ==
1546: d_code_espace))
1547: {
1548: pointeur_caractere_courant++;
1549:
1550: if ((*pointeur_caractere_courant) == '>')
1551: { // Cas de '>>'
1552: drapeau_fin_objet = d_vrai;
1553: pointeur_caractere_courant++;
1554: break;
1555: }
1556: else if ((*pointeur_caractere_courant) == '=')
1557: { // Cas de '>='
1558: pointeur_caractere_courant++;
1559: }
1560: else if ((*pointeur_caractere_courant) !=
1561: d_code_espace)
1562: { // Tous les cas différents de '>'
1563: erreur_analyse = d_ex_syntaxe;
1564: break;
1565: }
1566:
1567: pointeur_caractere_courant--;
1568: }
1569:
1570: if ((erreur_format == d_absence_erreur) &&
1571: (drapeau_fin_objet == d_faux))
1572: {
1573: (*s_etat_processus).position_courante =
1574: pointeur_caractere_courant
1575: - (*s_etat_processus).definitions_chainees;
1576:
1577: registre_type_en_cours = (*s_etat_processus)
1578: .type_en_cours;
1579: (*s_etat_processus).type_en_cours = RPN;
1580:
1581: if ((erreur =
1582: recherche_instruction_suivante_recursive(
1583: s_etat_processus, recursivite + 1))
1584: != d_absence_erreur)
1585: {
1586: (*s_etat_processus).type_en_cours =
1587: registre_type_en_cours;
1588:
1589: if ((*s_etat_processus).instruction_courante
1590: != NULL)
1591: {
1592: free((*s_etat_processus)
1593: .instruction_courante);
1594: (*s_etat_processus).instruction_courante
1595: = NULL;
1596: }
1597:
1598: return(d_erreur);
1599: }
1600:
1601: (*s_etat_processus).type_en_cours =
1602: registre_type_en_cours;
1603: pointeur_caractere_courant = (*s_etat_processus)
1604: .definitions_chainees + (*s_etat_processus)
1605: .position_courante;
1606:
1607: free((*s_etat_processus).instruction_courante);
1608: }
1609: }
1610:
1611: if (drapeau_fin_objet == d_faux)
1612: {
1613: erreur_analyse = d_ex_syntaxe;
1614: drapeau_fin_objet = d_vrai;
1615: }
1616: }
1617: else if ((*pointeur_caractere_courant) == '[')
1618: { // Cas <[ ]>
1619: if (pointeur_debut_instruction !=
1620: (pointeur_caractere_courant - 1))
1621: {
1622: erreur_format = d_ex_syntaxe;
1623: }
1624:
1625: pointeur_caractere_courant++;
1626: drapeau_fin_objet = d_faux;
1627:
1628: while(((*pointeur_caractere_courant) != d_code_fin_chaine)
1629: && (erreur_format == d_absence_erreur))
1630: {
1631: while((*pointeur_caractere_courant) == d_code_espace)
1632: {
1633: pointeur_caractere_courant++;
1634: }
1635:
1636: if ((*pointeur_caractere_courant) == ']')
1637: {
1638: if ((*(++pointeur_caractere_courant)) == '>')
1639: {
1640: drapeau_fin_objet = d_vrai;
1641: }
1642: else
1643: {
1644: erreur_analyse = d_ex_syntaxe;
1645: }
1646:
1647: pointeur_caractere_courant++;
1648: break;
1649: }
1650:
1651: if ((erreur_format == d_absence_erreur) &&
1652: (drapeau_fin_objet == d_faux))
1653: {
1654: (*s_etat_processus).position_courante =
1655: pointeur_caractere_courant
1656: - (*s_etat_processus).definitions_chainees;
1657:
1658: registre_type_en_cours = (*s_etat_processus)
1659: .type_en_cours;
1660: (*s_etat_processus).type_en_cours = TBL;
1661:
1662: if ((erreur =
1663: recherche_instruction_suivante_recursive(
1664: s_etat_processus, recursivite + 1))
1665: != d_absence_erreur)
1666: {
1667: (*s_etat_processus).type_en_cours =
1668: registre_type_en_cours;
1669:
1670: if ((*s_etat_processus).instruction_courante
1671: != NULL)
1672: {
1673: free((*s_etat_processus)
1674: .instruction_courante);
1675: (*s_etat_processus).instruction_courante
1676: = NULL;
1677: }
1678:
1679: return(d_erreur);
1680: }
1681:
1682: (*s_etat_processus).type_en_cours =
1683: registre_type_en_cours;
1684: pointeur_caractere_courant = (*s_etat_processus)
1685: .definitions_chainees + (*s_etat_processus)
1686: .position_courante;
1687:
1688: free((*s_etat_processus).instruction_courante);
1689: }
1690: }
1691:
1692: if (drapeau_fin_objet == d_faux)
1693: {
1694: erreur_analyse = d_ex_syntaxe;
1695: drapeau_fin_objet = d_vrai;
1696: }
1697: }
1698:
1699: break;
1700: }
1701:
1702: case '|' :
1703: {
1704: if ((*pointeur_caractere_courant) == '[')
1705: { // Cas |[ ]|
1706: if (pointeur_debut_instruction !=
1707: (pointeur_caractere_courant - 1))
1708: {
1709: erreur_format = d_ex_syntaxe;
1710: }
1711:
1712: pointeur_caractere_courant++;
1713: drapeau_fin_objet = d_faux;
1714:
1715: while(((*pointeur_caractere_courant) != d_code_fin_chaine)
1716: && (erreur_format == d_absence_erreur))
1717: {
1718: while((*pointeur_caractere_courant) == d_code_espace)
1719: {
1720: pointeur_caractere_courant++;
1721: }
1722:
1723: if ((*pointeur_caractere_courant) == ']')
1724: {
1725: if ((*(++pointeur_caractere_courant)) == '|')
1726: {
1727: drapeau_fin_objet = d_vrai;
1728: }
1729: else
1730: {
1731: erreur_analyse = d_ex_syntaxe;
1732: }
1733:
1734: pointeur_caractere_courant++;
1735: break;
1736: }
1737:
1738: if ((erreur_format == d_absence_erreur) &&
1739: (drapeau_fin_objet == d_faux))
1740: {
1741: (*s_etat_processus).position_courante =
1742: pointeur_caractere_courant
1743: - (*s_etat_processus).definitions_chainees;
1744:
1745: registre_type_en_cours = (*s_etat_processus)
1746: .type_en_cours;
1747: (*s_etat_processus).type_en_cours = REC;
1748:
1749: if ((erreur =
1750: recherche_instruction_suivante_recursive(
1751: s_etat_processus, recursivite + 1))
1752: != d_absence_erreur)
1753: {
1754: (*s_etat_processus).type_en_cours =
1755: registre_type_en_cours;
1756:
1757: if ((*s_etat_processus).instruction_courante
1758: != NULL)
1759: {
1760: free((*s_etat_processus)
1761: .instruction_courante);
1762: (*s_etat_processus).instruction_courante
1763: = NULL;
1764: }
1765:
1766: return(d_erreur);
1767: }
1768:
1769: (*s_etat_processus).type_en_cours =
1770: registre_type_en_cours;
1771: pointeur_caractere_courant = (*s_etat_processus)
1772: .definitions_chainees + (*s_etat_processus)
1773: .position_courante;
1774:
1775: free((*s_etat_processus).instruction_courante);
1776: }
1777: }
1778:
1779: if (drapeau_fin_objet == d_faux)
1780: {
1781: erreur_analyse = d_ex_syntaxe;
1782: drapeau_fin_objet = d_vrai;
1783: }
1784: }
1785:
1786: break;
1787: }
1788: }
1789:
1790: if ((*(pointeur_caractere_courant - 1)) == caractere_fin)
1791: {
1792: // Cas des objets composites (LST, RPN, TBL, REC)
1793: break;
1794: }
1795: else if ((*pointeur_caractere_courant) == caractere_fin)
1796: {
1797: // Condition pour traiter les cas "123}"
1798: break;
1799: }
1800: }
1801:
1802: pointeur_fin_instruction = pointeur_caractere_courant;
1803:
1804: if (recursivite == 0)
1805: {
1806: // Si la variable récursivité est nulle, il faut que le caractère
1807: // suivant l'objet soit un espace ou une fin de chaîne. Si ce n'est pas
1808: // le cas, il faut retourner une erreur car les objets de type
1809: // [[ 1 4 ]]3 doivent être invalides.
1810:
1811: switch((*pointeur_fin_instruction))
1812: {
1813: case d_code_fin_chaine:
1814: case d_code_espace:
1815: {
1816: break;
1817: }
1818:
1819: default:
1820: {
1821: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1822: // return(d_erreur);
1823: }
1824: }
1825: }
1826:
1827: (*s_etat_processus).instruction_courante = (unsigned char *)
1828: malloc((((size_t) (pointeur_fin_instruction
1829: - pointeur_debut_instruction)) + 1) * sizeof(unsigned char));
1830:
1831: if ((*s_etat_processus).instruction_courante == NULL)
1832: {
1833: erreur = d_erreur;
1834: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1835: }
1836: else if (pointeur_fin_instruction != pointeur_debut_instruction)
1837: {
1838: pointeur_caractere_courant = pointeur_debut_instruction;
1839: pointeur_caractere_destination =
1840: (*s_etat_processus).instruction_courante;
1841:
1842: do
1843: {
1844: *pointeur_caractere_destination++ = *pointeur_caractere_courant++;
1845: } while(pointeur_caractere_courant < pointeur_fin_instruction);
1846:
1847: (*pointeur_caractere_destination) = d_code_fin_chaine;
1848:
1849: erreur = ((erreur_analyse == d_ex) && (erreur_format == d_ex))
1850: ? d_absence_erreur : d_erreur;
1851: (*s_etat_processus).erreur_execution = erreur_analyse;
1852:
1853: if ((*s_etat_processus).erreur_execution == d_ex)
1854: {
1855: (*s_etat_processus).erreur_execution = erreur_format;
1856: }
1857: }
1858: else
1859: {
1860: (*(*s_etat_processus).instruction_courante) = d_code_fin_chaine;
1861: }
1862:
1863: (*s_etat_processus).position_courante = pointeur_fin_instruction
1864: - (*s_etat_processus).definitions_chainees;
1865:
1866: return(erreur);
1867: }
1868:
1869:
1870: /*
1871: ================================================================================
1872: Routine mettant la chaîne d'entrée en majuscule
1873: ================================================================================
1874: Entrée : pointeur sur une chaîne en minuscules.
1875: --------------------------------------------------------------------------------
1876: Sortie : pointeur sur la chaîne en majuscules. Si le pointeur retourné
1877: est nul, il s'est produit une erreur. L'allocation est faite dans la
1878: routine.
1879: --------------------------------------------------------------------------------
1880: Effets de bord : néant.
1881: ================================================================================
1882: */
1883:
1884: unsigned char *
1885: conversion_majuscule(struct_processus *s_etat_processus, unsigned char *chaine)
1886: {
1887: register unsigned char *caractere_courant;
1888: register unsigned char *caractere_courant_converti;
1889: register unsigned char *chaine_convertie;
1890:
1891: integer8 longueur_chaine_plus_terminaison;
1892:
1893: longueur_chaine_plus_terminaison = 0;
1894: caractere_courant = chaine;
1895:
1896: while((*caractere_courant) != d_code_fin_chaine)
1897: {
1898: caractere_courant++;
1899: longueur_chaine_plus_terminaison++;
1900: }
1901:
1902: caractere_courant = chaine;
1903: caractere_courant_converti = chaine_convertie = (unsigned char *) malloc(
1904: ((size_t) (longueur_chaine_plus_terminaison + 1))
1905: * sizeof(unsigned char));
1906:
1907: if (chaine_convertie != NULL)
1908: {
1909: while((*caractere_courant) != d_code_fin_chaine)
1910: {
1911: if (isalpha((*caractere_courant)))
1912: {
1913: (*caractere_courant_converti) = (unsigned char)
1914: toupper((*caractere_courant));
1915: }
1916: else
1917: {
1918: (*caractere_courant_converti) = (*caractere_courant);
1919: }
1920:
1921: caractere_courant++;
1922: caractere_courant_converti++;
1923: }
1924:
1925: (*caractere_courant_converti) = d_code_fin_chaine;
1926: }
1927:
1928: return(chaine_convertie);
1929: }
1930:
1931: void
1932: conversion_majuscule_limitee(unsigned char *chaine_entree,
1933: unsigned char *chaine_sortie, integer8 longueur)
1934: {
1935: integer8 i;
1936:
1937: for(i = 0; i < longueur; i++)
1938: {
1939: if (isalpha((*chaine_entree)))
1940: {
1941: (*chaine_sortie) = (unsigned char) toupper((*chaine_entree));
1942: }
1943: else
1944: {
1945: (*chaine_sortie) = (*chaine_entree);
1946: }
1947:
1948: if ((*chaine_entree) == d_code_fin_chaine)
1949: {
1950: break;
1951: }
1952:
1953: chaine_entree++;
1954: chaine_sortie++;
1955: }
1956:
1957: return;
1958: }
1959:
1960:
1961: /*
1962: ================================================================================
1963: Initialisation de l'état du calculateur
1964: Configuration par défaut d'un calculateur HP-28S
1965: ================================================================================
1966: Entrée : pointeur sur la structure struct_processus
1967: --------------------------------------------------------------------------------
1968: Sortie : néant
1969: --------------------------------------------------------------------------------
1970: Effets de bord : néant
1971: ================================================================================
1972: */
1973:
1974: void
1975: initialisation_drapeaux(struct_processus *s_etat_processus)
1976: {
1977: unsigned long i;
1978:
1979: for(i = 0; i < 31; cf(s_etat_processus, (unsigned char) i++));
1980:
1981: if ((*s_etat_processus).lancement_interactif == d_vrai)
1982: {
1983: sf(s_etat_processus, 31);
1984: /* LAST autorisé */
1985: }
1986: else
1987: {
1988: cf(s_etat_processus, 31);
1989: /* LAST invalidé */
1990: }
1991:
1992: cf(s_etat_processus, 32); /* Impression automatique */
1993: cf(s_etat_processus, 33); /* CR automatique (disp) */
1994: sf(s_etat_processus, 34); /* Évaluation des caractères de contrôle */
1995: sf(s_etat_processus, 35); /* Évaluation symbolique des constantes */
1996: sf(s_etat_processus, 36); /* Évaluation symbolique des fonctions */
1997: sf(s_etat_processus, 37); /* Taille de mot pour les entiers binaires */
1998: sf(s_etat_processus, 38); /* Taille de mot pour les entiers binaires */
1999: sf(s_etat_processus, 39); /* Taille de mot pour les entiers binaires */
2000: sf(s_etat_processus, 40); /* Taille de mot pour les entiers binaires */
2001: sf(s_etat_processus, 41); /* Taille de mot pour les entiers binaires */
2002: sf(s_etat_processus, 42); /* Taille de mot pour les entiers binaires */
2003: /*
2004: 37 : bit de poids faible
2005: 42 : bit de poids fort
2006: Les six drapeaux peuvent être nuls. Dans ce cas, la longueur des mots
2007: binaires reste de un bit.
2008: */
2009: cf(s_etat_processus, 43); /* Base de numération binaire */
2010: cf(s_etat_processus, 44); /* Base de numération binaire */
2011: /*
2012: 43 44 = 00 => décimal
2013: 43 44 = 01 => binaire
2014: 43 44 = 10 => octal
2015: 43 44 = 11 => hexadécimal
2016: */
2017: sf(s_etat_processus, 45); /* Affichage multiligne du niveau 1 */
2018: cf(s_etat_processus, 46); /* Réservé */
2019: cf(s_etat_processus, 47); /* Réservé */
2020: /*
2021: 46 et 47 réservés sur le calculateur HP28S
2022: 46 47 = 00 => système rectangulaire
2023: 46 47 = 01 => système cylindrique
2024: 46 47 = 10 => système sphérique
2025: */
2026: cf(s_etat_processus, 48); /* Séparateur décimal */
2027: cf(s_etat_processus, 49); /* Format des nombres réels */
2028: cf(s_etat_processus, 50); /* Format des nombres réels */
2029: /*
2030: 49 50 = 00 => standard
2031: 49 50 = 01 => scientifique
2032: 49 50 = 10 => virgule fixe
2033: 49 50 = 11 => ingénieur
2034: */
2035: cf(s_etat_processus, 51); /* Tonalité */
2036: cf(s_etat_processus, 52); /* REDRAW automatique */
2037: cf(s_etat_processus, 53); /* Nombre de chiffres décimaux */
2038: cf(s_etat_processus, 54); /* Nombre de chiffres décimaux */
2039: cf(s_etat_processus, 55); /* Nombre de chiffres décimaux */
2040: cf(s_etat_processus, 56); /* Nombre de chiffres décimaux */
2041: /*
2042: 53 : bit de poids faible
2043: 56 : bit de poids fort
2044: */
2045: cf(s_etat_processus, 57); /* Underflow traité normalement */
2046: cf(s_etat_processus, 58); /* Overflow traité normalement */
2047: sf(s_etat_processus, 59); /* Infinite result traité normalement */
2048: sf(s_etat_processus, 60); /* Angles */
2049: /*
2050: 60 = 0 => degrés
2051: 60 = 1 => radians
2052: */
2053: cf(s_etat_processus, 61); /* Underflow- traité en exception */
2054: cf(s_etat_processus, 62); /* Underflow+ traité en exception */
2055: cf(s_etat_processus, 63); /* Overflow traité en exception */
2056: cf(s_etat_processus, 64); /* Infinite result traité en exception */
2057: }
2058:
2059: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>