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