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