![]() ![]() | ![]() |
1.1 bertrand 1: /*
2: ================================================================================
1.40 ! bertrand 3: RPL/2 (R) version 4.1.4
1.26 bertrand 4: Copyright (C) 1989-2011 Dr. BERTRAND Joël
1.1 bertrand 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:
1.19 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
28: Affectation automatique d'un type à des données
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: void
39: recherche_type(struct_processus *s_etat_processus)
40: {
41: int nombre_elements_convertis;
42:
43: struct_liste_chainee *l_base_liste_fonctions;
44: struct_liste_chainee *l_base_liste_decomposition;
45: struct_liste_chainee *l_element_courant;
46: struct_liste_chainee *l_element_courant_fonctions;
47: struct_liste_chainee *l_element_precedent;
48:
49: struct_liste_pile_systeme *s_sauvegarde_pile;
50:
51: struct_objet *s_objet;
52: struct_objet *s_sous_objet;
53:
54: logical1 drapeau_chaine;
55: logical1 drapeau_complexe;
56: logical1 drapeau_matrice;
57: logical1 drapeau_reel;
58: logical1 drapeau_valeur_entiere;
59: logical1 drapeau_valeur_reelle;
60: logical1 erreur;
61: logical1 erreur_lecture_binaire;
62:
63: logical8 ancienne_valeur_base;
64: logical8 valeur_base;
65:
66: long coherence_liste;
67:
68: unsigned char autorisation_evaluation_nom;
69: unsigned char *definitions_chainees_precedentes;
70: unsigned char *fonction_majuscule;
71: unsigned char *instruction_majuscule;
72: unsigned char *ptr;
73: unsigned char *ptr_ecriture;
74: unsigned char *ptr_lecture;
75: unsigned char registre_instruction_valide;
76: unsigned char registre_interruption;
77: unsigned char registre_mode_execution_programme;
1.24 bertrand 78: unsigned char registre_recherche_type;
1.1 bertrand 79: unsigned char registre_test;
80: unsigned char registre_test_bis;
81: unsigned char *tampon;
1.34 bertrand 82: unsigned char variable_implicite;
1.1 bertrand 83:
84: unsigned long i;
85: unsigned long j;
86: unsigned long niveau;
87: unsigned long niveau_maximal;
88: unsigned long nombre_colonnes;
89: unsigned long nombre_egalites;
90: unsigned long nombre_elements;
91: unsigned long nombre_exposants;
92: unsigned long nombre_lignes;
93: unsigned long nombre_lignes_a_supprimer;
94: unsigned long nombre_points;
95: unsigned long nombre_virgules;
96: unsigned long position_courante;
97: unsigned long profondeur_finale;
98: unsigned long profondeur_initiale;
99: unsigned long sauvegarde_niveau_courant;
100: unsigned long sauvegarde_longueur_definitions_chainees;
101:
102: void *element;
103:
104: s_objet = (struct_objet *) malloc(sizeof(struct_objet));
105: element = NULL;
106: nombre_egalites = 0;
107: i = 0;
108:
109: if (s_objet == NULL)
110: {
111: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
112: return;
113: }
114:
115: initialisation_objet(s_objet);
116: registre_test = (*s_etat_processus).test_instruction;
117: registre_instruction_valide = (*s_etat_processus).instruction_valide;
118: registre_interruption = (*s_etat_processus).traitement_interruptible;
119: (*s_etat_processus).test_instruction = 'Y';
120: (*s_etat_processus).traitement_interruptible = 'N';
121:
122: analyse(s_etat_processus, NULL);
123:
124: (*s_etat_processus).test_instruction = registre_test;
125:
126: if ((*s_etat_processus).instruction_valide == 'Y')
127: {
128: if ((*s_etat_processus).constante_symbolique == 'N')
129: {
130: if ((element = malloc(sizeof(struct_fonction))) == NULL)
131: {
132: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
133: (*s_etat_processus).traitement_interruptible =
134: registre_interruption;
135: return;
136: }
137:
138: (*((struct_fonction *) element)).nombre_arguments = 0;
139: (*((struct_fonction *) element)).prediction_saut = NULL;
140:
141: if ((*s_etat_processus).instruction_intrinseque == 'Y')
142: {
143: /*
144: * Les fonctions intrinsèques ne sont pas sensibles à la casse.
145: */
146:
147: if (((*((struct_fonction *) element)).nom_fonction =
148: conversion_majuscule((*s_etat_processus)
149: .instruction_courante)) == NULL)
150: {
151: (*s_etat_processus).erreur_systeme =
152: d_es_allocation_memoire;
153: (*s_etat_processus).traitement_interruptible =
154: registre_interruption;
155: return;
156: }
157: }
158: else
159: {
160: if (((*((struct_fonction *) element)).nom_fonction =
161: malloc((strlen((*s_etat_processus).instruction_courante)
162: + 1) * sizeof(unsigned char))) == NULL)
163: {
164: (*s_etat_processus).erreur_systeme =
165: d_es_allocation_memoire;
166: (*s_etat_processus).traitement_interruptible =
167: registre_interruption;
168: return;
169: }
170:
171: strcpy((*((struct_fonction *) element)).nom_fonction,
172: (*s_etat_processus).instruction_courante);
173: }
174:
175: (*((struct_fonction *) element)).fonction =
176: analyse_instruction(s_etat_processus,
177: (*((struct_fonction *) element)).nom_fonction);
178:
179: (*s_objet).type = FCT;
180: (*s_objet).objet = element;
1.7 bertrand 181: (*((struct_fonction *) (*s_objet).objet)).prediction_saut = NULL;
182: (*((struct_fonction *) (*s_objet).objet)).prediction_execution
183: = d_faux;
1.1 bertrand 184:
185: if (empilement(s_etat_processus,
186: &((*s_etat_processus).l_base_pile), s_objet) == d_erreur)
187: {
188: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
189: (*s_etat_processus).traitement_interruptible =
190: registre_interruption;
191: return;
192: }
193: }
194: else
195: {
196: if ((instruction_majuscule = conversion_majuscule(
197: (*s_etat_processus).instruction_courante)) == NULL)
198: {
199: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
200: (*s_etat_processus).traitement_interruptible =
201: registre_interruption;
202: return;
203: }
204:
205: if ((*s_etat_processus).constante_symbolique == 'Y')
206: {
207: registre_test_bis = (*s_etat_processus).test_instruction;
208: (*s_etat_processus).test_instruction = 'N';
209: analyse(s_etat_processus, NULL);
210: (*s_etat_processus).test_instruction = registre_test_bis;
211: free(s_objet);
212: }
213: else
214: {
215: (*s_objet).type = NOM;
216:
217: if (((*s_objet).objet = malloc(sizeof(struct_nom))) == NULL)
218: {
219: (*s_etat_processus).erreur_systeme =
220: d_es_allocation_memoire;
221: (*s_etat_processus).traitement_interruptible =
222: registre_interruption;
223: return;
224: }
225:
226: (*((struct_nom *) (*s_objet).objet)).symbole = d_faux;
227:
228: if (((*((struct_nom *) (*s_objet).objet)).nom =
229: (unsigned char *) malloc((strlen((*s_etat_processus)
230: .instruction_courante) + 1) * sizeof(unsigned char)))
231: == NULL)
232: {
233: (*s_etat_processus).erreur_systeme =
234: d_es_allocation_memoire;
235: (*s_etat_processus).traitement_interruptible =
236: registre_interruption;
237: return;
238: }
239:
240: strcpy((*((struct_nom *) (*s_objet).objet)).nom,
241: (*s_etat_processus).instruction_courante);
242:
243: if (empilement(s_etat_processus,
244: &((*s_etat_processus).l_base_pile), s_objet) ==
245: d_erreur)
246: {
247: (*s_etat_processus).erreur_systeme =
248: d_es_allocation_memoire;
249: (*s_etat_processus).traitement_interruptible =
250: registre_interruption;
251: return;
252: }
253: }
254:
255: free(instruction_majuscule);
256: }
257:
258: (*s_etat_processus).instruction_valide = registre_instruction_valide;
259: (*s_etat_processus).traitement_interruptible = registre_interruption;
260: return;
261: }
262:
263: (*s_etat_processus).instruction_valide = registre_instruction_valide;
264:
265: switch(*((*s_etat_processus).instruction_courante))
266: {
267:
268: /*
269: --------------------------------------------------------------------------------
270: Complexe
271: --------------------------------------------------------------------------------
272: */
273:
274: case '(' :
275: {
276: (*s_objet).type = CPL;
277:
278: element = (void *) ((struct_complexe16 *) malloc(
279: sizeof(struct_complexe16)));
280:
281: if (element == NULL)
282: {
283: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
284: (*s_etat_processus).traitement_interruptible =
285: registre_interruption;
286: return;
287: }
288:
289: conversion_format(s_etat_processus,
290: (*s_etat_processus).instruction_courante);
291:
292: sauvegarde_longueur_definitions_chainees =
293: (*s_etat_processus).longueur_definitions_chainees;
294:
295: tampon = (unsigned char *) malloc(
296: (((*s_etat_processus).longueur_definitions_chainees
297: = strlen((*s_etat_processus).instruction_courante)
298: + 4) + 1) * sizeof(unsigned char));
299:
300: if (tampon == NULL)
301: {
302: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
303: (*s_etat_processus).traitement_interruptible =
304: registre_interruption;
305: return;
306: }
307:
308: strcpy(tampon, "<< ");
309: ptr_ecriture = tampon + 3;
310: ptr_lecture = (*s_etat_processus).instruction_courante + 1;
311:
312: nombre_virgules = 0;
313:
314: while((*ptr_lecture) != d_code_fin_chaine)
315: {
316: if ((*ptr_lecture) == ',')
317: {
318: (*ptr_lecture) = ' ';
319: nombre_virgules++;
320: }
321:
322: *ptr_ecriture++ = *ptr_lecture++;
323: }
324:
325: (*(--ptr_ecriture)) = d_code_fin_chaine;
326: strcat(ptr_ecriture, " >>");
327:
328: position_courante = (*s_etat_processus).position_courante;
329: (*s_etat_processus).position_courante = 0;
330:
331: profondeur_initiale = (*s_etat_processus)
332: .hauteur_pile_operationnelle;
333:
334: /*
335: -- On met le tout dans la pile opérationnelle ----------------------------------
336: */
337:
338: (*s_etat_processus).niveau_recursivite++;
339: definitions_chainees_precedentes = (*s_etat_processus)
340: .definitions_chainees;
341: (*s_etat_processus).definitions_chainees = tampon;
342:
343: s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
344: sauvegarde_niveau_courant = (*s_etat_processus).niveau_courant;
345:
346: (*s_etat_processus).l_base_pile_systeme = NULL;
347: empilement_pile_systeme(s_etat_processus);
348:
349: if ((*s_etat_processus).erreur_systeme != d_es)
350: {
351: (*s_etat_processus).traitement_interruptible =
352: registre_interruption;
353: return;
354: }
355:
356: (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
357: (*s_etat_processus).niveau_courant = 0;
358: (*s_etat_processus).autorisation_empilement_programme = 'N';
359: registre_mode_execution_programme =
360: (*s_etat_processus).mode_execution_programme;
361: (*s_etat_processus).mode_execution_programme = 'Y';
362:
363: tampon = (*s_etat_processus).instruction_courante;
364:
365: if ((*s_etat_processus).profilage == d_vrai)
366: {
367: profilage(s_etat_processus, "RPL/2 internals");
368:
369: if ((*s_etat_processus).erreur_systeme != d_es)
370: {
371: return;
372: }
373: }
374:
1.24 bertrand 375: registre_recherche_type = (*s_etat_processus).recherche_type;
376: (*s_etat_processus).recherche_type = 'Y';
377:
1.1 bertrand 378: if (sequenceur(s_etat_processus) == d_erreur)
379: {
1.24 bertrand 380: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
381: (*s_etat_processus).recherche_type = registre_recherche_type;
1.1 bertrand 382: (*s_etat_processus).instruction_courante = tampon;
383: (*s_etat_processus).mode_execution_programme =
384: registre_mode_execution_programme;
385:
1.12 bertrand 386: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 387: (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
388: (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
389:
390: (*s_etat_processus).niveau_recursivite--;
391:
392: (*s_etat_processus).position_courante = position_courante;
393: free((*s_etat_processus).definitions_chainees);
394: (*s_etat_processus).definitions_chainees =
395: definitions_chainees_precedentes;
396: (*s_etat_processus).longueur_definitions_chainees =
397: sauvegarde_longueur_definitions_chainees;
398:
399: free(element);
400: free(s_objet);
401:
402: (*s_etat_processus).traitement_interruptible =
403: registre_interruption;
404: return;
405: }
406:
1.24 bertrand 407: (*s_etat_processus).recherche_type = registre_recherche_type;
1.1 bertrand 408: (*s_etat_processus).instruction_courante = tampon;
409: (*s_etat_processus).mode_execution_programme =
410: registre_mode_execution_programme;
411:
412: (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
413: (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
414:
415: (*s_etat_processus).niveau_recursivite--;
416:
417: (*s_etat_processus).position_courante = position_courante;
418: free((*s_etat_processus).definitions_chainees);
419: (*s_etat_processus).definitions_chainees =
420: definitions_chainees_precedentes;
421: (*s_etat_processus).longueur_definitions_chainees =
422: sauvegarde_longueur_definitions_chainees;
423:
424: /*
425: -- On relit la pile pour remplir le complexe -----------------------------------
426: */
427:
428: profondeur_finale = (*s_etat_processus).hauteur_pile_operationnelle;
429: nombre_elements_convertis = profondeur_finale - profondeur_initiale;
430:
431: if ((nombre_elements_convertis != 2) || (nombre_virgules != 1))
432: {
433: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
434:
435: free(s_objet);
436: free(element);
437:
438: for(i = 0; i < (unsigned long) nombre_elements_convertis; i++)
439: {
440: if (depilement(s_etat_processus, &((*s_etat_processus)
441: .l_base_pile), &s_sous_objet) == d_erreur)
442: {
443: (*s_etat_processus).traitement_interruptible =
444: registre_interruption;
445: return;
446: }
447:
448: liberation(s_etat_processus, s_sous_objet);
449: }
450:
451: (*s_etat_processus).traitement_interruptible =
452: registre_interruption;
453: return;
454: }
455: else
456: {
457: if (depilement(s_etat_processus,
458: &((*s_etat_processus).l_base_pile), &s_sous_objet) ==
459: d_absence_erreur)
460: {
461: if ((*s_sous_objet).type == INT)
462: {
463: (*((struct_complexe16 *) element)).partie_imaginaire =
464: (*((integer8 *) (*s_sous_objet).objet));
465: }
466: else if ((*s_sous_objet).type == REL)
467: {
468: (*((struct_complexe16 *) element)).partie_imaginaire =
469: (*((real8 *) (*s_sous_objet).objet));
470: }
471: else
472: {
473: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
474:
475: free(element);
476: free(s_objet);
477:
478: liberation(s_etat_processus, s_sous_objet);
479:
480: (*s_etat_processus).traitement_interruptible =
481: registre_interruption;
482: return;
483: }
484:
485: liberation(s_etat_processus, s_sous_objet);
486:
487: if (depilement(s_etat_processus,
488: &((*s_etat_processus).l_base_pile), &s_sous_objet)
489: == d_absence_erreur)
490: {
491: if ((*s_sous_objet).type == INT)
492: {
493: (*((struct_complexe16 *) element)).partie_reelle =
494: (*((integer8 *) (*s_sous_objet).objet));
495: }
496: else if ((*s_sous_objet).type == REL)
497: {
498: (*((struct_complexe16 *) element)).partie_reelle =
499: (*((real8 *) (*s_sous_objet).objet));
500: }
501: else
502: {
503: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
504:
505: free(element);
506: free(s_objet);
507:
508: liberation(s_etat_processus, s_sous_objet);
509:
510: (*s_etat_processus).traitement_interruptible =
511: registre_interruption;
512: return;
513: }
514:
515: liberation(s_etat_processus, s_sous_objet);
516: }
517: }
518: }
519:
520: break;
521: }
522:
523: /*
524: --------------------------------------------------------------------------------
525: Binaire
526: --------------------------------------------------------------------------------
527: */
528:
529: case '#' :
530: {
531: (*s_objet).type = BIN;
532:
533: element = (void *) ((logical8 *) malloc(
534: sizeof(logical8)));
535:
536: if (element == NULL)
537: {
538: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
539: (*s_etat_processus).traitement_interruptible =
540: registre_interruption;
541: return;
542: }
543:
544: erreur_lecture_binaire = d_faux;
545:
546: switch((*s_etat_processus).instruction_courante
547: [strlen((*s_etat_processus).instruction_courante) - 1])
548: {
549: case 'b' :
550: {
551: i = strlen((*s_etat_processus).instruction_courante) - 2;
552: valeur_base = 1;
553:
554: (*((logical8 *) element)) = 0;
555:
556: while(i > 0)
557: {
558: if ((*s_etat_processus).instruction_courante[i] == '1')
559: {
560: (*((logical8 *) element)) += valeur_base;
561: }
562: else if ((*s_etat_processus).instruction_courante[i]
563: != '0')
564: {
565: if ((*s_etat_processus).instruction_courante[i]
566: == ' ')
567: {
568: while(i > 0)
569: {
570: if ((*s_etat_processus)
571: .instruction_courante[i] != ' ')
572: {
573: break;
574: }
575:
576: i--;
577: }
578: }
579:
580: if (i != 0)
581: {
582: free(element);
583: free(s_objet);
584:
585: (*s_etat_processus).erreur_execution =
586: d_ex_syntaxe;
587: (*s_etat_processus).traitement_interruptible =
588: registre_interruption;
589: return;
590: }
591:
592: break;
593: }
594:
595: ancienne_valeur_base = valeur_base;
596: valeur_base *= 2;
597:
598: if (ancienne_valeur_base > valeur_base)
599: {
600: i--;
601:
602: while(i > 0)
603: {
604: if ((*s_etat_processus).instruction_courante[i]
605: != ' ')
606: {
607: erreur_lecture_binaire = d_vrai;
608: }
609:
610: i--;
611: }
612:
613: break;
614: }
615:
616: i--;
617: }
618:
619: nombre_elements_convertis = 1;
620: break;
621: }
622:
623: case 'o' :
624: {
625: i = strlen((*s_etat_processus).instruction_courante) - 2;
626: valeur_base = 1;
627:
628: (*((logical8 *) element)) = 0;
629:
630: while(i > 0)
631: {
632: if ((*s_etat_processus).instruction_courante[i] == '1')
633: {
634: (*((logical8 *) element)) += valeur_base;
635: }
636: else if ((*s_etat_processus).instruction_courante[i]
637: == '2')
638: {
639: (*((logical8 *) element)) += 2 * valeur_base;
640: }
641: else if ((*s_etat_processus).instruction_courante[i]
642: == '3')
643: {
644: (*((logical8 *) element)) += 3 * valeur_base;
645: }
646: else if ((*s_etat_processus).instruction_courante[i]
647: == '4')
648: {
649: (*((logical8 *) element)) += 4 * valeur_base;
650: }
651: else if ((*s_etat_processus).instruction_courante[i]
652: == '5')
653: {
654: (*((logical8 *) element)) += 5 * valeur_base;
655: }
656: else if ((*s_etat_processus).instruction_courante[i]
657: == '6')
658: {
659: (*((logical8 *) element)) += 6 * valeur_base;
660: }
661: else if ((*s_etat_processus).instruction_courante[i]
662: == '7')
663: {
664: (*((logical8 *) element)) += 7 * valeur_base;
665: }
666: else if ((*s_etat_processus).instruction_courante[i]
667: != '0')
668: {
669: if ((*s_etat_processus).instruction_courante[i]
670: == ' ')
671: {
672: while(i > 0)
673: {
674: if ((*s_etat_processus)
675: .instruction_courante[i] != ' ')
676: {
677: break;
678: }
679:
680: i--;
681: }
682: }
683:
684: if (i != 0)
685: {
686: free(element);
687: free(s_objet);
688:
689: (*s_etat_processus).erreur_execution =
690: d_ex_syntaxe;
691: (*s_etat_processus).traitement_interruptible =
692: registre_interruption;
693: return;
694: }
695:
696: break;
697: }
698:
699: ancienne_valeur_base = valeur_base;
700: valeur_base *= 8;
701:
702: if (ancienne_valeur_base > valeur_base)
703: {
704: i--;
705:
706: while(i > 0)
707: {
708: if ((*s_etat_processus).instruction_courante[i]
709: != ' ')
710: {
711: erreur_lecture_binaire = d_vrai;
712: }
713:
714: i--;
715: }
716:
717: break;
718: }
719:
720: i--;
721: }
722:
723: nombre_elements_convertis = 1;
724: break;
725: }
726:
727: case 'd' :
728: {
729: i = strlen((*s_etat_processus).instruction_courante) - 2;
730: valeur_base = 1;
731:
732: (*((logical8 *) element)) = 0;
733:
734: while(i > 0)
735: {
736: if ((*s_etat_processus).instruction_courante[i] == '1')
737: {
738: (*((logical8 *) element)) += valeur_base;
739: }
740: else if ((*s_etat_processus).instruction_courante[i]
741: == '2')
742: {
743: (*((logical8 *) element)) += 2 * valeur_base;
744: }
745: else if ((*s_etat_processus).instruction_courante[i]
746: == '3')
747: {
748: (*((logical8 *) element)) += 3 * valeur_base;
749: }
750: else if ((*s_etat_processus).instruction_courante[i]
751: == '4')
752: {
753: (*((logical8 *) element)) += 4 * valeur_base;
754: }
755: else if ((*s_etat_processus).instruction_courante[i]
756: == '5')
757: {
758: (*((logical8 *) element)) += 5 * valeur_base;
759: }
760: else if ((*s_etat_processus).instruction_courante[i]
761: == '6')
762: {
763: (*((logical8 *) element)) += 6 * valeur_base;
764: }
765: else if ((*s_etat_processus).instruction_courante[i]
766: == '7')
767: {
768: (*((logical8 *) element)) += 7 * valeur_base;
769: }
770: else if ((*s_etat_processus).instruction_courante[i]
771: == '8')
772: {
773: (*((logical8 *) element)) += 8 * valeur_base;
774: }
775: else if ((*s_etat_processus).instruction_courante[i]
776: == '9')
777: {
778: (*((logical8 *) element)) += 9 * valeur_base;
779: }
780: else if ((*s_etat_processus).instruction_courante[i]
781: != '0')
782: {
783: if ((*s_etat_processus).instruction_courante[i]
784: == ' ')
785: {
786: while(i > 0)
787: {
788: if ((*s_etat_processus)
789: .instruction_courante[i] != ' ')
790: {
791: break;
792: }
793:
794: i--;
795: }
796: }
797:
798: if (i != 0)
799: {
800: free(element);
801: free(s_objet);
802:
803: (*s_etat_processus).erreur_execution =
804: d_ex_syntaxe;
805: (*s_etat_processus).traitement_interruptible =
806: registre_interruption;
807: return;
808: }
809:
810: break;
811: }
812:
813: ancienne_valeur_base = valeur_base;
814: valeur_base *= 10;
815:
816: if (ancienne_valeur_base > valeur_base)
817: {
818: i--;
819:
820: while(i > 0)
821: {
822: if ((*s_etat_processus).instruction_courante[i]
823: != ' ')
824: {
825: erreur_lecture_binaire = d_vrai;
826: }
827:
828: i--;
829: }
830:
831: break;
832: }
833:
834: i--;
835: }
836:
837: nombre_elements_convertis = 1;
838: break;
839: }
840:
841: case 'h' :
842: {
843: i = strlen((*s_etat_processus).instruction_courante) - 2;
844: valeur_base = 1;
845:
846: (*((logical8 *) element)) = 0;
847:
848: while(i > 0)
849: {
850: if ((*s_etat_processus).instruction_courante[i] == '1')
851: {
852: (*((logical8 *) element)) += valeur_base;
853: }
854: else if ((*s_etat_processus).instruction_courante[i]
855: == '2')
856: {
857: (*((logical8 *) element)) += 2 * valeur_base;
858: }
859: else if ((*s_etat_processus).instruction_courante[i]
860: == '3')
861: {
862: (*((logical8 *) element)) += 3 * valeur_base;
863: }
864: else if ((*s_etat_processus).instruction_courante[i]
865: == '4')
866: {
867: (*((logical8 *) element)) += 4 * valeur_base;
868: }
869: else if ((*s_etat_processus).instruction_courante[i]
870: == '5')
871: {
872: (*((logical8 *) element)) += 5 * valeur_base;
873: }
874: else if ((*s_etat_processus).instruction_courante[i]
875: == '6')
876: {
877: (*((logical8 *) element)) += 6 * valeur_base;
878: }
879: else if ((*s_etat_processus).instruction_courante[i]
880: == '7')
881: {
882: (*((logical8 *) element)) += 7 * valeur_base;
883: }
884: else if ((*s_etat_processus).instruction_courante[i]
885: == '8')
886: {
887: (*((logical8 *) element)) += 8 * valeur_base;
888: }
889: else if ((*s_etat_processus).instruction_courante[i]
890: == '9')
891: {
892: (*((logical8 *) element)) += 9 * valeur_base;
893: }
894: else if ((*s_etat_processus).instruction_courante[i]
895: == 'A')
896: {
897: (*((logical8 *) element)) += 10 * valeur_base;
898: }
899: else if ((*s_etat_processus).instruction_courante[i]
900: == 'B')
901: {
902: (*((logical8 *) element)) += 11 * valeur_base;
903: }
904: else if ((*s_etat_processus).instruction_courante[i]
905: == 'C')
906: {
907: (*((logical8 *) element)) += 12 * valeur_base;
908: }
909: else if ((*s_etat_processus).instruction_courante[i]
910: == 'D')
911: {
912: (*((logical8 *) element)) += 13 * valeur_base;
913: }
914: else if ((*s_etat_processus).instruction_courante[i]
915: == 'E')
916: {
917: (*((logical8 *) element)) += 14 * valeur_base;
918: }
919: else if ((*s_etat_processus).instruction_courante[i]
920: == 'F')
921: {
922: (*((logical8 *) element)) += 15 * valeur_base;
923: }
924: else if ((*s_etat_processus).instruction_courante[i]
925: != '0')
926: {
927: if ((*s_etat_processus).instruction_courante[i]
928: == ' ')
929: {
930: while(i > 0)
931: {
932: if ((*s_etat_processus)
933: .instruction_courante[i] != ' ')
934: {
935: break;
936: }
937:
938: i--;
939: }
940: }
941:
942: if (i != 0)
943: {
944: free(element);
945: free(s_objet);
946:
947: (*s_etat_processus).erreur_execution =
948: d_ex_syntaxe;
949: (*s_etat_processus).traitement_interruptible =
950: registre_interruption;
951: return;
952: }
953:
954: break;
955: }
956:
957: ancienne_valeur_base = valeur_base;
958: valeur_base *= 16;
959:
960: if (ancienne_valeur_base > valeur_base)
961: {
962: i--;
963:
964: while(i > 0)
965: {
966: if ((*s_etat_processus).instruction_courante[i]
967: != ' ')
968: {
969: erreur_lecture_binaire = d_vrai;
970: }
971:
972: i--;
973: }
974:
975: break;
976: }
977:
978: i--;
979: }
980:
981: nombre_elements_convertis = 1;
982: break;
983: }
984:
985: default :
986: {
987: nombre_elements_convertis = 0;
988: break;
989: }
990: }
991:
992: if ((nombre_elements_convertis != 1) ||
993: (erreur_lecture_binaire == d_vrai))
994: {
995: free(element);
996: free(s_objet);
997:
998: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
999: (*s_etat_processus).traitement_interruptible =
1000: registre_interruption;
1001: return;
1002: }
1003:
1004: break;
1005: }
1006:
1007: /*
1008: --------------------------------------------------------------------------------
1009: Matrices ou vecteurs entiers, réels ou complexes
1010: --------------------------------------------------------------------------------
1011: */
1012:
1013: case '[' :
1014: {
1015: niveau = 0;
1016: niveau_maximal = 0;
1017:
1018: nombre_colonnes = 0;
1019: nombre_lignes = 0;
1020:
1021: drapeau_complexe = d_faux;
1022: drapeau_reel = d_faux;
1023:
1024: ptr = (*s_etat_processus).instruction_courante;
1025:
1026: while((*ptr) != d_code_fin_chaine)
1027: {
1028: switch(*ptr)
1029: {
1030: case '(' :
1031: case ')' :
1032: {
1033: drapeau_complexe = d_vrai;
1034: drapeau_reel = d_vrai;
1035: break;
1036: }
1037:
1038: case '.' :
1039: case 'E' :
1040: case 'e' :
1041: {
1042: drapeau_reel = d_vrai;
1043: break;
1044: }
1045:
1046: case '[' :
1047: {
1048: niveau_maximal = (++niveau);
1049: break;
1050: }
1051:
1052: case ']' :
1053: {
1054: niveau--;
1055: break;
1056: }
1057: }
1058:
1059: ptr++;
1060: }
1061:
1062: if (niveau != 0)
1063: {
1064: free(s_objet);
1065:
1066: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1067: (*s_etat_processus).traitement_interruptible =
1068: registre_interruption;
1069: return;
1070: }
1071:
1072: drapeau_matrice = (niveau_maximal == 2) ? d_vrai : d_faux;
1073:
1074: switch (drapeau_matrice)
1075: {
1076:
1077: /*
1078: --------------------------------------------------------------------------------
1079: Vecteur
1080: --------------------------------------------------------------------------------
1081: */
1082:
1083: case d_faux :
1084: {
1085:
1086: /*
1087: -- Sauvegarde des paramètres du processus pour analyser le vecteur -------------
1.3 bertrand 1088: -- Analyse récursive en appelant l'interprète sur le vecteur moins -------------
1.1 bertrand 1089: -- ses délimiteurs -------------------------------------------------------------
1090: */
1091:
1092: sauvegarde_longueur_definitions_chainees =
1093: (*s_etat_processus).longueur_definitions_chainees;
1094:
1095: tampon = (unsigned char *) malloc(
1096: (((*s_etat_processus).longueur_definitions_chainees
1097: = strlen((*s_etat_processus).instruction_courante)
1098: + 4) + 1) * sizeof(unsigned char));
1099:
1100: if (tampon == NULL)
1101: {
1102: (*s_etat_processus).erreur_systeme =
1103: d_es_allocation_memoire;
1104: (*s_etat_processus).traitement_interruptible =
1105: registre_interruption;
1106: return;
1107: }
1108:
1109: strcpy(tampon, "<< ");
1110: ptr_ecriture = tampon + 3;
1111: ptr_lecture = (*s_etat_processus).instruction_courante + 1;
1112:
1113: while((*ptr_lecture) != d_code_fin_chaine)
1114: {
1115: *ptr_ecriture++ = *ptr_lecture++;
1116: }
1117:
1118: (*(--ptr_ecriture)) = d_code_fin_chaine;
1119: strcat(ptr_ecriture, " >>");
1120:
1121: position_courante = (*s_etat_processus).position_courante;
1122: (*s_etat_processus).position_courante = 0;
1123:
1124: profondeur_initiale = (*s_etat_processus)
1125: .hauteur_pile_operationnelle;
1126:
1127: /*
1128: -- On met le tout dans la pile opérationnelle ----------------------------------
1129: */
1130:
1131: (*s_etat_processus).niveau_recursivite++;
1132: definitions_chainees_precedentes = (*s_etat_processus)
1133: .definitions_chainees;
1134: (*s_etat_processus).definitions_chainees = tampon;
1135:
1136: s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
1137: sauvegarde_niveau_courant = (*s_etat_processus)
1138: .niveau_courant;
1139:
1140: (*s_etat_processus).l_base_pile_systeme = NULL;
1141: empilement_pile_systeme(s_etat_processus);
1142:
1143: if ((*s_etat_processus).erreur_systeme != d_es)
1144: {
1145: (*s_etat_processus).traitement_interruptible =
1146: registre_interruption;
1147: return;
1148: }
1149:
1150: (*(*s_etat_processus).l_base_pile_systeme)
1151: .retour_definition = 'Y';
1152: (*s_etat_processus).niveau_courant = 0;
1153: (*s_etat_processus).autorisation_empilement_programme = 'N';
1154: registre_mode_execution_programme =
1155: (*s_etat_processus).mode_execution_programme;
1156: (*s_etat_processus).mode_execution_programme = 'Y';
1157: (*s_etat_processus).erreur_scrutation = d_faux;
1158:
1159: tampon = (*s_etat_processus).instruction_courante;
1160: nombre_lignes_a_supprimer =
1161: (*s_etat_processus).hauteur_pile_operationnelle;
1162:
1163: if ((*s_etat_processus).profilage == d_vrai)
1164: {
1165: profilage(s_etat_processus, "RPL/2 internals");
1166:
1167: if ((*s_etat_processus).erreur_systeme != d_es)
1168: {
1169: return;
1170: }
1171: }
1172:
1.24 bertrand 1173: registre_recherche_type =
1174: (*s_etat_processus).recherche_type;
1175: (*s_etat_processus).recherche_type = 'Y';
1176:
1.1 bertrand 1177: if (sequenceur(s_etat_processus) == d_erreur)
1178: {
1.24 bertrand 1179: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1180: (*s_etat_processus).recherche_type =
1181: registre_recherche_type;
1.1 bertrand 1182: (*s_etat_processus).mode_execution_programme =
1183: registre_mode_execution_programme;
1184: nombre_lignes_a_supprimer =
1185: (*s_etat_processus).hauteur_pile_operationnelle
1186: - nombre_lignes_a_supprimer;
1187:
1188: for(i = 0; i < nombre_lignes_a_supprimer; i++)
1189: {
1190: if (depilement(s_etat_processus,
1191: &((*s_etat_processus).l_base_pile),
1192: &s_sous_objet) == d_erreur)
1193: {
1194: (*s_etat_processus).traitement_interruptible =
1195: registre_interruption;
1196: return;
1197: }
1198:
1199: liberation(s_etat_processus, s_sous_objet);
1200: }
1201:
1202: (*s_etat_processus).instruction_courante = tampon;
1203:
1.12 bertrand 1204: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 1205: (*s_etat_processus).l_base_pile_systeme =
1206: s_sauvegarde_pile;
1207: (*s_etat_processus).niveau_courant =
1208: sauvegarde_niveau_courant;
1209:
1210: (*s_etat_processus).niveau_recursivite--;
1211: free((*s_etat_processus).definitions_chainees);
1212:
1213: (*s_etat_processus).position_courante =
1214: position_courante;
1215: (*s_etat_processus).definitions_chainees =
1216: definitions_chainees_precedentes;
1217: (*s_etat_processus).longueur_definitions_chainees =
1218: sauvegarde_longueur_definitions_chainees;
1219:
1220: free(s_objet);
1221:
1222: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1223: (*s_etat_processus).traitement_interruptible =
1224: registre_interruption;
1225: return;
1226: }
1227:
1.24 bertrand 1228: (*s_etat_processus).recherche_type =
1229: registre_recherche_type;
1.1 bertrand 1230: (*s_etat_processus).mode_execution_programme =
1231: registre_mode_execution_programme;
1232:
1233: if ((*s_etat_processus).erreur_scrutation == d_vrai)
1234: {
1235: nombre_lignes_a_supprimer =
1236: (*s_etat_processus).hauteur_pile_operationnelle
1237: - nombre_lignes_a_supprimer;
1238:
1239: for(i = 0; i < nombre_lignes_a_supprimer; i++)
1240: {
1241: if (depilement(s_etat_processus,
1242: &((*s_etat_processus).l_base_pile),
1243: &s_sous_objet) == d_erreur)
1244: {
1245: (*s_etat_processus).traitement_interruptible =
1246: registre_interruption;
1247: return;
1248: }
1249:
1250: liberation(s_etat_processus, s_sous_objet);
1251: }
1252:
1253: (*s_etat_processus).instruction_courante = tampon;
1254:
1.12 bertrand 1255: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 1256: (*s_etat_processus).l_base_pile_systeme =
1257: s_sauvegarde_pile;
1258: (*s_etat_processus).niveau_courant =
1259: sauvegarde_niveau_courant;
1260:
1261: (*s_etat_processus).niveau_recursivite--;
1262: free((*s_etat_processus).definitions_chainees);
1263:
1264: (*s_etat_processus).position_courante =
1265: position_courante;
1266: (*s_etat_processus).definitions_chainees =
1267: definitions_chainees_precedentes;
1268: (*s_etat_processus).longueur_definitions_chainees =
1269: sauvegarde_longueur_definitions_chainees;
1270:
1271: free(s_objet);
1272:
1273: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1274: (*s_etat_processus).traitement_interruptible =
1275: registre_interruption;
1276: return;
1277: }
1278:
1279: (*s_etat_processus).instruction_courante = tampon;
1280:
1281: (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
1282: (*s_etat_processus).niveau_courant =
1283: sauvegarde_niveau_courant;
1284:
1285: (*s_etat_processus).niveau_recursivite--;
1286:
1287: (*s_etat_processus).position_courante = position_courante;
1288: free((*s_etat_processus).definitions_chainees);
1289: (*s_etat_processus).definitions_chainees =
1290: definitions_chainees_precedentes;
1291: (*s_etat_processus).longueur_definitions_chainees =
1292: sauvegarde_longueur_definitions_chainees;
1293:
1294: /*
1295: -- On relit la pile pour remplir le vecteur ------------------------------------
1296: */
1297:
1298: profondeur_finale = (*s_etat_processus)
1299: .hauteur_pile_operationnelle;
1300: nombre_colonnes = profondeur_finale - profondeur_initiale;
1301:
1302: element = (void *) ((struct_vecteur *)
1303: malloc(sizeof(struct_vecteur)));
1304:
1305: if (element == NULL)
1306: {
1307: (*s_etat_processus).erreur_systeme =
1308: d_es_allocation_memoire;
1309: (*s_etat_processus).traitement_interruptible =
1310: registre_interruption;
1311: return;
1312: }
1313:
1314: (*((struct_vecteur *) element)).taille = nombre_colonnes;
1315:
1316: if (drapeau_complexe == d_vrai)
1317: {
1318: (*((struct_vecteur *) element)).tableau = (void *)
1319: ((struct_complexe16 *) malloc(nombre_colonnes *
1320: sizeof(struct_complexe16)));
1321: (*((struct_vecteur *) element)).type = 'C';
1322: }
1323: else if (drapeau_reel == d_vrai)
1324: {
1325: (*((struct_vecteur *) element)).tableau = (void *)
1326: ((real8 *) malloc(nombre_colonnes *
1327: sizeof(real8)));
1328: (*((struct_vecteur *) element)).type = 'R';
1329: }
1330: else
1331: {
1332: (*((struct_vecteur *) element)).tableau = (void *)
1333: ((integer8 *) malloc(nombre_colonnes *
1334: sizeof(integer8)));
1335: (*((struct_vecteur *) element)).type = 'I';
1336: }
1337:
1338: if ((*((struct_vecteur *) element)).tableau == NULL)
1339: {
1340: (*s_etat_processus).erreur_systeme =
1341: d_es_allocation_memoire;
1342: (*s_etat_processus).traitement_interruptible =
1343: registre_interruption;
1344: return;
1345: }
1346:
1347: erreur = d_absence_erreur;
1348: free(s_objet);
1349:
1350: for(i = 0; (i < nombre_colonnes) &&
1351: (erreur == d_absence_erreur); i++)
1352: {
1353: erreur = depilement(s_etat_processus,
1354: &((*s_etat_processus).l_base_pile), &s_objet);
1355:
1356: if (erreur == d_absence_erreur)
1357: {
1358: if (drapeau_complexe == d_vrai)
1359: {
1360: if ((*s_objet).type == CPL)
1361: {
1362: ((struct_complexe16 *) (*((struct_vecteur *)
1363: element)).tableau)[nombre_colonnes
1364: - i - 1] = *((struct_complexe16 *)
1365: ((*s_objet).objet));
1366: }
1367: else if ((*s_objet).type == REL)
1368: {
1369: ((struct_complexe16 *) (*((struct_vecteur *)
1370: element)).tableau)[nombre_colonnes
1371: - i - 1].partie_reelle =
1372: *((real8 *) ((*s_objet).objet));
1373: ((struct_complexe16 *) (*((struct_vecteur *)
1374: element)).tableau)[nombre_colonnes
1375: - i - 1].partie_imaginaire =
1376: (real8) 0;
1377: }
1378: else if ((*s_objet).type == INT)
1379: {
1380: ((struct_complexe16 *) (*((struct_vecteur *)
1381: element)).tableau)[nombre_colonnes
1382: - i - 1].partie_reelle = (real8)
1383: (*((integer8 *) ((*s_objet)
1384: .objet)));
1385: ((struct_complexe16 *) (*((struct_vecteur *)
1386: element)).tableau) [nombre_colonnes
1387: - i - 1].partie_imaginaire =
1388: (real8) 0;
1389: }
1390: else
1391: {
1392: erreur = d_erreur;
1393: }
1394: }
1395: else if (drapeau_reel == d_vrai)
1396: {
1397: if ((*s_objet).type == REL)
1398: {
1399: ((real8 *) (*((struct_vecteur *)
1400: element)).tableau)
1401: [nombre_colonnes - i - 1] =
1402: *((real8 *) ((*s_objet).objet));
1403: }
1404: else if ((*s_objet).type == INT)
1405: {
1406: ((real8 *) (*((struct_vecteur *)
1407: element)).tableau)
1408: [nombre_colonnes - i - 1] =
1409: (real8) (*((integer8 *)
1410: ((*s_objet).objet)));
1411: }
1412: else
1413: {
1414: erreur = d_erreur;
1415: }
1416: }
1417: else
1418: {
1419: if ((*s_objet).type == INT)
1420: {
1421: ((integer8 *) (*((struct_vecteur *)
1422: element)).tableau)
1423: [nombre_colonnes - i - 1] =
1424: *((integer8 *) ((*s_objet).objet));
1425: }
1426: else
1427: {
1428: erreur = d_erreur;
1429: }
1430: }
1431:
1432: liberation(s_etat_processus, s_objet);
1433:
1434: if (erreur == d_erreur)
1435: {
1436: for(i++; i < nombre_colonnes; i++)
1437: {
1438: if (depilement(s_etat_processus,
1439: &((*s_etat_processus).l_base_pile),
1440: &s_objet) == d_erreur)
1441: {
1442: (*s_etat_processus)
1443: .traitement_interruptible =
1444: registre_interruption;
1445: return;
1446: }
1447:
1448: liberation(s_etat_processus, s_objet);
1449: }
1450:
1451: (*s_etat_processus).erreur_execution =
1452: d_ex_syntaxe;
1453:
1454: free((*((struct_vecteur *) element)).tableau);
1455: free(element);
1456:
1457: (*s_etat_processus).traitement_interruptible =
1458: registre_interruption;
1459: return;
1460: }
1461: }
1462: else
1463: {
1464: (*s_etat_processus).erreur_systeme = d_es_pile_vide;
1465: (*s_etat_processus).traitement_interruptible =
1466: registre_interruption;
1467: return;
1468: }
1469: }
1470:
1471: s_objet = (struct_objet *) malloc(sizeof(struct_objet));
1472:
1473: if (s_objet == NULL)
1474: {
1475: (*s_etat_processus).erreur_systeme =
1476: d_es_allocation_memoire;
1477: (*s_etat_processus).traitement_interruptible =
1478: registre_interruption;
1479: return;
1480: }
1481:
1482: initialisation_objet(s_objet);
1483:
1484: if (drapeau_complexe == d_vrai)
1485: {
1486: (*s_objet).type = VCX;
1487: }
1488: else if (drapeau_reel == d_vrai)
1489: {
1490: (*s_objet).type = VRL;
1491: }
1492: else
1493: {
1494: (*s_objet).type = VIN;
1495: }
1496:
1497: break;
1498: }
1499:
1500: /*
1501: --------------------------------------------------------------------------------
1502: Matrice
1503: --------------------------------------------------------------------------------
1504: */
1505:
1506: case d_vrai :
1507: {
1508: nombre_lignes--;
1509:
1510: sauvegarde_longueur_definitions_chainees =
1511: (*s_etat_processus).longueur_definitions_chainees;
1512:
1513: tampon = (unsigned char *) malloc(
1514: (((*s_etat_processus).longueur_definitions_chainees
1515: = strlen((*s_etat_processus).instruction_courante)
1516: + 4) + 1) * sizeof(unsigned char));
1517:
1518: if (tampon == NULL)
1519: {
1520: (*s_etat_processus).erreur_systeme =
1521: d_es_allocation_memoire;
1522: (*s_etat_processus).traitement_interruptible =
1523: registre_interruption;
1524: return;
1525: }
1526:
1527: strcpy(tampon, "<< ");
1528: ptr_ecriture = tampon + 3;
1529: ptr_lecture = (*s_etat_processus).instruction_courante + 1;
1530:
1531: while((*ptr_lecture) != d_code_fin_chaine)
1532: {
1533: *ptr_ecriture++ = *ptr_lecture++;
1534: }
1535:
1536: (*(--ptr_ecriture)) = d_code_fin_chaine;
1537: strcat(ptr_ecriture, " >>");
1538:
1539: position_courante = (*s_etat_processus).position_courante;
1540: (*s_etat_processus).position_courante = 0;
1541:
1542: profondeur_initiale = (*s_etat_processus)
1543: .hauteur_pile_operationnelle;
1544:
1545: /*
1546: -- On met les lignes de la matrice dans la pile opérationnelle -----------------
1547: */
1548:
1549: (*s_etat_processus).niveau_recursivite++;
1550: definitions_chainees_precedentes = (*s_etat_processus)
1551: .definitions_chainees;
1552: (*s_etat_processus).definitions_chainees = tampon;
1553:
1554: s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
1555: sauvegarde_niveau_courant = (*s_etat_processus)
1556: .niveau_courant;
1557:
1558: (*s_etat_processus).l_base_pile_systeme = NULL;
1559: empilement_pile_systeme(s_etat_processus);
1560:
1561: if ((*s_etat_processus).erreur_systeme != d_es)
1562: {
1563: (*s_etat_processus).traitement_interruptible =
1564: registre_interruption;
1565: return;
1566: }
1567:
1568: (*(*s_etat_processus).l_base_pile_systeme)
1569: .retour_definition = 'Y';
1570: (*s_etat_processus).niveau_courant = 0;
1571: (*s_etat_processus).autorisation_empilement_programme = 'N';
1572: registre_mode_execution_programme =
1573: (*s_etat_processus).mode_execution_programme;
1574: (*s_etat_processus).mode_execution_programme = 'Y';
1575: (*s_etat_processus).erreur_scrutation = d_faux;
1576:
1577: tampon = (*s_etat_processus).instruction_courante;
1578: nombre_lignes_a_supprimer =
1579: (*s_etat_processus).hauteur_pile_operationnelle;
1580:
1581: if ((*s_etat_processus).profilage == d_vrai)
1582: {
1583: profilage(s_etat_processus, "RPL/2 internals");
1584:
1585: if ((*s_etat_processus).erreur_systeme != d_es)
1586: {
1587: return;
1588: }
1589: }
1.24 bertrand 1590:
1591: registre_recherche_type = (*s_etat_processus)
1592: .recherche_type;
1593: (*s_etat_processus).recherche_type = 'Y';
1.1 bertrand 1594:
1595: if (sequenceur(s_etat_processus) == d_erreur)
1596: {
1.24 bertrand 1597: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1598: (*s_etat_processus).recherche_type =
1599: registre_recherche_type;
1.1 bertrand 1600: (*s_etat_processus).mode_execution_programme =
1601: registre_mode_execution_programme;
1602: nombre_lignes_a_supprimer =
1603: (*s_etat_processus).hauteur_pile_operationnelle
1604: - nombre_lignes_a_supprimer;
1605:
1606: for(i = 0; i < nombre_lignes_a_supprimer; i++)
1607: {
1608: if (depilement(s_etat_processus,
1609: &((*s_etat_processus).l_base_pile),
1610: &s_sous_objet) == d_erreur)
1611: {
1612: (*s_etat_processus).traitement_interruptible =
1613: registre_interruption;
1614: return;
1615: }
1616:
1617: liberation(s_etat_processus, s_sous_objet);
1618: }
1619:
1620: (*s_etat_processus).instruction_courante = tampon;
1621:
1.12 bertrand 1622: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 1623: (*s_etat_processus).l_base_pile_systeme =
1624: s_sauvegarde_pile;
1625: (*s_etat_processus).niveau_courant =
1626: sauvegarde_niveau_courant;
1627:
1628: free((*s_etat_processus).definitions_chainees);
1629: (*s_etat_processus).niveau_recursivite--;
1630:
1631: (*s_etat_processus).definitions_chainees =
1632: definitions_chainees_precedentes;
1633: (*s_etat_processus).longueur_definitions_chainees =
1634: sauvegarde_longueur_definitions_chainees;
1635:
1636: (*s_etat_processus).position_courante =
1637: position_courante;
1638:
1639: free(s_objet);
1640:
1641: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1642: (*s_etat_processus).traitement_interruptible =
1643: registre_interruption;
1644: return;
1645: }
1646:
1.24 bertrand 1647: (*s_etat_processus).recherche_type =
1648: registre_recherche_type;
1.1 bertrand 1649: (*s_etat_processus).mode_execution_programme =
1650: registre_mode_execution_programme;
1651:
1652: if ((*s_etat_processus).erreur_scrutation == d_vrai)
1653: {
1654: nombre_lignes_a_supprimer =
1655: (*s_etat_processus).hauteur_pile_operationnelle
1656: - nombre_lignes_a_supprimer;
1657:
1658: for(i = 0; i < nombre_lignes_a_supprimer; i++)
1659: {
1660: if (depilement(s_etat_processus,
1661: &((*s_etat_processus).l_base_pile),
1662: &s_sous_objet) == d_erreur)
1663: {
1664: (*s_etat_processus).traitement_interruptible =
1665: registre_interruption;
1666: return;
1667: }
1668:
1669: liberation(s_etat_processus, s_sous_objet);
1670: }
1671:
1672: (*s_etat_processus).instruction_courante = tampon;
1673:
1.12 bertrand 1674: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 1675: (*s_etat_processus).l_base_pile_systeme =
1676: s_sauvegarde_pile;
1677: (*s_etat_processus).niveau_courant =
1678: sauvegarde_niveau_courant;
1679:
1680: free((*s_etat_processus).definitions_chainees);
1681: (*s_etat_processus).niveau_recursivite--;
1682:
1683: (*s_etat_processus).definitions_chainees =
1684: definitions_chainees_precedentes;
1685: (*s_etat_processus).longueur_definitions_chainees =
1686: sauvegarde_longueur_definitions_chainees;
1687:
1688: (*s_etat_processus).position_courante =
1689: position_courante;
1690:
1691: free(s_objet);
1692:
1693: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1694: (*s_etat_processus).traitement_interruptible =
1695: registre_interruption;
1696: return;
1697: }
1698:
1699: (*s_etat_processus).instruction_courante = tampon;
1700:
1701: (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
1702: (*s_etat_processus).niveau_courant =
1703: sauvegarde_niveau_courant;
1704:
1705: free((*s_etat_processus).definitions_chainees);
1706: (*s_etat_processus).definitions_chainees =
1707: definitions_chainees_precedentes;
1708: (*s_etat_processus).longueur_definitions_chainees =
1709: sauvegarde_longueur_definitions_chainees;
1710:
1711: (*s_etat_processus).niveau_recursivite--;
1712:
1713: (*s_etat_processus).position_courante = position_courante;
1714:
1715: /*
1716: -- On relit la pile qui contient des objets "vecteurs" contenant les -----------
1717: -- lignes de la matrice --------------------------------------------------------
1718: */
1719:
1720: profondeur_finale = (*s_etat_processus)
1721: .hauteur_pile_operationnelle;
1722:
1723: nombre_lignes = profondeur_finale - profondeur_initiale;
1724:
1725: element = (void *) ((struct_matrice *) malloc(
1726: sizeof(struct_matrice)));
1727:
1728: if (element == NULL)
1729: {
1730: (*s_etat_processus).erreur_systeme =
1731: d_es_allocation_memoire;
1732: (*s_etat_processus).traitement_interruptible =
1733: registre_interruption;
1734: return;
1735: }
1736:
1737: (*((struct_matrice *) element))
1738: .nombre_lignes = nombre_lignes;
1739: (*((struct_matrice *) element)).nombre_colonnes =
1740: (*((struct_vecteur *) ((*(*(*s_etat_processus)
1741: .l_base_pile).donnee).objet))).taille;
1742: nombre_colonnes = (*((struct_matrice *)
1743: element)).nombre_colonnes;
1744:
1745: l_element_courant = (*s_etat_processus).l_base_pile;
1746:
1747: drapeau_complexe = d_faux;
1748: drapeau_reel = d_faux;
1749: erreur = d_absence_erreur;
1750:
1751: for(i = 0; i < nombre_lignes; i++)
1752: {
1753: if (nombre_colonnes != (*((struct_vecteur *)
1754: (*(*l_element_courant).donnee).objet)).taille)
1755: {
1756: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
1757:
1758: for(j = 0; j < nombre_lignes; j++)
1759: {
1760: if (depilement(s_etat_processus,
1761: &((*s_etat_processus).l_base_pile),
1762: &s_sous_objet) == d_erreur)
1763: {
1764: (*s_etat_processus)
1765: .traitement_interruptible =
1766: registre_interruption;
1767: return;
1768: }
1769:
1770: liberation(s_etat_processus, s_sous_objet);
1771: }
1772:
1773: free(element);
1774: free(s_objet);
1775:
1776: (*s_etat_processus).traitement_interruptible =
1777: registre_interruption;
1778: return;
1779: }
1780:
1781: if ((*(*l_element_courant)
1782: .donnee).type == VRL)
1783: {
1784: drapeau_reel = d_vrai;
1785: }
1786: else if ((*(*l_element_courant)
1787: .donnee).type == VCX)
1788: {
1789: drapeau_complexe = d_vrai;
1790: }
1791:
1792: l_element_courant = (*l_element_courant).suivant;
1793: }
1794:
1795: free(s_objet);
1796:
1797: if ((*s_etat_processus).erreur_execution == d_ex)
1798: {
1799: if (drapeau_complexe == d_vrai)
1800: {
1801: if (((*((struct_matrice *) element)).tableau =
1802: (void **) ((struct_complexe16 **)
1803: malloc(nombre_lignes * sizeof(
1804: struct_complexe16 *)))) == NULL)
1805: {
1806: (*s_etat_processus).erreur_systeme =
1807: d_es_allocation_memoire;
1808: (*s_etat_processus).traitement_interruptible =
1809: registre_interruption;
1810: return;
1811: }
1812:
1813: (*((struct_matrice *) element)).type = 'C';
1814:
1815: for(i = 0; i < nombre_lignes; i++)
1816: {
1817: if ((((*((struct_matrice *)
1818: element)).tableau)[i] = (void *)
1819: ((struct_complexe16 *)
1820: malloc(nombre_colonnes * sizeof(
1821: struct_complexe16)))) == NULL)
1822: {
1823: (*s_etat_processus).erreur_systeme =
1824: d_es_allocation_memoire;
1825: (*s_etat_processus)
1826: .traitement_interruptible =
1827: registre_interruption;
1828: return;
1829: }
1830: }
1831: }
1832: else if (drapeau_reel == d_vrai)
1833: {
1834: if (((*((struct_matrice *) element)).tableau =
1835: (void **) ((real8 **)
1836: malloc(nombre_lignes * sizeof(real8 *))))
1837: == NULL)
1838: {
1839: (*s_etat_processus).erreur_systeme =
1840: d_es_allocation_memoire;
1841: (*s_etat_processus).traitement_interruptible =
1842: registre_interruption;
1843: return;
1844: }
1845:
1846: (*((struct_matrice *) element)).type = 'R';
1847:
1848: for(i = 0; i < nombre_lignes; i++)
1849: {
1850: if ((((*((struct_matrice *)element)).tableau)[i]
1851: = (void *) ((real8 *)
1852: malloc(nombre_colonnes *
1853: sizeof(real8)))) == NULL)
1854: {
1855: (*s_etat_processus).erreur_systeme =
1856: d_es_allocation_memoire;
1857: (*s_etat_processus)
1858: .traitement_interruptible =
1859: registre_interruption;
1860: return;
1861: }
1862: }
1863: }
1864: else
1865: {
1866: if (((*((struct_matrice *) element)).tableau =
1867: (void **) ((integer8 **)
1868: malloc(nombre_lignes *
1869: sizeof(integer8 *)))) == NULL)
1870: {
1871: (*s_etat_processus).erreur_systeme =
1872: d_es_allocation_memoire;
1873: (*s_etat_processus).traitement_interruptible =
1874: registre_interruption;
1875: return;
1876: }
1877:
1878: (*((struct_matrice *) element)).type = 'I';
1879:
1880: for(i = 0; i < nombre_lignes; i++)
1881: {
1882: if ((((*((struct_matrice *)
1883: element)).tableau)[i] = (void *)
1884: ((integer8 *)
1885: malloc(nombre_colonnes *
1886: sizeof(integer8)))) == NULL)
1887: {
1888: (*s_etat_processus).erreur_systeme =
1889: d_es_allocation_memoire;
1890: (*s_etat_processus)
1891: .traitement_interruptible =
1892: registre_interruption;
1893: return;
1894: }
1895: }
1896: }
1897:
1898: for(i = 0; i < nombre_lignes; i++)
1899: {
1900: if (depilement(s_etat_processus,
1901: &((*s_etat_processus)
1902: .l_base_pile), &s_objet) ==
1903: d_absence_erreur)
1904: {
1905: if (drapeau_complexe == d_vrai)
1906: {
1907: if ((*s_objet).type == VCX)
1908: {
1909: for(j = 0; j < nombre_colonnes; j++)
1910: {
1911: ((struct_complexe16 **) ((*(
1912: (struct_matrice *) element))
1913: .tableau))[nombre_lignes - i
1914: - 1][j] =
1915: ((struct_complexe16 *)
1916: (*((struct_vecteur *)
1917: (*s_objet).objet))
1918: .tableau)[j];
1919: }
1920: }
1921: else if ((*s_objet).type == VRL)
1922: {
1923: for(j = 0; j < nombre_colonnes; j++)
1924: {
1925: (((struct_complexe16 **) ((*(
1926: (struct_matrice *) element))
1927: .tableau))[nombre_lignes - i
1928: - 1][j]).partie_reelle =
1929: ((real8 *) (*(
1930: (struct_vecteur *)
1931: (*s_objet).objet))
1932: .tableau)[j];
1933: (((struct_complexe16 **) ((*(
1934: (struct_matrice *) element))
1935: .tableau))[nombre_lignes - i
1936: - 1][j]).partie_imaginaire =
1937: (real8) 0;
1938: }
1939: }
1940: else if ((*s_objet).type == VIN)
1941: {
1942: for(j = 0; j < nombre_colonnes; j++)
1943: {
1944: (((struct_complexe16 **) ((*(
1945: (struct_matrice *) element))
1946: .tableau))[nombre_lignes - i
1947: - 1][j]).partie_reelle =
1948: (real8) ((integer8 *)
1949: (*((struct_vecteur *)
1950: (*s_objet).objet)).tableau)
1951: [j];
1952: (((struct_complexe16 **) ((*(
1953: (struct_matrice *) element))
1954: .tableau))[nombre_lignes - i
1955: - 1][j]).partie_imaginaire =
1956: (real8) 0;
1957: }
1958: }
1959: else
1960: {
1961: erreur = d_erreur;
1962: }
1963: }
1964: else if (drapeau_reel == d_vrai)
1965: {
1966: if ((*s_objet).type == VRL)
1967: {
1968: for(j = 0; j < nombre_colonnes; j++)
1969: {
1970: ((real8 **) ((*((struct_matrice *)
1971: element)).tableau))
1972: [nombre_lignes - i - 1][j] =
1973: ((real8 *) (*(
1974: (struct_vecteur *)
1975: (*s_objet).objet)).tableau)
1976: [j];
1977: }
1978: }
1979: else if ((*s_objet).type == VIN)
1980: {
1981: for(j = 0; j < nombre_colonnes; j++)
1982: {
1983: ((real8 **) ((*((struct_matrice *)
1984: element)).tableau))
1985: [nombre_lignes - i - 1][j] =
1986: (real8) ((integer8 *)
1987: (*((struct_vecteur *)
1988: (*s_objet).objet)).tableau)
1989: [j];
1990: }
1991: }
1992: else
1993: {
1994: erreur = d_erreur;
1995: }
1996: }
1997: else
1998: {
1999: if ((*s_objet).type == VIN)
2000: {
2001: for(j = 0; j < nombre_colonnes; j++)
2002: {
2003: ((integer8 **)
2004: ((*((struct_matrice *)
2005: element)).tableau))
2006: [nombre_lignes - i - 1][j] =
2007: ((integer8 *)
2008: (*((struct_vecteur *)
2009: (*s_objet)
2010: .objet)).tableau)[j];
2011: }
2012: }
2013: else
2014: {
2015: erreur = d_erreur;
2016: }
2017: }
2018:
2019: liberation(s_etat_processus, s_objet);
2020:
2021: if (erreur == d_erreur)
2022: {
2023: for(i++; i < nombre_lignes; i++)
2024: {
2025: if (depilement(s_etat_processus,
2026: &((*s_etat_processus)
2027: .l_base_pile), &s_objet)
2028: == d_erreur)
2029: {
2030: (*s_etat_processus)
2031: .traitement_interruptible =
2032: registre_interruption;
2033: return;
2034: }
2035:
2036: liberation(s_etat_processus, s_objet);
2037: }
2038:
2039: (*s_etat_processus).erreur_execution =
2040: d_ex_syntaxe;
2041:
2042: for(j = 0; j < (*((struct_matrice *)
2043: element)).nombre_lignes; j++)
2044: {
2045: free((*((struct_matrice *) element))
2046: .tableau[j]);
2047: }
2048:
2049: free((*((struct_matrice *) element))
2050: .tableau);
2051: free(element);
2052:
2053: (*s_etat_processus)
2054: .traitement_interruptible =
2055: registre_interruption;
2056: return;
2057: }
2058: }
2059: else
2060: {
2061: (*s_etat_processus).erreur_systeme =
2062: d_es_pile_vide;
2063: (*s_etat_processus).traitement_interruptible =
2064: registre_interruption;
2065: return;
2066: }
2067: }
2068:
2069: s_objet = (struct_objet *) malloc(sizeof(struct_objet));
2070:
2071: if (s_objet == NULL)
2072: {
2073: (*s_etat_processus).erreur_systeme =
2074: d_es_allocation_memoire;
2075: (*s_etat_processus).traitement_interruptible =
2076: registre_interruption;
2077: return;
2078: }
2079:
2080: initialisation_objet(s_objet);
2081:
2082: if (drapeau_complexe == d_vrai)
2083: {
2084: (*s_objet).type = MCX;
2085: }
2086: else if (drapeau_reel == d_vrai)
2087: {
2088: (*s_objet).type = MRL;
2089: }
2090: else
2091: {
2092: (*s_objet).type = MIN;
2093: }
2094: }
2095: else
2096: {
2097: if ((*s_etat_processus).langue == 'F')
2098: {
2099: printf("+++Erreur : Matrice %s invalide [%d]\n",
2100: (*s_etat_processus).instruction_courante,
2101: (int) getpid());
2102: }
2103: else
2104: {
2105: printf("+++Error : Invalid %s matrix [%d]\n",
2106: (*s_etat_processus).instruction_courante,
2107: (int) getpid());
2108: }
2109:
2110: fflush(stdout);
2111: }
2112:
2113: break;
2114: }
2115: }
2116:
2117: break;
2118: }
2119:
2120: /*
2121: --------------------------------------------------------------------------------
2122: Liste
2123: --------------------------------------------------------------------------------
2124: */
2125:
2126: case '{' :
2127: {
2128: sauvegarde_longueur_definitions_chainees =
2129: (*s_etat_processus).longueur_definitions_chainees;
2130:
2131: tampon = (unsigned char *) malloc(
2132: (((*s_etat_processus).longueur_definitions_chainees =
2133: strlen((*s_etat_processus).instruction_courante) + 4) + 1)
2134: * sizeof(unsigned char));
2135:
2136: if (tampon == NULL)
2137: {
2138: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2139: (*s_etat_processus).traitement_interruptible =
2140: registre_interruption;
2141: return;
2142: }
2143:
2144: strcpy(tampon, "<< ");
2145: ptr_ecriture = tampon + 3;
2146: ptr_lecture = (*s_etat_processus).instruction_courante + 1;
2147:
2148: while((*ptr_lecture) != d_code_fin_chaine)
2149: {
2150: *ptr_ecriture++ = *ptr_lecture++;
2151: }
2152:
2153: (*(--ptr_ecriture)) = d_code_fin_chaine;
2154: strcat(ptr_ecriture, " >>");
2155:
2156: position_courante = (*s_etat_processus).position_courante;
2157: (*s_etat_processus).position_courante = 0;
2158:
2159: profondeur_initiale = (*s_etat_processus)
2160: .hauteur_pile_operationnelle;
2161:
2162: /*
2163: -- On met le tout dans la pile opérationnelle. ---------------------------------
2164: */
2165:
2166: (*s_etat_processus).niveau_recursivite++;
2167: definitions_chainees_precedentes = (*s_etat_processus)
2168: .definitions_chainees;
2169: (*s_etat_processus).definitions_chainees = tampon;
2170:
2171: s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
2172: sauvegarde_niveau_courant = (*s_etat_processus).niveau_courant;
2173:
2174: (*s_etat_processus).l_base_pile_systeme = NULL;
2175: empilement_pile_systeme(s_etat_processus);
2176:
2177: if ((*s_etat_processus).erreur_systeme != d_es)
2178: {
2179: (*s_etat_processus).traitement_interruptible =
2180: registre_interruption;
2181: return;
2182: }
2183:
2184: (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
2185: (*(*s_etat_processus).l_base_pile_systeme)
2186: .origine_routine_evaluation = 'N';
2187: (*s_etat_processus).niveau_courant = 0;
2188: (*s_etat_processus).autorisation_empilement_programme = 'N';
2189:
2190: tampon = (*s_etat_processus).instruction_courante;
2191: autorisation_evaluation_nom = (*s_etat_processus)
2192: .autorisation_evaluation_nom;
2193: (*s_etat_processus).autorisation_evaluation_nom = 'N';
2194:
2195: registre_test = (*s_etat_processus).test_instruction;
2196: (*s_etat_processus).test_instruction = 'Y';
2197: registre_mode_execution_programme =
2198: (*s_etat_processus).mode_execution_programme;
2199: (*s_etat_processus).mode_execution_programme = 'Y';
2200: (*s_etat_processus).erreur_scrutation = d_faux;
2201:
2202: nombre_lignes_a_supprimer =
2203: (*s_etat_processus).hauteur_pile_operationnelle;
2204:
2205: /*
2206: * Vérification de la cohérence des arguments.
2207: * Il doit y avoir autant de '<<' que de '>>' dans
2208: * l'expression candidate.
2209: */
2210:
2211: coherence_liste = 0;
2212: drapeau_chaine = d_faux;
2213:
2214: while((*s_etat_processus).definitions_chainees
2215: [(*s_etat_processus).position_courante] !=
2216: d_code_fin_chaine)
2217: {
2218: if ((*s_etat_processus).definitions_chainees
2219: [(*s_etat_processus).position_courante] == '"')
2220: {
2221: if (drapeau_chaine == d_faux)
2222: {
2223: drapeau_chaine = d_vrai;
2224: }
2225: else
2226: {
2227: drapeau_chaine = d_faux;
2228: }
2229: }
2230: else if (drapeau_chaine == d_faux)
2231: {
2232: if (((*s_etat_processus).definitions_chainees
2233: [(*s_etat_processus).position_courante] == '<') &&
2234: ((*s_etat_processus).definitions_chainees
2235: [(*s_etat_processus).position_courante + 1] == '<'))
2236: {
2237: coherence_liste++;
2238: }
2239: else if (((*s_etat_processus).definitions_chainees
2240: [(*s_etat_processus).position_courante] == '>') &&
2241: ((*s_etat_processus).definitions_chainees
2242: [(*s_etat_processus).position_courante + 1] == '>'))
2243: {
2244: coherence_liste--;
2245: }
2246:
2247: }
2248:
2249: (*s_etat_processus).position_courante++;
2250: }
2251:
2252: (*s_etat_processus).position_courante = 0;
2253:
2254: if ((coherence_liste != 0) || (drapeau_chaine == d_vrai))
2255: {
2256: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
2257:
2258: nombre_lignes_a_supprimer =
2259: (*s_etat_processus).hauteur_pile_operationnelle
2260: - nombre_lignes_a_supprimer;
2261:
2262: for(i = 0; i < nombre_lignes_a_supprimer; i++)
2263: {
2264: if (depilement(s_etat_processus, &((*s_etat_processus)
2265: .l_base_pile), &s_sous_objet) == d_erreur)
2266: {
2267: (*s_etat_processus).traitement_interruptible =
2268: registre_interruption;
2269: (*s_etat_processus).mode_execution_programme =
2270: registre_mode_execution_programme;
2271: return;
2272: }
2273:
2274: liberation(s_etat_processus, s_sous_objet);
2275: }
2276:
2277: (*s_etat_processus).test_instruction = registre_test;
2278: (*s_etat_processus).longueur_definitions_chainees =
2279: sauvegarde_longueur_definitions_chainees;
2280:
2281: (*s_etat_processus).instruction_courante = tampon;
2282: (*s_etat_processus).autorisation_evaluation_nom =
2283: autorisation_evaluation_nom;
2284:
1.12 bertrand 2285: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 2286: (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
2287: (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
2288:
2289: free((*s_etat_processus).definitions_chainees);
2290: free(s_objet);
2291:
2292: (*s_etat_processus).definitions_chainees =
2293: definitions_chainees_precedentes;
2294:
2295: (*s_etat_processus).niveau_recursivite--;
2296:
2297: (*s_etat_processus).position_courante = position_courante;
2298:
2299: (*s_etat_processus).traitement_interruptible =
2300: registre_interruption;
2301: (*s_etat_processus).mode_execution_programme =
2302: registre_mode_execution_programme;
2303: return;
2304: }
2305:
2306: /*
2307: * Scrutation de la séquence.
2308: */
2309:
2310: (*s_etat_processus).position_courante = 0;
2311:
2312: if ((*s_etat_processus).profilage == d_vrai)
2313: {
2314: profilage(s_etat_processus, "RPL/2 internals");
2315:
2316: if ((*s_etat_processus).erreur_systeme != d_es)
2317: {
2318: return;
2319: }
2320: }
2321:
1.34 bertrand 2322: variable_implicite = (*s_etat_processus).autorisation_nom_implicite;
1.24 bertrand 2323: registre_recherche_type = (*s_etat_processus).recherche_type;
2324: (*s_etat_processus).recherche_type = 'Y';
1.34 bertrand 2325: (*s_etat_processus).autorisation_nom_implicite = 'Y';
1.24 bertrand 2326:
1.1 bertrand 2327: if (sequenceur(s_etat_processus) == d_erreur)
2328: {
1.34 bertrand 2329: (*s_etat_processus).autorisation_nom_implicite =
2330: variable_implicite;
1.24 bertrand 2331: (*s_etat_processus).recherche_type = registre_recherche_type;
1.1 bertrand 2332: (*s_etat_processus).mode_execution_programme =
2333: registre_mode_execution_programme;
1.34 bertrand 2334:
2335: if ((*s_etat_processus).erreur_execution !=
2336: d_ex_nom_implicite)
2337: {
2338: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
2339: }
1.1 bertrand 2340:
2341: nombre_lignes_a_supprimer =
2342: (*s_etat_processus).hauteur_pile_operationnelle
2343: - nombre_lignes_a_supprimer;
2344:
2345: for(i = 0; i < nombre_lignes_a_supprimer; i++)
2346: {
2347: if (depilement(s_etat_processus, &((*s_etat_processus)
2348: .l_base_pile), &s_sous_objet) == d_erreur)
2349: {
2350: (*s_etat_processus).traitement_interruptible =
2351: registre_interruption;
2352: return;
2353: }
2354:
2355: liberation(s_etat_processus, s_sous_objet);
2356: }
2357:
2358: (*s_etat_processus).test_instruction = registre_test;
2359: (*s_etat_processus).longueur_definitions_chainees =
2360: sauvegarde_longueur_definitions_chainees;
2361:
2362: (*s_etat_processus).instruction_courante = tampon;
2363: (*s_etat_processus).autorisation_evaluation_nom =
2364: autorisation_evaluation_nom;
2365:
1.12 bertrand 2366: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 2367: (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
2368: (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
2369:
2370: free((*s_etat_processus).definitions_chainees);
2371: free(s_objet);
2372:
2373: (*s_etat_processus).definitions_chainees =
2374: definitions_chainees_precedentes;
2375:
2376: (*s_etat_processus).niveau_recursivite--;
2377:
2378: (*s_etat_processus).position_courante = position_courante;
2379:
2380: (*s_etat_processus).traitement_interruptible =
2381: registre_interruption;
2382: return;
2383: }
2384:
1.34 bertrand 2385: (*s_etat_processus).autorisation_nom_implicite = variable_implicite;
1.24 bertrand 2386: (*s_etat_processus).recherche_type = registre_recherche_type;
1.1 bertrand 2387: (*s_etat_processus).mode_execution_programme =
2388: registre_mode_execution_programme;
2389:
2390: if ((*s_etat_processus).erreur_scrutation == d_vrai)
2391: {
2392: nombre_lignes_a_supprimer =
2393: (*s_etat_processus).hauteur_pile_operationnelle
2394: - nombre_lignes_a_supprimer;
2395:
2396: for(i = 0; i < nombre_lignes_a_supprimer; i++)
2397: {
2398: if (depilement(s_etat_processus, &((*s_etat_processus)
2399: .l_base_pile), &s_sous_objet) == d_erreur)
2400: {
2401: (*s_etat_processus).traitement_interruptible =
2402: registre_interruption;
2403: return;
2404: }
2405:
2406: liberation(s_etat_processus, s_sous_objet);
2407: }
2408:
2409: (*s_etat_processus).test_instruction = registre_test;
2410: (*s_etat_processus).longueur_definitions_chainees =
2411: sauvegarde_longueur_definitions_chainees;
2412:
2413: (*s_etat_processus).instruction_courante = tampon;
2414: (*s_etat_processus).autorisation_evaluation_nom =
2415: autorisation_evaluation_nom;
2416:
1.12 bertrand 2417: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 2418: (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
2419: (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
2420:
2421: free((*s_etat_processus).definitions_chainees);
2422: free(s_objet);
2423:
2424: (*s_etat_processus).definitions_chainees =
2425: definitions_chainees_precedentes;
2426:
2427: (*s_etat_processus).niveau_recursivite--;
2428: (*s_etat_processus).position_courante = position_courante;
2429:
2430: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
2431: (*s_etat_processus).traitement_interruptible =
2432: registre_interruption;
2433: return;
2434: }
2435:
2436: (*s_etat_processus).test_instruction = registre_test;
2437: (*s_etat_processus).longueur_definitions_chainees =
2438: sauvegarde_longueur_definitions_chainees;
2439:
2440: (*s_etat_processus).instruction_courante = tampon;
2441: (*s_etat_processus).autorisation_evaluation_nom =
2442: autorisation_evaluation_nom;
2443:
2444: (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
2445: (*s_etat_processus).niveau_courant = sauvegarde_niveau_courant;
2446:
2447: free((*s_etat_processus).definitions_chainees);
2448: (*s_etat_processus).definitions_chainees =
2449: definitions_chainees_precedentes;
2450:
2451: (*s_etat_processus).niveau_recursivite--;
2452:
2453: (*s_etat_processus).position_courante = position_courante;
2454:
2455: /*
2456: -- Relecture de la pile opérationnelle -----------------------------------------
2457: */
2458:
2459: profondeur_finale = (*s_etat_processus).hauteur_pile_operationnelle;
2460:
2461: l_element_courant = NULL;
2462:
2463: free(s_objet);
2464:
2465: for(i = 0; i < (profondeur_finale - profondeur_initiale); i++)
2466: {
2467: if (depilement(s_etat_processus,
2468: &((*s_etat_processus).l_base_pile),
2469: &s_objet) == d_erreur)
2470: {
2471: (*s_etat_processus).traitement_interruptible =
2472: registre_interruption;
2473: return;
2474: }
2475:
2476: if (empilement(s_etat_processus, &l_element_courant,
2477: s_objet) == d_erreur)
2478: {
2479: (*s_etat_processus).traitement_interruptible =
2480: registre_interruption;
2481: return;
2482: }
2483: }
2484:
2485: s_objet = (struct_objet *) malloc(sizeof(struct_objet));
2486:
2487: if (s_objet == NULL)
2488: {
2489: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2490: (*s_etat_processus).traitement_interruptible =
2491: registre_interruption;
2492: return;
2493: }
2494:
2495: initialisation_objet(s_objet);
2496: (*s_objet).type = LST;
2497: element = (void *) l_element_courant;
2498:
2499: break;
2500: }
2501:
2502: /*
2503: --------------------------------------------------------------------------------
2504: Nom ou expression algébrique
2505: --------------------------------------------------------------------------------
2506: */
2507:
2508: case '\'' :
2509: {
2510: if ((tampon = analyse_algebrique(s_etat_processus,
2511: (*s_etat_processus).instruction_courante,
2512: &l_base_liste_fonctions)) == NULL)
2513: {
2514: /*
2515: * L'erreur est de type exécution ou système.
2516: * Dans le doute, on libère *s_objet.
2517: */
2518:
2519: while(l_base_liste_fonctions != NULL)
2520: {
2521: l_element_courant_fonctions = l_base_liste_fonctions;
2522: l_base_liste_fonctions = (*l_base_liste_fonctions).suivant;
2523:
2524: free((*((struct_fonction *) (*l_element_courant_fonctions)
2525: .donnee)).nom_fonction);
2526: free((struct_fonction *) (*l_element_courant_fonctions)
2527: .donnee);
2528: free(l_element_courant_fonctions);
2529: }
2530:
2531: free(s_objet);
2532:
2533: (*s_etat_processus).traitement_interruptible =
2534: registre_interruption;
2535: return;
2536: }
2537:
2538: l_base_liste_decomposition = analyse_rpn(s_etat_processus, tampon);
2539: l_element_courant = l_base_liste_decomposition;
2540: nombre_elements = 0;
2541:
2542: while(l_element_courant != NULL)
2543: {
2544: nombre_elements++;
2545: l_element_courant = (*l_element_courant).suivant;
2546: }
2547:
2548: if (nombre_elements == 3)
2549: {
2550: free(tampon);
2551:
2552: (*s_objet).type = (*(*(*l_base_liste_decomposition)
2553: .suivant).donnee).type;
2554: element = (void *) (*(*(*l_base_liste_decomposition)
2555: .suivant).donnee).objet;
2556:
2557: if ((*s_objet).type == NOM)
2558: {
2559: (*((struct_nom *) (*(*(*l_base_liste_decomposition)
2560: .suivant).donnee).objet)).symbole = d_vrai;
2561: }
2562: else if ((*s_objet).type == FCT)
2563: {
2564: /*
2565: * On essaye de mettre d'utiliser une fonction
2566: * comme un nom... On convertit la fonction en nom
2567: * puis on renvoie une erreur.
2568: */
2569:
2570: free(s_objet);
2571:
2572: l_element_courant = l_base_liste_decomposition;
2573:
2574: while(l_element_courant != NULL)
2575: {
2576: liberation(s_etat_processus,
2577: (*l_element_courant).donnee);
2578: l_element_precedent = l_element_courant;
2579: l_element_courant = (*l_element_courant).suivant;
2580: free(l_element_precedent);
2581: }
2582:
2583: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
2584: (*s_etat_processus).traitement_interruptible =
2585: registre_interruption;
2586: return;
2587: }
2588:
2589: l_element_precedent = l_base_liste_decomposition;
2590: l_element_courant = (*l_element_precedent).suivant;
2591: liberation(s_etat_processus, (*l_element_precedent).donnee);
2592: free(l_element_precedent);
2593: l_element_precedent = l_element_courant;
2594: l_element_courant = (*l_element_courant).suivant;
2595: free((*l_element_precedent).donnee);
2596: free(l_element_precedent);
2597: liberation(s_etat_processus, (*l_element_courant).donnee);
2598: free(l_element_courant);
2599: }
2600: else
2601: {
2602: (*s_objet).type = ALG;
2603:
2604: if ((*s_etat_processus).debug == d_vrai)
2605: if (((*s_etat_processus).type_debug &
2606: d_debug_variables) != 0)
2607: {
2608: if ((*s_etat_processus).langue == 'F')
2609: {
2610: printf("[%d] Conversion de l'expression en "
2611: "notation polonaise inversée\n%s\n",
2612: (int) getpid(), tampon);
2613: }
2614: else
2615: {
2616: printf("[%d] Translation of expression "
2617: "into reverse polish notation\n%s",
2618: (int) getpid(), tampon);
2619: }
2620:
2621: fflush(stdout);
2622: }
2623:
2624: element = (void *) l_base_liste_decomposition;
2625: free(tampon);
2626:
2627: if (element == NULL)
2628: {
2629: (*s_etat_processus).erreur_execution =
2630: d_ex_expression_invalide;
2631: (*s_etat_processus).traitement_interruptible =
2632: registre_interruption;
2633: return;
2634: }
2635:
2636: l_element_courant = (struct_liste_chainee *) element;
2637:
2638: while(l_element_courant != NULL)
2639: {
2640: if ((*(*l_element_courant).donnee).type == FCT)
2641: {
2642: /*
2643: * Si la fonction est intrinsèque au langage,
2644: * elle est convertie en majuscules.
2645: */
2646:
2647: tampon = conversion_majuscule((*((struct_fonction *)
2648: (*(*l_element_courant).donnee).objet))
2649: .nom_fonction);
2650:
2651: free((*((struct_fonction *)
2652: (*(*l_element_courant).donnee).objet))
2653: .nom_fonction);
2654:
2655: (*((struct_fonction *) (*(*l_element_courant).donnee)
2656: .objet)).nom_fonction = tampon;
2657:
2658: if (strcmp(tampon, "=") == 0)
2659: {
2660: nombre_egalites++;
2661: }
2662: }
2663:
2664: l_element_courant = (*l_element_courant).suivant;
2665: }
2666:
2667: l_element_courant = (struct_liste_chainee *) element;
2668:
2669: while(l_element_courant != NULL)
2670: {
2671: if (((*(*l_element_courant).donnee).type == FCT)
2672: || ((*(*l_element_courant).donnee).type == NOM))
2673: {
2674: if ((*(*l_element_courant).donnee).type == FCT)
2675: {
2676: if (l_base_liste_fonctions != NULL)
2677: {
2678: l_element_courant_fonctions =
2679: l_base_liste_fonctions;
2680:
2681: while(l_element_courant_fonctions != NULL)
2682: {
2683: if ((fonction_majuscule =
2684: conversion_majuscule(
2685: (*((struct_fonction *)
2686: ((*l_element_courant_fonctions)
2687: .donnee))).nom_fonction)) == NULL)
2688: {
2689: (*s_etat_processus).erreur_systeme =
2690: d_es_allocation_memoire;
2691: (*s_etat_processus)
2692: .traitement_interruptible =
2693: registre_interruption;
2694: return;
2695: }
2696:
2697: if (strcmp(fonction_majuscule,
2698: (*((struct_fonction *)
2699: (*(*l_element_courant).donnee)
2700: .objet)).nom_fonction) == 0)
2701: {
2702: free(fonction_majuscule);
2703: break;
2704: }
2705:
2706: free(fonction_majuscule);
2707: l_element_courant_fonctions =
2708: (*l_element_courant_fonctions)
2709: .suivant;
2710: }
2711:
2712: if (l_element_courant_fonctions != NULL)
2713: {
2714: (*((struct_fonction *)
2715: (*(*l_element_courant)
2716: .donnee).objet)).nombre_arguments =
2717: (*((struct_fonction *)
2718: ((*l_element_courant_fonctions)
2719: .donnee))).nombre_arguments;
2720: }
2721: else
2722: {
2723: (*((struct_fonction *)
2724: (*(*l_element_courant).donnee)
2725: .objet)).nombre_arguments = 0;
2726: }
2727: }
2728: else
2729: {
2730: (*((struct_fonction *)
2731: (*(*l_element_courant).donnee)
2732: .objet)).nombre_arguments = 0;
2733: }
2734: }
2735: else
2736: {
2737: (*((struct_nom *) (*(*l_element_courant).donnee)
2738: .objet)).symbole = d_faux;
2739:
2740: if (l_base_liste_fonctions != NULL)
2741: {
2742: l_element_courant_fonctions =
2743: l_base_liste_fonctions;
2744:
2745: while((strcmp((*((struct_fonction *)
2746: ((*l_element_courant_fonctions)
2747: .donnee))).nom_fonction,
2748: (*((struct_nom *)
2749: (*(*l_element_courant).donnee).objet))
2750: .nom) != 0) &&
2751: ((*l_element_courant_fonctions)
2752: .suivant != NULL))
2753: {
2754: l_element_courant_fonctions =
2755: (*l_element_courant_fonctions)
2756: .suivant;
2757: }
2758:
2759: if (((*l_element_courant_fonctions).suivant !=
2760: NULL) || (strcmp((*((struct_nom *)
2761: (*(*l_element_courant).donnee).objet))
2762: .nom, (*((struct_fonction *)
2763: ((*l_element_courant_fonctions)
2764: .donnee))).nom_fonction) == 0))
2765: {
2766: tampon = (*((struct_nom *)
2767: (*(*l_element_courant)
2768: .donnee).objet)).nom;
2769:
2770: if ((s_sous_objet = (struct_objet *)
2771: malloc(sizeof(
2772: struct_objet))) == NULL)
2773: {
2774: (*s_etat_processus).erreur_systeme =
2775: d_es_allocation_memoire;
2776: (*s_etat_processus)
2777: .traitement_interruptible =
2778: registre_interruption;
2779: return;
2780: }
2781:
2782: initialisation_objet(s_sous_objet);
2783: (*s_sous_objet).type = FCT;
2784:
2785: if (((*s_sous_objet).objet = (void *)
1.8 bertrand 2786: malloc(sizeof(struct_fonction)))
1.1 bertrand 2787: == NULL)
2788: {
2789: (*s_etat_processus).erreur_systeme =
2790: d_es_allocation_memoire;
2791: (*s_etat_processus)
2792: .traitement_interruptible =
2793: registre_interruption;
2794: return;
2795: }
2796:
2797: (*((struct_fonction *) ((*s_sous_objet)
2798: .objet))).nom_fonction = tampon;
2799:
2800: (*((struct_fonction *) ((*s_sous_objet)
2801: .objet))).fonction =
2802: analyse_instruction(
2803: s_etat_processus, tampon);
2804:
2805: (*((struct_fonction *) ((*s_sous_objet)
2806: .objet))).nombre_arguments =
2807: (*((struct_fonction *)
2808: ((*l_element_courant_fonctions)
2809: .donnee))).nombre_arguments;
2810:
2811: free((struct_nom *) (*(*l_element_courant)
2812: .donnee).objet);
2813: free((*l_element_courant).donnee);
2814:
2815: (*l_element_courant).donnee = s_sous_objet;
2816: }
2817: }
2818: }
2819: }
2820:
2821: l_element_courant = (*l_element_courant).suivant;
2822: }
2823: }
2824:
2825: while(l_base_liste_fonctions != NULL)
2826: {
2827: l_element_courant_fonctions = l_base_liste_fonctions;
2828: l_base_liste_fonctions = (*l_base_liste_fonctions).suivant;
2829:
2830: free((*((struct_fonction *) (*l_element_courant_fonctions)
2831: .donnee)).nom_fonction);
2832: free((struct_fonction *) (*l_element_courant_fonctions).donnee);
2833: free(l_element_courant_fonctions);
2834: }
2835:
2836: break;
2837: }
2838:
2839: /*
2840: --------------------------------------------------------------------------------
2841: Chaîne de caractères
2842: --------------------------------------------------------------------------------
2843: */
2844:
2845: case '"' :
2846: {
2847: (*s_objet).type = CHN;
2848:
2849: element = (void *) ((unsigned char *) malloc(
2850: (strlen((*s_etat_processus).instruction_courante) - 1)
2851: * sizeof(unsigned char)));
2852:
2853: if (element == NULL)
2854: {
2855: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2856: (*s_etat_processus).traitement_interruptible =
2857: registre_interruption;
2858: return;
2859: }
2860:
2861: ptr_lecture = (*s_etat_processus).instruction_courante + 1;
2862: ptr_ecriture = (unsigned char *) element;
2863:
2864: while((*ptr_lecture) != d_code_fin_chaine)
2865: {
2866: *ptr_ecriture++ = *ptr_lecture++;
2867: }
2868:
2869: (*(--ptr_ecriture)) = d_code_fin_chaine;
2870:
2871: break;
2872: }
2873:
2874: /*
2875: --------------------------------------------------------------------------------
2876: Définition ou tableau
2877: --------------------------------------------------------------------------------
2878: */
2879:
2880: case '<' :
2881: {
2882: if ((*s_etat_processus).instruction_courante[1] == '[')
2883: {
2884: // Tableau
2885:
2886: sauvegarde_longueur_definitions_chainees =
2887: (*s_etat_processus).longueur_definitions_chainees;
2888:
2889: tampon = (unsigned char *) malloc(
2890: (((*s_etat_processus).longueur_definitions_chainees
2891: = strlen((*s_etat_processus).instruction_courante)
2892: + 2) + 1) * sizeof(unsigned char));
2893:
2894: if (tampon == NULL)
2895: {
2896: (*s_etat_processus).erreur_systeme =
2897: d_es_allocation_memoire;
2898: (*s_etat_processus).traitement_interruptible =
2899: registre_interruption;
2900: return;
2901: }
2902:
2903: strcpy(tampon, "<< ");
2904: ptr_ecriture = tampon + 3;
2905: ptr_lecture = (*s_etat_processus).instruction_courante + 2;
2906:
2907: while((*ptr_lecture) != d_code_fin_chaine)
2908: {
2909: *ptr_ecriture++ = *ptr_lecture++;
2910: }
2911:
2912: ptr_ecriture -= 2;
2913: (*ptr_ecriture) = d_code_fin_chaine;
2914: strcat(ptr_ecriture, " >>");
2915:
2916: position_courante = (*s_etat_processus).position_courante;
2917: (*s_etat_processus).position_courante = 0;
2918:
2919: profondeur_initiale = (*s_etat_processus)
2920: .hauteur_pile_operationnelle;
2921:
2922: /*
2923: -- On met les éléments du tableau dans la pile opérationnelle ------------------
2924: */
2925:
2926: (*s_etat_processus).niveau_recursivite++;
2927: definitions_chainees_precedentes = (*s_etat_processus)
2928: .definitions_chainees;
2929: (*s_etat_processus).definitions_chainees = tampon;
2930:
2931: s_sauvegarde_pile = (*s_etat_processus).l_base_pile_systeme;
2932: sauvegarde_niveau_courant = (*s_etat_processus).niveau_courant;
2933:
2934: (*s_etat_processus).l_base_pile_systeme = NULL;
2935: empilement_pile_systeme(s_etat_processus);
2936:
2937: if ((*s_etat_processus).erreur_systeme != d_es)
2938: {
2939: (*s_etat_processus).traitement_interruptible =
2940: registre_interruption;
2941: return;
2942: }
2943:
2944: (*(*s_etat_processus).l_base_pile_systeme)
2945: .retour_definition = 'Y';
2946: (*s_etat_processus).niveau_courant = 0;
2947: (*s_etat_processus).autorisation_empilement_programme = 'N';
2948: registre_mode_execution_programme =
2949: (*s_etat_processus).mode_execution_programme;
2950: (*s_etat_processus).mode_execution_programme = 'Y';
2951: (*s_etat_processus).erreur_scrutation = d_faux;
2952:
2953: tampon = (*s_etat_processus).instruction_courante;
2954: nombre_lignes_a_supprimer =
2955: (*s_etat_processus).hauteur_pile_operationnelle;
2956:
2957: if ((*s_etat_processus).profilage == d_vrai)
2958: {
2959: profilage(s_etat_processus, "RPL/2 internals");
2960:
2961: if ((*s_etat_processus).erreur_systeme != d_es)
2962: {
2963: return;
2964: }
2965: }
2966:
1.24 bertrand 2967: registre_recherche_type = (*s_etat_processus).recherche_type;
2968: (*s_etat_processus).recherche_type = 'Y';
2969:
1.34 bertrand 2970: variable_implicite =
2971: (*s_etat_processus).autorisation_nom_implicite;
2972: (*s_etat_processus).autorisation_nom_implicite = 'Y';
2973:
1.1 bertrand 2974: if (sequenceur(s_etat_processus) == d_erreur)
2975: {
1.34 bertrand 2976: (*s_etat_processus).autorisation_nom_implicite =
2977: variable_implicite;
1.24 bertrand 2978: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
2979: (*s_etat_processus).recherche_type =
2980: registre_recherche_type;
1.1 bertrand 2981: (*s_etat_processus).mode_execution_programme =
2982: registre_mode_execution_programme;
2983: nombre_lignes_a_supprimer =
2984: (*s_etat_processus).hauteur_pile_operationnelle
2985: - nombre_lignes_a_supprimer;
2986:
2987: for(i = 0; i < nombre_lignes_a_supprimer; i++)
2988: {
2989: if (depilement(s_etat_processus,
2990: &((*s_etat_processus).l_base_pile),
2991: &s_sous_objet) == d_erreur)
2992: {
2993: (*s_etat_processus).traitement_interruptible =
2994: registre_interruption;
2995: return;
2996: }
2997:
2998: liberation(s_etat_processus, s_sous_objet);
2999: }
3000:
3001: (*s_etat_processus).instruction_courante = tampon;
3002:
1.12 bertrand 3003: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 3004: (*s_etat_processus).l_base_pile_systeme =
3005: s_sauvegarde_pile;
3006: (*s_etat_processus).niveau_courant =
3007: sauvegarde_niveau_courant;
3008:
3009: free((*s_etat_processus).definitions_chainees);
3010: (*s_etat_processus).niveau_recursivite--;
3011:
3012: (*s_etat_processus).definitions_chainees =
3013: definitions_chainees_precedentes;
3014: (*s_etat_processus).longueur_definitions_chainees =
3015: sauvegarde_longueur_definitions_chainees;
3016:
3017: (*s_etat_processus).position_courante =
3018: position_courante;
3019:
3020: free(s_objet);
3021:
3022: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
3023: (*s_etat_processus).traitement_interruptible =
3024: registre_interruption;
3025: return;
3026: }
3027:
1.34 bertrand 3028: (*s_etat_processus).autorisation_nom_implicite =
3029: variable_implicite;
1.24 bertrand 3030: (*s_etat_processus).recherche_type = registre_recherche_type;
1.1 bertrand 3031: (*s_etat_processus).mode_execution_programme =
3032: registre_mode_execution_programme;
3033:
3034: if ((*s_etat_processus).erreur_scrutation == d_vrai)
3035: {
3036: nombre_lignes_a_supprimer =
3037: (*s_etat_processus).hauteur_pile_operationnelle
3038: - nombre_lignes_a_supprimer;
3039:
3040: for(i = 0; i < nombre_lignes_a_supprimer; i++)
3041: {
3042: if (depilement(s_etat_processus,
3043: &((*s_etat_processus).l_base_pile),
3044: &s_sous_objet) == d_erreur)
3045: {
3046: (*s_etat_processus).traitement_interruptible =
3047: registre_interruption;
3048: return;
3049: }
3050:
3051: liberation(s_etat_processus, s_sous_objet);
3052: }
3053:
3054: (*s_etat_processus).instruction_courante = tampon;
3055:
1.12 bertrand 3056: effacement_pile_systeme(s_etat_processus);
1.1 bertrand 3057: (*s_etat_processus).l_base_pile_systeme =
3058: s_sauvegarde_pile;
3059: (*s_etat_processus).niveau_courant =
3060: sauvegarde_niveau_courant;
3061:
3062: free((*s_etat_processus).definitions_chainees);
3063: (*s_etat_processus).niveau_recursivite--;
3064:
3065: (*s_etat_processus).definitions_chainees =
3066: definitions_chainees_precedentes;
3067: (*s_etat_processus).longueur_definitions_chainees =
3068: sauvegarde_longueur_definitions_chainees;
3069:
3070: (*s_etat_processus).position_courante =
3071: position_courante;
3072:
3073: free(s_objet);
3074:
3075: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
3076: (*s_etat_processus).traitement_interruptible =
3077: registre_interruption;
3078: return;
3079: }
3080:
3081: (*s_etat_processus).instruction_courante = tampon;
3082:
3083: (*s_etat_processus).l_base_pile_systeme = s_sauvegarde_pile;
3084: (*s_etat_processus).niveau_courant =
3085: sauvegarde_niveau_courant;
3086:
3087: free((*s_etat_processus).definitions_chainees);
3088: (*s_etat_processus).definitions_chainees =
3089: definitions_chainees_precedentes;
3090: (*s_etat_processus).longueur_definitions_chainees =
3091: sauvegarde_longueur_definitions_chainees;
3092:
3093: (*s_etat_processus).niveau_recursivite--;
3094:
3095: (*s_etat_processus).position_courante = position_courante;
3096:
3097: /*
3098: -- On relit la pile qui contient des sous-objets contenant les -----------------
3099: -- éléments du tableau ---------------------------------------------------------
3100: */
3101:
3102: profondeur_finale = (*s_etat_processus)
3103: .hauteur_pile_operationnelle;
3104:
3105: nombre_lignes = profondeur_finale - profondeur_initiale;
3106:
1.12 bertrand 3107: if ((element = malloc(sizeof(struct_tableau))) == NULL)
1.1 bertrand 3108: {
3109: (*s_etat_processus).erreur_systeme =
3110: d_es_allocation_memoire;
3111: (*s_etat_processus).traitement_interruptible =
3112: registre_interruption;
3113: return;
3114: }
3115:
3116: (*((struct_tableau *) element)).nombre_elements = nombre_lignes;
3117:
3118: if (((*((struct_tableau *) element)).elements =
3119: malloc(nombre_lignes * sizeof(struct_objet *))) == NULL)
3120: {
3121: (*s_etat_processus).erreur_systeme =
3122: d_es_allocation_memoire;
3123: (*s_etat_processus).traitement_interruptible =
3124: registre_interruption;
3125: return;
3126: }
3127:
3128: for(i = 1; i <= nombre_lignes; i++)
3129: {
3130: if (depilement(s_etat_processus,
3131: &((*s_etat_processus).l_base_pile),
3132: &s_sous_objet) == d_erreur)
3133: {
3134: (*s_etat_processus).traitement_interruptible =
3135: registre_interruption;
3136: return;
3137: }
3138:
3139: (*((struct_tableau *) element)).elements[nombre_lignes - i]
3140: = s_sous_objet;
3141: }
3142:
3143: (*s_objet).type = TBL;
3144:
3145: (*s_etat_processus).traitement_interruptible =
3146: registre_interruption;
3147: }
3148: else
3149: {
3150: // Définition
3151:
3152: if (strlen((*s_etat_processus).instruction_courante) < 5)
3153: {
3154: free(s_objet);
3155:
3156: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
3157: (*s_etat_processus).traitement_interruptible =
3158: registre_interruption;
3159: return;
3160: }
3161:
3162: if ((strncmp((*s_etat_processus).instruction_courante, "<< ", 3)
3163: != 0) && (strcmp((*s_etat_processus)
3164: .instruction_courante, "<<") != 0))
3165: {
3166: free(s_objet);
3167:
3168: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
3169: (*s_etat_processus).traitement_interruptible =
3170: registre_interruption;
3171: return;
3172: }
3173:
3174: (*s_objet).type = RPN;
3175:
3176: element = (void *) analyse_rpn(s_etat_processus,
3177: (*s_etat_processus).instruction_courante);
3178:
3179: if (element == NULL)
3180: {
3181: if ((*s_etat_processus).erreur_systeme != d_es)
3182: {
3183: (*s_etat_processus).erreur_systeme =
3184: d_es_allocation_memoire;
3185: }
3186:
1.12 bertrand 3187: free(s_objet);
3188:
1.1 bertrand 3189: (*s_etat_processus).traitement_interruptible =
3190: registre_interruption;
3191: return;
3192: }
3193:
3194: l_element_courant = (struct_liste_chainee *) element;
3195:
3196: while(l_element_courant != NULL)
3197: {
3198: if ((*(*l_element_courant).donnee).type == FCT)
3199: {
3200: if (strcmp((*((struct_fonction *) (*(*l_element_courant)
3201: .donnee).objet)).nom_fonction, "=") == 0)
3202: {
3203: nombre_egalites++;
3204: }
3205: }
3206:
3207: l_element_courant = (*l_element_courant).suivant;
3208: }
3209: }
3210:
3211: break;
3212: }
3213:
3214: /*
3215: --------------------------------------------------------------------------------
3216: Entier ou réel
3217: --------------------------------------------------------------------------------
3218: */
3219:
3220: default :
3221: {
3222: if (((*((*s_etat_processus).instruction_courante)) == '-') ||
3223: ((*((*s_etat_processus).instruction_courante)) == '+') ||
3224: (((*((*s_etat_processus).instruction_courante)) >= '0') &&
3225: ((*((*s_etat_processus).instruction_courante))
3226: <= '9')) || ((*((*s_etat_processus).instruction_courante))
3227: == '.'))
3228: {
3229: drapeau_valeur_entiere = ((*((*s_etat_processus)
3230: .instruction_courante)) != '.') ? d_vrai : d_faux;
3231: drapeau_valeur_reelle = d_vrai;
3232:
3233: nombre_points = 0;
3234: nombre_exposants = 0;
3235:
3236: conversion_format(s_etat_processus,
3237: (*s_etat_processus).instruction_courante);
3238:
3239: ptr = (*s_etat_processus).instruction_courante;
3240:
3241: while((*ptr) != d_code_fin_chaine)
3242: {
3243: switch(*ptr)
3244: {
3245: case '0' :
3246: case '1' :
3247: case '2' :
3248: case '3' :
3249: case '4' :
3250: case '5' :
3251: case '6' :
3252: case '7' :
3253: case '8' :
3254: case '9' :
3255: {
3256: break;
3257: }
3258:
3259: // Ne peut survenir qu'après un 'E', un 'e' ou au
3260: // début de la chaîne.
3261: case '+' :
3262: case '-' :
3263: {
3264: if (ptr > (*s_etat_processus).instruction_courante)
3265: {
3266: if (((*(ptr - 1)) != 'e') &&
3267: ((*(ptr - 1)) != 'E'))
3268: {
3269: drapeau_valeur_entiere = d_faux;
3270: drapeau_valeur_reelle = d_faux;
3271: }
3272: }
3273:
3274: break;
3275: }
3276:
3277: // Ne peut que commencer une chaîne, suivre un
3278: // chiffre ou un signe. Ne peut constituer un
3279: // nombre seul.
3280: case '.' :
3281: {
3282: nombre_points++;
3283:
3284: if (ptr > (*s_etat_processus).instruction_courante)
3285: {
3286: switch(*(ptr - 1))
3287: {
3288: case '+' :
3289: case '-' :
3290: case '0' :
3291: case '1' :
3292: case '2' :
3293: case '3' :
3294: case '4' :
3295: case '5' :
3296: case '6' :
3297: case '7' :
3298: case '8' :
3299: case '9' :
3300: {
3301: drapeau_valeur_entiere = d_faux;
3302: break;
3303: }
3304:
3305: default :
3306: {
3307: drapeau_valeur_entiere = d_faux;
3308: drapeau_valeur_reelle = d_faux;
3309: break;
3310: }
3311: }
3312: }
3313: else
3314: {
3315: if ((*(ptr + 1)) == d_code_fin_chaine)
3316: {
3317: drapeau_valeur_entiere = d_faux;
3318: drapeau_valeur_reelle = d_faux;
3319: }
3320: }
3321:
3322: break;
3323: }
3324:
3325: // Ne peut suivre qu'un chiffre ou un point
3326: case 'e' :
3327: case 'E' :
3328: {
3329: nombre_exposants++;
3330:
3331: if (ptr > (*s_etat_processus).instruction_courante)
3332: {
3333: switch(*(ptr - 1))
3334: {
3335: case '0' :
3336: case '1' :
3337: case '2' :
3338: case '3' :
3339: case '4' :
3340: case '5' :
3341: case '6' :
3342: case '7' :
3343: case '8' :
3344: case '9' :
3345: {
3346: drapeau_valeur_entiere = d_faux;
3347: break;
3348: }
3349:
3350: // Le point doit suivre un chiffre
3351: case '.' :
3352: {
3353: if ((ptr - 1) > (*s_etat_processus)
3354: .instruction_courante)
3355: {
3356: switch(*(ptr - 2))
3357: {
3358: case '0' :
3359: case '1' :
3360: case '2' :
3361: case '3' :
3362: case '4' :
3363: case '5' :
3364: case '6' :
3365: case '7' :
3366: case '8' :
3367: case '9' :
3368: {
3369: drapeau_valeur_entiere =
3370: d_faux;
3371: break;
3372: }
3373:
3374: default :
3375: {
3376: drapeau_valeur_entiere =
3377: d_faux;
3378: drapeau_valeur_reelle =
3379: d_faux;
3380: break;
3381: }
3382: }
3383: }
3384: else
3385: {
3386: drapeau_valeur_entiere = d_faux;
3387: drapeau_valeur_reelle = d_faux;
3388: }
3389:
3390: break;
3391: }
3392:
3393: default :
3394: {
3395: drapeau_valeur_entiere = d_faux;
3396: drapeau_valeur_reelle = d_faux;
3397: break;
3398: }
3399: }
3400: }
3401: else
3402: {
3403: drapeau_valeur_entiere = d_faux;
3404: drapeau_valeur_reelle = d_faux;
3405: }
3406:
3407: break;
3408: }
3409:
3410: default :
3411: {
3412: drapeau_valeur_entiere = d_faux;
3413: drapeau_valeur_reelle = d_faux;
3414: break;
3415: }
3416: }
3417:
3418: ptr++;
3419: }
3420:
3421: if ((nombre_points > 1) || (nombre_exposants > 1))
3422: {
3423: drapeau_valeur_reelle = d_faux;
3424: drapeau_valeur_entiere = d_faux;
3425: }
3426: }
3427: else
3428: {
3429: drapeau_valeur_entiere = d_faux;
3430: drapeau_valeur_reelle = d_faux;
3431: }
3432:
3433: if ((drapeau_valeur_reelle == d_faux) &&
3434: (drapeau_valeur_entiere == d_faux))
3435: {
1.23 bertrand 3436: ptr = (*s_etat_processus).instruction_courante;
3437:
3438: while((*ptr) != d_code_fin_chaine)
3439: {
1.25 bertrand 3440: if ((isalnum((*ptr)) == 0) &&
3441: ((*ptr) != '_') &&
3442: ((*ptr) != '$'))
1.23 bertrand 3443: {
3444: free(s_objet);
3445:
3446: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
3447: (*s_etat_processus).traitement_interruptible =
3448: registre_interruption;
3449:
3450: return;
3451: }
3452:
3453: ptr++;
3454: }
3455:
1.1 bertrand 3456: (*s_objet).type = NOM;
3457:
3458: element = malloc(sizeof(struct_nom));
3459:
3460: if (element == NULL)
3461: {
3462: (*s_etat_processus).erreur_systeme =
3463: d_es_allocation_memoire;
3464: (*s_etat_processus).traitement_interruptible =
3465: registre_interruption;
3466: return;
3467: }
3468:
3469: (*((struct_nom *) element)).symbole = d_faux;
3470: (*((struct_nom *) element)).nom = ((unsigned char *) malloc(
3471: (strlen((*s_etat_processus)
3472: .instruction_courante) + 1) * sizeof(unsigned char)));
3473:
3474: if ((*((struct_nom *) element)).nom == NULL)
3475: {
3476: (*s_etat_processus).erreur_systeme =
3477: d_es_allocation_memoire;
3478: (*s_etat_processus).traitement_interruptible =
3479: registre_interruption;
3480: return;
3481: }
3482:
3483: strcpy((*((struct_nom *) element)).nom, (*s_etat_processus)
3484: .instruction_courante);
3485: }
3486: else
3487: {
3488: if (drapeau_valeur_entiere == d_faux)
3489: {
3490: (*s_objet).type = REL;
3491:
3492: element = (void *) ((real8 *) malloc(
3493: sizeof(real8)));
3494:
3495: if (element == NULL)
3496: {
3497: (*s_etat_processus).erreur_systeme =
3498: d_es_allocation_memoire;
3499: (*s_etat_processus).traitement_interruptible =
3500: registre_interruption;
3501: return;
3502: }
3503:
3504: nombre_elements_convertis = sscanf(
3505: (*s_etat_processus).instruction_courante, "%lg",
3506: (real8 *) element);
3507:
3508: if (nombre_elements_convertis != 1)
3509: {
3510: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
3511: }
3512: }
3513: else
3514: {
3515: (*s_objet).type = INT;
3516:
3517: element = (void *) ((integer8 *) malloc(
3518: sizeof(integer8)));
3519:
3520: if (element == NULL)
3521: {
3522: (*s_etat_processus).erreur_systeme =
3523: d_es_allocation_memoire;
3524: (*s_etat_processus).traitement_interruptible =
3525: registre_interruption;
3526: return;
3527: }
3528:
3529: nombre_elements_convertis = sscanf(
3530: (*s_etat_processus).instruction_courante, "%lld",
3531: (integer8 *) element);
3532:
3533: if (nombre_elements_convertis != 1)
3534: {
3535: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
3536: }
3537: }
3538: }
3539:
3540: break;
3541: }
3542: }
3543:
3544: (*s_objet).objet = element;
3545:
3546: if (nombre_egalites > 1)
3547: {
3548: liberation(s_etat_processus, s_objet);
3549:
3550: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
3551: (*s_etat_processus).traitement_interruptible = registre_interruption;
3552: return;
3553: }
3554:
3555: if (empilement(s_etat_processus,
3556: &((*s_etat_processus).l_base_pile), s_objet) == d_erreur)
3557: {
3558: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1.7 bertrand 3559: (*s_etat_processus).traitement_interruptible =
3560: registre_interruption;
1.1 bertrand 3561: return;
3562: }
3563:
3564: (*s_etat_processus).traitement_interruptible = registre_interruption;
3565: return;
3566: }
3567:
3568:
3569: /*
3570: ================================================================================
3571: Conversion de la virgule
3572: ================================================================================
3573: Entrées : structure sur l'état du processus
3574: --------------------------------------------------------------------------------
3575: Sorties : néant
3576: --------------------------------------------------------------------------------
3577: Effets de bord : néant
3578: ================================================================================
3579: */
3580:
3581: void
3582: conversion_format(struct_processus *s_etat_processus, unsigned char *chaine)
3583: {
3584: unsigned char *ptr;
3585:
3586: /*
3587: --------------------------------------------------------------------------------
3588: Transcription du point en virgule et réciproquement selon l'indicateur 48
3589: --------------------------------------------------------------------------------
3590: */
3591:
3592: if (test_cfsf(s_etat_processus, 48) == d_vrai)
3593: {
3594: ptr = chaine;
3595:
3596: while((*ptr) != d_code_fin_chaine)
3597: {
3598: if ((*ptr) == '.')
3599: {
3600: (*ptr) = ',';
3601: }
3602: else if ((*ptr) == ',')
3603: {
3604: (*ptr) = '.';
3605: }
3606:
3607: ptr++;
3608: }
3609: }
3610:
3611: return;
3612: }
3613:
3614: // vim: ts=4