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