1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.14
4: Copyright (C) 1989-2013 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: Routine de formation des données pour l'écriture dans les fichiers
29: ================================================================================
30: Entrées : structure sur l'état du processus et objet à afficher
31: Longueur est la précision requise et longueur_champ, le nombre maximal
32: de caractères de la chaîne résultat (-1 signifiant une absence de contrainte)
33: Type = 'F/U' (formaté, non formaté)
34: --------------------------------------------------------------------------------
35: Sorties : chaine de caractères et longueur du tableau de caractères
36: --------------------------------------------------------------------------------
37: Effets de bord : néant
38: ================================================================================
39: */
40:
41: unsigned char *
42: formateur_fichier(struct_processus *s_etat_processus, struct_objet *s_objet,
43: struct_objet *s_format, integer8 longueur, integer8 longueur_champ,
44: unsigned char format_sortie, unsigned char type,
45: integer8 *longueur_effective, integer8 *recursivite,
46: logical1 export_fichier)
47: {
48: /*
49: * Traitement du format des fichiers formatés :
50: *
51: * { "standard*(*)" (format classique sans limitation)
52: * "standard*(Y)" (format classique limité à Y caractères)
53: * "fixed*X(*)" (format virgule fixe avec une partie
54: * fractionnaire composée de X chiffres,
55: * mais dont la longueur est limité par
56: * la précision de la représentation interne)
57: * "fixed*X(Y)" (idem, mais longueur totale inférieure ou égale à
58: * Y caractères)
59: * "scientific*X(*)"
60: * "scientific*X(Y)"
61: * "engineer*X(*)"
62: * "engineer*X(Y)"
63: * "binary*X(*)"
64: * "binary*X(Y)" (X est la base : 2, 8, 10, 16)
65: * "character*(*)"
66: * "character*(Y)"
67: * "native*(*)" }
68: *
69: * Traitement du format des fichiers non formatés :
70: *
71: * { "integer*1", "integer*2", "integer*4", "integer*8",
72: * "real*4", "real*8", ["real*16",]
73: * "complex*8", "complex*16", ["complex*32",]
74: * "logical*1", "logical*2", "logical*4", logical*8",
75: * "character*n" "character*(*)" "native*(*)" }
76: */
77:
78: logical1 autorisation_parenthese;
79: logical1 format_degenere;
80: logical1 presence_signe;
81:
82: struct_liste_chainee *l_atome;
83: struct_liste_chainee *l_element_courant;
84: struct_liste_chainee *l_element_courant_format;
85: struct_liste_chainee *l_liste1;
86: struct_liste_chainee *l_liste2;
87:
88: struct_objet *s_sous_objet;
89: struct_objet *s_sous_objet_1;
90: struct_objet *s_sous_objet_2;
91: struct_objet *s_sous_objet_3;
92:
93: unsigned char base[1 + 1];
94: unsigned char *chaine;
95: unsigned char *chaine_fonction;
96: unsigned char *chaine_formatee;
97: unsigned char *chaine_tampon;
98: unsigned char *chaine_sauvegarde;
99: unsigned char *format_chaine;
100: unsigned char *ptre;
101: unsigned char *ptrl;
102: unsigned char tampon[64 + 1];
103: unsigned char type_binaire;
104:
105: integer8 i;
106: integer8 j;
107: integer8 nombre_arguments;
108: integer8 nombre_arguments_fonction;
109: integer8 nombre_colonnes;
110: integer8 nombre_elements;
111: integer8 nombre_lignes;
112:
113: integer8 longueur_chaine_traitee;
114: integer8 longueur_fonction;
115: integer8 longueur_liste;
116: integer8 longueur_reelle_chaine;
117: integer8 longueur_totale;
118: integer8 position_1;
119: integer8 position_2;
120: integer8 position_3;
121:
122: (*recursivite)++;
123:
124: if (type == 'F')
125: {
126: /*
127: * Fichiers formatés
128: */
129:
130: chaine = NULL;
131: chaine_formatee = NULL;
132: chaine_sauvegarde = NULL;
133:
134: strcpy(base, " ");
135:
136: if ((*s_objet).type == ALG)
137: {
138:
139: /*
140: --------------------------------------------------------------------------------
141: Expression algébrique
142: --------------------------------------------------------------------------------
143: */
144:
145: if (format_sortie != 'N')
146: {
147: (*s_etat_processus).erreur_execution =
148: d_ex_erreur_format_fichier;
149: return(NULL);
150: }
151:
152: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
153:
154: while(l_element_courant != NULL)
155: {
156: if ((*(*l_element_courant).donnee).type == FCT)
157: {
158: if ((strcmp((*((struct_fonction *) (*(*l_element_courant)
159: .donnee).objet)).nom_fonction, "<<") != 0) &&
160: (strcmp((*((struct_fonction *)
161: (*(*l_element_courant)
162: .donnee).objet)).nom_fonction, ">>") != 0))
163: {
164: if ((strcmp((*((struct_fonction *)
165: (*(*l_element_courant)
166: .donnee).objet)).nom_fonction, "+") == 0) ||
167: (strcmp((*((struct_fonction *)
168: (*(*l_element_courant).donnee).objet))
169: .nom_fonction, "-") == 0) || (strcmp(
170: (*((struct_fonction *) (*(*l_element_courant)
171: .donnee).objet)).nom_fonction, "*") == 0) ||
172: (strcmp((*((struct_fonction *)
173: (*(*l_element_courant).donnee).objet))
174: .nom_fonction,
175: "/") == 0) || (strcmp((*((struct_fonction *)
176: (*(*l_element_courant).donnee).objet))
177: .nom_fonction,
178: "^") == 0) || (strcmp((*((struct_fonction *)
179: (*(*l_element_courant).donnee).objet))
180: .nom_fonction,
181: "<") == 0) || (strcmp((*((struct_fonction *)
182: (*(*l_element_courant).donnee).objet))
183: .nom_fonction,
184: ">") == 0) || (strcmp((*((struct_fonction *)
185: (*(*l_element_courant).donnee).objet))
186: .nom_fonction,
187: "==") == 0) || (strcmp((*((struct_fonction *)
188: (*(*l_element_courant).donnee).objet))
189: .nom_fonction,
190: "<>") == 0) || (strcmp((*((struct_fonction *)
191: (*(*l_element_courant).donnee).objet))
192: .nom_fonction,
193: "<=") == 0) || (strcmp((*((struct_fonction *)
194: (*(*l_element_courant).donnee).objet))
195: .nom_fonction,
196: "=<") == 0) || (strcmp((*((struct_fonction *)
197: (*(*l_element_courant).donnee).objet))
198: .nom_fonction,
199: ">=") == 0) || (strcmp((*((struct_fonction *)
200: (*(*l_element_courant).donnee).objet))
201: .nom_fonction,
202: "=>") == 0))
203: {
204: if (depilement(s_etat_processus,
205: &((*s_etat_processus)
206: .l_base_pile), &s_sous_objet_2) == d_erreur)
207: {
208: return(NULL);
209: }
210:
211: chaine_sauvegarde = (*s_etat_processus)
212: .instruction_courante;
213:
214: if (((*s_etat_processus).instruction_courante =
215: (unsigned char *) malloc((strlen(
216: (unsigned char *) (*s_sous_objet_2).objet)
217: + 2 + 1) * sizeof(unsigned char))) == NULL)
218: {
219: (*s_etat_processus).instruction_courante =
220: chaine_sauvegarde;
221: (*s_etat_processus).erreur_systeme =
222: d_es_allocation_memoire;
223: return(NULL);
224: }
225:
226: sprintf((*s_etat_processus).instruction_courante,
227: "'%s'", (unsigned char *)
228: (*s_sous_objet_2).objet);
229:
230: presence_signe = (((*s_etat_processus)
231: .instruction_courante[1] == '+')
232: || ((*s_etat_processus)
233: .instruction_courante[1]
234: == '-')) ? d_vrai : d_faux;
235:
236: recherche_type(s_etat_processus);
237:
238: if ((*s_etat_processus).erreur_execution != d_ex)
239: {
240: // Aucune erreur ne peut être renvoyée.
241:
242: return(NULL);
243: }
244:
245: if (depilement(s_etat_processus,
246: &((*s_etat_processus)
247: .l_base_pile), &s_sous_objet_3) == d_erreur)
248: {
249: return(NULL);
250: }
251:
252: free((*s_etat_processus).instruction_courante);
253:
254: (*s_etat_processus).instruction_courante =
255: chaine_sauvegarde;
256:
257: autorisation_parenthese = d_faux;
258:
259: if ((*s_sous_objet_3).type == ALG)
260: {
261: l_atome = (struct_liste_chainee *)
262: (*s_sous_objet_3).objet;
263: chaine_fonction = "";
264: nombre_arguments_fonction = 0;
265:
266: while(l_atome != NULL)
267: {
268: if ((*(*l_atome).donnee).type == FCT)
269: {
270: if (strcmp((*((struct_fonction *)
271: (*(*l_atome).donnee).objet))
272: .nom_fonction, ">>") != 0)
273: {
274: chaine_fonction =
275: (*((struct_fonction *)
276: (*(*l_atome).donnee).objet))
277: .nom_fonction;
278: nombre_arguments_fonction =
279: (*((struct_fonction *)
280: (*(*l_atome).donnee).objet))
281: .nombre_arguments;
282: }
283: }
284:
285: l_atome = (*l_atome).suivant;
286: }
287:
288: if (strcmp((*((struct_fonction *)
289: (*(*l_element_courant).donnee).objet))
290: .nom_fonction, "+") == 0)
291: {
292: if ((strcmp(chaine_fonction, "AND") == 0) ||
293: (strcmp(chaine_fonction, "XOR") ==
294: 0) || (strcmp(chaine_fonction, "OR")
295: == 0))
296: {
297: autorisation_parenthese = d_vrai;
298: }
299: }
300: else if (strcmp((*((struct_fonction *)
301: (*(*l_element_courant).donnee).objet))
302: .nom_fonction, "-") == 0)
303: {
304: if (nombre_arguments_fonction != 0)
305: {
306: autorisation_parenthese = d_faux;
307: }
308: else
309: {
310: autorisation_parenthese = d_vrai;
311: }
312: }
313: else if (strcmp((*((struct_fonction *)
314: (*(*l_element_courant).donnee).objet))
315: .nom_fonction, "*") == 0)
316: {
317: if ((strcmp(chaine_fonction, "+") == 0) ||
318: (strcmp(chaine_fonction, "-") == 0)
319: || (strcmp(chaine_fonction, "AND")
320: == 0) || (strcmp(chaine_fonction,
321: "XOR") == 0) || (strcmp(
322: chaine_fonction, "OR") == 0))
323: {
324: autorisation_parenthese = d_vrai;
325: }
326: }
327: else if (strcmp((*((struct_fonction *)
328: (*(*l_element_courant).donnee).objet))
329: .nom_fonction, "/") == 0)
330: {
331: if (nombre_arguments_fonction != 0)
332: {
333: autorisation_parenthese = d_faux;
334: }
335: else
336: {
337: autorisation_parenthese = d_vrai;
338: }
339: }
340: else if ((strcmp((*((struct_fonction *)
341: (*(*l_element_courant).donnee).objet))
342: .nom_fonction, "^") == 0))
343: {
344: if (nombre_arguments_fonction != 0)
345: {
346: autorisation_parenthese = d_faux;
347: }
348: else
349: {
350: autorisation_parenthese = d_vrai;
351: }
352: }
353: }
354:
355: if ((autorisation_parenthese == d_vrai) ||
356: (presence_signe == d_vrai))
357: {
358: chaine_sauvegarde = (unsigned char *)
359: (*s_sous_objet_2).objet;
360:
361: if (((*s_sous_objet_2).objet = (void *)
362: malloc((strlen(chaine_sauvegarde) + 2
363: + 1) * sizeof(unsigned char))) == NULL)
364: {
365: (*s_etat_processus).erreur_systeme =
366: d_es_allocation_memoire;
367: return(NULL);
368: }
369:
370: sprintf((unsigned char *) (*s_sous_objet_2)
371: .objet, "(%s)", chaine_sauvegarde);
372: free(chaine_sauvegarde);
373: }
374:
375: liberation(s_etat_processus, s_sous_objet_3);
376:
377: if (depilement(s_etat_processus,
378: &((*s_etat_processus)
379: .l_base_pile), &s_sous_objet_1) == d_erreur)
380: {
381: return(NULL);
382: }
383:
384: chaine_sauvegarde = (*s_etat_processus)
385: .instruction_courante;
386:
387: if (((*s_etat_processus).instruction_courante =
388: (unsigned char *) malloc((strlen(
389: (unsigned char *) (*s_sous_objet_1).objet)
390: + 2 + 1) * sizeof(unsigned char))) == NULL)
391: {
392: (*s_etat_processus).instruction_courante =
393: chaine_sauvegarde;
394: (*s_etat_processus).erreur_systeme =
395: d_es_allocation_memoire;
396: return(NULL);
397: }
398:
399: sprintf((*s_etat_processus).instruction_courante,
400: "'%s'", (unsigned char *)
401: (*s_sous_objet_1).objet);
402:
403: recherche_type(s_etat_processus);
404:
405: if ((*s_etat_processus).erreur_execution != d_ex)
406: {
407: // Aucune erreur ne peut être renvoyée.
408:
409: return(NULL);
410: }
411:
412: if (depilement(s_etat_processus,
413: &((*s_etat_processus)
414: .l_base_pile), &s_sous_objet_3) == d_erreur)
415: {
416: return(NULL);
417: }
418:
419: free((*s_etat_processus).instruction_courante);
420:
421: (*s_etat_processus).instruction_courante =
422: chaine_sauvegarde;
423:
424: autorisation_parenthese = d_faux;
425:
426: if ((*s_sous_objet_3).type == ALG)
427: {
428: l_atome = (struct_liste_chainee *)
429: (*s_sous_objet_3).objet;
430: chaine_fonction = "";
431:
432: while(l_atome != NULL)
433: {
434: if ((*(*l_atome).donnee).type == FCT)
435: {
436: if (strcmp((*((struct_fonction *)
437: (*(*l_atome).donnee).objet))
438: .nom_fonction, ">>") != 0)
439: {
440: chaine_fonction =
441: (*((struct_fonction *)
442: (*(*l_atome).donnee).objet))
443: .nom_fonction;
444: }
445: }
446:
447: l_atome = (*l_atome).suivant;
448: }
449:
450: if ((strcmp((*((struct_fonction *)
451: (*(*l_element_courant).donnee).objet))
452: .nom_fonction, "+") == 0) ||
453: (strcmp((*((struct_fonction *)
454: (*(*l_element_courant).donnee).objet))
455: .nom_fonction, "-") == 0))
456: {
457: if ((strcmp(chaine_fonction, "AND") == 0) ||
458: (strcmp(chaine_fonction, "XOR") ==
459: 0) || (strcmp(chaine_fonction, "OR")
460: == 0))
461: {
462: autorisation_parenthese = d_vrai;
463: }
464: }
465: else if ((strcmp((*((struct_fonction *)
466: (*(*l_element_courant).donnee).objet))
467: .nom_fonction, "*") == 0) ||
468: (strcmp((*((struct_fonction *)
469: (*(*l_element_courant).donnee).objet))
470: .nom_fonction, "/") == 0))
471: {
472: if ((strcmp(chaine_fonction, "+") == 0) ||
473: (strcmp(chaine_fonction, "-") == 0)
474: || (strcmp(chaine_fonction, "AND")
475: == 0) || (strcmp(chaine_fonction,
476: "XOR") == 0) || (strcmp(
477: chaine_fonction, "OR") == 0))
478: {
479: autorisation_parenthese = d_vrai;
480: }
481: }
482: else if ((strcmp((*((struct_fonction *)
483: (*(*l_element_courant).donnee).objet))
484: .nom_fonction, "^") == 0))
485: {
486: autorisation_parenthese = d_vrai;
487: }
488: }
489:
490: if (autorisation_parenthese == d_vrai)
491: {
492: chaine_sauvegarde = (unsigned char *)
493: (*s_sous_objet_1).objet;
494:
495: if (((*s_sous_objet_1).objet = (void *)
496: malloc((strlen(chaine_sauvegarde) + 2
497: + 1) * sizeof(unsigned char))) == NULL)
498: {
499: (*s_etat_processus).erreur_systeme =
500: d_es_allocation_memoire;
501: return(NULL);
502: }
503:
504: sprintf((unsigned char *) (*s_sous_objet_1)
505: .objet, "(%s)", chaine_sauvegarde);
506: free(chaine_sauvegarde);
507: }
508:
509: liberation(s_etat_processus, s_sous_objet_3);
510:
511: if ((s_sous_objet = allocation(s_etat_processus,
512: CHN)) == NULL)
513: {
514: (*s_etat_processus).erreur_systeme =
515: d_es_allocation_memoire;
516: return(NULL);
517: }
518:
519: if (((*s_sous_objet).objet = (void *)
520: malloc((strlen(
521: (unsigned char *) (*s_sous_objet_1).objet) +
522: strlen((*((struct_fonction *)
523: (*(*l_element_courant).donnee).objet))
524: .nom_fonction) + strlen((unsigned char *)
525: (*s_sous_objet_2).objet) + 1) *
526: sizeof(unsigned char))) == NULL)
527: {
528: (*s_etat_processus).erreur_systeme =
529: d_es_allocation_memoire;
530: return(NULL);
531: }
532:
533: sprintf((unsigned char *) (*s_sous_objet).objet,
534: "%s%s%s", (unsigned char *)
535: (*s_sous_objet_1)
536: .objet, (*((struct_fonction *)
537: (*(*l_element_courant).donnee).objet))
538: .nom_fonction, (unsigned char *)
539: (*s_sous_objet_2).objet);
540:
541: liberation(s_etat_processus, s_sous_objet_1);
542: liberation(s_etat_processus, s_sous_objet_2);
543:
544: if (empilement(s_etat_processus,
545: &((*s_etat_processus)
546: .l_base_pile), s_sous_objet) == d_erreur)
547: {
548: return(NULL);
549: }
550: }
551: else if (strcmp((*((struct_fonction *)
552: (*(*l_element_courant).donnee).objet))
553: .nom_fonction, "=") == 0)
554: {
555: if (depilement(s_etat_processus,
556: &((*s_etat_processus).l_base_pile),
557: &s_sous_objet_2) == d_erreur)
558: {
559: return(NULL);
560: }
561:
562: if (depilement(s_etat_processus,
563: &((*s_etat_processus).l_base_pile),
564: &s_sous_objet_1) == d_erreur)
565: {
566: return(NULL);
567: }
568:
569: if ((s_sous_objet = allocation(s_etat_processus,
570: CHN)) == NULL)
571: {
572: (*s_etat_processus).erreur_systeme =
573: d_es_allocation_memoire;
574: return(NULL);
575: }
576:
577: autorisation_parenthese = d_vrai;
578: l_atome = l_element_courant;
579:
580: if (l_atome != NULL)
581: {
582: if ((*l_atome).suivant != NULL)
583: {
584: l_atome = (*l_atome).suivant;
585:
586: if ((*(*l_atome).donnee).type == FCT)
587: {
588: if (strcmp((*((struct_fonction *)
589: (*(*l_atome).donnee).objet))
590: .nom_fonction, ">>") == 0)
591: {
592: if ((*l_atome).suivant == NULL)
593: {
594: autorisation_parenthese =
595: d_faux;
596: }
597: }
598: }
599: }
600: }
601:
602: if (autorisation_parenthese == d_vrai)
603: {
604: if (((*s_sous_objet).objet =
605: (void *) malloc((strlen(
606: (unsigned char *) (*s_sous_objet_1)
607: .objet) + strlen((*((struct_fonction *)
608: (*(*l_element_courant).donnee).objet))
609: .nom_fonction) +
610: strlen((unsigned char *)
611: (*s_sous_objet_2).objet) + 2 + 1) *
612: sizeof(unsigned char))) == NULL)
613: {
614: (*s_etat_processus).erreur_systeme =
615: d_es_allocation_memoire;
616: return(NULL);
617: }
618:
619: sprintf((unsigned char *) (*s_sous_objet).objet,
620: "(%s%s%s)", (unsigned char *)
621: (*s_sous_objet_1)
622: .objet, (*((struct_fonction *)
623: (*(*l_element_courant).donnee).objet))
624: .nom_fonction, (unsigned char *)
625: (*s_sous_objet_2).objet);
626: }
627: else
628: {
629: if (((*s_sous_objet).objet =
630: (void *) malloc((strlen(
631: (unsigned char *) (*s_sous_objet_1)
632: .objet) + strlen((*((struct_fonction *)
633: (*(*l_element_courant).donnee).objet))
634: .nom_fonction) + strlen(
635: (unsigned char *) (*s_sous_objet_2)
636: .objet) + 1) * sizeof(unsigned char)))
637: == NULL)
638: {
639: (*s_etat_processus).erreur_systeme =
640: d_es_allocation_memoire;
641: return(NULL);
642: }
643:
644: sprintf((unsigned char *) (*s_sous_objet).objet,
645: "%s%s%s", (unsigned char *)
646: (*s_sous_objet_1)
647: .objet, (*((struct_fonction *)
648: (*(*l_element_courant).donnee).objet))
649: .nom_fonction, (unsigned char *)
650: (*s_sous_objet_2).objet);
651: }
652:
653: liberation(s_etat_processus, s_sous_objet_1);
654: liberation(s_etat_processus, s_sous_objet_2);
655:
656: if (empilement(s_etat_processus,
657: &((*s_etat_processus).l_base_pile),
658: s_sous_objet) == d_erreur)
659: {
660: return(NULL);
661: }
662: }
663: else if (strcmp((*((struct_fonction *)
664: (*(*l_element_courant).donnee).objet))
665: .nom_fonction,
666: "NOT") == 0)
667: {
668: if (depilement(s_etat_processus,
669: &((*s_etat_processus)
670: .l_base_pile), &s_sous_objet_1) == d_erreur)
671: {
672: return(NULL);
673: }
674:
675: if ((s_sous_objet = allocation(s_etat_processus,
676: CHN)) == NULL)
677: {
678: (*s_etat_processus).erreur_systeme =
679: d_es_allocation_memoire;
680: return(NULL);
681: }
682:
683: if (((*s_sous_objet).objet = (unsigned char *)
684: malloc(
685: (strlen((unsigned char *) (*s_sous_objet_1)
686: .objet) + 4 + 1) * sizeof(unsigned char)))
687: == NULL)
688: {
689: (*s_etat_processus).erreur_systeme =
690: d_es_allocation_memoire;
691: return(NULL);
692: }
693:
694: sprintf((unsigned char *) (*s_sous_objet).objet,
695: "%s %s", (*((struct_fonction *)
696: (*(*l_element_courant).donnee).objet))
697: .nom_fonction, (unsigned char *)
698: (*s_sous_objet_1).objet );
699:
700: liberation(s_etat_processus, s_sous_objet_1);
701:
702: if (empilement(s_etat_processus,
703: &((*s_etat_processus)
704: .l_base_pile), s_sous_objet) == d_erreur)
705: {
706: return(NULL);
707: }
708: }
709: else if ((strcmp((*((struct_fonction *)
710: (*(*l_element_courant).donnee).objet))
711: .nom_fonction,
712: "OR") == 0) || (strcmp((*((struct_fonction *)
713: (*(*l_element_courant).donnee).objet))
714: .nom_fonction,
715: "XOR") == 0) || (strcmp((*((struct_fonction *)
716: (*(*l_element_courant).donnee).objet))
717: .nom_fonction,
718: "AND") == 0))
719: {
720: if (depilement(s_etat_processus,
721: &((*s_etat_processus)
722: .l_base_pile), &s_sous_objet_2) == d_erreur)
723: {
724: return(NULL);
725: }
726:
727: if (depilement(s_etat_processus,
728: &((*s_etat_processus)
729: .l_base_pile), &s_sous_objet_1) == d_erreur)
730: {
731: return(NULL);
732: }
733:
734: if ((s_sous_objet = allocation(s_etat_processus,
735: CHN)) == NULL)
736: {
737: (*s_etat_processus).erreur_systeme =
738: d_es_allocation_memoire;
739: return(NULL);
740: }
741:
742: if (((*s_sous_objet).objet = (void *)
743: malloc((strlen(
744: (unsigned char *) (*s_sous_objet_1).objet) +
745: strlen((*((struct_fonction *)
746: (*(*l_element_courant).donnee).objet))
747: .nom_fonction) + strlen((unsigned char *)
748: (*s_sous_objet_2).objet) + 2 + 1) *
749: sizeof(unsigned char))) == NULL)
750: {
751: (*s_etat_processus).erreur_systeme =
752: d_es_allocation_memoire;
753: return(NULL);
754: }
755:
756: sprintf((unsigned char *) (*s_sous_objet).objet,
757: "%s %s %s", (unsigned char *)
758: (*s_sous_objet_1)
759: .objet, (*((struct_fonction *)
760: (*(*l_element_courant).donnee).objet))
761: .nom_fonction, (unsigned char *)
762: (*s_sous_objet_2).objet);
763:
764: liberation(s_etat_processus, s_sous_objet_1);
765: liberation(s_etat_processus, s_sous_objet_2);
766:
767: if (empilement(s_etat_processus,
768: &((*s_etat_processus)
769: .l_base_pile), s_sous_objet) == d_erreur)
770: {
771: return(NULL);
772: }
773: }
774: else
775: {
776: nombre_arguments = (*((struct_fonction *)
777: (*(*l_element_courant).donnee).objet))
778: .nombre_arguments;
779:
780: if ((chaine = (unsigned char *)
781: malloc(sizeof(unsigned char))) == NULL)
782: {
783: (*s_etat_processus).erreur_systeme =
784: d_es_allocation_memoire;
785: return(NULL);
786: }
787:
788: chaine[0] = d_code_fin_chaine;
789:
790: for(i = 0; i < nombre_arguments; i++)
791: {
792: if ((nombre_arguments - i) > 1)
793: {
794: l_liste1 = (*s_etat_processus).l_base_pile;
795:
796: for(j = 2; j < (nombre_arguments - i); j++)
797: {
798: l_liste1 = (*l_liste1).suivant;
799: }
800:
801: l_liste2 = (*l_liste1).suivant;
802: (*l_liste1).suivant = (*l_liste2).suivant;
803: (*l_liste2).suivant = (*s_etat_processus)
804: .l_base_pile;
805: (*s_etat_processus).l_base_pile = l_liste2;
806: }
807:
808: if (depilement(s_etat_processus,
809: &((*s_etat_processus).l_base_pile),
810: &s_sous_objet) == d_erreur)
811: {
812: return(NULL);
813: }
814:
815: chaine_sauvegarde = chaine;
816:
817: if (strlen(chaine_sauvegarde) == 0)
818: {
819: if ((chaine = (unsigned char *)
820: malloc((strlen((unsigned char *)
821: (*s_sous_objet).objet) + 1) *
822: sizeof(unsigned char))) == NULL)
823: {
824: (*s_etat_processus).erreur_systeme =
825: d_es_allocation_memoire;
826: return(NULL);
827: }
828:
829: sprintf(chaine, "%s", (unsigned char *)
830: (*s_sous_objet).objet);
831: }
832: else
833: {
834: if ((chaine = (unsigned char *)
835: malloc((strlen(chaine_sauvegarde)
836: + 1 + strlen((unsigned char *)
837: (*s_sous_objet).objet) + 1) *
838: sizeof(unsigned char))) == NULL)
839: {
840: (*s_etat_processus).erreur_systeme =
841: d_es_allocation_memoire;
842: return(NULL);
843: }
844:
845: sprintf(chaine, "%s,%s", chaine_sauvegarde,
846: (unsigned char *) (*s_sous_objet)
847: .objet);
848: }
849:
850: free(chaine_sauvegarde);
851: liberation(s_etat_processus, s_sous_objet);
852: }
853:
854: chaine_sauvegarde = chaine;
855:
856: if ((chaine = (unsigned char *) malloc((strlen(
857: (*((struct_fonction *)
858: (*(*l_element_courant)
859: .donnee).objet)).nom_fonction) + 2 +
860: strlen(chaine_sauvegarde) + 1) *
861: sizeof(unsigned char))) == NULL)
862: {
863: (*s_etat_processus).erreur_systeme =
864: d_es_allocation_memoire;
865: return(NULL);
866: }
867:
868: sprintf(chaine, "%s(%s)", (*((struct_fonction *)
869: (*(*l_element_courant).donnee).objet))
870: .nom_fonction, chaine_sauvegarde);
871: free(chaine_sauvegarde);
872:
873: if ((s_sous_objet = allocation(s_etat_processus,
874: CHN)) == NULL)
875: {
876: (*s_etat_processus).erreur_systeme =
877: d_es_allocation_memoire;
878: return(NULL);
879: }
880:
881: (*s_sous_objet).objet = (void *) chaine;
882:
883: if (empilement(s_etat_processus,
884: &((*s_etat_processus)
885: .l_base_pile), s_sous_objet) == d_erreur)
886: {
887: return(NULL);
888: }
889: }
890: }
891: }
892: else
893: {
894: if ((s_sous_objet = allocation(s_etat_processus, CHN))
895: == NULL)
896: {
897: (*s_etat_processus).erreur_systeme =
898: d_es_allocation_memoire;
899: return(NULL);
900: }
901:
902: if (((*s_sous_objet).objet = (void *) formateur_fichier(
903: s_etat_processus, (*l_element_courant).donnee,
904: s_format, longueur, longueur_champ, format_sortie,
905: type, longueur_effective, recursivite,
906: export_fichier)) == NULL)
907: {
908: (*s_etat_processus).erreur_systeme =
909: d_es_allocation_memoire;
910: return(NULL);
911: }
912:
913: if (((*(*l_element_courant).donnee).type == ALG)
914: || ((*(*l_element_courant).donnee).type == NOM))
915: {
916: chaine_sauvegarde = (unsigned char *)
917: (*s_sous_objet).objet;
918:
919: if (((*s_sous_objet).objet = malloc((strlen(
920: chaine_sauvegarde) - 1) *
921: sizeof(unsigned char))) == NULL)
922: {
923: (*s_etat_processus).erreur_systeme =
924: d_es_allocation_memoire;
925: return(NULL);
926: }
927:
928: ptrl = chaine_sauvegarde;
929: ptre = (unsigned char *) (*s_sous_objet).objet;
930:
931: for(ptrl++, i = ((integer8) strlen(chaine_sauvegarde))
932: - 2; i > 0; i--, *ptre++ = *ptrl++);
933:
934: (*ptre) = d_code_fin_chaine;
935:
936: free(chaine_sauvegarde);
937: }
938: else if ((*(*l_element_courant).donnee).type == CHN)
939: {
940: chaine_sauvegarde = (unsigned char *)
941: (*s_sous_objet).objet;
942:
943: if (((*s_sous_objet).objet = malloc((strlen(
944: chaine_sauvegarde) + 3) *
945: sizeof(unsigned char))) == NULL)
946: {
947: (*s_etat_processus).erreur_systeme =
948: d_es_allocation_memoire;
949: return(NULL);
950: }
951:
952: sprintf((unsigned char *) (*s_sous_objet).objet,
953: "\"%s\"", chaine_sauvegarde);
954:
955: free(chaine_sauvegarde);
956: }
957:
958: if (empilement(s_etat_processus, &((*s_etat_processus)
959: .l_base_pile), s_sous_objet) == d_erreur)
960: {
961: return(NULL);
962: }
963: }
964:
965: l_element_courant = (*l_element_courant).suivant;
966: }
967:
968: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
969: &s_sous_objet) == d_erreur)
970: {
971: return(NULL);
972: }
973:
974: if ((chaine = (unsigned char *) malloc((strlen((unsigned char *)
975: (*s_sous_objet).objet) + 2 + 1) * sizeof(unsigned char)))
976: == NULL)
977: {
978: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
979: return(NULL);
980: }
981:
982: sprintf(chaine, "'%s'", (unsigned char *) (*s_sous_objet).objet);
983: liberation(s_etat_processus, s_sous_objet);
984: }
985: else if ((*s_objet).type == BIN)
986: {
987:
988: /*
989: --------------------------------------------------------------------------------
990: Entier binaire en base 2, 8, 10 ou 16
991: --------------------------------------------------------------------------------
992: */
993:
994: if ((format_sortie != 'B') && (format_sortie != 'N'))
995: {
996: (*s_etat_processus).erreur_execution =
997: d_ex_erreur_format_fichier;
998: return(NULL);
999: }
1000:
1001: if (format_sortie == 'N')
1002: {
1003: sprintf(tampon, "%llX", (unsigned long long) (*((logical8 *)
1004: ((*s_objet).objet))));
1005: strcpy(base, "h");
1006: }
1007: else
1008: {
1009: switch(longueur)
1010: {
1011: case 2:
1012: {
1013: sprintf(tampon, "%llX", (unsigned long long)
1014: (*((logical8 *) ((*s_objet).objet))));
1015:
1016: chaine = (unsigned char *) malloc((strlen(tampon) + 1)
1017: * sizeof(unsigned char));
1018:
1019: if (chaine == NULL)
1020: {
1021: (*s_etat_processus).erreur_systeme =
1022: d_es_allocation_memoire;
1023: return(NULL);
1024: }
1025:
1026: strcpy(chaine, tampon);
1027: tampon[0] = 0;
1028:
1029: for(i = 0; i < ((integer8) strlen(chaine)); i++)
1030: {
1031: switch(chaine[i])
1032: {
1033: case '0' :
1034: {
1035: strcat(tampon, (i != 0) ? "0000" : "0");
1036: break;
1037: }
1038: case '1' :
1039: {
1040: strcat(tampon, (i != 0) ? "0001" : "1");
1041: break;
1042: }
1043: case '2' :
1044: {
1045: strcat(tampon, (i != 0) ? "0010" : "10");
1046: break;
1047: }
1048: case '3' :
1049: {
1050: strcat(tampon, (i != 0) ? "0011" : "11");
1051: break;
1052: }
1053: case '4' :
1054: {
1055: strcat(tampon, (i != 0) ? "0100" : "100");
1056: break;
1057: }
1058: case '5' :
1059: {
1060: strcat(tampon, (i != 0) ? "0101" : "101");
1061: break;
1062: }
1063: case '6' :
1064: {
1065: strcat(tampon, (i != 0) ? "0110" : "110");
1066: break;
1067: }
1068: case '7' :
1069: {
1070: strcat(tampon, (i != 0) ? "0111" : "111");
1071: break;
1072: }
1073: case '8' :
1074: {
1075: strcat(tampon, "1000");
1076: break;
1077: }
1078: case '9' :
1079: {
1080: strcat(tampon, "1001");
1081: break;
1082: }
1083: case 'A' :
1084: {
1085: strcat(tampon, "1010");
1086: break;
1087: }
1088: case 'B' :
1089: {
1090: strcat(tampon, "1011");
1091: break;
1092: }
1093: case 'C' :
1094: {
1095: strcat(tampon, "1100");
1096: break;
1097: }
1098: case 'D' :
1099: {
1100: strcat(tampon, "1101");
1101: break;
1102: }
1103: case 'E' :
1104: {
1105: strcat(tampon, "1110");
1106: break;
1107: }
1108: case 'F' :
1109: {
1110: strcat(tampon, "1111");
1111: break;
1112: }
1113: }
1114: }
1115:
1116: free(chaine);
1117: strcpy(base, "b");
1118: break;
1119: }
1120:
1121: case 8:
1122: {
1123: sprintf(tampon, "%llo", (*((unsigned long long *)
1124: ((*s_objet).objet))));
1125: strcpy(base, "o");
1126: break;
1127: }
1128:
1129: case 10:
1130: {
1131: sprintf(tampon, "%llu", (*((unsigned long long *)
1132: ((*s_objet).objet))));
1133: strcpy(base, "d");
1134: break;
1135: }
1136:
1137: case 16:
1138: {
1139: sprintf(tampon, "%llX", (unsigned long long)
1140: (*((logical8 *) ((*s_objet).objet))));
1141: strcpy(base, "h");
1142: break;
1143: }
1144:
1145: default:
1146: {
1147: (*s_etat_processus).erreur_execution =
1148: d_ex_erreur_format_fichier;
1149: return(NULL);
1150: }
1151: }
1152: }
1153:
1154: if (format_sortie == 'B')
1155: {
1156: if ((longueur_champ > 0) && (longueur_champ
1157: < (signed) strlen(tampon)))
1158: {
1159: ptrl = &(tampon[((integer8) strlen(tampon))
1160: - longueur_champ]);
1161: ptre = tampon;
1162:
1163: do
1164: {
1165: *ptre++ = *ptrl++;
1166: } while((*ptrl) != d_code_fin_chaine);
1167:
1168: (*ptre) = d_code_fin_chaine;
1169: }
1170: }
1171:
1172: chaine = (unsigned char *) malloc((strlen(tampon) + 4)
1173: * sizeof(unsigned char));
1174:
1175: if (chaine == NULL)
1176: {
1177: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1178: return(NULL);
1179: }
1180:
1181: strcpy(chaine, "# ");
1182:
1183: strcat(chaine, tampon);
1184: strcat(chaine, base);
1185: }
1186: else if ((*s_objet).type == CHN)
1187: {
1188:
1189: /*
1190: --------------------------------------------------------------------------------
1191: Chaîne de caractères
1192: --------------------------------------------------------------------------------
1193: */
1194:
1195: if ((format_sortie != 'C') && (format_sortie != 'N'))
1196: {
1197: (*s_etat_processus).erreur_execution =
1198: d_ex_erreur_format_fichier;
1199: return(NULL);
1200: }
1201:
1202: longueur_reelle_chaine = longueur_chaine(s_etat_processus,
1203: (unsigned char *) (*s_objet).objet);
1204:
1205: if (format_sortie == 'N')
1206: {
1207: longueur_champ = -1;
1208: }
1209:
1210: if ((longueur_champ == -1) || (longueur_reelle_chaine <
1211: longueur_champ))
1212: {
1213: chaine = (unsigned char *) malloc((strlen((unsigned char *)
1214: ((*s_objet).objet)) + 1) * sizeof(unsigned char));
1215:
1216: if (chaine == NULL)
1217: {
1218: (*s_etat_processus).erreur_systeme =
1219: d_es_allocation_memoire;
1220: return(NULL);
1221: }
1222:
1223: strcpy(chaine, (unsigned char *) ((*s_objet).objet));
1224: }
1225: else
1226: {
1227: longueur_reelle_chaine = pointeur_ieme_caractere(
1228: s_etat_processus, (unsigned char *)
1229: (*s_objet).objet, longueur_champ)
1230: - ((unsigned char *) (*s_objet).objet);
1231:
1232: if ((chaine = malloc((((size_t) longueur_reelle_chaine) + 1) *
1233: sizeof(unsigned char))) == NULL)
1234: {
1235: (*s_etat_processus).erreur_systeme =
1236: d_es_allocation_memoire;
1237: return(NULL);
1238: }
1239:
1240: strncpy(chaine, (unsigned char *) ((*s_objet).objet),
1241: (size_t) longueur_reelle_chaine);
1242: chaine[longueur_reelle_chaine] = d_code_fin_chaine;
1243: }
1244: }
1245: else if ((*s_objet).type == CPL)
1246: {
1247:
1248: /*
1249: --------------------------------------------------------------------------------
1250: Complexe
1251: --------------------------------------------------------------------------------
1252: */
1253:
1254: if (format_sortie == 'N')
1255: {
1256: format_sortie = 'S';
1257: }
1258:
1259: if ((format_sortie != 'S') && (format_sortie != 'F') &&
1260: (format_sortie != 'I') && (format_sortie != 'E'))
1261: {
1262: (*s_etat_processus).erreur_execution =
1263: d_ex_erreur_format_fichier;
1264: return(NULL);
1265: }
1266:
1267: if ((chaine_formatee = formateur_fichier_nombre(s_etat_processus,
1268: (void *) ((struct_complexe16 *) ((*s_objet).objet)), 'C',
1269: longueur, longueur_champ, format_sortie)) == NULL)
1270: {
1271: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1272: return(NULL);
1273: }
1274:
1275: chaine = (unsigned char *) malloc((strlen(chaine_formatee)
1276: + 1) * sizeof(unsigned char));
1277:
1278: if (chaine == NULL)
1279: {
1280: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1281: return(NULL);
1282: }
1283:
1284: strcpy(chaine, chaine_formatee);
1285: free(chaine_formatee);
1286: }
1287: else if ((*s_objet).type == RPN)
1288: {
1289:
1290: /*
1291: --------------------------------------------------------------------------------
1292: Définition
1293: --------------------------------------------------------------------------------
1294: */
1295:
1296: if (format_sortie != 'N')
1297: {
1298: (*s_etat_processus).erreur_execution =
1299: d_ex_erreur_format_fichier;
1300: return(NULL);
1301: }
1302:
1303: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
1304: chaine_sauvegarde = chaine;
1305:
1306: while(l_element_courant != NULL)
1307: {
1308: if ((chaine_formatee = formateur_fichier(s_etat_processus,
1309: (*l_element_courant).donnee, s_format,
1310: longueur, longueur_champ, format_sortie, type,
1311: longueur_effective, recursivite, export_fichier))
1312: == NULL)
1313: {
1314: return(NULL);
1315: }
1316:
1317: if ((*(*l_element_courant).donnee).type == CHN)
1318: {
1319: chaine_tampon = chaine_formatee;
1320:
1321: if ((chaine_formatee = (unsigned char *) malloc((strlen(
1322: chaine_tampon) + 3) * sizeof(unsigned char)))
1323: == NULL)
1324: {
1325: (*s_etat_processus).erreur_systeme =
1326: d_es_allocation_memoire;
1327: return(NULL);
1328: }
1329:
1330: sprintf(chaine_formatee, "\"%s\"", chaine_tampon);
1331: free(chaine_tampon);
1332: }
1333:
1334: l_element_courant = (*l_element_courant).suivant;
1335:
1336: if (chaine != NULL)
1337: {
1338: chaine_sauvegarde = chaine;
1339:
1340: if ((chaine = (unsigned char *) malloc((strlen(
1341: chaine_sauvegarde) + strlen(chaine_formatee) + 2) *
1342: sizeof(unsigned char))) == NULL)
1343: {
1344: (*s_etat_processus).erreur_systeme =
1345: d_es_allocation_memoire;
1346: return(NULL);
1347: }
1348:
1349: strcpy(chaine, chaine_sauvegarde);
1350: free(chaine_sauvegarde);
1351: strcat(chaine, " ");
1352: strcat(chaine, chaine_formatee);
1353: free(chaine_formatee);
1354: }
1355: else
1356: {
1357: chaine = chaine_formatee;
1358: }
1359: }
1360:
1361: chaine_sauvegarde = chaine;
1362: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 1) *
1363: sizeof(unsigned char));
1364:
1365: if (chaine == NULL)
1366: {
1367: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1368: free(chaine_sauvegarde);
1369: return(NULL);
1370: }
1371:
1372: chaine_sauvegarde[strlen(chaine_sauvegarde)] = d_code_fin_chaine;
1373: strcpy(chaine, chaine_sauvegarde);
1374: free(chaine_sauvegarde);
1375: }
1376: else if ((*s_objet).type == INT)
1377: {
1378:
1379: /*
1380: --------------------------------------------------------------------------------
1381: Entier
1382: --------------------------------------------------------------------------------
1383: */
1384:
1385: if (format_sortie == 'N')
1386: {
1387: format_sortie = 'S';
1388: }
1389:
1390: if ((format_sortie != 'S') && (format_sortie != 'F') &&
1391: (format_sortie != 'I') && (format_sortie != 'E'))
1392: {
1393: (*s_etat_processus).erreur_execution =
1394: d_ex_erreur_format_fichier;
1395: return(NULL);
1396: }
1397:
1398: if ((chaine_formatee = formateur_fichier_nombre(s_etat_processus,
1399: (void *) ((integer8 *) ((*s_objet).objet)), 'I',
1400: longueur, longueur_champ, format_sortie)) == NULL)
1401: {
1402: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1403: return(NULL);
1404: }
1405:
1406: chaine = (unsigned char *) malloc((strlen(chaine_formatee) + 1)
1407: * sizeof(unsigned char));
1408:
1409: if (chaine == NULL)
1410: {
1411: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1412: return(NULL);
1413: }
1414:
1415: strcpy(chaine, chaine_formatee);
1416: free(chaine_formatee);
1417: }
1418: else if ((*s_objet).type == FCT)
1419: {
1420:
1421: /*
1422: --------------------------------------------------------------------------------
1423: Fonction
1424: --------------------------------------------------------------------------------
1425: */
1426:
1427: if (format_sortie != 'N')
1428: {
1429: (*s_etat_processus).erreur_execution =
1430: d_ex_erreur_format_fichier;
1431: return(NULL);
1432: }
1433:
1434: chaine = (unsigned char *) malloc((strlen((*((struct_fonction *)
1435: ((*s_objet).objet))).nom_fonction) + 1) *
1436: sizeof(unsigned char));
1437:
1438: if (chaine == NULL)
1439: {
1440: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1441: return(NULL);
1442: }
1443:
1444: strcpy(chaine, (unsigned char *) (*((struct_fonction *)
1445: ((*s_objet).objet))).nom_fonction);
1446: }
1447: else if ((*s_objet).type == LST)
1448: {
1449:
1450: /*
1451: --------------------------------------------------------------------------------
1452: Liste
1453: --------------------------------------------------------------------------------
1454: */
1455:
1456: chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
1457:
1458: if (chaine == NULL)
1459: {
1460: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1461: return(NULL);
1462: }
1463:
1464: strcpy(chaine, "{");
1465:
1466: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
1467: l_element_courant_format = (struct_liste_chainee *)
1468: (*s_format).objet;
1469: nombre_elements = 0;
1470:
1471: while((l_element_courant != NULL) &&
1472: (l_element_courant_format != NULL))
1473: {
1474: if ((((*(*l_element_courant_format).donnee).type == LST)
1475: && ((*(*l_element_courant).donnee).type == LST)) ||
1476: (((*(*l_element_courant_format).donnee).type == TBL)
1477: && ((*(*l_element_courant).donnee).type == TBL)))
1478: {
1479: chaine_sauvegarde = chaine;
1480:
1481: if (format_sortie != 'N')
1482: {
1483: if ((chaine_formatee =
1484: formateur_fichier(s_etat_processus,
1485: (*l_element_courant).donnee,
1486: (*l_element_courant_format).donnee,
1487: 0, 0, ' ', 'F', longueur_effective, recursivite,
1488: export_fichier)) == NULL)
1489: {
1490: return(NULL);
1491: }
1492: }
1493: else
1494: {
1495: if ((chaine_formatee =
1496: formateur_fichier(s_etat_processus,
1497: (*l_element_courant).donnee,
1498: (*l_element_courant_format).donnee,
1499: 0, 0, 'N', 'F', longueur_effective, recursivite,
1500: export_fichier)) == NULL)
1501: {
1502: return(NULL);
1503: }
1504: }
1505:
1506: chaine = (unsigned char *) malloc((strlen(chaine_formatee)
1507: + strlen(chaine_sauvegarde) + 2)
1508: * sizeof(unsigned char));
1509:
1510: if (chaine == NULL)
1511: {
1512: (*s_etat_processus).erreur_systeme =
1513: d_es_allocation_memoire;
1514: return(NULL);
1515: }
1516:
1517: strcpy(chaine, chaine_sauvegarde);
1518: free(chaine_sauvegarde);
1519: strcat(chaine, " ");
1520: strcat(chaine, chaine_formatee);
1521: free(chaine_formatee);
1522: }
1523: else if ((*(*l_element_courant_format).donnee).type != CHN)
1524: {
1525: free(chaine);
1526:
1527: (*s_etat_processus).erreur_execution =
1528: d_ex_erreur_format_fichier;
1529: return(NULL);
1530: }
1531: else
1532: {
1533: if ((format_chaine = conversion_majuscule((unsigned char *)
1534: (*(*l_element_courant_format).donnee).objet))
1535: == NULL)
1536: {
1537: (*s_etat_processus).erreur_systeme =
1538: d_es_allocation_memoire;
1539: return(NULL);
1540: }
1541:
1542: format_degenere = d_faux;
1543:
1544: if (strncmp("STANDARD*", format_chaine, 9) == 0)
1545: {
1546: format_sortie = 'S';
1547: position_1 = 9;
1548: format_degenere = d_vrai;
1549: }
1550: else if (strncmp("BINARY*", format_chaine, 7) == 0)
1551: {
1552: format_sortie = 'B';
1553: position_1 = 7;
1554: }
1555: else if (strncmp("FIXED*", format_chaine, 6) == 0)
1556: {
1557: format_sortie = 'F';
1558: position_1 = 6;
1559: }
1560: else if (strncmp("SCIENTIFIC*", format_chaine, 11) == 0)
1561: {
1562: format_sortie = 'I';
1563: position_1 = 11;
1564: }
1565: else if (strncmp("ENGINEER*", format_chaine, 9) == 0)
1566: {
1567: format_sortie = 'E';
1568: position_1 = 9;
1569: }
1570: else if (strncmp("CHARACTER*", format_chaine, 10) == 0)
1571: {
1572: format_sortie = 'C';
1573: position_1 = 10;
1574: format_degenere = d_vrai;
1575: }
1576: else if (strcmp("NATIVE*(*)", format_chaine) == 0)
1577: {
1578: format_sortie = 'N';
1579: position_1 = 7;
1580: format_degenere = d_vrai;
1581: }
1582: else
1583: {
1584: free(chaine);
1585: free(format_chaine);
1586:
1587: (*s_etat_processus).erreur_execution =
1588: d_ex_erreur_format_fichier;
1589: return(NULL);
1590: }
1591:
1592: position_3 = ((integer8) strlen(format_chaine)) - 1;
1593:
1594: if (format_chaine[position_3] != ')')
1595: {
1596: free(chaine);
1597: free(format_chaine);
1598:
1599: (*s_etat_processus).erreur_execution =
1600: d_ex_erreur_format_fichier;
1601: return(NULL);
1602: }
1603:
1604: format_chaine[position_3] = d_code_fin_chaine;
1605:
1606: position_2 = position_1;
1607:
1608: while(format_chaine[position_2] != '(')
1609: {
1610: if (format_chaine[position_2] == d_code_fin_chaine)
1611: {
1612: free(chaine);
1613: free(format_chaine);
1614:
1615: (*s_etat_processus).erreur_execution =
1616: d_ex_erreur_format_fichier;
1617: return(NULL);
1618: }
1619:
1620: position_2++;
1621: }
1622:
1623: format_chaine[position_2++] = d_code_fin_chaine;
1624:
1625: if (format_degenere == d_faux)
1626: {
1627: if (sscanf(&(format_chaine[position_1]), "%lld",
1628: &longueur) != 1)
1629: {
1630: free(chaine);
1631: free(format_chaine);
1632:
1633: (*s_etat_processus).erreur_execution =
1634: d_ex_erreur_format_fichier;
1635: return(NULL);
1636: }
1637: }
1638: else
1639: {
1640: longueur = -1;
1641: }
1642:
1643: if (strcmp(&(format_chaine[position_2]), "*") != 0)
1644: {
1645: if (sscanf(&(format_chaine[position_2]), "%lld",
1646: &longueur_champ) != 1)
1647: {
1648: free(chaine);
1649: free(format_chaine);
1650:
1651: (*s_etat_processus).erreur_execution =
1652: d_ex_erreur_format_fichier;
1653: return(NULL);
1654: }
1655: }
1656: else
1657: {
1658: longueur_champ = -1;
1659: }
1660:
1661: if ((longueur >= 0) && (longueur_champ >= 0) && (longueur >
1662: longueur_champ) && (format_sortie != 'B'))
1663: {
1664: free(chaine);
1665: free(format_chaine);
1666:
1667: (*s_etat_processus).erreur_execution =
1668: d_ex_erreur_format_fichier;
1669: return(NULL);
1670: }
1671:
1672: free(format_chaine);
1673:
1674: chaine_sauvegarde = chaine;
1675:
1676: if ((chaine_formatee = formateur_fichier(s_etat_processus,
1677: (*l_element_courant).donnee, s_format,
1678: longueur, longueur_champ, format_sortie, type,
1679: longueur_effective, recursivite, export_fichier))
1680: == NULL)
1681: {
1682: free(chaine);
1683: return(NULL);
1684: }
1685:
1686: if ((*(*l_element_courant).donnee).type == CHN)
1687: {
1688: chaine = (unsigned char *)
1689: malloc((strlen(chaine_formatee)
1690: + strlen(chaine_sauvegarde) + 4)
1691: * sizeof(unsigned char));
1692:
1693: if (chaine == NULL)
1694: {
1695: (*s_etat_processus).erreur_systeme =
1696: d_es_allocation_memoire;
1697: return(NULL);
1698: }
1699:
1700: strcpy(chaine, chaine_sauvegarde);
1701: free(chaine_sauvegarde);
1702: strcat(chaine, " \"");
1703: strcat(chaine, chaine_formatee);
1704: free(chaine_formatee);
1705: strcat(chaine, "\"");
1706: }
1707: else if ((*(*l_element_courant).donnee).type == NOM)
1708: {
1709: chaine = (unsigned char *)
1710: malloc((strlen(chaine_formatee)
1711: + strlen(chaine_sauvegarde) + 2)
1712: * sizeof(unsigned char));
1713:
1714: if (chaine == NULL)
1715: {
1716: (*s_etat_processus).erreur_systeme =
1717: d_es_allocation_memoire;
1718: return(NULL);
1719: }
1720:
1721: sprintf(chaine, "%s %s", chaine_sauvegarde,
1722: chaine_formatee);
1723: free(chaine_formatee);
1724: }
1725: else
1726: {
1727: chaine = (unsigned char *)
1728: malloc((strlen(chaine_formatee)
1729: + strlen(chaine_sauvegarde) + 2)
1730: * sizeof(unsigned char));
1731:
1732: if (chaine == NULL)
1733: {
1734: (*s_etat_processus).erreur_systeme =
1735: d_es_allocation_memoire;
1736: return(NULL);
1737: }
1738:
1739: strcpy(chaine, chaine_sauvegarde);
1740: free(chaine_sauvegarde);
1741: strcat(chaine, " ");
1742: strcat(chaine, chaine_formatee);
1743: free(chaine_formatee);
1744: }
1745: }
1746:
1747: nombre_elements++;
1748: l_element_courant = (*l_element_courant).suivant;
1749:
1750: if (format_sortie != 'N')
1751: {
1752: l_element_courant_format =
1753: (*l_element_courant_format).suivant;
1754: }
1755: }
1756:
1757: // Dans le cas où le format de sortie n'est pas du type
1758: // NATIVE*(*), on vérifie que tous les éléments du format et
1759: // de la liste d'arguments ont été consommés.
1760:
1761: if (format_sortie != 'N')
1762: {
1763: if ((l_element_courant != NULL) ||
1764: (l_element_courant_format != NULL))
1765: {
1766: free(chaine);
1767:
1768: (*s_etat_processus).erreur_execution =
1769: d_ex_erreur_format_fichier;
1770: return(NULL);
1771: }
1772: }
1773:
1774: chaine_sauvegarde = chaine;
1775: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 3)
1776: * sizeof(unsigned char));
1777:
1778: if (chaine == NULL)
1779: {
1780: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1781: return(NULL);
1782: }
1783:
1784: strcpy(chaine, chaine_sauvegarde);
1785: free(chaine_sauvegarde);
1786: strcat(chaine, " }");
1787: }
1788: else if ((*s_objet).type == TBL)
1789: {
1790:
1791: /*
1792: --------------------------------------------------------------------------------
1793: Table
1794: --------------------------------------------------------------------------------
1795: */
1796:
1797: if (((*s_format).type != TBL) && (format_sortie != 'N'))
1798: {
1799: (*s_etat_processus).erreur_execution =
1800: d_ex_erreur_format_fichier;
1801: return(NULL);
1802: }
1803:
1804: if (format_sortie != 'N')
1805: {
1806: if ((*((struct_tableau *) (*s_objet).objet)).nombre_elements !=
1807: (*((struct_tableau *) (*s_format).objet))
1808: .nombre_elements)
1809: {
1810: (*s_etat_processus).erreur_execution =
1811: d_ex_erreur_format_fichier;
1812: return(NULL);
1813: }
1814: }
1815:
1816: chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
1817:
1818: if (chaine == NULL)
1819: {
1820: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1821: return(NULL);
1822: }
1823:
1824: strcpy(chaine, "<[");
1825:
1826: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
1827: .nombre_elements; i++)
1828: {
1829: if (format_sortie != 'N')
1830: {
1831: if ((((*(*((struct_tableau *) (*s_format).objet))
1832: .elements[i]).type == LST) &&
1833: ((*(*((struct_tableau *) (*s_objet).objet))
1834: .elements[i]).type == LST)) ||
1835: (((*(*((struct_tableau *) (*s_format).objet))
1836: .elements[i]).type == TBL) &&
1837: ((*(*((struct_tableau *) (*s_objet).objet))
1838: .elements[i]).type == TBL)))
1839: {
1840: chaine_sauvegarde = chaine;
1841:
1842: if ((chaine_formatee = formateur_fichier(
1843: s_etat_processus,
1844: (*(*((struct_tableau *) (*s_objet).objet))
1845: .elements[i]).objet,
1846: (*(*((struct_tableau *) (*s_format).objet))
1847: .elements[i]).objet,
1848: 0, 0, ' ', 'F', longueur_effective, recursivite,
1849: export_fichier)) == NULL)
1850: {
1851: return(NULL);
1852: }
1853:
1854: if ((chaine = (unsigned char *) malloc((strlen(
1855: chaine_formatee) + strlen(chaine_sauvegarde)
1856: + 2) * sizeof(unsigned char))) == NULL)
1857: {
1858: (*s_etat_processus).erreur_systeme =
1859: d_es_allocation_memoire;
1860: return(NULL);
1861: }
1862:
1863: strcpy(chaine, chaine_sauvegarde);
1864: free(chaine_sauvegarde);
1865: strcat(chaine, " ");
1866: strcat(chaine, chaine_formatee);
1867: free(chaine_formatee);
1868: }
1869: else if ((*(*((struct_tableau *) (*s_format).objet))
1870: .elements[i]).type != CHN)
1871: {
1872: free(chaine);
1873:
1874: (*s_etat_processus).erreur_execution =
1875: d_ex_erreur_format_fichier;
1876: return(NULL);
1877: }
1878: else
1879: {
1880: if ((format_chaine = conversion_majuscule(
1881: (unsigned char *) (*(*((struct_tableau *)
1882: (*s_format).objet)).elements[i]).objet))
1883: == NULL)
1884: {
1885: (*s_etat_processus).erreur_systeme =
1886: d_es_allocation_memoire;
1887: return(NULL);
1888: }
1889:
1890: format_degenere = d_faux;
1891:
1892: if (strncmp("STANDARD*", format_chaine, 9) == 0)
1893: {
1894: format_sortie = 'S';
1895: position_1 = 9;
1896: format_degenere = d_vrai;
1897: }
1898: else if (strncmp("BINARY*", format_chaine, 7) == 0)
1899: {
1900: format_sortie = 'B';
1901: position_1 = 7;
1902: }
1903: else if (strncmp("FIXED*", format_chaine, 6) == 0)
1904: {
1905: format_sortie = 'F';
1906: position_1 = 6;
1907: }
1908: else if (strncmp("SCIENTIFIC*", format_chaine, 11) == 0)
1909: {
1910: format_sortie = 'I';
1911: position_1 = 11;
1912: }
1913: else if (strncmp("ENGINEER*", format_chaine, 9) == 0)
1914: {
1915: format_sortie = 'E';
1916: position_1 = 9;
1917: }
1918: else if (strncmp("CHARACTER*", format_chaine, 10) == 0)
1919: {
1920: format_sortie = 'C';
1921: position_1 = 10;
1922: format_degenere = d_vrai;
1923: }
1924: else if (strcmp("NATIVE*(*)", format_chaine) == 0)
1925: {
1926: format_sortie = 'N';
1927: position_1 = 7;
1928: format_degenere = d_vrai;
1929: }
1930: else
1931: {
1932: free(chaine);
1933: free(format_chaine);
1934:
1935: (*s_etat_processus).erreur_execution =
1936: d_ex_erreur_format_fichier;
1937: return(NULL);
1938: }
1939:
1940: position_3 = (integer8) strlen(format_chaine);
1941: format_chaine[--position_3] = d_code_fin_chaine;
1942:
1943: position_2 = position_1;
1944:
1945: while(format_chaine[position_2] != '(')
1946: {
1947: if (format_chaine[position_2] == d_code_fin_chaine)
1948: {
1949: free(chaine);
1950: free(format_chaine);
1951:
1952: (*s_etat_processus).erreur_execution =
1953: d_ex_erreur_format_fichier;
1954: return(NULL);
1955: }
1956:
1957: position_2++;
1958: }
1959:
1960: format_chaine[position_2++] = d_code_fin_chaine;
1961:
1962: if (format_degenere == d_faux)
1963: {
1964: if (sscanf(&(format_chaine[position_1]), "%lld",
1965: &longueur) != 1)
1966: {
1967: free(chaine);
1968: free(format_chaine);
1969:
1970: (*s_etat_processus).erreur_execution =
1971: d_ex_erreur_format_fichier;
1972: return(NULL);
1973: }
1974: }
1975: else
1976: {
1977: longueur = -1;
1978: }
1979:
1980: if (strcmp(&(format_chaine[position_2]), "*") != 0)
1981: {
1982: if (sscanf(&(format_chaine[position_2]), "%lld",
1983: &longueur_champ) != 1)
1984: {
1985: free(chaine);
1986: free(format_chaine);
1987:
1988: (*s_etat_processus).erreur_execution =
1989: d_ex_erreur_format_fichier;
1990: return(NULL);
1991: }
1992: }
1993: else
1994: {
1995: longueur_champ = -1;
1996: }
1997:
1998: if ((longueur >= 0) && (longueur_champ >= 0) &&
1999: (longueur > longueur_champ))
2000: {
2001: free(chaine);
2002: free(format_chaine);
2003:
2004: (*s_etat_processus).erreur_execution =
2005: d_ex_erreur_format_fichier;
2006: return(NULL);
2007: }
2008:
2009: free(format_chaine);
2010:
2011: chaine_sauvegarde = chaine;
2012:
2013: if ((chaine_formatee = formateur_fichier(
2014: s_etat_processus, (*((struct_tableau *)
2015: (*s_objet).objet)).elements[i], s_format,
2016: longueur, longueur_champ, format_sortie, type,
2017: longueur_effective, recursivite,
2018: export_fichier)) == NULL)
2019: {
2020: return(NULL);
2021: }
2022: }
2023: }
2024: else // NATIVE*(*)
2025: {
2026: chaine_sauvegarde = chaine;
2027:
2028: if ((chaine_formatee = formateur_fichier(
2029: s_etat_processus, (*((struct_tableau *)
2030: (*s_objet).objet)).elements[i], s_format,
2031: longueur, longueur_champ, format_sortie, type,
2032: longueur_effective, recursivite,
2033: export_fichier)) == NULL)
2034: {
2035: return(NULL);
2036: }
2037: }
2038:
2039: if ((*(*((struct_tableau *) (*s_objet).objet))
2040: .elements[i]).type == CHN)
2041: {
2042: chaine = (unsigned char *)
2043: malloc((strlen(chaine_formatee)
2044: + strlen(chaine_sauvegarde) + 4)
2045: * sizeof(unsigned char));
2046:
2047: if (chaine == NULL)
2048: {
2049: (*s_etat_processus).erreur_systeme =
2050: d_es_allocation_memoire;
2051: return(NULL);
2052: }
2053:
2054: strcpy(chaine, chaine_sauvegarde);
2055: free(chaine_sauvegarde);
2056: strcat(chaine, " \"");
2057: strcat(chaine, chaine_formatee);
2058: free(chaine_formatee);
2059: strcat(chaine, "\"");
2060: }
2061: else if ((*(*((struct_tableau *) (*s_objet).objet))
2062: .elements[i]).type == NOM)
2063: {
2064: chaine = (unsigned char *)
2065: malloc((strlen(chaine_formatee)
2066: + strlen(chaine_sauvegarde) + 2)
2067: * sizeof(unsigned char));
2068:
2069: if (chaine == NULL)
2070: {
2071: (*s_etat_processus).erreur_systeme =
2072: d_es_allocation_memoire;
2073: return(NULL);
2074: }
2075:
2076: sprintf(chaine, "%s %s", chaine_sauvegarde,
2077: chaine_formatee);
2078: free(chaine_formatee);
2079: }
2080: else
2081: {
2082: chaine = (unsigned char *)
2083: malloc((strlen(chaine_formatee)
2084: + strlen(chaine_sauvegarde) + 2)
2085: * sizeof(unsigned char));
2086:
2087: if (chaine == NULL)
2088: {
2089: (*s_etat_processus).erreur_systeme =
2090: d_es_allocation_memoire;
2091: return(NULL);
2092: }
2093:
2094: strcpy(chaine, chaine_sauvegarde);
2095: free(chaine_sauvegarde);
2096: strcat(chaine, " ");
2097: strcat(chaine, chaine_formatee);
2098: free(chaine_formatee);
2099: }
2100: }
2101:
2102: chaine_sauvegarde = chaine;
2103: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 4)
2104: * sizeof(unsigned char));
2105:
2106: if (chaine == NULL)
2107: {
2108: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2109: return(NULL);
2110: }
2111:
2112: strcpy(chaine, chaine_sauvegarde);
2113: free(chaine_sauvegarde);
2114: strcat(chaine, " ]>");
2115: }
2116: else if ((*s_objet).type == MCX)
2117: {
2118:
2119: /*
2120: --------------------------------------------------------------------------------
2121: Matrice complexe
2122: --------------------------------------------------------------------------------
2123: */
2124:
2125: if (format_sortie == 'N')
2126: {
2127: format_sortie = 'S';
2128: }
2129:
2130: if ((format_sortie != 'S') && (format_sortie != 'F') &&
2131: (format_sortie != 'I') && (format_sortie != 'E'))
2132: {
2133: (*s_etat_processus).erreur_execution =
2134: d_ex_erreur_format_fichier;
2135: return(NULL);
2136: }
2137:
2138: nombre_lignes = (*((struct_matrice *) ((*s_objet).objet)))
2139: .nombre_lignes;
2140: nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet)))
2141: .nombre_colonnes;
2142:
2143: chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
2144:
2145: if (chaine != NULL)
2146: {
2147: strcpy(chaine, "[[");
2148:
2149: for(i = 0; i < nombre_lignes; i++)
2150: {
2151: for(j = 0; j < nombre_colonnes; j++)
2152: {
2153: if ((chaine_formatee =
2154: formateur_fichier_nombre(s_etat_processus,
2155: (void *) &(((struct_complexe16 **)
2156: ((*((struct_matrice *)
2157: ((*s_objet).objet))).tableau))[i][j]), 'C',
2158: longueur, longueur_champ, format_sortie))
2159: == NULL)
2160: {
2161: (*s_etat_processus).erreur_systeme =
2162: d_es_allocation_memoire;
2163: return(NULL);
2164: }
2165:
2166: chaine_sauvegarde = chaine;
2167: chaine = (unsigned char *) malloc(
2168: (strlen(chaine_sauvegarde) +
2169: strlen(chaine_formatee) + 2)
2170: * sizeof(unsigned char));
2171:
2172: if (chaine == NULL)
2173: {
2174: (*s_etat_processus).erreur_systeme =
2175: d_es_allocation_memoire;
2176: return(NULL);
2177: }
2178:
2179: strcpy(chaine, chaine_sauvegarde);
2180: free(chaine_sauvegarde);
2181: strcat(chaine, " ");
2182: strcat(chaine, chaine_formatee);
2183: free(chaine_formatee);
2184: }
2185:
2186: chaine_sauvegarde = chaine;
2187: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2188: {
2189: chaine = (unsigned char *) malloc(
2190: (strlen(chaine_sauvegarde) + 6)
2191: * sizeof(unsigned char));
2192:
2193: if (chaine == NULL)
2194: {
2195: (*s_etat_processus).erreur_systeme =
2196: d_es_allocation_memoire;
2197: return(NULL);
2198: }
2199:
2200: strcpy(chaine, chaine_sauvegarde);
2201: free(chaine_sauvegarde);
2202: strcat(chaine, " ]\n [");
2203: }
2204: else
2205: {
2206: chaine = (unsigned char *) malloc(
2207: (strlen(chaine_sauvegarde) + 4)
2208: * sizeof(unsigned char));
2209:
2210: if (chaine == NULL)
2211: {
2212: (*s_etat_processus).erreur_systeme =
2213: d_es_allocation_memoire;
2214: return(NULL);
2215: }
2216:
2217: strcpy(chaine, chaine_sauvegarde);
2218: free(chaine_sauvegarde);
2219: strcat(chaine, " ][");
2220: }
2221: }
2222:
2223: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2224: {
2225: chaine[strlen(chaine) - 3] = ']';
2226: chaine[strlen(chaine) - 2] = 0;
2227:
2228: chaine_sauvegarde = chaine;
2229: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
2230: + 1) * sizeof(unsigned char));
2231:
2232: if (chaine == NULL)
2233: {
2234: (*s_etat_processus).erreur_systeme =
2235: d_es_allocation_memoire;
2236: return(NULL);
2237: }
2238:
2239: strcpy(chaine, chaine_sauvegarde);
2240: free(chaine_sauvegarde);
2241: }
2242: else
2243: {
2244: chaine[strlen(chaine) - 2] = ']';
2245: chaine[strlen(chaine) - 1] = 0;
2246:
2247: chaine_sauvegarde = chaine;
2248: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
2249: + 2) * sizeof(unsigned char));
2250:
2251: if (chaine == NULL)
2252: {
2253: (*s_etat_processus).erreur_systeme =
2254: d_es_allocation_memoire;
2255: return(NULL);
2256: }
2257:
2258: strcpy(chaine, chaine_sauvegarde);
2259: free(chaine_sauvegarde);
2260: strcat(chaine, "]");
2261: }
2262: }
2263: }
2264: else if ((*s_objet).type == MIN)
2265: {
2266:
2267: /*
2268: --------------------------------------------------------------------------------
2269: Matrice entière
2270: --------------------------------------------------------------------------------
2271: */
2272:
2273: if (format_sortie == 'N')
2274: {
2275: format_sortie = 'S';
2276: }
2277:
2278: if ((format_sortie != 'S') && (format_sortie != 'F') &&
2279: (format_sortie != 'I') && (format_sortie != 'E'))
2280: {
2281: (*s_etat_processus).erreur_execution =
2282: d_ex_erreur_format_fichier;
2283: return(NULL);
2284: }
2285:
2286: nombre_lignes = (*((struct_matrice *) ((*s_objet).objet)))
2287: .nombre_lignes;
2288: nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet)))
2289: .nombre_colonnes;
2290:
2291: chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
2292:
2293: if (chaine != NULL)
2294: {
2295: strcpy(chaine, "[[");
2296:
2297: for(i = 0; i < nombre_lignes; i++)
2298: {
2299: for(j = 0; j < nombre_colonnes; j++)
2300: {
2301: if ((chaine_formatee =
2302: formateur_fichier_nombre(s_etat_processus,
2303: (void *) &(((integer8 **) ((*((struct_matrice *)
2304: ((*s_objet).objet))).tableau))[i][j]), 'I',
2305: longueur, longueur_champ, format_sortie))
2306: == NULL)
2307: {
2308: (*s_etat_processus).erreur_systeme =
2309: d_es_allocation_memoire;
2310: return(NULL);
2311: }
2312:
2313: chaine_sauvegarde = chaine;
2314: chaine = (unsigned char *) malloc(
2315: (strlen(chaine_sauvegarde) +
2316: strlen(chaine_formatee) + 2)
2317: * sizeof(unsigned char));
2318:
2319: if (chaine == NULL)
2320: {
2321: (*s_etat_processus).erreur_systeme =
2322: d_es_allocation_memoire;
2323: return(NULL);
2324: }
2325:
2326: strcpy(chaine, chaine_sauvegarde);
2327: free(chaine_sauvegarde);
2328: strcat(chaine, " ");
2329: strcat(chaine, chaine_formatee);
2330: free(chaine_formatee);
2331: }
2332:
2333: chaine_sauvegarde = chaine;
2334: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2335: {
2336: chaine = (unsigned char *) malloc(
2337: (strlen(chaine_sauvegarde) + 6)
2338: * sizeof(unsigned char));
2339:
2340: if (chaine == NULL)
2341: {
2342: (*s_etat_processus).erreur_systeme =
2343: d_es_allocation_memoire;
2344: return(NULL);
2345: }
2346:
2347: strcpy(chaine, chaine_sauvegarde);
2348: free(chaine_sauvegarde);
2349: strcat(chaine, " ]\n [");
2350: }
2351: else
2352: {
2353: chaine = (unsigned char *) malloc(
2354: (strlen(chaine_sauvegarde) + 4)
2355: * sizeof(unsigned char));
2356:
2357: if (chaine == NULL)
2358: {
2359: (*s_etat_processus).erreur_systeme =
2360: d_es_allocation_memoire;
2361: return(NULL);
2362: }
2363:
2364: strcpy(chaine, chaine_sauvegarde);
2365: free(chaine_sauvegarde);
2366: strcat(chaine, " ][");
2367: }
2368: }
2369:
2370: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2371: {
2372: chaine[strlen(chaine) - 3] = ']';
2373: chaine[strlen(chaine) - 2] = 0;
2374:
2375: chaine_sauvegarde = chaine;
2376: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
2377: + 1) * sizeof(unsigned char));
2378:
2379: if (chaine == NULL)
2380: {
2381: (*s_etat_processus).erreur_systeme =
2382: d_es_allocation_memoire;
2383: return(NULL);
2384: }
2385:
2386: strcpy(chaine, chaine_sauvegarde);
2387: free(chaine_sauvegarde);
2388: }
2389: else
2390: {
2391: chaine[strlen(chaine) - 2] = ']';
2392: chaine[strlen(chaine) - 1] = 0;
2393:
2394: chaine_sauvegarde = chaine;
2395: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
2396: + 2) * sizeof(unsigned char));
2397:
2398: if (chaine == NULL)
2399: {
2400: (*s_etat_processus).erreur_systeme =
2401: d_es_allocation_memoire;
2402: return(NULL);
2403: }
2404:
2405: strcpy(chaine, chaine_sauvegarde);
2406: free(chaine_sauvegarde);
2407: strcat(chaine, "]");
2408: }
2409: }
2410: }
2411: else if ((*s_objet).type == MRL)
2412: {
2413:
2414: /*
2415: --------------------------------------------------------------------------------
2416: Matrice réelle
2417: --------------------------------------------------------------------------------
2418: */
2419:
2420: if (format_sortie == 'N')
2421: {
2422: format_sortie = 'S';
2423: }
2424:
2425: if ((format_sortie != 'S') && (format_sortie != 'F') &&
2426: (format_sortie != 'I') && (format_sortie != 'E'))
2427: {
2428: (*s_etat_processus).erreur_execution =
2429: d_ex_erreur_format_fichier;
2430: return(NULL);
2431: }
2432:
2433: nombre_lignes = (*((struct_matrice *) ((*s_objet).objet)))
2434: .nombre_lignes;
2435: nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet)))
2436: .nombre_colonnes;
2437:
2438: chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
2439:
2440: if (chaine != NULL)
2441: {
2442: strcpy(chaine, "[[");
2443:
2444: for(i = 0; i < nombre_lignes; i++)
2445: {
2446: for(j = 0; j < nombre_colonnes; j++)
2447: {
2448: if ((chaine_formatee =
2449: formateur_fichier_nombre(s_etat_processus,
2450: (void *) &(((real8 **) ((*((struct_matrice *)
2451: ((*s_objet).objet))).tableau))[i][j]), 'R',
2452: longueur, longueur_champ, format_sortie))
2453: == NULL)
2454: {
2455: (*s_etat_processus).erreur_systeme =
2456: d_es_allocation_memoire;
2457: return(NULL);
2458: }
2459:
2460: chaine_sauvegarde = chaine;
2461: chaine = (unsigned char *) malloc(
2462: (strlen(chaine_sauvegarde) +
2463: strlen(chaine_formatee) + 2)
2464: * sizeof(unsigned char));
2465:
2466: if (chaine == NULL)
2467: {
2468: (*s_etat_processus).erreur_systeme =
2469: d_es_allocation_memoire;
2470: return(NULL);
2471: }
2472:
2473: strcpy(chaine, chaine_sauvegarde);
2474: free(chaine_sauvegarde);
2475: strcat(chaine, " ");
2476: strcat(chaine, chaine_formatee);
2477: free(chaine_formatee);
2478: }
2479:
2480: chaine_sauvegarde = chaine;
2481: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2482: {
2483: chaine = (unsigned char *) malloc(
2484: (strlen(chaine_sauvegarde) + 6)
2485: * sizeof(unsigned char));
2486:
2487: if (chaine == NULL)
2488: {
2489: (*s_etat_processus).erreur_systeme =
2490: d_es_allocation_memoire;
2491: return(NULL);
2492: }
2493:
2494: strcpy(chaine, chaine_sauvegarde);
2495: free(chaine_sauvegarde);
2496: strcat(chaine, " ]\n [");
2497: }
2498: else
2499: {
2500: chaine = (unsigned char *) malloc(
2501: (strlen(chaine_sauvegarde) + 4)
2502: * sizeof(unsigned char));
2503:
2504: if (chaine == NULL)
2505: {
2506: (*s_etat_processus).erreur_systeme =
2507: d_es_allocation_memoire;
2508: return(NULL);
2509: }
2510:
2511: strcpy(chaine, chaine_sauvegarde);
2512: free(chaine_sauvegarde);
2513: strcat(chaine, " ][");
2514: }
2515: }
2516:
2517: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2518: {
2519: chaine[strlen(chaine) - 3] = ']';
2520: chaine[strlen(chaine) - 2] = 0;
2521:
2522: chaine_sauvegarde = chaine;
2523: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
2524: + 1) * sizeof(unsigned char));
2525:
2526: if (chaine == NULL)
2527: {
2528: (*s_etat_processus).erreur_systeme =
2529: d_es_allocation_memoire;
2530: return(NULL);
2531: }
2532:
2533: strcpy(chaine, chaine_sauvegarde);
2534: free(chaine_sauvegarde);
2535: }
2536: else
2537: {
2538: chaine[strlen(chaine) - 2] = ']';
2539: chaine[strlen(chaine) - 1] = 0;
2540:
2541: chaine_sauvegarde = chaine;
2542: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
2543: + 2) * sizeof(unsigned char));
2544:
2545: if (chaine == NULL)
2546: {
2547: (*s_etat_processus).erreur_systeme =
2548: d_es_allocation_memoire;
2549: return(NULL);
2550: }
2551:
2552: strcpy(chaine, chaine_sauvegarde);
2553: free(chaine_sauvegarde);
2554: strcat(chaine, "]");
2555: }
2556: }
2557: }
2558: else if ((*s_objet).type == NOM)
2559: {
2560:
2561: /*
2562: --------------------------------------------------------------------------------
2563: Nom
2564: --------------------------------------------------------------------------------
2565: */
2566:
2567: if (format_sortie != 'N')
2568: {
2569: (*s_etat_processus).erreur_execution =
2570: d_ex_erreur_format_fichier;
2571: return(NULL);
2572: }
2573:
2574: chaine = (unsigned char *) malloc((strlen((*((struct_nom *)
2575: (*s_objet).objet)).nom) + 3) * sizeof(unsigned char));
2576:
2577: if (chaine == NULL)
2578: {
2579: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2580: return(NULL);
2581: }
2582:
2583: sprintf(chaine, "'%s'", (*((struct_nom *) (*s_objet).objet)).nom);
2584: }
2585: else if ((*s_objet).type == REL)
2586: {
2587:
2588: /*
2589: --------------------------------------------------------------------------------
2590: Réel
2591: --------------------------------------------------------------------------------
2592: */
2593:
2594: if (format_sortie == 'N')
2595: {
2596: format_sortie = 'S';
2597: }
2598:
2599: if ((format_sortie != 'S') && (format_sortie != 'F') &&
2600: (format_sortie != 'I') && (format_sortie != 'E'))
2601: {
2602: (*s_etat_processus).erreur_execution =
2603: d_ex_erreur_format_fichier;
2604: return(NULL);
2605: }
2606:
2607: if ((chaine_formatee = formateur_fichier_nombre(s_etat_processus,
2608: (void *) ((real8 *) ((*s_objet).objet)), 'R',
2609: longueur, longueur_champ, format_sortie)) == NULL)
2610: {
2611: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2612: return(NULL);
2613: }
2614:
2615: chaine = (unsigned char *) malloc((strlen(chaine_formatee) + 1)
2616: * sizeof(unsigned char));
2617:
2618: if (chaine == NULL)
2619: {
2620: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2621: return(NULL);
2622: }
2623:
2624: strcpy(chaine, chaine_formatee);
2625: free(chaine_formatee);
2626: }
2627: else if ((*s_objet).type == VCX)
2628: {
2629:
2630: /*
2631: --------------------------------------------------------------------------------
2632: Vecteur complexe
2633: --------------------------------------------------------------------------------
2634: */
2635:
2636: if (format_sortie == 'N')
2637: {
2638: format_sortie = 'S';
2639: }
2640:
2641: if ((format_sortie != 'S') && (format_sortie != 'F') &&
2642: (format_sortie != 'I') && (format_sortie != 'E'))
2643: {
2644: (*s_etat_processus).erreur_execution =
2645: d_ex_erreur_format_fichier;
2646: return(NULL);
2647: }
2648:
2649: nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet)))
2650: .taille;
2651:
2652: chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
2653:
2654: if (chaine != NULL)
2655: {
2656: strcpy(chaine, "[");
2657:
2658: for(i = 0; i < nombre_colonnes; i++)
2659: {
2660: if ((chaine_formatee =
2661: formateur_fichier_nombre(s_etat_processus,
2662: (void *) &(((struct_complexe16 *)
2663: ((*((struct_vecteur *)
2664: ((*s_objet).objet))).tableau))[i]), 'C',
2665: longueur, longueur_champ, format_sortie)) == NULL)
2666: {
2667: (*s_etat_processus).erreur_systeme =
2668: d_es_allocation_memoire;
2669: return(NULL);
2670: }
2671:
2672: chaine_sauvegarde = chaine;
2673: chaine = (unsigned char *) malloc(
2674: (strlen(chaine_sauvegarde) + strlen(chaine_formatee)
2675: + 2) * sizeof(unsigned char));
2676:
2677: if (chaine == NULL)
2678: {
2679: (*s_etat_processus).erreur_systeme =
2680: d_es_allocation_memoire;
2681: return(NULL);
2682: }
2683:
2684: strcpy(chaine, chaine_sauvegarde);
2685: free(chaine_sauvegarde);
2686: strcat(chaine, " ");
2687: strcat(chaine, chaine_formatee);
2688: free(chaine_formatee);
2689: }
2690:
2691: chaine_sauvegarde = chaine;
2692: chaine = (unsigned char *) malloc(
2693: (strlen(chaine_sauvegarde) + 3)
2694: * sizeof(unsigned char));
2695:
2696: if (chaine == NULL)
2697: {
2698: (*s_etat_processus).erreur_systeme =
2699: d_es_allocation_memoire;
2700: return(NULL);
2701: }
2702:
2703: strcpy(chaine, chaine_sauvegarde);
2704: free(chaine_sauvegarde);
2705: strcat(chaine, " ]");
2706: }
2707: }
2708: else if ((*s_objet).type == VIN)
2709: {
2710:
2711: /*
2712: --------------------------------------------------------------------------------
2713: Vecteur entier
2714: --------------------------------------------------------------------------------
2715: */
2716:
2717: if (format_sortie == 'N')
2718: {
2719: format_sortie = 'S';
2720: }
2721:
2722: if ((format_sortie != 'S') && (format_sortie != 'F') &&
2723: (format_sortie != 'I') && (format_sortie != 'E'))
2724: {
2725: (*s_etat_processus).erreur_execution =
2726: d_ex_erreur_format_fichier;
2727: return(NULL);
2728: }
2729:
2730: nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet)))
2731: .taille;
2732:
2733: chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
2734:
2735: if (chaine != NULL)
2736: {
2737: strcpy(chaine, "[");
2738:
2739: for(i = 0; i < nombre_colonnes; i++)
2740: {
2741: if ((chaine_formatee =
2742: formateur_fichier_nombre(s_etat_processus,
2743: (void *) &(((integer8 *) ((*((struct_vecteur *)
2744: ((*s_objet).objet))).tableau))[i]), 'I',
2745: longueur, longueur_champ, format_sortie)) == NULL)
2746: {
2747: (*s_etat_processus).erreur_systeme =
2748: d_es_allocation_memoire;
2749: return(NULL);
2750: }
2751:
2752: chaine_sauvegarde = chaine;
2753: chaine = (unsigned char *) malloc(
2754: (strlen(chaine_sauvegarde) + strlen(chaine_formatee)
2755: + 2) * sizeof(unsigned char));
2756:
2757: if (chaine == NULL)
2758: {
2759: (*s_etat_processus).erreur_systeme =
2760: d_es_allocation_memoire;
2761: return(NULL);
2762: }
2763:
2764: strcpy(chaine, chaine_sauvegarde);
2765: free(chaine_sauvegarde);
2766: strcat(chaine, " ");
2767: strcat(chaine, chaine_formatee);
2768: free(chaine_formatee);
2769: }
2770:
2771: chaine_sauvegarde = chaine;
2772: chaine = (unsigned char *) malloc(
2773: (strlen(chaine_sauvegarde) + 3)
2774: * sizeof(unsigned char));
2775:
2776: if (chaine == NULL)
2777: {
2778: (*s_etat_processus).erreur_systeme =
2779: d_es_allocation_memoire;
2780: return(NULL);
2781: }
2782:
2783: strcpy(chaine, chaine_sauvegarde);
2784: free(chaine_sauvegarde);
2785: strcat(chaine, " ]");
2786: }
2787: }
2788: else if ((*s_objet).type == VRL)
2789: {
2790:
2791: /*
2792: --------------------------------------------------------------------------------
2793: Vecteur réel
2794: --------------------------------------------------------------------------------
2795: */
2796:
2797: if (format_sortie == 'N')
2798: {
2799: format_sortie = 'S';
2800: }
2801:
2802: if ((format_sortie != 'S') && (format_sortie != 'F') &&
2803: (format_sortie != 'I') && (format_sortie != 'E'))
2804: {
2805: (*s_etat_processus).erreur_execution =
2806: d_ex_erreur_format_fichier;
2807: return(NULL);
2808: }
2809:
2810: nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet)))
2811: .taille;
2812:
2813: chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
2814:
2815: if (chaine != NULL)
2816: {
2817: strcpy(chaine, "[");
2818:
2819: for(i = 0; i < nombre_colonnes; i++)
2820: {
2821: if ((chaine_formatee =
2822: formateur_fichier_nombre(s_etat_processus,
2823: (void *) &(((real8 *) ((*((struct_vecteur *)
2824: ((*s_objet).objet))).tableau))[i]), 'R',
2825: longueur, longueur_champ, format_sortie)) == NULL)
2826: {
2827: (*s_etat_processus).erreur_systeme =
2828: d_es_allocation_memoire;
2829: return(NULL);
2830: }
2831:
2832: chaine_sauvegarde = chaine;
2833: chaine = (unsigned char *) malloc(
2834: (strlen(chaine_sauvegarde) + strlen(chaine_formatee)
2835: + 2) * sizeof(unsigned char));
2836:
2837: if (chaine == NULL)
2838: {
2839: (*s_etat_processus).erreur_systeme =
2840: d_es_allocation_memoire;
2841: return(NULL);
2842: }
2843:
2844: strcpy(chaine, chaine_sauvegarde);
2845: free(chaine_sauvegarde);
2846: strcat(chaine, " ");
2847: strcat(chaine, chaine_formatee);
2848: free(chaine_formatee);
2849: }
2850:
2851: chaine_sauvegarde = chaine;
2852: chaine = (unsigned char *) malloc(
2853: (strlen(chaine_sauvegarde) + 3)
2854: * sizeof(unsigned char));
2855:
2856: if (chaine == NULL)
2857: {
2858: (*s_etat_processus).erreur_systeme =
2859: d_es_allocation_memoire;
2860: return(NULL);
2861: }
2862:
2863: strcpy(chaine, chaine_sauvegarde);
2864: free(chaine_sauvegarde);
2865: strcat(chaine, " ]");
2866: }
2867: }
2868: else
2869: {
2870: // Type non exportable
2871:
2872: (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier;
2873: free(chaine);
2874:
2875: return(NULL);
2876: }
2877:
2878: (*longueur_effective) = ((integer8) strlen(chaine)) + 1;
2879: }
2880: else
2881: {
2882: /*
2883: * Fichiers non formatés
2884: */
2885:
2886: #define __zone() \
2887: do { int _i; \
2888: for(_i = 0; _i < longueur_totale; _i++) \
2889: printf("%02X ", chaine[_i]); printf("\b\n"); } while(0)
2890:
2891: /*
2892: * Chaque enregistrement est composé d'une donnée (une liste)
2893: * suivie de sa longueur en octets et d'un champ binaire indiquant
2894: * le format (integer*1,2,4 ou 8) d'écriture de cette longueur.
2895: * Les données contenues dans ces fichiers sont associées à un
2896: * descripteur de type.
2897: *
2898: * Attention : les fichiers non formatés ne sont pas portables
2899: * d'une architecture à l'autre.
2900: *
2901: * Structure d'un enregistrement :
2902: * [en-tête][.........données..........][longueur + type de longueur]
2903: *
2904: * Longueur : (pour l'instruction backspace)
2905: *
2906: * XXXXXXX0 longueur sur 7 bits
2907: * XXXX0011 XXXXXXXX XXXX0011 longueur sur 16 bits
2908: * LSB(1/2) MSB LSB(2/2)
2909: * XXXX0101 XXXXXXXX XXXXXXXX XXXX0101 longueur sur 24 bits
2910: * XXXX0111 XXXXXXXX XXXXXXXX XXXXXXXX
2911: * XXXX0111 longueur sur 32 bits
2912: * XXXX1001 XXXXXXXX XXXXXXXX XXXXXXXX
2913: * XXXXXXXX XXXX1001 longueur sur 40 bits
2914: * XXXX1011 XXXXXXXX XXXXXXXX XXXXXXXX
2915: * XXXXXXXX XXXXXXXX XXXX1011 longueur sur 48 bits
2916: * XXXX1101 XXXXXXXX XXXXXXXX XXXXXXXX
2917: * XXXXXXXX XXXXXXXX XXXXXXXX
2918: * XXXX1101 longueur sur 56 bits
2919: * XXXX1111 XXXXXXXX XXXXXXXX XXXXXXXX
2920: * XXXXXXXX XXXXXXXX XXXXXXXX
2921: * XXXXXXXX XXXX1111 longueur sur 64 bits
2922: *
2923: * Structures des enregistrements :
2924: * chaque type de donnée est associé à une en-tête binaire comprenant
2925: * le type de données ainsi que toutes autres informations utiles.
2926: *
2927: * Représentation binaire :
2928: *
2929: * 1/ scalaires
2930: * 0000 XXXX Binaire sur XXXX octets
2931: *
2932: * TYPE
2933: * 0001 00 00 integer*1
2934: * 0001 00 01 integer*2
2935: * 0001 00 10 integer*4
2936: * 0001 00 11 integer*8
2937: *
2938: * 0001 01 00 real*4
2939: * 0001 01 01 real*8
2940: *
2941: * 0001 10 00 complex*8
2942: * 0001 10 01 complex*16
2943: *
2944: * 0010 00 00 vecteur integer*1 (dimensions integer*1)
2945: * 0010 01 00 vecteur integer*1 (dimensions integer*2)
2946: * 0010 10 00 vecteur integer*1 (dimensions integer*4)
2947: * 0010 11 00 vecteur integer*1 (dimensions integer*8)
2948: * 0010 00 01 vecteur integer*2 (dimensions integer*1)
2949: * 0010 01 01 vecteur integer*2 (dimensions integer*2)
2950: * 0010 10 01 vecteur integer*2 (dimensions integer*4)
2951: * 0010 11 01 vecteur integer*2 (dimensions integer*8)
2952: * 0010 00 10 vecteur integer*4 (dimensions integer*1)
2953: * 0010 01 10 vecteur integer*4 (dimensions integer*2)
2954: * 0010 10 10 vecteur integer*4 (dimensions integer*4)
2955: * 0010 11 10 vecteur integer*4 (dimensions integer*8)
2956: * 0010 00 11 vecteur integer*8 (dimensions integer*1)
2957: * 0010 01 11 vecteur integer*8 (dimensions integer*2)
2958: * 0010 10 11 vecteur integer*8 (dimensions integer*4)
2959: * 0010 11 11 vecteur integer*8 (dimensions integer*8)
2960: *
2961: * 0011 00 00 matrice integer*1 (dimensions integer*1)
2962: * 0011 01 00 matrice integer*1 (dimensions integer*2)
2963: * 0011 10 00 matrice integer*1 (dimensions integer*4)
2964: * 0011 11 00 matrice integer*1 (dimensions integer*8)
2965: * 0011 00 01 matrice integer*2 (dimensions integer*1)
2966: * 0011 01 01 matrice integer*2 (dimensions integer*2)
2967: * 0011 10 01 matrice integer*2 (dimensions integer*4)
2968: * 0011 11 01 matrice integer*2 (dimensions integer*8)
2969: * 0011 00 10 matrice integer*4 (dimensions integer*1)
2970: * 0011 01 10 matrice integer*4 (dimensions integer*2)
2971: * 0011 10 10 matrice integer*4 (dimensions integer*4)
2972: * 0011 11 10 matrice integer*4 (dimensions integer*8)
2973: * 0011 00 11 matrice integer*8 (dimensions integer*1)
2974: * 0011 01 11 matrice integer*8 (dimensions integer*2)
2975: * 0011 10 11 matrice integer*8 (dimensions integer*4)
2976: * 0011 11 11 matrice integer*8 (dimensions integer*8)
2977: *
2978: * 0100 0 XXX liste de longueur XXX
2979: * 0100 10 00 liste de longueur integer*1
2980: * 0100 10 01 liste de longueur integer*2
2981: * 0100 10 10 liste de longueur integer*4
2982: * 0100 10 11 liste de longueur integer*8
2983: *
2984: * 0101 0 XXX nom de longueur XXX
2985: * 0101 10 LL nom de longueur integer*LL
2986: *
2987: * 0110 0 XXX expression RPN
2988: * 0110 10 LL
2989: *
2990: * 0111 0 XXX expression algébrique
2991: * 0111 10 LL
2992: *
2993: * 1000 0 XXX chaîne de caractères
2994: * 1000 10 LL
2995: *
2996: * 1001 0 XXX table de longueur XXX
2997: * 1001 10 00 table de longueur integer*1
2998: * 1001 10 01 table de longueur integer*2
2999: * 1001 10 10 table de longueur integer*4
3000: * 1001 10 11 table de longueur integer*8
3001: *
3002: * 1010 00 10 vecteur real*4 (dimensions integer*1)
3003: * 1010 01 10 vecteur real*4 (dimensions integer*2)
3004: * 1010 10 10 vecteur real*4 (dimensions integer*4)
3005: * 1010 11 10 vecteur real*4 (dimensions integer*8)
3006: * 1010 00 11 vecteur real*8 (dimensions integer*1)
3007: * 1010 01 11 vecteur real*8 (dimensions integer*2)
3008: * 1010 10 11 vecteur real*8 (dimensions integer*4)
3009: * 1010 11 11 vecteur real*8 (dimensions integer*8)
3010: * 1011 00 10 vecteur complex*8 (dimensions integer*1)
3011: * 1011 01 10 vecteur complex*8 (dimensions integer*2)
3012: * 1011 10 10 vecteur complex*8 (dimensions integer*4)
3013: * 1011 11 10 vecteur complex*8 (dimensions integer*8)
3014: * 1011 00 11 vecteur complex*16 (dimensions integer*1)
3015: * 1011 01 11 vecteur complex*16 (dimensions integer*2)
3016: * 1011 10 11 vecteur complex*16 (dimensions integer*4)
3017: * 1011 11 11 vecteur complex*16 (dimensions integer*8)
3018: *
3019: * 1100 00 10 matrice real*4 (dimensions integer*1)
3020: * 1100 01 10 matrice real*4 (dimensions integer*2)
3021: * 1100 10 10 matrice real*4 (dimensions integer*4)
3022: * 1100 11 10 matrice real*4 (dimensions integer*8)
3023: * 1100 00 11 matrice real*8 (dimensions integer*1)
3024: * 1100 01 11 matrice real*8 (dimensions integer*2)
3025: * 1100 10 11 matrice real*8 (dimensions integer*4)
3026: * 1100 11 11 matrice real*8 (dimensions integer*8)
3027: * 1101 00 10 matrice complex*8 (dimensions integer*1)
3028: * 1101 01 10 matrice complex*8 (dimensions integer*2)
3029: * 1101 10 10 matrice complex*8 (dimensions integer*4)
3030: * 1101 11 10 matrice complex*8 (dimensions integer*8)
3031: * 1101 00 11 matrice complex*16 (dimensions integer*1)
3032: * 1101 01 11 matrice complex*16 (dimensions integer*2)
3033: * 1101 10 11 matrice complex*16 (dimensions integer*4)
3034: * 1101 11 11 matrice complex*16 (dimensions integer*8)
3035: *
3036: * 1110 0 XXX fonction de longueur XXX
3037: * 1110 10 LL fonction de longueur integer*LL
3038: *
3039: * Les longueurs indiquées par le champ LL suivent l'en-tête :
3040: * 00 : integer*1
3041: * 01 : integer*2
3042: * 10 : integer*4
3043: * 11 : integer*8
3044: *
3045: * [En-tête][longueur_1][longueur_2][données]
3046: * le nombre de champs longueur dépendant des types d'enregistrement.
3047: *
3048: * Toutes les autres combinaisons sont invalides.
3049: */
3050:
3051: chaine = NULL;
3052: chaine_formatee = NULL;
3053: chaine_sauvegarde = NULL;
3054:
3055: if ((*s_objet).type == BIN)
3056: {
3057:
3058: /*
3059: --------------------------------------------------------------------------------
3060: Entier binaire en base 2, 8, 10 ou 16
3061: Poids fort 0000
3062: --------------------------------------------------------------------------------
3063: */
3064:
3065: if (format_sortie == 'N')
3066: {
3067: format_sortie = 'L';
3068: longueur_champ = 8;
3069: }
3070:
3071: if (format_sortie != 'L')
3072: {
3073: (*s_etat_processus).erreur_execution =
3074: d_ex_erreur_format_fichier;
3075: return(NULL);
3076: }
3077:
3078: if (longueur_champ < 8)
3079: {
3080: if ((*((logical8 *) (*s_objet).objet)) >=
3081: ((logical8) 1 << (8 * longueur_champ)))
3082: {
3083: (*s_etat_processus).erreur_execution =
3084: d_ex_representation;
3085: return(NULL);
3086: }
3087: }
3088:
3089: (*longueur_effective) = longueur_champ + 1;
3090:
3091: if ((chaine = malloc(((size_t) (*longueur_effective))
3092: * sizeof(unsigned char))) == NULL)
3093: {
3094: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3095: return(NULL);
3096: }
3097:
3098: chaine[0] = (unsigned char) longueur_champ;
3099:
3100: for(i = 1; i <= (*longueur_effective); i++)
3101: {
3102: chaine[i] = ((*((logical8 *) (*s_objet).objet)) >>
3103: (8 * (longueur_champ - i))) & 0xFF;
3104: }
3105: }
3106: else if ((*s_objet).type == CHN)
3107: {
3108:
3109: /*
3110: --------------------------------------------------------------------------------
3111: Chaîne de caractères
3112: Poids fort 1000 0XXX (longueur inférieure à 2**3-1
3113: 1000 10LL (autres longueurs)
3114: --------------------------------------------------------------------------------
3115: */
3116:
3117: if (format_sortie == 'N')
3118: {
3119: format_sortie = 'S';
3120: longueur_champ = -1;
3121: }
3122:
3123: if (format_sortie != 'S')
3124: {
3125: (*s_etat_processus).erreur_execution =
3126: d_ex_erreur_format_fichier;
3127: return(NULL);
3128: }
3129:
3130: longueur_reelle_chaine = longueur_chaine(s_etat_processus,
3131: (unsigned char *) (*s_objet).objet);
3132:
3133: if ((longueur_champ == -1) || (longueur_reelle_chaine <
3134: longueur_champ))
3135: {
3136: // Le format est CHARACTER*(*). On copie dans la sortie
3137: // la chaine en évaluant les caractères échappés.
3138:
3139: if ((chaine = formateur_flux(s_etat_processus, (unsigned char *)
3140: (*s_objet).objet, &longueur_chaine_traitee)) == NULL)
3141: {
3142: return(NULL);
3143: }
3144: }
3145: else
3146: {
3147: // Format de type CHARACTER*(n)
3148:
3149: if ((chaine_sauvegarde = formateur_flux(s_etat_processus,
3150: (unsigned char *) (*s_objet).objet,
3151: &longueur_chaine_traitee)) == NULL)
3152: {
3153: return(NULL);
3154: }
3155:
3156: if ((chaine = malloc(((size_t) longueur_champ)
3157: * sizeof(unsigned char))) == NULL)
3158: {
3159: (*s_etat_processus).erreur_systeme =
3160: d_es_allocation_memoire;
3161: return(NULL);
3162: }
3163:
3164: memcpy(chaine, chaine_sauvegarde, (size_t) longueur_champ);
3165: longueur_chaine_traitee = longueur_champ;
3166: free(chaine_sauvegarde);
3167: }
3168:
3169: chaine_sauvegarde = chaine;
3170:
3171: if (longueur_chaine_traitee < (1LL << 3))
3172: {
3173: if ((chaine = malloc((((size_t) longueur_chaine_traitee) + 1)
3174: * sizeof(unsigned char))) == NULL)
3175: {
3176: (*s_etat_processus).erreur_systeme =
3177: d_es_allocation_memoire;
3178: return(NULL);
3179: }
3180:
3181: chaine[0] = (unsigned char) (0x80 |
3182: (longueur_chaine_traitee & 0x7));
3183:
3184: memcpy(chaine + 1, chaine_sauvegarde,
3185: (size_t) longueur_chaine_traitee);
3186: longueur_totale = longueur_chaine_traitee + 1;
3187: }
3188: else if (longueur_chaine_traitee < (1LL << 8))
3189: {
3190: if ((chaine = malloc((((size_t) longueur_chaine_traitee) + 2)
3191: * sizeof(unsigned char))) == NULL)
3192: {
3193: (*s_etat_processus).erreur_systeme =
3194: d_es_allocation_memoire;
3195: return(NULL);
3196: }
3197:
3198: chaine[0] = (unsigned char) 0x88;
3199: chaine[1] = (unsigned char) (longueur_chaine_traitee & 0xFF);
3200:
3201: memcpy(chaine + 2, chaine_sauvegarde,
3202: (size_t) longueur_chaine_traitee);
3203: longueur_totale = longueur_chaine_traitee + 2;
3204: }
3205: else if (longueur_chaine_traitee < (1LL << 16))
3206: {
3207: if ((chaine = malloc((((size_t) longueur_chaine_traitee) + 3)
3208: * sizeof(unsigned char))) == NULL)
3209: {
3210: (*s_etat_processus).erreur_systeme =
3211: d_es_allocation_memoire;
3212: return(NULL);
3213: }
3214:
3215: chaine[0] = (unsigned char) 0x89;
3216: chaine[1] = (unsigned char) ((longueur_chaine_traitee >> 8)
3217: & 0xFF);
3218: chaine[2] = (unsigned char) (longueur_chaine_traitee & 0xFF);
3219:
3220: memcpy(chaine + 3, chaine_sauvegarde,
3221: (size_t) longueur_chaine_traitee);
3222: longueur_totale = longueur_chaine_traitee + 3;
3223: }
3224: else if (longueur_chaine_traitee < (1LL << 32))
3225: {
3226: if ((chaine = malloc((((size_t) longueur_chaine_traitee) + 5)
3227: * sizeof(unsigned char))) == NULL)
3228: {
3229: (*s_etat_processus).erreur_systeme =
3230: d_es_allocation_memoire;
3231: return(NULL);
3232: }
3233:
3234: chaine[0] = (unsigned char) 0x8A;
3235: chaine[1] = (unsigned char) ((longueur_chaine_traitee >> 24)
3236: & 0xFF);
3237: chaine[2] = (unsigned char) ((longueur_chaine_traitee >> 16)
3238: & 0xFF);
3239: chaine[3] = (unsigned char) ((longueur_chaine_traitee >> 8)
3240: & 0xFF);
3241: chaine[4] = (unsigned char) (longueur_chaine_traitee & 0xFF);
3242:
3243: memcpy(chaine + 5, chaine_sauvegarde,
3244: (size_t) longueur_chaine_traitee);
3245: longueur_totale = longueur_chaine_traitee + 5;
3246: }
3247: else
3248: {
3249: if ((chaine = malloc((((size_t) longueur_chaine_traitee) + 9)
3250: * sizeof(unsigned char))) == NULL)
3251: {
3252: (*s_etat_processus).erreur_systeme =
3253: d_es_allocation_memoire;
3254: return(NULL);
3255: }
3256:
3257: chaine[0] = (unsigned char) 0x8B;
3258: chaine[1] = (unsigned char) ((longueur_chaine_traitee >> 56)
3259: & 0xFF);
3260: chaine[2] = (unsigned char) ((longueur_chaine_traitee >> 48)
3261: & 0xFF);
3262: chaine[3] = (unsigned char) ((longueur_chaine_traitee >> 40)
3263: & 0xFF);
3264: chaine[4] = (unsigned char) ((longueur_chaine_traitee >> 32)
3265: & 0xFF);
3266: chaine[5] = (unsigned char) ((longueur_chaine_traitee >> 24)
3267: & 0xFF);
3268: chaine[6] = (unsigned char) ((longueur_chaine_traitee >> 16)
3269: & 0xFF);
3270: chaine[7] = (unsigned char) ((longueur_chaine_traitee >> 8)
3271: & 0xFF);
3272: chaine[8] = (unsigned char) (longueur_chaine_traitee & 0xFF);
3273:
3274: memcpy(chaine + 9, chaine_sauvegarde,
3275: (size_t) longueur_chaine_traitee);
3276: longueur_totale = longueur_chaine_traitee + 9;
3277: }
3278:
3279: (*longueur_effective) = longueur_totale;
3280: }
3281: else if ((*s_objet).type == CPL)
3282: {
3283:
3284: /*
3285: --------------------------------------------------------------------------------
3286: Complexe
3287: Poids fort 0001 10
3288: --------------------------------------------------------------------------------
3289: */
3290:
3291: if (format_sortie == 'N')
3292: {
3293: format_sortie = 'C';
3294: longueur = 8;
3295: }
3296:
3297: if (format_sortie != 'C')
3298: {
3299: (*s_etat_processus).erreur_execution =
3300: d_ex_erreur_format_fichier;
3301: return(NULL);
3302: }
3303:
3304: if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus,
3305: (*s_objet).objet, 'C', 'C', longueur, longueur_effective))
3306: == NULL)
3307: {
3308: return(NULL);
3309: }
3310: }
3311: else if ((*s_objet).type == INT)
3312: {
3313:
3314: /*
3315: --------------------------------------------------------------------------------
3316: Entier
3317: Poids fort 0001 00
3318: --------------------------------------------------------------------------------
3319: */
3320:
3321: if (format_sortie == 'N')
3322: {
3323: format_sortie = 'I';
3324: longueur = 8;
3325: }
3326:
3327: if ((format_sortie != 'I') && (format_sortie != 'R')
3328: && (format_sortie != 'C'))
3329: {
3330: (*s_etat_processus).erreur_execution =
3331: d_ex_erreur_format_fichier;
3332: return(NULL);
3333: }
3334:
3335: if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus,
3336: (*s_objet).objet, 'I', format_sortie, longueur,
3337: longueur_effective)) == NULL)
3338: {
3339: return(NULL);
3340: }
3341: }
3342: else if ((*s_objet).type == FCT)
3343: {
3344:
3345: /*
3346: --------------------------------------------------------------------------------
3347: Fonction
3348: Poids fort 1110
3349: --------------------------------------------------------------------------------
3350: */
3351:
3352: if (format_sortie != 'N')
3353: {
3354: (*s_etat_processus).erreur_execution =
3355: d_ex_erreur_format_fichier;
3356: return(NULL);
3357: }
3358:
3359: longueur_fonction = (integer8) strlen((*((struct_fonction *)
3360: (*s_objet).objet)).nom_fonction);
3361:
3362: if (longueur_fonction < (1LL << 3))
3363: {
3364: if ((chaine = malloc((1 + ((size_t) longueur_fonction) + 8)
3365: * sizeof(unsigned char)))== NULL)
3366: {
3367: (*s_etat_processus).erreur_systeme =
3368: d_es_allocation_memoire;
3369: return(NULL);
3370: }
3371:
3372: chaine[0] = (unsigned char) (0xE0 | (longueur_fonction & 0x7));
3373:
3374: strcpy(chaine + 1, (*((struct_fonction *) (*s_objet).objet))
3375: .nom_fonction);
3376: (*longueur_effective) = 1 + longueur_fonction + 8;
3377: }
3378: else if (longueur_fonction < (1LL << 8))
3379: {
3380: if ((chaine = malloc((2 + ((size_t) longueur_fonction) + 8)
3381: * sizeof(unsigned char)))== NULL)
3382: {
3383: (*s_etat_processus).erreur_systeme =
3384: d_es_allocation_memoire;
3385: return(NULL);
3386: }
3387:
3388: chaine[0] = (unsigned char) (0xE0 | 0x08);
3389: chaine[1] = (unsigned char) (longueur_fonction & 0xFF);
3390:
3391: strcpy(chaine + 2, (*((struct_fonction *) (*s_objet).objet))
3392: .nom_fonction);
3393: (*longueur_effective) = 2 + longueur_fonction + 8;
3394: }
3395: else if (longueur_fonction < (1LL << 16))
3396: {
3397: if ((chaine = malloc((3 + ((size_t) longueur_fonction) + 8)
3398: * sizeof(unsigned char)))== NULL)
3399: {
3400: (*s_etat_processus).erreur_systeme =
3401: d_es_allocation_memoire;
3402: return(NULL);
3403: }
3404:
3405: chaine[0] = (unsigned char ) (0xE0 | 0x09);
3406: chaine[1] = (unsigned char) ((longueur_fonction >> 8) & 0xFF);
3407: chaine[2] = (unsigned char) (longueur_fonction & 0xFF);
3408:
3409: strcpy(chaine + 3, (*((struct_fonction *) (*s_objet).objet))
3410: .nom_fonction);
3411: (*longueur_effective) = 3 + longueur_fonction + 9;
3412: }
3413: else if (longueur_fonction < (1LL << 32))
3414: {
3415: if ((chaine = malloc((5 + ((size_t) longueur_fonction) + 8)
3416: * sizeof(unsigned char)))== NULL)
3417: {
3418: (*s_etat_processus).erreur_systeme =
3419: d_es_allocation_memoire;
3420: return(NULL);
3421: }
3422:
3423: chaine[0] = (unsigned char) (0xE0 | 0x0A);
3424: chaine[1] = (unsigned char) ((longueur_fonction >> 24) & 0xFF);
3425: chaine[2] = (unsigned char) ((longueur_fonction >> 16) & 0xFF);
3426: chaine[3] = (unsigned char) ((longueur_fonction >> 8) & 0xFF);
3427: chaine[4] = (unsigned char) (longueur_fonction & 0xFF);
3428:
3429: strcpy(chaine + 5, (*((struct_fonction *) (*s_objet).objet))
3430: .nom_fonction);
3431: (*longueur_effective) = 5 + longueur_fonction + 8;
3432: }
3433: else
3434: {
3435: if ((chaine = malloc((9 + ((size_t) longueur_fonction) + 8)
3436: * sizeof(unsigned char)))== NULL)
3437: {
3438: (*s_etat_processus).erreur_systeme =
3439: d_es_allocation_memoire;
3440: return(NULL);
3441: }
3442:
3443: chaine[0] = (unsigned char) (0xE0 | 0x0B);
3444: chaine[1] = (unsigned char) ((longueur_fonction >> 56) & 0xFF);
3445: chaine[2] = (unsigned char) ((longueur_fonction >> 48) & 0xFF);
3446: chaine[3] = (unsigned char) ((longueur_fonction >> 40) & 0xFF);
3447: chaine[4] = (unsigned char) ((longueur_fonction >> 32) & 0xFF);
3448: chaine[5] = (unsigned char) ((longueur_fonction >> 24) & 0xFF);
3449: chaine[6] = (unsigned char) ((longueur_fonction >> 16) & 0xFF);
3450: chaine[7] = (unsigned char) ((longueur_fonction >> 8) & 0xFF);
3451: chaine[8] = (unsigned char) (longueur_fonction & 0xFF);
3452:
3453: strcpy(chaine + 9, (*((struct_fonction *) (*s_objet).objet))
3454: .nom_fonction);
3455: (*longueur_effective) = 9 + longueur_fonction + 8;
3456: }
3457:
3458: for(i = 1; i <= 8; i++)
3459: {
3460: chaine[(*longueur_effective) - i] = (unsigned char)
3461: (((*((struct_fonction *) (*s_objet).objet))
3462: .nombre_arguments >> ((8 - i) * 8)) & 0xFF);
3463: }
3464: }
3465: else if (((*s_objet).type == LST) || ((*s_objet).type == ALG)
3466: || ((*s_objet).type == RPN))
3467: {
3468:
3469: /*
3470: --------------------------------------------------------------------------------
3471: Liste
3472: Poids fort 0100
3473:
3474: Expression algébrique
3475: Poids fort 0111
3476:
3477: Définition
3478: Poids fort 0110
3479: --------------------------------------------------------------------------------
3480: */
3481:
3482: chaine = malloc(sizeof(unsigned char));
3483:
3484: if (chaine == NULL)
3485: {
3486: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3487: return(NULL);
3488: }
3489:
3490: if ((*s_objet).type == LST)
3491: {
3492: type_binaire = 0x40;
3493: }
3494: else if ((*s_objet).type == RPN)
3495: {
3496: type_binaire = 0x60;
3497: }
3498: else // ALG
3499: {
3500: type_binaire = 0x70;
3501: }
3502:
3503: // Calcul de la longueur de la liste.
3504:
3505: longueur_liste = 0;
3506: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
3507:
3508: while(l_element_courant != NULL)
3509: {
3510: l_element_courant = (*l_element_courant).suivant;
3511: longueur_liste++;
3512: }
3513:
3514: if (longueur_liste < (1LL << 3))
3515: {
3516: chaine[0] = (unsigned char) (type_binaire |
3517: (longueur_liste & 0x7));
3518: }
3519: else if (longueur_liste < (1LL << 8))
3520: {
3521: chaine[0] = (unsigned char) (type_binaire | 0x08);
3522: }
3523: else if (longueur_liste < (1LL << 16))
3524: {
3525: chaine[0] = (unsigned char ) (type_binaire | 0x09);
3526: }
3527: else if (longueur_liste < (1LL << 32))
3528: {
3529: chaine[0] = (unsigned char) (type_binaire | 0x0A);
3530: }
3531: else
3532: {
3533: chaine[0] = (unsigned char) (type_binaire | 0x0B);
3534: }
3535:
3536: longueur_totale = 1;
3537:
3538: if ((chaine[0] & 0x8) != 0)
3539: {
3540: switch(chaine[0] & 0x03)
3541: {
3542: case 0x00 :
3543: {
3544: longueur_totale += 1;
3545:
3546: if ((chaine = realloc(chaine,
3547: ((size_t) longueur_totale) *
3548: sizeof(unsigned char))) == NULL)
3549: {
3550: (*s_etat_processus).erreur_systeme =
3551: d_es_allocation_memoire;
3552: return(NULL);
3553: }
3554:
3555: chaine[longueur_totale - 1] =
3556: (unsigned char) (longueur_liste & 0xFF);
3557: break;
3558: }
3559:
3560: case 0x01 :
3561: {
3562: longueur_totale += 2;
3563:
3564: if ((chaine = realloc(chaine,
3565: ((size_t) longueur_totale) *
3566: sizeof(unsigned char))) == NULL)
3567: {
3568: (*s_etat_processus).erreur_systeme =
3569: d_es_allocation_memoire;
3570: return(NULL);
3571: }
3572:
3573: chaine[longueur_totale - 2] =
3574: (unsigned char) ((longueur_liste >> 8) & 0xFF);
3575: chaine[longueur_totale - 1] =
3576: (unsigned char) (longueur_liste & 0xFF);
3577: break;
3578: }
3579:
3580: case 0x02 :
3581: {
3582: longueur_totale += 4;
3583:
3584: if ((chaine = realloc(chaine,
3585: ((size_t) longueur_totale) *
3586: sizeof(unsigned char))) == NULL)
3587: {
3588: (*s_etat_processus).erreur_systeme =
3589: d_es_allocation_memoire;
3590: return(NULL);
3591: }
3592:
3593: chaine[longueur_totale - 4] =
3594: (unsigned char) ((longueur_liste >> 24) & 0xFF);
3595: chaine[longueur_totale - 3] =
3596: (unsigned char) ((longueur_liste >> 16) & 0xFF);
3597: chaine[longueur_totale - 2] =
3598: (unsigned char) ((longueur_liste >> 8) & 0xFF);
3599: chaine[longueur_totale - 1] =
3600: (unsigned char) (longueur_liste & 0xFF);
3601: break;
3602: }
3603:
3604: case 0x03 :
3605: {
3606: longueur_totale += 8;
3607:
3608: if ((chaine = realloc(chaine,
3609: ((size_t) longueur_totale) *
3610: sizeof(unsigned char))) == NULL)
3611: {
3612: (*s_etat_processus).erreur_systeme =
3613: d_es_allocation_memoire;
3614: return(NULL);
3615: }
3616:
3617: chaine[longueur_totale - 8] =
3618: (unsigned char) ((longueur_liste >> 56) & 0xFF);
3619: chaine[longueur_totale - 7] =
3620: (unsigned char) ((longueur_liste >> 48) & 0xFF);
3621: chaine[longueur_totale - 6] =
3622: (unsigned char) ((longueur_liste >> 40) & 0xFF);
3623: chaine[longueur_totale - 5] =
3624: (unsigned char) ((longueur_liste >> 32) & 0xFF);
3625: chaine[longueur_totale - 4] =
3626: (unsigned char) ((longueur_liste >> 24) & 0xFF);
3627: chaine[longueur_totale - 3] =
3628: (unsigned char) ((longueur_liste >> 16) & 0xFF);
3629: chaine[longueur_totale - 2] =
3630: (unsigned char) ((longueur_liste >> 8) & 0xFF);
3631: chaine[longueur_totale - 1] =
3632: (unsigned char) (longueur_liste & 0xFF);
3633: break;
3634: }
3635:
3636: default :
3637: {
3638: BUG(1, printf("Internal format error\n"));
3639: }
3640: }
3641: }
3642:
3643: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
3644: l_element_courant_format = (struct_liste_chainee *)
3645: (*s_format).objet;
3646: nombre_elements = 0;
3647:
3648: while((l_element_courant != NULL) &&
3649: (l_element_courant_format != NULL))
3650: {
3651: if ((((*(*l_element_courant_format).donnee).type == LST)
3652: && ((*(*l_element_courant).donnee).type == LST)) ||
3653: (((*(*l_element_courant_format).donnee).type == TBL)
3654: && ((*(*l_element_courant).donnee).type == TBL)))
3655: {
3656: if (format_sortie != 'N')
3657: {
3658: if ((chaine_formatee = formateur_fichier(
3659: s_etat_processus,
3660: (*l_element_courant).donnee,
3661: (*l_element_courant_format).donnee,
3662: 0, 0, ' ', 'U', longueur_effective, recursivite,
3663: export_fichier)) == NULL)
3664: {
3665: return(NULL);
3666: }
3667: }
3668: else
3669: {
3670: if ((chaine_formatee = formateur_fichier(
3671: s_etat_processus,
3672: (*l_element_courant).donnee,
3673: (*l_element_courant_format).donnee,
3674: 0, 0, 'N', 'U', longueur_effective, recursivite,
3675: export_fichier)) == NULL)
3676: {
3677: return(NULL);
3678: }
3679: }
3680:
3681: if ((chaine = realloc(chaine, ((size_t) (longueur_totale +
3682: (*longueur_effective))) * sizeof(unsigned char)))
3683: == NULL)
3684: {
3685: (*s_etat_processus).erreur_systeme =
3686: d_es_allocation_memoire;
3687: return(NULL);
3688: }
3689:
3690: memcpy(&(chaine[longueur_totale]), chaine_formatee,
3691: (size_t) (*longueur_effective));
3692: longueur_totale += (*longueur_effective);
3693: free(chaine_formatee);
3694: }
3695: else if ((*(*l_element_courant_format).donnee).type != CHN)
3696: {
3697: free(chaine);
3698:
3699: (*s_etat_processus).erreur_execution =
3700: d_ex_erreur_format_fichier;
3701: return(NULL);
3702: }
3703: else
3704: {
3705: if ((format_chaine = conversion_majuscule((unsigned char *)
3706: (*(*l_element_courant_format).donnee).objet))
3707: == NULL)
3708: {
3709: (*s_etat_processus).erreur_systeme =
3710: d_es_allocation_memoire;
3711: return(NULL);
3712: }
3713:
3714: if (strncmp("INTEGER*", format_chaine, 8) == 0)
3715: {
3716: format_sortie = 'I';
3717: position_1 = 8;
3718: }
3719: else if (strncmp("LOGICAL*", format_chaine, 8) == 0)
3720: {
3721: format_sortie = 'L';
3722: position_1 = 8;
3723: }
3724: else if (strncmp("REAL*", format_chaine, 5) == 0)
3725: {
3726: format_sortie = 'R';
3727: position_1 = 5;
3728: }
3729: else if (strncmp("COMPLEX*", format_chaine, 8) == 0)
3730: {
3731: format_sortie = 'C';
3732: position_1 = 8;
3733: }
3734: else if (strncmp("CHARACTER*", format_chaine, 10) == 0)
3735: {
3736: format_sortie = 'S';
3737: position_1 = 10;
3738: format_degenere = d_vrai;
3739: }
3740: else if (strcmp("NATIVE*(*)", format_chaine) == 0)
3741: {
3742: format_sortie = 'N';
3743: position_1 = 7;
3744: format_degenere = d_vrai;
3745: }
3746: else
3747: {
3748: free(chaine);
3749: free(format_chaine);
3750:
3751: (*s_etat_processus).erreur_execution =
3752: d_ex_erreur_format_fichier;
3753: return(NULL);
3754: }
3755:
3756: if (format_chaine[position_1] == d_code_fin_chaine)
3757: {
3758: free(chaine);
3759: free(format_chaine);
3760:
3761: (*s_etat_processus).erreur_execution =
3762: d_ex_erreur_format_fichier;
3763: return(NULL);
3764: }
3765:
3766: if (strcmp(&(format_chaine[position_1]), "(*)") != 0)
3767: {
3768: if (sscanf(&(format_chaine[position_1]), "%lld",
3769: &longueur) != 1)
3770: {
3771: free(chaine);
3772: free(format_chaine);
3773:
3774: (*s_etat_processus).erreur_execution =
3775: d_ex_erreur_format_fichier;
3776: return(NULL);
3777: }
3778:
3779: longueur_champ = longueur;
3780: }
3781: else
3782: {
3783: longueur_champ = -1;
3784: longueur = -1;
3785: }
3786:
3787: free(format_chaine);
3788:
3789: if ((chaine_formatee = formateur_fichier(s_etat_processus,
3790: (*l_element_courant).donnee, s_format,
3791: longueur, longueur_champ, format_sortie, type,
3792: longueur_effective, recursivite, export_fichier))
3793: == NULL)
3794: {
3795: free(chaine);
3796: return(NULL);
3797: }
3798:
3799: if ((chaine = realloc(chaine,
3800: ((size_t) (longueur_totale + (*longueur_effective)))
3801: * sizeof(unsigned char))) == NULL)
3802: {
3803: (*s_etat_processus).erreur_systeme =
3804: d_es_allocation_memoire;
3805: return(NULL);
3806: }
3807:
3808: memcpy(&(chaine[longueur_totale]), chaine_formatee,
3809: (size_t) (*longueur_effective));
3810: longueur_totale += (*longueur_effective);
3811: free(chaine_formatee);
3812: }
3813:
3814: nombre_elements++;
3815: l_element_courant = (*l_element_courant).suivant;
3816:
3817: if (format_sortie != 'N')
3818: {
3819: l_element_courant_format =
3820: (*l_element_courant_format).suivant;
3821: }
3822: }
3823:
3824: if (format_sortie != 'N')
3825: {
3826: if ((l_element_courant != NULL) ||
3827: (l_element_courant_format != NULL))
3828: {
3829: free(chaine);
3830:
3831: (*s_etat_processus).erreur_execution =
3832: d_ex_erreur_format_fichier;
3833: return(NULL);
3834: }
3835: }
3836:
3837: (*longueur_effective) = longueur_totale;
3838: }
3839: else if ((*s_objet).type == TBL)
3840: {
3841:
3842: /*
3843: --------------------------------------------------------------------------------
3844: Table
3845: --------------------------------------------------------------------------------
3846: */
3847: }
3848: else if ((*s_objet).type == MCX)
3849: {
3850:
3851: /*
3852: --------------------------------------------------------------------------------
3853: Matrice complexe
3854: --------------------------------------------------------------------------------
3855: */
3856: }
3857: else if ((*s_objet).type == MIN)
3858: {
3859:
3860: /*
3861: --------------------------------------------------------------------------------
3862: Matrice entière
3863: --------------------------------------------------------------------------------
3864: */
3865: }
3866: else if ((*s_objet).type == MRL)
3867: {
3868:
3869: /*
3870: --------------------------------------------------------------------------------
3871: Matrice réelle
3872: --------------------------------------------------------------------------------
3873: */
3874: }
3875: else if ((*s_objet).type == NOM)
3876: {
3877:
3878: /*
3879: --------------------------------------------------------------------------------
3880: Nom
3881: Poids fort 0101
3882: --------------------------------------------------------------------------------
3883: */
3884: if (format_sortie != 'N')
3885: {
3886: (*s_etat_processus).erreur_execution =
3887: d_ex_erreur_format_fichier;
3888: return(NULL);
3889: }
3890:
3891: longueur_fonction = (integer8) strlen((*((struct_nom *)
3892: (*s_objet).objet)).nom);
3893:
3894: if (longueur_fonction < (1LL << 3))
3895: {
3896: if ((chaine = malloc((1 + ((size_t) longueur_fonction) + 1)
3897: * sizeof(unsigned char)))== NULL)
3898: {
3899: (*s_etat_processus).erreur_systeme =
3900: d_es_allocation_memoire;
3901: return(NULL);
3902: }
3903:
3904: chaine[0] = (unsigned char) (0x50 | (longueur_fonction & 0x7));
3905:
3906: strcpy(chaine + 1, (*((struct_nom *) (*s_objet).objet)).nom);
3907: (*longueur_effective) = longueur_fonction + 2;
3908: }
3909: else if (longueur_fonction < (1LL << 8))
3910: {
3911: if ((chaine = malloc((2 + ((size_t) longueur_fonction) + 1)
3912: * sizeof(unsigned char)))== NULL)
3913: {
3914: (*s_etat_processus).erreur_systeme =
3915: d_es_allocation_memoire;
3916: return(NULL);
3917: }
3918:
3919: chaine[0] = (unsigned char) (0x50 | 0x08);
3920: chaine[1] = (unsigned char) (longueur_fonction & 0xFF);
3921:
3922: strcpy(chaine + 2, (*((struct_nom *) (*s_objet).objet)).nom);
3923: (*longueur_effective) = longueur_fonction + 3;
3924: }
3925: else if (longueur_fonction < (1LL << 16))
3926: {
3927: if ((chaine = malloc((3 + ((size_t) longueur_fonction) + 1)
3928: * sizeof(unsigned char)))== NULL)
3929: {
3930: (*s_etat_processus).erreur_systeme =
3931: d_es_allocation_memoire;
3932: return(NULL);
3933: }
3934:
3935: chaine[0] = (unsigned char) (0x50 | 0x09);
3936: chaine[1] = (unsigned char) ((longueur_fonction >> 8) & 0xFF);
3937: chaine[2] = (unsigned char) (longueur_fonction & 0xFF);
3938:
3939: strcpy(chaine + 3, (*((struct_nom *) (*s_objet).objet)).nom);
3940: (*longueur_effective) = longueur_fonction + 4;
3941: }
3942: else if (longueur_fonction < (1LL << 32))
3943: {
3944: if ((chaine = malloc((5 + ((size_t) longueur_fonction) + 1)
3945: * sizeof(unsigned char)))== NULL)
3946: {
3947: (*s_etat_processus).erreur_systeme =
3948: d_es_allocation_memoire;
3949: return(NULL);
3950: }
3951:
3952: chaine[0] = (unsigned char) (0xE0 | 0x0A);
3953: chaine[1] = (unsigned char) ((longueur_fonction >> 24) & 0xFF);
3954: chaine[2] = (unsigned char) ((longueur_fonction >> 16) & 0xFF);
3955: chaine[3] = (unsigned char) ((longueur_fonction >> 8) & 0xFF);
3956: chaine[4] = (unsigned char) (longueur_fonction & 0xFF);
3957:
3958: strcpy(chaine + 5, (*((struct_nom *) (*s_objet).objet)).nom);
3959: (*longueur_effective) = longueur_fonction + 6;
3960: }
3961: else
3962: {
3963: if ((chaine = malloc((9 + ((size_t) longueur_fonction) + 1)
3964: * sizeof(unsigned char)))== NULL)
3965: {
3966: (*s_etat_processus).erreur_systeme =
3967: d_es_allocation_memoire;
3968: return(NULL);
3969: }
3970:
3971: chaine[0] = (unsigned char) (0xE0 | 0x0B);
3972: chaine[1] = (unsigned char) ((longueur_fonction >> 56) & 0xFF);
3973: chaine[2] = (unsigned char) ((longueur_fonction >> 48) & 0xFF);
3974: chaine[3] = (unsigned char) ((longueur_fonction >> 40) & 0xFF);
3975: chaine[4] = (unsigned char) ((longueur_fonction >> 32) & 0xFF);
3976: chaine[5] = (unsigned char) ((longueur_fonction >> 24) & 0xFF);
3977: chaine[6] = (unsigned char) ((longueur_fonction >> 16) & 0xFF);
3978: chaine[7] = (unsigned char) ((longueur_fonction >> 8) & 0xFF);
3979: chaine[8] = (unsigned char) (longueur_fonction & 0xFF);
3980:
3981: strcpy(chaine + 9, (*((struct_nom *) (*s_objet).objet)).nom);
3982: (*longueur_effective) = longueur_fonction + 10;
3983: }
3984:
3985: chaine[(*longueur_effective) - 1] = ((*((struct_nom *)
3986: (*s_objet).objet)).symbole == d_vrai) ? 0xFF : 0x00;
3987: }
3988: else if ((*s_objet).type == REL)
3989: {
3990:
3991: /*
3992: --------------------------------------------------------------------------------
3993: Réel
3994: Poids fort 0001 01
3995: --------------------------------------------------------------------------------
3996: */
3997:
3998: if (format_sortie == 'N')
3999: {
4000: format_sortie = 'R';
4001: longueur = 8;
4002: }
4003:
4004: if ((format_sortie != 'R') && (format_sortie != 'C'))
4005: {
4006: (*s_etat_processus).erreur_execution =
4007: d_ex_erreur_format_fichier;
4008: return(NULL);
4009: }
4010:
4011: if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus,
4012: (*s_objet).objet, 'R', format_sortie,
4013: longueur, longueur_effective)) == NULL)
4014: {
4015: return(NULL);
4016: }
4017: }
4018: else if ((*s_objet).type == VCX)
4019: {
4020:
4021: /*
4022: --------------------------------------------------------------------------------
4023: Vecteur complexe
4024: --------------------------------------------------------------------------------
4025: */
4026: }
4027: else if ((*s_objet).type == VIN)
4028: {
4029:
4030: /*
4031: --------------------------------------------------------------------------------
4032: Vecteur entier
4033: --------------------------------------------------------------------------------
4034: */
4035: }
4036: else if ((*s_objet).type == VRL)
4037: {
4038:
4039: /*
4040: --------------------------------------------------------------------------------
4041: Vecteur réel
4042: --------------------------------------------------------------------------------
4043: */
4044: }
4045: else
4046: {
4047: // Type non exportable
4048:
4049: (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier;
4050: free(chaine);
4051:
4052: return(NULL);
4053: }
4054:
4055: // On n'ajoute la longueur de l'enregistrement que dans le cas
4056: // où le format est utilisé dans un fichier.
4057:
4058: if (((*recursivite) == 1) && (export_fichier == d_vrai))
4059: {
4060: // Ajout de la longueur totale en fin d'enregistrement.
4061:
4062: longueur_totale = (*longueur_effective);
4063:
4064: if (longueur_totale < (((integer8) 1) << 7))
4065: {
4066: tampon[0] = (unsigned char) (((longueur_totale + 1) << 1)
4067: & 0xFF);
4068:
4069: if ((chaine = realloc(chaine, (((size_t) longueur_totale) + 1)
4070: * sizeof(unsigned char))) == NULL)
4071: {
4072: (*s_etat_processus).erreur_systeme =
4073: d_es_allocation_memoire;
4074: return(NULL);
4075: }
4076:
4077: // XXXX XXX0
4078: memcpy(&(chaine[longueur_totale]), tampon, 1);
4079: longueur_totale += 1;
4080: }
4081: else
4082: {
4083: longueur_totale++;
4084:
4085: // i = { 0 (16 bits) 2 (32 bits) 6 (64 bits) }
4086:
4087: i = 0;
4088:
4089: for(;;)
4090: {
4091: if ((longueur_totale < (((integer8) 1) << (8 * (i + 2))))
4092: || (i == 6))
4093: {
4094: // LSB (4 bits de poids fort)
4095: tampon[0] = (unsigned char) ((longueur_totale & 0xF0)
4096: | 0x1 /* longueur supérieure à 7 bits */
4097: | ((i + 1) << 1));
4098:
4099: for(j = 0; j <= i; j++)
4100: {
4101: tampon[(i - j) + 1] = (unsigned char)
4102: ((longueur_totale >> (8 * (j + 1)))
4103: & 0xFF);
4104: }
4105:
4106: // LSB (4 bits de poids faible)
4107: tampon[i + 2] = (unsigned char)
4108: (((longueur_totale & 0x0F) << 4)
4109: | 0x1 /* longueur supérieure à 7 bits */
4110: | ((i + 1) << 1));
4111: break;
4112: }
4113:
4114: switch(i)
4115: {
4116: case 0 :
4117: {
4118: i = 2;
4119: break;
4120: }
4121:
4122: case 2 :
4123: {
4124: i = 6;
4125: break;
4126: }
4127: }
4128: }
4129:
4130: // i = 0 => +3 (16 bits)
4131: // i = 2 => +5 (32 bits)
4132: // i = 6 => +9 (64 bits)
4133:
4134: if ((chaine = realloc(chaine, (((size_t) longueur_totale)
4135: + ((i == 0) ? 3 : ((i == 2) ? 5 : 9)))
4136: * sizeof(unsigned char))) == NULL)
4137: {
4138: (*s_etat_processus).erreur_systeme =
4139: d_es_allocation_memoire;
4140: return(NULL);
4141: }
4142:
4143: memcpy(&(chaine[longueur_totale]), tampon, 3);
4144: longueur_totale += 3;
4145: }
4146:
4147: __zone();
4148: (*longueur_effective) = longueur_totale;
4149: }
4150: }
4151:
4152: (*recursivite)--;
4153:
4154: return(chaine);
4155: }
4156:
4157:
4158: /*
4159: ================================================================================
4160: Routines qui transforment un nombre entier, réel ou complexe en chaîne de
4161: caractères suivant le format courant
4162: ================================================================================
4163: Entrées : pointeur générique sur la donnée numérique à convertir,
4164: type de l'entité (I, R ou C).
4165: --------------------------------------------------------------------------------
4166: Sorties : chaîne de caractères allouée dans la routine
4167: --------------------------------------------------------------------------------
4168: Effets de bord : néant
4169: ================================================================================
4170: */
4171:
4172: /*
4173: --------------------------------------------------------------------------------
4174: Formatage des complexes, réels et entiers
4175: --------------------------------------------------------------------------------
4176: */
4177:
4178: unsigned char *
4179: formateur_fichier_nombre(struct_processus *s_etat_processus,
4180: void *valeur_numerique, unsigned char type,
4181: integer8 longueur, integer8 longueur_champ, unsigned char format)
4182: {
4183: unsigned char *chaine;
4184: unsigned char *construction_chaine;
4185: unsigned char *sauvegarde;
4186: unsigned char *tampon;
4187:
4188: chaine = NULL;
4189:
4190: switch(type)
4191: {
4192: case 'C' :
4193: {
4194: construction_chaine = (unsigned char *) malloc(
4195: 2 * sizeof(unsigned char));
4196:
4197: if (construction_chaine == NULL)
4198: {
4199: (*s_etat_processus).erreur_systeme =
4200: d_es_allocation_memoire;
4201: return(NULL);
4202: }
4203:
4204: strcpy(construction_chaine, "(");
4205:
4206: tampon = formateur_fichier_reel(s_etat_processus,
4207: (void *) &((*((struct_complexe16 *)
4208: valeur_numerique)).partie_reelle), 'R',
4209: longueur, longueur_champ, format);
4210:
4211: if (tampon == NULL)
4212: {
4213: (*s_etat_processus).erreur_systeme =
4214: d_es_allocation_memoire;
4215: return(NULL);
4216: }
4217:
4218: sauvegarde = construction_chaine;
4219:
4220: construction_chaine = (unsigned char *) malloc(
4221: (strlen(sauvegarde) + strlen(tampon) + 2)
4222: * sizeof(unsigned char));
4223:
4224: if (construction_chaine == NULL)
4225: {
4226: (*s_etat_processus).erreur_systeme =
4227: d_es_allocation_memoire;
4228: return(NULL);
4229: }
4230:
4231: strcpy(construction_chaine, sauvegarde);
4232: free(sauvegarde);
4233: strcat(construction_chaine, tampon);
4234: free(tampon);
4235:
4236: strcat(construction_chaine, ",");
4237:
4238: tampon = formateur_fichier_reel(s_etat_processus,
4239: (void *) &((*((struct_complexe16 *)
4240: valeur_numerique)).partie_imaginaire), 'R',
4241: longueur, longueur_champ, format);
4242:
4243: if (tampon == NULL)
4244: {
4245: (*s_etat_processus).erreur_systeme =
4246: d_es_allocation_memoire;
4247: return(NULL);
4248: }
4249:
4250: sauvegarde = construction_chaine;
4251:
4252: construction_chaine = (unsigned char *) malloc(
4253: (strlen(sauvegarde) + strlen(tampon) + 2)
4254: * sizeof(unsigned char));
4255:
4256: if (construction_chaine == NULL)
4257: {
4258: (*s_etat_processus).erreur_systeme =
4259: d_es_allocation_memoire;
4260: return(NULL);
4261: }
4262:
4263: strcpy(construction_chaine, sauvegarde);
4264: free(sauvegarde);
4265: strcat(construction_chaine, tampon);
4266: free(tampon);
4267: strcat(construction_chaine, ")");
4268:
4269: chaine = construction_chaine;
4270:
4271: break;
4272: }
4273:
4274: case 'R' :
4275: {
4276: chaine = formateur_fichier_reel(s_etat_processus,
4277: valeur_numerique, 'R', longueur, longueur_champ,
4278: format);
4279:
4280: if (chaine == NULL)
4281: {
4282: (*s_etat_processus).erreur_systeme =
4283: d_es_allocation_memoire;
4284: return(NULL);
4285: }
4286:
4287: break;
4288: }
4289:
4290: default :
4291: case 'I' :
4292: {
4293: chaine = formateur_fichier_reel(s_etat_processus,
4294: valeur_numerique, 'I', longueur, longueur_champ,
4295: format);
4296:
4297: if (chaine == NULL)
4298: {
4299: (*s_etat_processus).erreur_systeme =
4300: d_es_allocation_memoire;
4301: return(NULL);
4302: }
4303:
4304: break;
4305: }
4306: }
4307:
4308: return(chaine);
4309: }
4310:
4311:
4312: /*
4313: --------------------------------------------------------------------------------
4314: Formateur des réels et entiers
4315: --------------------------------------------------------------------------------
4316: */
4317:
4318: unsigned char *
4319: formateur_fichier_reel(struct_processus *s_etat_processus,
4320: void *valeur_numerique, unsigned char type,
4321: integer8 longueur, integer8 longueur_champ,
4322: unsigned char format_sortie)
4323: {
4324: real8 mantisse;
4325: real8 tampon_reel;
4326:
4327: integer8 i;
4328: integer8 tampon_entier;
4329:
4330: long correction;
4331: long exposant;
4332: long longueur_utile;
4333: long longueur_utile_limite;
4334:
4335: unsigned char *chaine;
4336: unsigned char format[16 + 1];
4337: unsigned char mode[3 + 1];
4338: unsigned char tampon[16 + 1];
4339:
4340: chaine = (unsigned char *) malloc((32 + 1) * sizeof(unsigned char));
4341:
4342: if (chaine == NULL)
4343: {
4344: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
4345: return(NULL);
4346: }
4347:
4348: if (type == 'R')
4349: {
4350: tampon_reel = *((real8 *) valeur_numerique);
4351:
4352: if (tampon_reel > ((real8) 0))
4353: {
4354: exposant = (long) floor(log10(tampon_reel));
4355: }
4356: else if (tampon_reel < ((real8) 0))
4357: {
4358: exposant = (long) floor(log10(-tampon_reel));
4359: }
4360: else
4361: {
4362: exposant = 0;
4363: }
4364:
4365: mantisse = (*((real8 *) valeur_numerique)) / pow(10, (double) exposant);
4366: }
4367: else
4368: {
4369: tampon_entier = *((integer8 *) valeur_numerique);
4370:
4371: if (tampon_entier > ((integer8) 0))
4372: {
4373: exposant = (long) floor(log10((double) tampon_entier));
4374: }
4375: else if (tampon_entier < ((integer8) 0))
4376: {
4377: exposant = (long) floor(log10((double) -tampon_entier));
4378: }
4379: else
4380: {
4381: exposant = 0;
4382: }
4383:
4384: mantisse = ((real8) (*((integer8 *) valeur_numerique))) /
4385: pow(10, (double) exposant);
4386: }
4387:
4388: longueur_utile = (long) longueur;
4389: longueur_utile_limite = 15;
4390:
4391: if (longueur_utile > longueur_utile_limite)
4392: {
4393: longueur_utile = longueur_utile_limite;
4394: }
4395:
4396: if (format_sortie == 'S')
4397: {
4398: strcpy(mode, "STD");
4399: }
4400: else if (format_sortie == 'C')
4401: {
4402: strcpy(mode, "SCI");
4403: }
4404: else if (format_sortie == 'F')
4405: {
4406: strcpy(mode, "FIX");
4407: }
4408: else
4409: {
4410: strcpy(mode, "ENG");
4411: }
4412:
4413: if ((strcmp(mode, "SCI") == 0) ||
4414: ((strcmp(mode, "STD") == 0) && ((exposant >
4415: longueur_utile_limite) ||
4416: (exposant < -longueur_utile_limite))) ||
4417: ((strcmp(mode, "FIX") == 0) &&
4418: ((exposant >= longueur_utile_limite) ||
4419: (exposant < -longueur_utile))))
4420: {
4421: chaine[0] = 0;
4422: format[0] = 0;
4423:
4424: if (strcmp(mode, "STD") == 0)
4425: {
4426: longueur_utile = longueur_utile_limite - 1;
4427: }
4428:
4429: sprintf(format, "%%.%luf", longueur_utile);
4430:
4431: sprintf(tampon, format, mantisse);
4432: strcpy(chaine, tampon);
4433: strcat(chaine, "E");
4434: sprintf(tampon, "%ld", exposant);
4435: strcat(chaine, tampon);
4436: }
4437: else if (strcmp(mode, "FIX") == 0)
4438: {
4439: chaine[0] = 0;
4440: format[0] = 0;
4441:
4442: if (longueur_utile + exposant >= longueur_utile_limite)
4443: {
4444: longueur_utile = longueur_utile_limite - (exposant + 1);
4445: }
4446:
4447: sprintf(format, "%%.%luf", longueur_utile);
4448:
4449: sprintf(tampon, format, (mantisse * pow(10, (double) exposant)));
4450: strcpy(chaine, tampon);
4451: }
4452: else if (strcmp(mode, "ENG") == 0)
4453: {
4454: chaine[0] = 0;
4455: format[0] = 0;
4456:
4457: correction = labs(exposant) % 3;
4458:
4459: if (exposant < 0)
4460: {
4461: if (correction == 0)
4462: {
4463: correction = 3;
4464: }
4465:
4466: correction = 3 - correction;
4467: }
4468:
4469: longueur_utile -= correction;
4470: sprintf(format, "%%.%luf", longueur_utile);
4471:
4472: sprintf(tampon, format, (mantisse * pow(10, (double) correction)));
4473: strcpy(chaine, tampon);
4474: strcat(chaine, "E");
4475: sprintf(tampon, "%ld", (exposant - correction));
4476: strcat(chaine, tampon);
4477: }
4478: else
4479: {
4480: if (type == 'I')
4481: {
4482: chaine[0] = 0;
4483: sprintf(tampon, "%lld", *((integer8 *) valeur_numerique));
4484: }
4485: else
4486: {
4487: chaine[0] = 0;
4488: format[0] = 0;
4489:
4490: if (exposant >= 0)
4491: {
4492: sprintf(format, "%%.%luf", (longueur_utile_limite - exposant
4493: - 1));
4494: }
4495: else
4496: {
4497: sprintf(format, "%%.%luf", longueur_utile_limite);
4498: }
4499:
4500: sprintf(tampon, format, *((real8 *) valeur_numerique));
4501:
4502: i = (integer8) (strlen(tampon)) - 1;
4503: while(tampon[i] == '0')
4504: {
4505: tampon[i] = 0;
4506: i--;
4507: }
4508:
4509: if (ds_imposition_separateur_decimal == d_faux)
4510: {
4511: i = ((integer8) strlen(tampon)) - 1;
4512: if (tampon[i] == '.')
4513: {
4514: tampon[i] = 0;
4515: }
4516: }
4517: }
4518:
4519: strcpy(chaine, tampon);
4520: }
4521:
4522: if (longueur_champ >= 0)
4523: {
4524: if (strlen(chaine) > (size_t) longueur_champ)
4525: {
4526: for(i = 0; i < longueur_champ; i++)
4527: {
4528: chaine[i] = '*';
4529: }
4530:
4531: chaine[i] = d_code_fin_chaine;
4532: }
4533: }
4534:
4535: return(chaine);
4536: }
4537:
4538:
4539: /*
4540: --------------------------------------------------------------------------------
4541: Mêmes fonctions mais pour les fichiers binaires
4542: --------------------------------------------------------------------------------
4543: */
4544:
4545: unsigned char *
4546: formateur_fichier_binaire_nombre(struct_processus *s_etat_processus,
4547: void *valeur_numerique, unsigned char type_entree,
4548: unsigned char type, integer8 longueur, integer8 *longueur_conversion)
4549: {
4550: unsigned char *chaine;
4551:
4552: switch(type)
4553: {
4554: case 'I' :
4555: {
4556: if (type_entree != type)
4557: {
4558: (*s_etat_processus).erreur_execution = d_ex_representation;
4559: return(NULL);
4560: }
4561:
4562: switch(longueur)
4563: {
4564: case 1:
4565: {
4566: if ((*((integer8 *) valeur_numerique)) !=
4567: ((integer1) (*((integer8 *) valeur_numerique))))
4568: {
4569: (*s_etat_processus).erreur_execution =
4570: d_ex_representation;
4571: return(NULL);
4572: }
4573:
4574: if ((chaine = malloc(2 * sizeof(unsigned char))) == NULL)
4575: {
4576: (*s_etat_processus).erreur_systeme =
4577: d_es_allocation_memoire;
4578: return(NULL);
4579: }
4580:
4581: (*longueur_conversion) = 2;
4582: chaine[0] = (unsigned char) 0x10;
4583: chaine[1] = (unsigned char) ((*((integer8 *)
4584: valeur_numerique)) & 0xFF);
4585: break;
4586: }
4587:
4588: case 2:
4589: {
4590: if ((*((integer8 *) valeur_numerique)) !=
4591: ((integer2) (*((integer8 *) valeur_numerique))))
4592: {
4593: (*s_etat_processus).erreur_execution =
4594: d_ex_representation;
4595: return(NULL);
4596: }
4597:
4598: if ((chaine = malloc(3 * sizeof(unsigned char))) == NULL)
4599: {
4600: (*s_etat_processus).erreur_systeme =
4601: d_es_allocation_memoire;
4602: return(NULL);
4603: }
4604:
4605: (*longueur_conversion) = 3;
4606: chaine[0] = (unsigned char) 0x11;
4607: chaine[1] = ((unsigned char) ((*((integer8 *)
4608: valeur_numerique)) >> 8) & 0xFF);
4609: chaine[2] = (unsigned char) ((*((integer8 *)
4610: valeur_numerique)) & 0xFF);
4611: break;
4612: }
4613:
4614: case 4:
4615: {
4616: if ((*((integer8 *) valeur_numerique)) !=
4617: ((integer4) (*((integer8 *) valeur_numerique))))
4618: {
4619: (*s_etat_processus).erreur_execution =
4620: d_ex_representation;
4621: return(NULL);
4622: }
4623:
4624: if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL)
4625: {
4626: (*s_etat_processus).erreur_systeme =
4627: d_es_allocation_memoire;
4628: return(NULL);
4629: }
4630:
4631: (*longueur_conversion) = 5;
4632: chaine[0] = (unsigned char) 0x12;
4633: chaine[1] = (unsigned char) (((*((integer8 *)
4634: valeur_numerique)) >> 24) & 0xFF);
4635: chaine[2] = (unsigned char) (((*((integer8 *)
4636: valeur_numerique)) >> 16) & 0xFF);
4637: chaine[3] = (unsigned char) (((*((integer8 *)
4638: valeur_numerique)) >> 8) & 0xFF);
4639: chaine[4] = (unsigned char) ((*((integer8 *)
4640: valeur_numerique)) & 0xFF);
4641: break;
4642: }
4643:
4644: case 8:
4645: {
4646: if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL)
4647: {
4648: (*s_etat_processus).erreur_systeme =
4649: d_es_allocation_memoire;
4650: return(NULL);
4651: }
4652:
4653: (*longueur_conversion) = 9;
4654: chaine[0] = (unsigned char) 0x13;
4655: chaine[1] = (unsigned char) (((*((integer8 *)
4656: valeur_numerique)) >> 56) & 0xFF);
4657: chaine[2] = (unsigned char) (((*((integer8 *)
4658: valeur_numerique)) >> 48) & 0xFF);
4659: chaine[3] = (unsigned char) (((*((integer8 *)
4660: valeur_numerique)) >> 40) & 0xFF);
4661: chaine[4] = (unsigned char) (((*((integer8 *)
4662: valeur_numerique)) >> 32) & 0xFF);
4663: chaine[5] = (unsigned char) (((*((integer8 *)
4664: valeur_numerique)) >> 24) & 0xFF);
4665: chaine[6] = (unsigned char) (((*((integer8 *)
4666: valeur_numerique)) >> 16) & 0xFF);
4667: chaine[7] = (unsigned char) (((*((integer8 *)
4668: valeur_numerique)) >> 8) & 0xFF);
4669: chaine[8] = (unsigned char) ((*((integer8 *)
4670: valeur_numerique)) & 0xFF);
4671: break;
4672: }
4673:
4674: default :
4675: {
4676: (*s_etat_processus).erreur_execution =
4677: d_ex_erreur_format_fichier;
4678: return(NULL);
4679: }
4680: }
4681:
4682: break;
4683: }
4684:
4685: case 'R' :
4686: {
4687: switch(longueur)
4688: {
4689: case 4:
4690: {
4691: real8 valeur;
4692: real8 vinf;
4693: real8 vsup;
4694:
4695: union
4696: {
4697: real4 r4;
4698: integer4 i4;
4699: } eq4;
4700:
4701: if (type_entree == 'R')
4702: {
4703: valeur = (*((real8 *) valeur_numerique));
4704: }
4705: else if (type_entree == 'I')
4706: {
4707: valeur = (real8) (*((integer8 *) valeur_numerique));
4708: }
4709: else
4710: {
4711: (*s_etat_processus).erreur_execution =
4712: d_ex_representation;
4713: return(NULL);
4714: }
4715:
4716: if (valeur > 0)
4717: {
4718: vinf = nextafter(valeur, 0);
4719: vsup = nextafter(valeur, valeur * 2);
4720: }
4721: else
4722: {
4723: vinf = nextafter(valeur, valeur * 2);
4724: vsup = nextafter(valeur, 0);
4725: }
4726:
4727: if (!((vinf <= ((real4) valeur)) &&
4728: (((real4) valeur) <= vsup)))
4729: {
4730: (*s_etat_processus).erreur_execution =
4731: d_ex_representation;
4732: return(NULL);
4733: }
4734:
4735: if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL)
4736: {
4737: (*s_etat_processus).erreur_systeme =
4738: d_es_allocation_memoire;
4739: return(NULL);
4740: }
4741:
4742: eq4.r4 = (real4) valeur;
4743: (*longueur_conversion) = 5;
4744: chaine[0] = (unsigned char) 0x14;
4745: chaine[1] = (unsigned char) ((eq4.i4 >> 24) & 0xFF);
4746: chaine[2] = (unsigned char) ((eq4.i4 >> 16) & 0xFF);
4747: chaine[3] = (unsigned char) ((eq4.i4 >> 8) & 0xFF);
4748: chaine[4] = (unsigned char) (eq4.i4 & 0xFF);
4749: break;
4750: }
4751:
4752: case 8:
4753: {
4754: union
4755: {
4756: real8 r8;
4757: integer8 i8;
4758: } eq8;
4759:
4760: if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL)
4761: {
4762: (*s_etat_processus).erreur_systeme =
4763: d_es_allocation_memoire;
4764: return(NULL);
4765: }
4766:
4767: if (type_entree == 'I')
4768: {
4769: eq8.r8 = (real8) (*((integer8 *) valeur_numerique));
4770: }
4771: else if (type_entree == 'R')
4772: {
4773: eq8.r8 = (*((real8 *) valeur_numerique));
4774: }
4775: else
4776: {
4777: (*s_etat_processus).erreur_execution =
4778: d_ex_representation;
4779: return(NULL);
4780: }
4781:
4782: (*longueur_conversion) = 9;
4783: chaine[0] = (unsigned char) (0x15);
4784: chaine[1] = (unsigned char) ((eq8.i8 >> 56) & 0xFF);
4785: chaine[2] = (unsigned char) ((eq8.i8 >> 48) & 0xFF);
4786: chaine[3] = (unsigned char) ((eq8.i8 >> 40) & 0xFF);
4787: chaine[4] = (unsigned char) ((eq8.i8 >> 32) & 0xFF);
4788: chaine[5] = (unsigned char) ((eq8.i8 >> 24) & 0xFF);
4789: chaine[6] = (unsigned char) ((eq8.i8 >> 16) & 0xFF);
4790: chaine[7] = (unsigned char) ((eq8.i8 >> 8) & 0xFF);
4791: chaine[8] = (unsigned char) (eq8.i8 & 0xFF);
4792: break;
4793: }
4794:
4795: default :
4796: {
4797: (*s_etat_processus).erreur_execution =
4798: d_ex_erreur_format_fichier;
4799: return(NULL);
4800: }
4801: }
4802:
4803: break;
4804: }
4805:
4806: case 'C' :
4807: {
4808: switch(longueur)
4809: {
4810: case 8:
4811: {
4812: unsigned char *partie_reelle;
4813: unsigned char *partie_imaginaire;
4814:
4815: integer8 limag;
4816: integer8 lreel;
4817:
4818: real8 zero;
4819:
4820: if (type_entree == 'I')
4821: {
4822: if ((partie_reelle = formateur_fichier_binaire_nombre(
4823: s_etat_processus, &(*((integer8 *)
4824: valeur_numerique)), 'I', 'R', 4,
4825: &lreel)) == NULL)
4826: {
4827: return(NULL);
4828: }
4829:
4830: zero = 0;
4831:
4832: if ((partie_imaginaire =
4833: formateur_fichier_binaire_nombre(
4834: s_etat_processus, &zero, 'R', 'R', 4,
4835: &limag)) == NULL)
4836: {
4837: free(partie_reelle);
4838: return(NULL);
4839: }
4840: }
4841: else if (type_entree == 'R')
4842: {
4843: if ((partie_reelle = formateur_fichier_binaire_nombre(
4844: s_etat_processus, &(*((real8 *)
4845: valeur_numerique)), 'R', 'R', 4,
4846: &lreel)) == NULL)
4847: {
4848: return(NULL);
4849: }
4850:
4851: zero = 0;
4852:
4853: if ((partie_imaginaire =
4854: formateur_fichier_binaire_nombre(
4855: s_etat_processus, &zero, 'R', 'R', 4,
4856: &limag)) == NULL)
4857: {
4858: free(partie_reelle);
4859: return(NULL);
4860: }
4861: }
4862: else if (type_entree == 'C')
4863: {
4864: if ((partie_reelle = formateur_fichier_binaire_nombre(
4865: s_etat_processus, &((*((complex16 *)
4866: valeur_numerique)).partie_reelle), 'R', 'R', 4,
4867: &lreel)) == NULL)
4868: {
4869: return(NULL);
4870: }
4871:
4872: if ((partie_imaginaire =
4873: formateur_fichier_binaire_nombre(
4874: s_etat_processus, &((*((complex16 *)
4875: valeur_numerique)).partie_imaginaire),
4876: 'R', 'R', 4, &limag)) == NULL)
4877: {
4878: free(partie_reelle);
4879: return(NULL);
4880: }
4881: }
4882: else
4883: {
4884: (*s_etat_processus).erreur_execution =
4885: d_ex_erreur_format_fichier;
4886: return(NULL);
4887: }
4888:
4889: if ((chaine = malloc((((size_t) lreel) + ((size_t) limag)
4890: - 1) * sizeof(unsigned char))) == NULL)
4891: {
4892: free(partie_reelle);
4893: free(partie_imaginaire);
4894:
4895: (*s_etat_processus).erreur_systeme =
4896: d_es_allocation_memoire;
4897: return(NULL);
4898: }
4899:
4900: chaine[0] = (unsigned char) 0x18;
4901: memcpy(chaine + 1, partie_reelle + 1,
4902: ((size_t) lreel) - 1);
4903: memcpy(chaine + lreel, partie_imaginaire + 1,
4904: ((size_t) limag) - 1);
4905: (*longueur_conversion) = lreel + limag - 1;
4906:
4907: free(partie_reelle);
4908: free(partie_imaginaire);
4909: break;
4910: }
4911:
4912: case 16:
4913: {
4914: unsigned char *partie_reelle;
4915: unsigned char *partie_imaginaire;
4916:
4917: integer8 limag;
4918: integer8 lreel;
4919:
4920: real8 zero;
4921:
4922: if (type_entree == 'I')
4923: {
4924: if ((partie_reelle = formateur_fichier_binaire_nombre(
4925: s_etat_processus, &(*((integer8 *)
4926: valeur_numerique)), 'I', 'R', 8,
4927: &lreel)) == NULL)
4928: {
4929: return(NULL);
4930: }
4931:
4932: zero = 0;
4933:
4934: if ((partie_imaginaire =
4935: formateur_fichier_binaire_nombre(
4936: s_etat_processus, &zero, 'R', 'R', 8,
4937: &limag)) == NULL)
4938: {
4939: free(partie_reelle);
4940: return(NULL);
4941: }
4942: }
4943: else if (type_entree == 'R')
4944: {
4945: if ((partie_reelle = formateur_fichier_binaire_nombre(
4946: s_etat_processus, &(*((real8 *)
4947: valeur_numerique)), 'R', 'R', 8,
4948: &lreel)) == NULL)
4949: {
4950: return(NULL);
4951: }
4952:
4953: zero = 0;
4954:
4955: if ((partie_imaginaire =
4956: formateur_fichier_binaire_nombre(
4957: s_etat_processus, &zero, 'R', 'R', 8,
4958: &limag)) == NULL)
4959: {
4960: free(partie_reelle);
4961: return(NULL);
4962: }
4963: }
4964: else if (type_entree == 'C')
4965: {
4966: if ((partie_reelle = formateur_fichier_binaire_nombre(
4967: s_etat_processus, &((*((complex16 *)
4968: valeur_numerique)).partie_reelle), 'R', 'R', 8,
4969: &lreel)) == NULL)
4970: {
4971: return(NULL);
4972: }
4973:
4974: if ((partie_imaginaire =
4975: formateur_fichier_binaire_nombre(
4976: s_etat_processus, &((*((complex16 *)
4977: valeur_numerique)).partie_imaginaire),
4978: 'R', 'R', 8, &limag)) == NULL)
4979: {
4980: free(partie_reelle);
4981: return(NULL);
4982: }
4983: }
4984: else
4985: {
4986: (*s_etat_processus).erreur_execution =
4987: d_ex_erreur_format_fichier;
4988: return(NULL);
4989: }
4990:
4991: if ((chaine = malloc((((size_t) lreel) + ((size_t) limag)
4992: - 1) * sizeof(unsigned char))) == NULL)
4993: {
4994: free(partie_reelle);
4995: free(partie_imaginaire);
4996:
4997: (*s_etat_processus).erreur_systeme =
4998: d_es_allocation_memoire;
4999: return(NULL);
5000: }
5001:
5002: chaine[0] = (unsigned char) 0x19;
5003: memcpy(chaine + 1, partie_reelle + 1,
5004: ((size_t) lreel) - 1);
5005: memcpy(chaine + lreel, partie_imaginaire + 1,
5006: ((size_t) limag) - 1);
5007: (*longueur_conversion) = lreel + limag - 1;
5008:
5009: free(partie_reelle);
5010: free(partie_imaginaire);
5011: break;
5012: }
5013:
5014: default :
5015: {
5016: (*s_etat_processus).erreur_execution =
5017: d_ex_erreur_format_fichier;
5018: return(NULL);
5019: }
5020: }
5021:
5022: break;
5023: }
5024:
5025: default :
5026: {
5027: (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier;
5028: return(NULL);
5029: }
5030: }
5031:
5032: return(chaine);
5033: }
5034:
5035:
5036: /*
5037: ================================================================================
5038: Routines de conversion d'un objet binaire en struct_objet *
5039: ================================================================================
5040: Entrées : pointeur sur un void *. Si longueur_buffer est strictement inférieur
5041: à zéro, il s'agit d'un file * sinon d'un buffer de type unsigned
5042: char *.
5043: --------------------------------------------------------------------------------
5044: Sorties : pointeur sur un struct_objet nouvellement alloué
5045: --------------------------------------------------------------------------------
5046: Effets de bord : néant
5047: ================================================================================
5048: */
5049:
5050: struct_objet *
5051: lecture_fichier_non_formate(struct_processus *s_etat_processus,
5052: void *argument, integer8 longueur_buffer, logical1 recursivite)
5053: {
5054: file *fichier;
5055:
5056: int j;
5057:
5058: integer8 i;
5059: integer8 longueur;
5060:
5061: struct_liste_chainee *l_element_courant;
5062:
5063: struct_objet *s_objet;
5064: struct_objet *s_objet_elementaire;
5065:
5066: unsigned char octets[8];
5067: unsigned char *buffer;
5068: unsigned char *flux;
5069: unsigned char *ptr;
5070: unsigned char type_objet;
5071:
5072: size_t deplacement;
5073:
5074: if (longueur_buffer < 0)
5075: {
5076: fichier = argument;
5077: buffer = NULL;
5078: ptr = NULL;
5079: }
5080: else
5081: {
5082: buffer = (*((unsigned char **) argument));
5083: ptr = buffer;
5084: fichier = NULL;
5085: }
5086:
5087: if (longueur_buffer < 0)
5088: {
5089: if (fread(octets, (size_t) sizeof(unsigned char),
5090: 1, fichier) != 1)
5091: {
5092: if (feof(fichier))
5093: {
5094: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5095: }
5096: else
5097: {
5098: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
5099: }
5100:
5101: return(NULL);
5102: }
5103: }
5104: else
5105: {
5106: if ((longueur_buffer - (ptr - buffer)) >= 1)
5107: {
5108: octets[0] = *ptr++;
5109: }
5110: else
5111: {
5112: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5113: return(NULL);
5114: }
5115: }
5116:
5117: switch(type_objet = (octets[0] & 0xF0))
5118: {
5119: case 0x00: // Binaire
5120: {
5121: switch(octets[0] & 0x0F)
5122: {
5123: case 0x01: // logical*1
5124: {
5125: deplacement = 1;
5126: break;
5127: }
5128:
5129: case 0x02: // logical*2
5130: {
5131: deplacement = 2;
5132: break;
5133: }
5134:
5135: case 0x04: // logical*4
5136: {
5137: deplacement = 4;
5138: break;
5139: }
5140:
5141: case 0x08: // logical*8
5142: {
5143: deplacement = 8;
5144: break;
5145: }
5146:
5147: default:
5148: {
5149: (*s_etat_processus).erreur_execution =
5150: d_ex_syntaxe;
5151: return(NULL);
5152: }
5153: }
5154:
5155: if (longueur_buffer < 0)
5156: {
5157: if (fread(octets, (size_t) sizeof(unsigned char),
5158: deplacement, fichier) != deplacement)
5159: {
5160: if (feof(fichier))
5161: {
5162: (*s_etat_processus).erreur_execution =
5163: d_ex_syntaxe;
5164: }
5165: else
5166: {
5167: (*s_etat_processus).erreur_systeme =
5168: d_es_erreur_fichier;
5169: }
5170:
5171: return(NULL);
5172: }
5173: }
5174: else
5175: {
5176: if ((longueur_buffer - (ptr - buffer)) >=
5177: (ssize_t) deplacement)
5178: {
5179: for(i = 0; i < (signed) deplacement; i++)
5180: {
5181: octets[i] = *ptr++;
5182: }
5183: }
5184: else
5185: {
5186: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5187: return(NULL);
5188: }
5189: }
5190:
5191: if ((s_objet = allocation(s_etat_processus, BIN)) == NULL)
5192: {
5193: return(NULL);
5194: }
5195:
5196: (*((logical8 *) (*s_objet).objet)) = 0;
5197:
5198: for(i = 0; i < (signed) deplacement; i++)
5199: {
5200: (*((logical8 *) (*s_objet).objet)) |= ((logical8) octets[i])
5201: << (8 * ((((signed) deplacement) - 1) - i));
5202: }
5203:
5204: break;
5205: }
5206:
5207: case 0x10: // Scalaire
5208: {
5209: switch(octets[0] & 0x0C)
5210: {
5211: case 0x00: // Entier
5212: {
5213: switch(octets[0] & 0x03)
5214: {
5215: case 0x00: // integer*1
5216: {
5217: deplacement = 1;
5218: break;
5219: }
5220:
5221: case 0x01: // integer*2
5222: {
5223: deplacement = 2;
5224: break;
5225: }
5226:
5227: case 0x02: // integer*4
5228: {
5229: deplacement = 4;
5230: break;
5231: }
5232:
5233: case 0x03: // integer*8
5234: {
5235: deplacement = 8;
5236: break;
5237: }
5238: }
5239:
5240: if (longueur_buffer < 0)
5241: {
5242: if (fread(octets, (size_t) sizeof(unsigned char),
5243: deplacement, fichier) != deplacement)
5244: {
5245: if (feof(fichier))
5246: {
5247: (*s_etat_processus).erreur_execution =
5248: d_ex_syntaxe;
5249: }
5250: else
5251: {
5252: (*s_etat_processus).erreur_systeme =
5253: d_es_erreur_fichier;
5254: }
5255:
5256: return(NULL);
5257: }
5258: }
5259: else
5260: {
5261: if ((longueur_buffer - (ptr - buffer)) >=
5262: (ssize_t) deplacement)
5263: {
5264: for(i = 0; i < (signed) deplacement; i++)
5265: {
5266: octets[i] = *ptr++;
5267: }
5268: }
5269: else
5270: {
5271: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5272: return(NULL);
5273: }
5274: }
5275:
5276: if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
5277: {
5278: return(NULL);
5279: }
5280:
5281: // Récupération des données avec extension de signe.
5282:
5283: {
5284: integer1 i1;
5285: integer2 i2;
5286: integer4 i4;
5287: integer8 i8;
5288:
5289: i1 = 0;
5290: i2 = 0;
5291: i4 = 0;
5292: i8 = 0;
5293:
5294: for(i = 0; i < (signed) deplacement; i++)
5295: {
5296: switch(deplacement)
5297: {
5298: case 1:
5299: i1 = (integer1) octets[0];
5300: break;
5301:
5302: case 2:
5303: i2 |= (integer2) (((integer8) octets[i]) <<
5304: (8 * ((((signed) deplacement) - 1)
5305: - i)));
5306: break;
5307:
5308: case 4:
5309: i4 |= (integer4) (((integer8) octets[i]) <<
5310: (8 * ((((signed) deplacement) - 1)
5311: - i)));
5312: break;
5313:
5314: case 8:
5315: i8 |= (integer8) (((integer8) octets[i]) <<
5316: (8 * ((((signed) deplacement) - 1)
5317: - i)));
5318: break;
5319: }
5320: }
5321:
5322: switch(deplacement)
5323: {
5324: case 1:
5325: (*((integer8 *) (*s_objet).objet)) =
5326: (integer8) i1;
5327: break;
5328:
5329: case 2:
5330: (*((integer8 *) (*s_objet).objet)) =
5331: (integer8) i2;
5332: break;
5333:
5334: case 4:
5335: (*((integer8 *) (*s_objet).objet)) =
5336: (integer8) i4;
5337: break;
5338:
5339: case 8:
5340: (*((integer8 *) (*s_objet).objet)) =
5341: (integer8) i8;
5342: break;
5343: }
5344: }
5345:
5346: break;
5347: }
5348:
5349: case 0x04: // Réel
5350: {
5351: switch(octets[0] & 0x03)
5352: {
5353: case 0x00: // real*4
5354: {
5355: deplacement = 4;
5356: break;
5357: }
5358:
5359: case 0x01: // real*8
5360: {
5361: deplacement = 8;
5362: break;
5363: }
5364:
5365: default:
5366: {
5367: (*s_etat_processus).erreur_execution =
5368: d_ex_syntaxe;
5369: return(NULL);
5370: }
5371: }
5372:
5373: if (longueur_buffer < 0)
5374: {
5375: if (fread(octets, (size_t) sizeof(unsigned char),
5376: deplacement, fichier) != deplacement)
5377: {
5378: if (feof(fichier))
5379: {
5380: (*s_etat_processus).erreur_execution =
5381: d_ex_syntaxe;
5382: }
5383: else
5384: {
5385: (*s_etat_processus).erreur_systeme =
5386: d_es_erreur_fichier;
5387: }
5388:
5389: return(NULL);
5390: }
5391: }
5392: else
5393: {
5394: if ((longueur_buffer - (ptr - buffer)) >=
5395: (ssize_t) deplacement)
5396: {
5397: for(i = 0; i < (signed) deplacement; i++)
5398: {
5399: octets[i] = *ptr++;
5400: }
5401: }
5402: else
5403: {
5404: (*s_etat_processus).erreur_execution =
5405: d_ex_syntaxe;
5406: return(NULL);
5407: }
5408: }
5409:
5410: if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
5411: {
5412: return(NULL);
5413: }
5414:
5415: if (deplacement == 4)
5416: {
5417: union
5418: {
5419: real4 r4;
5420: integer4 i4;
5421: } eq4;
5422:
5423: eq4.i4 = 0;
5424:
5425: for(i = 0; i < (signed) deplacement; i++)
5426: {
5427: eq4.i4 |= ((integer4) octets[i]) <<
5428: (8 * ((((signed) deplacement) - 1) - i));
5429: }
5430:
5431: (*((real8 *) (*s_objet).objet)) = (real8) eq4.r4;
5432: }
5433: else
5434: {
5435: union
5436: {
5437: real8 r8;
5438: integer8 i8;
5439: } eq8;
5440:
5441: eq8.i8 = 0;
5442:
5443: for(i = 0; i < (signed) deplacement; i++)
5444: {
5445: eq8.i8 |= ((integer8) octets[i]) <<
5446: (8 * ((((signed) deplacement) - 1) - i));
5447: }
5448:
5449: (*((real8 *) (*s_objet).objet)) = (real8) eq8.r8;
5450: }
5451:
5452: break;
5453: }
5454:
5455: case 0x08: // Complexe
5456: {
5457: switch(octets[0] & 0x03)
5458: {
5459: case 0x00: // complex*8
5460: {
5461: deplacement = 4;
5462: break;
5463: }
5464:
5465: case 0x01: // complex*16
5466: {
5467: deplacement = 8;
5468: break;
5469: }
5470:
5471: default:
5472: {
5473: (*s_etat_processus).erreur_execution =
5474: d_ex_syntaxe;
5475: return(NULL);
5476: }
5477: }
5478:
5479: if ((s_objet = allocation(s_etat_processus, CPL)) == NULL)
5480: {
5481: return(NULL);
5482: }
5483:
5484: for(j = 0; j < 2; j++)
5485: {
5486: if (longueur_buffer < 0)
5487: {
5488: if (fread(octets, (size_t) sizeof(unsigned char),
5489: deplacement, fichier) != deplacement)
5490: {
5491: liberation(s_etat_processus, s_objet);
5492:
5493: if (feof(fichier))
5494: {
5495: (*s_etat_processus).erreur_execution =
5496: d_ex_syntaxe;
5497: }
5498: else
5499: {
5500: (*s_etat_processus).erreur_systeme =
5501: d_es_erreur_fichier;
5502: }
5503:
5504: return(NULL);
5505: }
5506: }
5507: else
5508: {
5509: if ((longueur_buffer - (ptr - buffer)) >=
5510: (ssize_t) deplacement)
5511: {
5512: for(i = 0; i < (signed) deplacement; i++)
5513: {
5514: octets[i] = *ptr++;
5515: }
5516: }
5517: else
5518: {
5519: liberation(s_etat_processus, s_objet);
5520: (*s_etat_processus).erreur_execution =
5521: d_ex_syntaxe;
5522: return(NULL);
5523: }
5524: }
5525:
5526: if (deplacement == 4)
5527: {
5528: union
5529: {
5530: real4 r4;
5531: integer4 i4;
5532: } eq4;
5533:
5534: eq4.i4 = 0;
5535:
5536: for(i = 0; i < (signed) deplacement; i++)
5537: {
5538: eq4.i4 |= ((integer4) octets[i]) <<
5539: (8 * ((((signed) deplacement) - 1)
5540: - i));
5541: }
5542:
5543: if (j == 0)
5544: {
5545: (*((complex16 *) (*s_objet).objet))
5546: .partie_reelle = (real8) eq4.r4;
5547: }
5548: else
5549: {
5550: (*((complex16 *) (*s_objet).objet))
5551: .partie_imaginaire = (real8) eq4.r4;
5552: }
5553: }
5554: else
5555: {
5556: union
5557: {
5558: real8 r8;
5559: integer8 i8;
5560: } eq8;
5561:
5562: eq8.i8 = 0;
5563:
5564: for(i = 0; i < (signed) deplacement; i++)
5565: {
5566: eq8.i8 |= ((integer8) octets[i]) <<
5567: (8 * ((((signed) deplacement) - 1)
5568: - i));
5569: }
5570:
5571: if (j == 0)
5572: {
5573: (*((complex16 *) (*s_objet).objet))
5574: .partie_reelle = (real8) eq8.r8;
5575: }
5576: else
5577: {
5578: (*((complex16 *) (*s_objet).objet))
5579: .partie_imaginaire = (real8) eq8.r8;
5580: }
5581: }
5582: }
5583:
5584: break;
5585: }
5586:
5587: default:
5588: {
5589: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5590: return(NULL);
5591: }
5592: }
5593:
5594: break;
5595: }
5596:
5597: case 0x40: // Liste
5598: case 0x60: // Expression
5599: case 0x70: // Expression algébrique
5600: {
5601: if ((octets[0] & 0x08) == 0) // Longueur sur 6 bits
5602: {
5603: longueur = (octets[0] & 0x07);
5604: }
5605: else
5606: {
5607: switch(octets[0] & 0x07)
5608: {
5609: case 0x00: // Longueur sur 8 bits
5610: {
5611: if (longueur_buffer < 0)
5612: {
5613: if (fread(octets, (size_t) sizeof(unsigned char),
5614: 1, fichier) != 1)
5615: {
5616: if (feof(fichier))
5617: {
5618: (*s_etat_processus).erreur_execution =
5619: d_ex_syntaxe;
5620: }
5621: else
5622: {
5623: (*s_etat_processus).erreur_systeme =
5624: d_es_erreur_fichier;
5625: }
5626:
5627: return(NULL);
5628: }
5629: }
5630: else
5631: {
5632: if ((longueur_buffer - (ptr - buffer)) >= 1)
5633: {
5634: octets[0] = *ptr++;
5635: }
5636: else
5637: {
5638: (*s_etat_processus).erreur_execution =
5639: d_ex_syntaxe;
5640: return(NULL);
5641: }
5642: }
5643:
5644: longueur = octets[0];
5645: break;
5646: }
5647:
5648: case 0x01: // Longueur sur 16 bits
5649: {
5650: if (longueur_buffer < 0)
5651: {
5652: if (fread(octets, (size_t) sizeof(unsigned char),
5653: 2, fichier) != 2)
5654: {
5655: if (feof(fichier))
5656: {
5657: (*s_etat_processus).erreur_execution =
5658: d_ex_syntaxe;
5659: }
5660: else
5661: {
5662: (*s_etat_processus).erreur_systeme =
5663: d_es_erreur_fichier;
5664: }
5665:
5666: return(NULL);
5667: }
5668: }
5669: else
5670: {
5671: if ((longueur_buffer - (ptr - buffer)) >= 2)
5672: {
5673: for(j = 0; j < 2; octets[j++] = *ptr++);
5674: }
5675: else
5676: {
5677: (*s_etat_processus).erreur_execution =
5678: d_ex_syntaxe;
5679: return(NULL);
5680: }
5681: }
5682:
5683: longueur = (((integer8) (octets[0])) << 8)
5684: | ((integer8) (octets[1]));
5685: break;
5686: }
5687:
5688: case 0x02: // Longueur sur 32 bits
5689: {
5690: if (longueur_buffer < 0)
5691: {
5692: if (fread(octets, (size_t) sizeof(unsigned char),
5693: 4, fichier) != 4)
5694: {
5695: if (feof(fichier))
5696: {
5697: (*s_etat_processus).erreur_execution =
5698: d_ex_syntaxe;
5699: }
5700: else
5701: {
5702: (*s_etat_processus).erreur_systeme =
5703: d_es_erreur_fichier;
5704: }
5705:
5706: return(NULL);
5707: }
5708: }
5709: else
5710: {
5711: if ((longueur_buffer - (ptr - buffer)) >= 4)
5712: {
5713: for(j = 0; j < 4; octets[j++] = *ptr++);
5714: }
5715: else
5716: {
5717: (*s_etat_processus).erreur_execution =
5718: d_ex_syntaxe;
5719: return(NULL);
5720: }
5721: }
5722:
5723: longueur = (((integer8) (octets[0])) << 24)
5724: | (((integer8) (octets[1])) << 16)
5725: | (((integer8) (octets[2])) << 8)
5726: | ((integer8) (octets[3]));
5727: break;
5728: }
5729:
5730: case 0x03: // Longueur sur 64 bits
5731: {
5732: if (longueur_buffer < 0)
5733: {
5734: if (fread(octets, (size_t) sizeof(unsigned char),
5735: 8, fichier) != 8)
5736: {
5737: if (feof(fichier))
5738: {
5739: (*s_etat_processus).erreur_execution =
5740: d_ex_syntaxe;
5741: }
5742: else
5743: {
5744: (*s_etat_processus).erreur_systeme =
5745: d_es_erreur_fichier;
5746: }
5747:
5748: return(NULL);
5749: }
5750: }
5751: else
5752: {
5753: if ((longueur_buffer - (ptr - buffer)) >= 8)
5754: {
5755: for(j = 0; j < 8; octets[j++] = *ptr++);
5756: }
5757: else
5758: {
5759: (*s_etat_processus).erreur_execution =
5760: d_ex_syntaxe;
5761: return(NULL);
5762: }
5763: }
5764:
5765: longueur = (((integer8) (octets[0])) << 56)
5766: | (((integer8) (octets[1])) << 48)
5767: | (((integer8) (octets[2])) << 40)
5768: | (((integer8) (octets[3])) << 32)
5769: | (((integer8) (octets[4])) << 24)
5770: | (((integer8) (octets[5])) << 16)
5771: | (((integer8) (octets[6])) << 8)
5772: | ((integer8) (octets[7]));
5773: break;
5774: }
5775:
5776: default:
5777: {
5778: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5779: return(NULL);
5780: }
5781: }
5782: }
5783:
5784: if (type_objet == 0x40)
5785: {
5786: if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
5787: {
5788: return(NULL);
5789: }
5790: }
5791: else if (type_objet == 0x60)
5792: {
5793: if ((s_objet = allocation(s_etat_processus, RPN)) == NULL)
5794: {
5795: return(NULL);
5796: }
5797: }
5798: else
5799: {
5800: if ((s_objet = allocation(s_etat_processus, ALG)) == NULL)
5801: {
5802: return(NULL);
5803: }
5804: }
5805:
5806: l_element_courant = NULL;
5807:
5808: for(i = 0; i < longueur; i++)
5809: {
5810: // Lecture des éléments de la liste.
5811:
5812: if (longueur_buffer < 0)
5813: {
5814: if ((s_objet_elementaire = lecture_fichier_non_formate(
5815: s_etat_processus, fichier, longueur_buffer, d_vrai))
5816: == NULL)
5817: {
5818: liberation(s_etat_processus, s_objet);
5819: return(NULL);
5820: }
5821: }
5822: else
5823: {
5824: if ((s_objet_elementaire = lecture_fichier_non_formate(
5825: s_etat_processus, &ptr,
5826: longueur_buffer - (ptr - buffer), d_vrai)) == NULL)
5827: {
5828: liberation(s_etat_processus, s_objet);
5829: return(NULL);
5830: }
5831: }
5832:
5833: if (l_element_courant == NULL)
5834: {
5835: if (((*s_objet).objet = allocation_maillon(
5836: s_etat_processus)) == NULL)
5837: {
5838: liberation(s_etat_processus, s_objet_elementaire);
5839: liberation(s_etat_processus, s_objet);
5840: return(NULL);
5841: }
5842:
5843: l_element_courant = (*s_objet).objet;
5844: }
5845: else
5846: {
5847: if (((*l_element_courant).suivant = allocation_maillon(
5848: s_etat_processus)) == NULL)
5849: {
5850: liberation(s_etat_processus, s_objet_elementaire);
5851: liberation(s_etat_processus, s_objet);
5852: return(NULL);
5853: }
5854:
5855: l_element_courant = (*l_element_courant).suivant;
5856: }
5857:
5858: (*l_element_courant).donnee = s_objet_elementaire;
5859: (*l_element_courant).suivant = NULL;
5860: }
5861:
5862: break;
5863: }
5864:
5865: case 0x80: // Chaîne de caractères
5866: {
5867: if ((octets[0] & 0x08) == 0) // Longueur sur 6 bits
5868: {
5869: longueur = (octets[0] & 0x07);
5870: }
5871: else
5872: {
5873: switch(octets[0] & 0x07)
5874: {
5875: case 0x00: // Longueur sur 8 bits
5876: {
5877: if (longueur_buffer < 0)
5878: {
5879: if (fread(octets, (size_t) sizeof(unsigned char),
5880: 1, fichier) != 1)
5881: {
5882: if (feof(fichier))
5883: {
5884: (*s_etat_processus).erreur_execution =
5885: d_ex_syntaxe;
5886: }
5887: else
5888: {
5889: (*s_etat_processus).erreur_systeme =
5890: d_es_erreur_fichier;
5891: }
5892:
5893: return(NULL);
5894: }
5895: }
5896: else
5897: {
5898: if ((longueur_buffer - (ptr - buffer)) >= 1)
5899: {
5900: octets[0] = *ptr++;
5901: }
5902: else
5903: {
5904: (*s_etat_processus).erreur_execution =
5905: d_ex_syntaxe;
5906: return(NULL);
5907: }
5908: }
5909:
5910: longueur = octets[0];
5911: break;
5912: }
5913:
5914: case 0x01: // Longueur sur 16 bits
5915: {
5916: if (longueur_buffer < 0)
5917: {
5918: if (fread(octets, (size_t) sizeof(unsigned char),
5919: 2, fichier) != 2)
5920: {
5921: if (feof(fichier))
5922: {
5923: (*s_etat_processus).erreur_execution =
5924: d_ex_syntaxe;
5925: }
5926: else
5927: {
5928: (*s_etat_processus).erreur_systeme =
5929: d_es_erreur_fichier;
5930: }
5931:
5932: return(NULL);
5933: }
5934: }
5935: else
5936: {
5937: if ((longueur_buffer - (ptr - buffer)) >= 2)
5938: {
5939: for(j = 0; j < 2; octets[j++] = *ptr++);
5940: }
5941: else
5942: {
5943: (*s_etat_processus).erreur_execution =
5944: d_ex_syntaxe;
5945: return(NULL);
5946: }
5947: }
5948:
5949: longueur = (((integer8) (octets[0])) << 8)
5950: | ((integer8) (octets[1]));
5951: break;
5952: }
5953:
5954: case 0x02: // Longueur sur 32 bits
5955: {
5956: if (longueur_buffer < 0)
5957: {
5958: if (fread(octets, (size_t) sizeof(unsigned char),
5959: 4, fichier) != 4)
5960: {
5961: if (feof(fichier))
5962: {
5963: (*s_etat_processus).erreur_execution =
5964: d_ex_syntaxe;
5965: }
5966: else
5967: {
5968: (*s_etat_processus).erreur_systeme =
5969: d_es_erreur_fichier;
5970: }
5971:
5972: return(NULL);
5973: }
5974: }
5975: else
5976: {
5977: if ((longueur_buffer - (ptr - buffer)) >= 4)
5978: {
5979: for(j = 0; j < 4; octets[j++] = *ptr++);
5980: }
5981: else
5982: {
5983: (*s_etat_processus).erreur_execution =
5984: d_ex_syntaxe;
5985: return(NULL);
5986: }
5987: }
5988:
5989: longueur = (((integer8) (octets[0])) << 24)
5990: | (((integer8) (octets[1])) << 16)
5991: | (((integer8) (octets[2])) << 8)
5992: | ((integer8) (octets[3]));
5993: break;
5994: }
5995:
5996: case 0x03: // Longueur sur 64 bits
5997: {
5998: if (longueur_buffer < 0)
5999: {
6000: if (fread(octets, (size_t) sizeof(unsigned char),
6001: 8, fichier) != 8)
6002: {
6003: if (feof(fichier))
6004: {
6005: (*s_etat_processus).erreur_execution =
6006: d_ex_syntaxe;
6007: }
6008: else
6009: {
6010: (*s_etat_processus).erreur_systeme =
6011: d_es_erreur_fichier;
6012: }
6013:
6014: return(NULL);
6015: }
6016: }
6017: else
6018: {
6019: if ((longueur_buffer - (ptr - buffer)) >= 8)
6020: {
6021: for(j = 0; j < 8; octets[j++] = *ptr++);
6022: }
6023: else
6024: {
6025: (*s_etat_processus).erreur_execution =
6026: d_ex_syntaxe;
6027: return(NULL);
6028: }
6029: }
6030:
6031: longueur = (((integer8) (octets[0])) << 56)
6032: | (((integer8) (octets[1])) << 48)
6033: | (((integer8) (octets[2])) << 40)
6034: | (((integer8) (octets[3])) << 32)
6035: | (((integer8) (octets[4])) << 24)
6036: | (((integer8) (octets[5])) << 16)
6037: | (((integer8) (octets[6])) << 8)
6038: | ((integer8) (octets[7]));
6039: break;
6040: }
6041:
6042: default:
6043: {
6044: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6045: return(NULL);
6046: }
6047: }
6048: }
6049:
6050: if (longueur_buffer < 0)
6051: {
6052: if ((flux = malloc(((size_t) longueur) * sizeof(unsigned char)))
6053: == NULL)
6054: {
6055: (*s_etat_processus).erreur_systeme =
6056: d_es_allocation_memoire;
6057: return(NULL);
6058: }
6059:
6060: if (fread(flux, (size_t) sizeof(unsigned char),
6061: (size_t) longueur, fichier) != (size_t) longueur)
6062: {
6063: if (feof(fichier))
6064: {
6065: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6066: }
6067: else
6068: {
6069: (*s_etat_processus).erreur_systeme =
6070: d_es_erreur_fichier;
6071: }
6072:
6073: return(NULL);
6074: }
6075: }
6076: else
6077: {
6078: if ((longueur_buffer - (ptr - buffer)) < longueur)
6079: {
6080: (*s_etat_processus).erreur_execution =
6081: d_ex_syntaxe;
6082: return(NULL);
6083: }
6084:
6085: flux = ptr;
6086: ptr += longueur;
6087: }
6088:
6089: if ((s_objet = allocation(s_etat_processus, CHN)) == NULL)
6090: {
6091: if (longueur_buffer < 0)
6092: {
6093: free(flux);
6094: }
6095:
6096: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6097: return(NULL);
6098: }
6099:
6100: if (((*s_objet).objet = analyse_flux(s_etat_processus, flux,
6101: longueur)) == NULL)
6102: {
6103: return(NULL);
6104: }
6105:
6106: if (longueur_buffer < 0)
6107: {
6108: free(flux);
6109: }
6110:
6111: break;
6112: }
6113:
6114: case 0x50: // Nom
6115: {
6116: if ((octets[0] & 0x08) == 0) // Longueur sur 6 bits
6117: {
6118: longueur = (octets[0] & 0x07);
6119: }
6120: else
6121: {
6122: switch(octets[0] & 0x07)
6123: {
6124: case 0x00: // Longueur sur 8 bits
6125: {
6126: if (longueur_buffer < 0)
6127: {
6128: if (fread(octets, (size_t) sizeof(unsigned char),
6129: 1, fichier) != 1)
6130: {
6131: if (feof(fichier))
6132: {
6133: (*s_etat_processus).erreur_execution =
6134: d_ex_syntaxe;
6135: }
6136: else
6137: {
6138: (*s_etat_processus).erreur_systeme =
6139: d_es_erreur_fichier;
6140: }
6141:
6142: return(NULL);
6143: }
6144: }
6145: else
6146: {
6147: if ((longueur_buffer - (ptr - buffer)) >= 1)
6148: {
6149: octets[0] = *ptr++;
6150: }
6151: else
6152: {
6153: (*s_etat_processus).erreur_execution =
6154: d_ex_syntaxe;
6155: return(NULL);
6156: }
6157: }
6158:
6159: longueur = octets[0];
6160: break;
6161: }
6162:
6163: case 0x01: // Longueur sur 16 bits
6164: {
6165: if (longueur_buffer < 0)
6166: {
6167: if (fread(octets, (size_t) sizeof(unsigned char),
6168: 2, fichier) != 2)
6169: {
6170: if (feof(fichier))
6171: {
6172: (*s_etat_processus).erreur_execution =
6173: d_ex_syntaxe;
6174: }
6175: else
6176: {
6177: (*s_etat_processus).erreur_systeme =
6178: d_es_erreur_fichier;
6179: }
6180:
6181: return(NULL);
6182: }
6183: }
6184: else
6185: {
6186: if ((longueur_buffer - (ptr - buffer)) >= 2)
6187: {
6188: for(j = 0; j < 2; octets[j++] = *ptr++);
6189: }
6190: else
6191: {
6192: (*s_etat_processus).erreur_execution =
6193: d_ex_syntaxe;
6194: return(NULL);
6195: }
6196: }
6197:
6198: longueur = (((integer8) (octets[0])) << 8)
6199: | ((integer8) (octets[1]));
6200: break;
6201: }
6202:
6203: case 0x02: // Longueur sur 32 bits
6204: {
6205: if (longueur_buffer < 0)
6206: {
6207: if (fread(octets, (size_t) sizeof(unsigned char),
6208: 4, fichier) != 4)
6209: {
6210: if (feof(fichier))
6211: {
6212: (*s_etat_processus).erreur_execution =
6213: d_ex_syntaxe;
6214: }
6215: else
6216: {
6217: (*s_etat_processus).erreur_systeme =
6218: d_es_erreur_fichier;
6219: }
6220:
6221: return(NULL);
6222: }
6223: }
6224: else
6225: {
6226: if ((longueur_buffer - (ptr - buffer)) >= 4)
6227: {
6228: for(j = 0; j < 4; octets[j++] = *ptr++);
6229: }
6230: else
6231: {
6232: (*s_etat_processus).erreur_execution =
6233: d_ex_syntaxe;
6234: return(NULL);
6235: }
6236: }
6237:
6238: longueur = (((integer8) (octets[0])) << 24)
6239: | (((integer8) (octets[1])) << 16)
6240: | (((integer8) (octets[2])) << 8)
6241: | ((integer8) (octets[3]));
6242: break;
6243: }
6244:
6245: case 0x03: // Longueur sur 64 bits
6246: {
6247: if (longueur_buffer < 0)
6248: {
6249: if (fread(octets, (size_t) sizeof(unsigned char),
6250: 8, fichier) != 8)
6251: {
6252: if (feof(fichier))
6253: {
6254: (*s_etat_processus).erreur_execution =
6255: d_ex_syntaxe;
6256: }
6257: else
6258: {
6259: (*s_etat_processus).erreur_systeme =
6260: d_es_erreur_fichier;
6261: }
6262:
6263: return(NULL);
6264: }
6265: }
6266: else
6267: {
6268: if ((longueur_buffer - (ptr - buffer)) >= 8)
6269: {
6270: for(j = 0; j < 8; octets[j++] = *ptr++);
6271: }
6272: else
6273: {
6274: (*s_etat_processus).erreur_execution =
6275: d_ex_syntaxe;
6276: return(NULL);
6277: }
6278: }
6279:
6280: longueur = (((integer8) (octets[0])) << 56)
6281: | (((integer8) (octets[1])) << 48)
6282: | (((integer8) (octets[2])) << 40)
6283: | (((integer8) (octets[3])) << 32)
6284: | (((integer8) (octets[4])) << 24)
6285: | (((integer8) (octets[5])) << 16)
6286: | (((integer8) (octets[6])) << 8)
6287: | ((integer8) (octets[7]));
6288: break;
6289: }
6290:
6291: default:
6292: {
6293: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6294: return(NULL);
6295: }
6296: }
6297: }
6298:
6299: if ((s_objet = allocation(s_etat_processus, NOM)) == NULL)
6300: {
6301: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6302: return(NULL);
6303: }
6304:
6305: if (((*((struct_nom *) (*s_objet).objet)).nom =
6306: malloc((((size_t) longueur) + 1) * sizeof(unsigned char)))
6307: == NULL)
6308: {
6309: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6310: return(NULL);
6311: }
6312:
6313: if (longueur_buffer < 0)
6314: {
6315: if (fread((unsigned char *) (*((struct_nom *) (*s_objet)
6316: .objet)).nom, (size_t) sizeof(unsigned char),
6317: (size_t) longueur, fichier) != (unsigned) longueur)
6318: {
6319: if (feof(fichier))
6320: {
6321: (*s_etat_processus).erreur_execution =
6322: d_ex_syntaxe;
6323: }
6324: else
6325: {
6326: (*s_etat_processus).erreur_systeme =
6327: d_es_erreur_fichier;
6328: }
6329:
6330: liberation(s_etat_processus, s_objet);
6331: return(NULL);
6332: }
6333:
6334: if (fread(octets, (size_t) sizeof(unsigned char),
6335: 1, fichier) != 1)
6336: {
6337: if (feof(fichier))
6338: {
6339: (*s_etat_processus).erreur_execution =
6340: d_ex_syntaxe;
6341: }
6342: else
6343: {
6344: (*s_etat_processus).erreur_systeme =
6345: d_es_erreur_fichier;
6346: }
6347:
6348: liberation(s_etat_processus, s_objet);
6349: return(NULL);
6350: }
6351: }
6352: else
6353: {
6354: if ((longueur_buffer - (ptr - buffer)) >= (longueur + 1))
6355: {
6356: for(j = 0; j < longueur; (*((struct_nom *)
6357: (*s_objet).objet)).nom[j] = *ptr++);
6358: octets[0] = *ptr++;
6359: }
6360: else
6361: {
6362: liberation(s_etat_processus, s_objet);
6363: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6364: return(NULL);
6365: }
6366: }
6367:
6368: (*((struct_nom *) (*s_objet).objet)).nom[longueur] =
6369: d_code_fin_chaine;
6370: (*((struct_nom *) (*s_objet).objet)).symbole =
6371: (octets[0] == 0xFF) ? d_vrai : d_faux;
6372: break;
6373: }
6374:
6375: case 0xE0: // Fonction
6376: {
6377: if ((octets[0] & 0x08) == 0) // Longueur sur 6 bits
6378: {
6379: longueur = (octets[0] & 0x07);
6380: }
6381: else
6382: {
6383: switch(octets[0] & 0x07)
6384: {
6385: case 0x00: // Longueur sur 8 bits
6386: {
6387: if (longueur_buffer < 0)
6388: {
6389: if (fread(octets, (size_t) sizeof(unsigned char),
6390: 1, fichier) != 1)
6391: {
6392: if (feof(fichier))
6393: {
6394: (*s_etat_processus).erreur_execution =
6395: d_ex_syntaxe;
6396: }
6397: else
6398: {
6399: (*s_etat_processus).erreur_systeme =
6400: d_es_erreur_fichier;
6401: }
6402:
6403: return(NULL);
6404: }
6405: }
6406: else
6407: {
6408: if ((longueur_buffer - (ptr - buffer)) >= 1)
6409: {
6410: octets[0] = *ptr++;
6411: }
6412: else
6413: {
6414: (*s_etat_processus).erreur_execution =
6415: d_ex_syntaxe;
6416: return(NULL);
6417: }
6418: }
6419:
6420: longueur = octets[0];
6421: break;
6422: }
6423:
6424: case 0x01: // Longueur sur 16 bits
6425: {
6426: if (longueur_buffer < 0)
6427: {
6428: if (fread(octets, (size_t) sizeof(unsigned char),
6429: 2, fichier) != 2)
6430: {
6431: if (feof(fichier))
6432: {
6433: (*s_etat_processus).erreur_execution =
6434: d_ex_syntaxe;
6435: }
6436: else
6437: {
6438: (*s_etat_processus).erreur_systeme =
6439: d_es_erreur_fichier;
6440: }
6441:
6442: return(NULL);
6443: }
6444: }
6445: else
6446: {
6447: if ((longueur_buffer - (ptr - buffer)) >= 2)
6448: {
6449: for(j = 0; j < 2; octets[j++] = *ptr++);
6450: }
6451: else
6452: {
6453: (*s_etat_processus).erreur_execution =
6454: d_ex_syntaxe;
6455: return(NULL);
6456: }
6457: }
6458:
6459: longueur = (((integer8) (octets[0])) << 8)
6460: | ((integer8) (octets[1]));
6461: break;
6462: }
6463:
6464: case 0x02: // Longueur sur 32 bits
6465: {
6466: if (longueur_buffer < 0)
6467: {
6468: if (fread(octets, (size_t) sizeof(unsigned char),
6469: 4, fichier) != 4)
6470: {
6471: if (feof(fichier))
6472: {
6473: (*s_etat_processus).erreur_execution =
6474: d_ex_syntaxe;
6475: }
6476: else
6477: {
6478: (*s_etat_processus).erreur_systeme =
6479: d_es_erreur_fichier;
6480: }
6481:
6482: return(NULL);
6483: }
6484: }
6485: else
6486: {
6487: if ((longueur_buffer - (ptr - buffer)) >= 4)
6488: {
6489: for(j = 0; j < 4; octets[j++] = *ptr++);
6490: }
6491: else
6492: {
6493: (*s_etat_processus).erreur_execution =
6494: d_ex_syntaxe;
6495: return(NULL);
6496: }
6497: }
6498:
6499: longueur = (((integer8) (octets[0])) << 24)
6500: | (((integer8) (octets[1])) << 16)
6501: | (((integer8) (octets[2])) << 8)
6502: | ((integer8) (octets[3]));
6503: break;
6504: }
6505:
6506: case 0x03: // Longueur sur 64 bits
6507: {
6508: if (longueur_buffer < 0)
6509: {
6510: if (fread(octets, (size_t) sizeof(unsigned char),
6511: 8, fichier) != 8)
6512: {
6513: if (feof(fichier))
6514: {
6515: (*s_etat_processus).erreur_execution =
6516: d_ex_syntaxe;
6517: }
6518: else
6519: {
6520: (*s_etat_processus).erreur_systeme =
6521: d_es_erreur_fichier;
6522: }
6523:
6524: return(NULL);
6525: }
6526: }
6527: else
6528: {
6529: if ((longueur_buffer - (ptr - buffer)) >= 8)
6530: {
6531: for(j = 0; j < 8; octets[j++] = *ptr++);
6532: }
6533: else
6534: {
6535: (*s_etat_processus).erreur_execution =
6536: d_ex_syntaxe;
6537: return(NULL);
6538: }
6539: }
6540:
6541: longueur = (((integer8) (octets[0])) << 56)
6542: | (((integer8) (octets[1])) << 48)
6543: | (((integer8) (octets[2])) << 40)
6544: | (((integer8) (octets[3])) << 32)
6545: | (((integer8) (octets[4])) << 24)
6546: | (((integer8) (octets[5])) << 16)
6547: | (((integer8) (octets[6])) << 8)
6548: | ((integer8) (octets[7]));
6549: break;
6550: }
6551:
6552: default:
6553: {
6554: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6555: return(NULL);
6556: }
6557: }
6558: }
6559:
6560: if ((s_objet = allocation(s_etat_processus, FCT)) == NULL)
6561: {
6562: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6563: return(NULL);
6564: }
6565:
6566: if (((*((struct_fonction *) (*s_objet).objet)).nom_fonction =
6567: malloc((((size_t) longueur) + 1) * sizeof(unsigned char)))
6568: == NULL)
6569: {
6570: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6571: return(NULL);
6572: }
6573:
6574: if (longueur_buffer < 0)
6575: {
6576: if (fread((unsigned char *) (*((struct_fonction *) (*s_objet)
6577: .objet)).nom_fonction, (size_t) sizeof(unsigned char),
6578: (size_t) longueur, fichier) != (unsigned) longueur)
6579: {
6580: if (feof(fichier))
6581: {
6582: (*s_etat_processus).erreur_execution =
6583: d_ex_syntaxe;
6584: }
6585: else
6586: {
6587: (*s_etat_processus).erreur_systeme =
6588: d_es_erreur_fichier;
6589: }
6590:
6591: liberation(s_etat_processus, s_objet);
6592: return(NULL);
6593: }
6594:
6595: if (fread(octets, (size_t) sizeof(unsigned char),
6596: 8, fichier) != 8)
6597: {
6598: if (feof(fichier))
6599: {
6600: (*s_etat_processus).erreur_execution =
6601: d_ex_syntaxe;
6602: }
6603: else
6604: {
6605: (*s_etat_processus).erreur_systeme =
6606: d_es_erreur_fichier;
6607: }
6608:
6609: liberation(s_etat_processus, s_objet);
6610: return(NULL);
6611: }
6612: }
6613: else
6614: {
6615: if ((longueur_buffer - (ptr - buffer)) >= (longueur + 8))
6616: {
6617: for(j = 0; j < longueur; (*((struct_fonction *)
6618: (*s_objet).objet)).nom_fonction[j] = *ptr++);
6619: for(j = 0; j < 8; octets[j++] = *ptr++);
6620: }
6621: else
6622: {
6623: liberation(s_etat_processus, s_objet);
6624: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6625: return(NULL);
6626: }
6627: }
6628:
6629: (*((struct_fonction *) (*s_objet).objet)).nom_fonction[longueur] =
6630: d_code_fin_chaine;
6631: (*((struct_fonction *) (*s_objet).objet)).nombre_arguments =
6632: (((integer8) (octets[0])) << 56)
6633: | (((integer8) (octets[1])) << 48)
6634: | (((integer8) (octets[2])) << 40)
6635: | (((integer8) (octets[3])) << 32)
6636: | (((integer8) (octets[4])) << 24)
6637: | (((integer8) (octets[5])) << 16)
6638: | (((integer8) (octets[6])) << 8)
6639: | ((integer8) (octets[7]));
6640: break;
6641: }
6642:
6643: default:
6644: {
6645: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6646: return(NULL);
6647: }
6648: }
6649:
6650: if ((longueur_buffer < 0) && (recursivite == d_faux))
6651: {
6652: // Lecture depuis un fichier, on saute le champ de queue qui contient
6653: // la longueur de l'enregistrement.
6654:
6655: if (fread(octets, (size_t) sizeof(unsigned char), 1, fichier) != 1)
6656: {
6657: liberation(s_etat_processus, s_objet);
6658:
6659: if (feof(fichier))
6660: {
6661: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6662: }
6663: else
6664: {
6665: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
6666: }
6667:
6668: return(NULL);
6669: }
6670:
6671: if ((octets[0] & 0x01) != 0)
6672: {
6673: deplacement = (size_t) (((octets[0] & 0x0F) >> 1) + 1);
6674:
6675: if (fread(octets, (size_t) sizeof(unsigned char), deplacement,
6676: fichier) != deplacement)
6677: {
6678: liberation(s_etat_processus, s_objet);
6679:
6680: if (feof(fichier))
6681: {
6682: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6683: }
6684: else
6685: {
6686: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
6687: }
6688:
6689: return(NULL);
6690: }
6691: }
6692: }
6693:
6694: if (longueur_buffer >= 0)
6695: {
6696: (*((unsigned char **) argument)) = ptr;
6697: }
6698:
6699: return(s_objet);
6700: }
6701:
6702: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>