1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.13
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: #define DEBUG_ERREURS
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", (*((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", (*((logical8 *)
1014: ((*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", (*((logical8 *)
1124: ((*s_objet).objet))));
1125: strcpy(base, "o");
1126: break;
1127: }
1128:
1129: case 10:
1130: {
1131: sprintf(tampon, "%llu", (*((logical8 *)
1132: ((*s_objet).objet))));
1133: strcpy(base, "d");
1134: break;
1135: }
1136:
1137: case 16:
1138: {
1139: sprintf(tampon, "%llX", (*((logical8 *)
1140: ((*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 if (longueur_totale < (((integer8) 1) << 16))
4082: {
4083: longueur_totale++;
4084:
4085: for(i = 0; i < 7; i++)
4086: {
4087: if ((longueur_totale < (((integer8) 1) << (8 * (i + 2))))
4088: || (i == 6))
4089: {
4090: // LSB (4 bits de poids fort)
4091: tampon[0] = (unsigned char) ((longueur_totale & 0xF0)
4092: | 0x1 /* longueur supérieure à 7 bits */
4093: | ((i + 1) << 1));
4094:
4095: for(j = 0; j <= i; j++)
4096: {
4097: tampon[(i - j) + 1] = (unsigned char)
4098: ((longueur_totale >> (8 * (j + 1)))
4099: & 0xFF);
4100: }
4101:
4102: // LSB (4 bits de poids faible)
4103: tampon[i + 2] = (unsigned char)
4104: (((longueur_totale & 0x0F) << 4)
4105: | 0x1 /* longueur supérieure à 7 bits */
4106: | ((i + 1) << 1));
4107: break;
4108: }
4109: }
4110:
4111: if ((chaine = realloc(chaine, (((size_t) longueur_totale) + 3)
4112: * sizeof(unsigned char))) == NULL)
4113: {
4114: (*s_etat_processus).erreur_systeme =
4115: d_es_allocation_memoire;
4116: return(NULL);
4117: }
4118:
4119: memcpy(&(chaine[longueur_totale]), tampon, 3);
4120: longueur_totale += 3;
4121: }
4122: else if (longueur_totale < (((integer8) 1) << 32))
4123: {
4124: }
4125:
4126: __zone();
4127: (*longueur_effective) = longueur_totale;
4128: }
4129: }
4130:
4131: (*recursivite)--;
4132:
4133: return(chaine);
4134: }
4135:
4136:
4137: /*
4138: ================================================================================
4139: Routines qui transforment un nombre entier, réel ou complexe en chaîne de
4140: caractères suivant le format courant
4141: ================================================================================
4142: Entrées : pointeur générique sur la donnée numérique à convertir,
4143: type de l'entité (I, R ou C).
4144: --------------------------------------------------------------------------------
4145: Sorties : chaîne de caractères allouée dans la routine
4146: --------------------------------------------------------------------------------
4147: Effets de bord : néant
4148: ================================================================================
4149: */
4150:
4151: /*
4152: --------------------------------------------------------------------------------
4153: Formatage des complexes, réels et entiers
4154: --------------------------------------------------------------------------------
4155: */
4156:
4157: unsigned char *
4158: formateur_fichier_nombre(struct_processus *s_etat_processus,
4159: void *valeur_numerique, unsigned char type,
4160: integer8 longueur, integer8 longueur_champ, unsigned char format)
4161: {
4162: unsigned char *chaine;
4163: unsigned char *construction_chaine;
4164: unsigned char *sauvegarde;
4165: unsigned char *tampon;
4166:
4167: chaine = NULL;
4168:
4169: switch(type)
4170: {
4171: case 'C' :
4172: {
4173: construction_chaine = (unsigned char *) malloc(
4174: 2 * sizeof(unsigned char));
4175:
4176: if (construction_chaine == NULL)
4177: {
4178: (*s_etat_processus).erreur_systeme =
4179: d_es_allocation_memoire;
4180: return(NULL);
4181: }
4182:
4183: strcpy(construction_chaine, "(");
4184:
4185: tampon = formateur_fichier_reel(s_etat_processus,
4186: (void *) &((*((struct_complexe16 *)
4187: valeur_numerique)).partie_reelle), 'R',
4188: longueur, longueur_champ, format);
4189:
4190: if (tampon == NULL)
4191: {
4192: (*s_etat_processus).erreur_systeme =
4193: d_es_allocation_memoire;
4194: return(NULL);
4195: }
4196:
4197: sauvegarde = construction_chaine;
4198:
4199: construction_chaine = (unsigned char *) malloc(
4200: (strlen(sauvegarde) + strlen(tampon) + 2)
4201: * sizeof(unsigned char));
4202:
4203: if (construction_chaine == NULL)
4204: {
4205: (*s_etat_processus).erreur_systeme =
4206: d_es_allocation_memoire;
4207: return(NULL);
4208: }
4209:
4210: strcpy(construction_chaine, sauvegarde);
4211: free(sauvegarde);
4212: strcat(construction_chaine, tampon);
4213: free(tampon);
4214:
4215: strcat(construction_chaine, ",");
4216:
4217: tampon = formateur_fichier_reel(s_etat_processus,
4218: (void *) &((*((struct_complexe16 *)
4219: valeur_numerique)).partie_imaginaire), 'R',
4220: longueur, longueur_champ, format);
4221:
4222: if (tampon == NULL)
4223: {
4224: (*s_etat_processus).erreur_systeme =
4225: d_es_allocation_memoire;
4226: return(NULL);
4227: }
4228:
4229: sauvegarde = construction_chaine;
4230:
4231: construction_chaine = (unsigned char *) malloc(
4232: (strlen(sauvegarde) + strlen(tampon) + 2)
4233: * sizeof(unsigned char));
4234:
4235: if (construction_chaine == NULL)
4236: {
4237: (*s_etat_processus).erreur_systeme =
4238: d_es_allocation_memoire;
4239: return(NULL);
4240: }
4241:
4242: strcpy(construction_chaine, sauvegarde);
4243: free(sauvegarde);
4244: strcat(construction_chaine, tampon);
4245: free(tampon);
4246: strcat(construction_chaine, ")");
4247:
4248: chaine = construction_chaine;
4249:
4250: break;
4251: }
4252:
4253: case 'R' :
4254: {
4255: chaine = formateur_fichier_reel(s_etat_processus,
4256: valeur_numerique, 'R', longueur, longueur_champ,
4257: format);
4258:
4259: if (chaine == NULL)
4260: {
4261: (*s_etat_processus).erreur_systeme =
4262: d_es_allocation_memoire;
4263: return(NULL);
4264: }
4265:
4266: break;
4267: }
4268:
4269: default :
4270: case 'I' :
4271: {
4272: chaine = formateur_fichier_reel(s_etat_processus,
4273: valeur_numerique, 'I', longueur, longueur_champ,
4274: format);
4275:
4276: if (chaine == NULL)
4277: {
4278: (*s_etat_processus).erreur_systeme =
4279: d_es_allocation_memoire;
4280: return(NULL);
4281: }
4282:
4283: break;
4284: }
4285: }
4286:
4287: return(chaine);
4288: }
4289:
4290:
4291: /*
4292: --------------------------------------------------------------------------------
4293: Formateur des réels et entiers
4294: --------------------------------------------------------------------------------
4295: */
4296:
4297: unsigned char *
4298: formateur_fichier_reel(struct_processus *s_etat_processus,
4299: void *valeur_numerique, unsigned char type,
4300: integer8 longueur, integer8 longueur_champ,
4301: unsigned char format_sortie)
4302: {
4303: real8 mantisse;
4304: real8 tampon_reel;
4305:
4306: integer8 i;
4307: integer8 tampon_entier;
4308:
4309: long correction;
4310: long exposant;
4311: long longueur_utile;
4312: long longueur_utile_limite;
4313:
4314: unsigned char *chaine;
4315: unsigned char format[16 + 1];
4316: unsigned char mode[3 + 1];
4317: unsigned char tampon[16 + 1];
4318:
4319: chaine = (unsigned char *) malloc((32 + 1) * sizeof(unsigned char));
4320:
4321: if (chaine == NULL)
4322: {
4323: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
4324: return(NULL);
4325: }
4326:
4327: if (type == 'R')
4328: {
4329: tampon_reel = *((real8 *) valeur_numerique);
4330:
4331: if (tampon_reel > ((real8) 0))
4332: {
4333: exposant = (long) floor(log10(tampon_reel));
4334: }
4335: else if (tampon_reel < ((real8) 0))
4336: {
4337: exposant = (long) floor(log10(-tampon_reel));
4338: }
4339: else
4340: {
4341: exposant = 0;
4342: }
4343:
4344: mantisse = (*((real8 *) valeur_numerique)) / pow(10, (double) exposant);
4345: }
4346: else
4347: {
4348: tampon_entier = *((integer8 *) valeur_numerique);
4349:
4350: if (tampon_entier > ((integer8) 0))
4351: {
4352: exposant = (long) floor(log10((double) tampon_entier));
4353: }
4354: else if (tampon_entier < ((integer8) 0))
4355: {
4356: exposant = (long) floor(log10((double) -tampon_entier));
4357: }
4358: else
4359: {
4360: exposant = 0;
4361: }
4362:
4363: mantisse = ((real8) (*((integer8 *) valeur_numerique))) /
4364: pow(10, (double) exposant);
4365: }
4366:
4367: longueur_utile = longueur;
4368: longueur_utile_limite = 15;
4369:
4370: if (longueur_utile > longueur_utile_limite)
4371: {
4372: longueur_utile = longueur_utile_limite;
4373: }
4374:
4375: if (format_sortie == 'S')
4376: {
4377: strcpy(mode, "STD");
4378: }
4379: else if (format_sortie == 'C')
4380: {
4381: strcpy(mode, "SCI");
4382: }
4383: else if (format_sortie == 'F')
4384: {
4385: strcpy(mode, "FIX");
4386: }
4387: else
4388: {
4389: strcpy(mode, "ENG");
4390: }
4391:
4392: if ((strcmp(mode, "SCI") == 0) ||
4393: ((strcmp(mode, "STD") == 0) && ((exposant >
4394: longueur_utile_limite) ||
4395: (exposant < -longueur_utile_limite))) ||
4396: ((strcmp(mode, "FIX") == 0) &&
4397: ((exposant >= longueur_utile_limite) ||
4398: (exposant < -longueur_utile))))
4399: {
4400: chaine[0] = 0;
4401: format[0] = 0;
4402:
4403: if (strcmp(mode, "STD") == 0)
4404: {
4405: longueur_utile = longueur_utile_limite - 1;
4406: }
4407:
4408: sprintf(format, "%%.%luf", longueur_utile);
4409:
4410: sprintf(tampon, format, mantisse);
4411: strcpy(chaine, tampon);
4412: strcat(chaine, "E");
4413: sprintf(tampon, "%ld", exposant);
4414: strcat(chaine, tampon);
4415: }
4416: else if (strcmp(mode, "FIX") == 0)
4417: {
4418: chaine[0] = 0;
4419: format[0] = 0;
4420:
4421: if (longueur_utile + exposant >= longueur_utile_limite)
4422: {
4423: longueur_utile = longueur_utile_limite - (exposant + 1);
4424: }
4425:
4426: sprintf(format, "%%.%luf", longueur_utile);
4427:
4428: sprintf(tampon, format, (mantisse * pow(10, (double) exposant)));
4429: strcpy(chaine, tampon);
4430: }
4431: else if (strcmp(mode, "ENG") == 0)
4432: {
4433: chaine[0] = 0;
4434: format[0] = 0;
4435:
4436: correction = labs(exposant) % 3;
4437:
4438: if (exposant < 0)
4439: {
4440: if (correction == 0)
4441: {
4442: correction = 3;
4443: }
4444:
4445: correction = 3 - correction;
4446: }
4447:
4448: longueur_utile -= correction;
4449: sprintf(format, "%%.%luf", longueur_utile);
4450:
4451: sprintf(tampon, format, (mantisse * pow(10, (double) correction)));
4452: strcpy(chaine, tampon);
4453: strcat(chaine, "E");
4454: sprintf(tampon, "%ld", (exposant - correction));
4455: strcat(chaine, tampon);
4456: }
4457: else
4458: {
4459: if (type == 'I')
4460: {
4461: chaine[0] = 0;
4462: sprintf(tampon, "%lld", *((integer8 *) valeur_numerique));
4463: }
4464: else
4465: {
4466: chaine[0] = 0;
4467: format[0] = 0;
4468:
4469: if (exposant >= 0)
4470: {
4471: sprintf(format, "%%.%luf", (longueur_utile_limite - exposant
4472: - 1));
4473: }
4474: else
4475: {
4476: sprintf(format, "%%.%luf", longueur_utile_limite);
4477: }
4478:
4479: sprintf(tampon, format, *((real8 *) valeur_numerique));
4480:
4481: i = (integer8) (strlen(tampon)) - 1;
4482: while(tampon[i] == '0')
4483: {
4484: tampon[i] = 0;
4485: i--;
4486: }
4487:
4488: if (ds_imposition_separateur_decimal == d_faux)
4489: {
4490: i = ((integer8) strlen(tampon)) - 1;
4491: if (tampon[i] == '.')
4492: {
4493: tampon[i] = 0;
4494: }
4495: }
4496: }
4497:
4498: strcpy(chaine, tampon);
4499: }
4500:
4501: if (longueur_champ >= 0)
4502: {
4503: if (strlen(chaine) > (size_t) longueur_champ)
4504: {
4505: for(i = 0; i < longueur_champ; i++)
4506: {
4507: chaine[i] = '*';
4508: }
4509:
4510: chaine[i] = d_code_fin_chaine;
4511: }
4512: }
4513:
4514: return(chaine);
4515: }
4516:
4517:
4518: /*
4519: --------------------------------------------------------------------------------
4520: Mêmes fonctions mais pour les fichiers binaires
4521: --------------------------------------------------------------------------------
4522: */
4523:
4524: unsigned char *
4525: formateur_fichier_binaire_nombre(struct_processus *s_etat_processus,
4526: void *valeur_numerique, unsigned char type_entree,
4527: unsigned char type, integer8 longueur, integer8 *longueur_conversion)
4528: {
4529: unsigned char *chaine;
4530:
4531: switch(type)
4532: {
4533: case 'I' :
4534: {
4535: if (type_entree != type)
4536: {
4537: (*s_etat_processus).erreur_execution = d_ex_representation;
4538: return(NULL);
4539: }
4540:
4541: switch(longueur)
4542: {
4543: case 1:
4544: {
4545: if ((*((integer8 *) valeur_numerique)) !=
4546: ((integer1) (*((integer8 *) valeur_numerique))))
4547: {
4548: (*s_etat_processus).erreur_execution =
4549: d_ex_representation;
4550: return(NULL);
4551: }
4552:
4553: if ((chaine = malloc(2 * sizeof(unsigned char))) == NULL)
4554: {
4555: (*s_etat_processus).erreur_systeme =
4556: d_es_allocation_memoire;
4557: return(NULL);
4558: }
4559:
4560: (*longueur_conversion) = 2;
4561: chaine[0] = (unsigned char) 0x10;
4562: chaine[1] = (unsigned char) ((*((integer8 *)
4563: valeur_numerique)) & 0xFF);
4564: break;
4565: }
4566:
4567: case 2:
4568: {
4569: if ((*((integer8 *) valeur_numerique)) !=
4570: ((integer2) (*((integer8 *) valeur_numerique))))
4571: {
4572: (*s_etat_processus).erreur_execution =
4573: d_ex_representation;
4574: return(NULL);
4575: }
4576:
4577: if ((chaine = malloc(3 * sizeof(unsigned char))) == NULL)
4578: {
4579: (*s_etat_processus).erreur_systeme =
4580: d_es_allocation_memoire;
4581: return(NULL);
4582: }
4583:
4584: (*longueur_conversion) = 3;
4585: chaine[0] = (unsigned char) 0x11;
4586: chaine[1] = ((unsigned char) ((*((integer8 *)
4587: valeur_numerique)) >> 8) & 0xFF);
4588: chaine[2] = (unsigned char) ((*((integer8 *)
4589: valeur_numerique)) & 0xFF);
4590: break;
4591: }
4592:
4593: case 4:
4594: {
4595: if ((*((integer8 *) valeur_numerique)) !=
4596: ((integer4) (*((integer8 *) valeur_numerique))))
4597: {
4598: (*s_etat_processus).erreur_execution =
4599: d_ex_representation;
4600: return(NULL);
4601: }
4602:
4603: if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL)
4604: {
4605: (*s_etat_processus).erreur_systeme =
4606: d_es_allocation_memoire;
4607: return(NULL);
4608: }
4609:
4610: (*longueur_conversion) = 5;
4611: chaine[0] = (unsigned char) 0x12;
4612: chaine[1] = (unsigned char) (((*((integer8 *)
4613: valeur_numerique)) >> 24) & 0xFF);
4614: chaine[2] = (unsigned char) (((*((integer8 *)
4615: valeur_numerique)) >> 16) & 0xFF);
4616: chaine[3] = (unsigned char) (((*((integer8 *)
4617: valeur_numerique)) >> 8) & 0xFF);
4618: chaine[4] = (unsigned char) ((*((integer8 *)
4619: valeur_numerique)) & 0xFF);
4620: break;
4621: }
4622:
4623: case 8:
4624: {
4625: if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL)
4626: {
4627: (*s_etat_processus).erreur_systeme =
4628: d_es_allocation_memoire;
4629: return(NULL);
4630: }
4631:
4632: (*longueur_conversion) = 9;
4633: chaine[0] = (unsigned char) 0x13;
4634: chaine[1] = (unsigned char) (((*((integer8 *)
4635: valeur_numerique)) >> 56) & 0xFF);
4636: chaine[2] = (unsigned char) (((*((integer8 *)
4637: valeur_numerique)) >> 48) & 0xFF);
4638: chaine[3] = (unsigned char) (((*((integer8 *)
4639: valeur_numerique)) >> 40) & 0xFF);
4640: chaine[4] = (unsigned char) (((*((integer8 *)
4641: valeur_numerique)) >> 32) & 0xFF);
4642: chaine[5] = (unsigned char) (((*((integer8 *)
4643: valeur_numerique)) >> 24) & 0xFF);
4644: chaine[6] = (unsigned char) (((*((integer8 *)
4645: valeur_numerique)) >> 16) & 0xFF);
4646: chaine[7] = (unsigned char) (((*((integer8 *)
4647: valeur_numerique)) >> 8) & 0xFF);
4648: chaine[8] = (unsigned char) ((*((integer8 *)
4649: valeur_numerique)) & 0xFF);
4650: break;
4651: }
4652:
4653: default :
4654: {
4655: (*s_etat_processus).erreur_execution =
4656: d_ex_erreur_format_fichier;
4657: return(NULL);
4658: }
4659: }
4660:
4661: break;
4662: }
4663:
4664: case 'R' :
4665: {
4666: switch(longueur)
4667: {
4668: case 4:
4669: {
4670: real8 valeur;
4671: real8 vinf;
4672: real8 vsup;
4673:
4674: union
4675: {
4676: real4 r4;
4677: integer4 i4;
4678: } eq4;
4679:
4680: if (type_entree == 'R')
4681: {
4682: valeur = (*((real8 *) valeur_numerique));
4683: }
4684: else if (type_entree == 'I')
4685: {
4686: valeur = (real8) (*((integer8 *) valeur_numerique));
4687: }
4688: else
4689: {
4690: (*s_etat_processus).erreur_execution =
4691: d_ex_representation;
4692: return(NULL);
4693: }
4694:
4695: if (valeur > 0)
4696: {
4697: vinf = nextafter(valeur, 0);
4698: vsup = nextafter(valeur, valeur * 2);
4699: }
4700: else
4701: {
4702: vinf = nextafter(valeur, valeur * 2);
4703: vsup = nextafter(valeur, 0);
4704: }
4705:
4706: if (!((vinf <= ((real4) valeur)) &&
4707: (((real4) valeur) <= vsup)))
4708: {
4709: (*s_etat_processus).erreur_execution =
4710: d_ex_representation;
4711: return(NULL);
4712: }
4713:
4714: if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL)
4715: {
4716: (*s_etat_processus).erreur_systeme =
4717: d_es_allocation_memoire;
4718: return(NULL);
4719: }
4720:
4721: eq4.r4 = (real4) valeur;
4722: (*longueur_conversion) = 5;
4723: chaine[0] = (unsigned char) 0x14;
4724: chaine[1] = (unsigned char) ((eq4.i4 >> 24) & 0xFF);
4725: chaine[2] = (unsigned char) ((eq4.i4 >> 16) & 0xFF);
4726: chaine[3] = (unsigned char) ((eq4.i4 >> 8) & 0xFF);
4727: chaine[4] = (unsigned char) (eq4.i4 & 0xFF);
4728: break;
4729: }
4730:
4731: case 8:
4732: {
4733: union
4734: {
4735: real8 r8;
4736: integer8 i8;
4737: } eq8;
4738:
4739: if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL)
4740: {
4741: (*s_etat_processus).erreur_systeme =
4742: d_es_allocation_memoire;
4743: return(NULL);
4744: }
4745:
4746: if (type_entree == 'I')
4747: {
4748: eq8.r8 = (real8) (*((integer8 *) valeur_numerique));
4749: }
4750: else if (type_entree == 'R')
4751: {
4752: eq8.r8 = (*((real8 *) valeur_numerique));
4753: }
4754: else
4755: {
4756: (*s_etat_processus).erreur_execution =
4757: d_ex_representation;
4758: return(NULL);
4759: }
4760:
4761: (*longueur_conversion) = 9;
4762: chaine[0] = (unsigned char) (0x15);
4763: chaine[1] = (unsigned char) ((eq8.i8 >> 56) & 0xFF);
4764: chaine[2] = (unsigned char) ((eq8.i8 >> 48) & 0xFF);
4765: chaine[3] = (unsigned char) ((eq8.i8 >> 40) & 0xFF);
4766: chaine[4] = (unsigned char) ((eq8.i8 >> 32) & 0xFF);
4767: chaine[5] = (unsigned char) ((eq8.i8 >> 24) & 0xFF);
4768: chaine[6] = (unsigned char) ((eq8.i8 >> 16) & 0xFF);
4769: chaine[7] = (unsigned char) ((eq8.i8 >> 8) & 0xFF);
4770: chaine[8] = (unsigned char) (eq8.i8 & 0xFF);
4771: break;
4772: }
4773:
4774: default :
4775: {
4776: (*s_etat_processus).erreur_execution =
4777: d_ex_erreur_format_fichier;
4778: return(NULL);
4779: }
4780: }
4781:
4782: break;
4783: }
4784:
4785: case 'C' :
4786: {
4787: switch(longueur)
4788: {
4789: case 8:
4790: {
4791: unsigned char *partie_reelle;
4792: unsigned char *partie_imaginaire;
4793:
4794: integer8 limag;
4795: integer8 lreel;
4796:
4797: real8 zero;
4798:
4799: if (type_entree == 'I')
4800: {
4801: if ((partie_reelle = formateur_fichier_binaire_nombre(
4802: s_etat_processus, &(*((integer8 *)
4803: valeur_numerique)), 'I', 'R', 4,
4804: &lreel)) == NULL)
4805: {
4806: return(NULL);
4807: }
4808:
4809: zero = 0;
4810:
4811: if ((partie_imaginaire =
4812: formateur_fichier_binaire_nombre(
4813: s_etat_processus, &zero, 'R', 'R', 4,
4814: &limag)) == NULL)
4815: {
4816: free(partie_reelle);
4817: return(NULL);
4818: }
4819: }
4820: else if (type_entree == 'R')
4821: {
4822: if ((partie_reelle = formateur_fichier_binaire_nombre(
4823: s_etat_processus, &(*((real8 *)
4824: valeur_numerique)), 'R', '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 == 'C')
4842: {
4843: if ((partie_reelle = formateur_fichier_binaire_nombre(
4844: s_etat_processus, &((*((complex16 *)
4845: valeur_numerique)).partie_reelle), 'R', 'R', 4,
4846: &lreel)) == NULL)
4847: {
4848: return(NULL);
4849: }
4850:
4851: if ((partie_imaginaire =
4852: formateur_fichier_binaire_nombre(
4853: s_etat_processus, &((*((complex16 *)
4854: valeur_numerique)).partie_imaginaire),
4855: 'R', 'R', 4, &limag)) == NULL)
4856: {
4857: free(partie_reelle);
4858: return(NULL);
4859: }
4860: }
4861: else
4862: {
4863: (*s_etat_processus).erreur_execution =
4864: d_ex_erreur_format_fichier;
4865: return(NULL);
4866: }
4867:
4868: if ((chaine = malloc((((size_t) lreel) + ((size_t) limag)
4869: - 1) * sizeof(unsigned char))) == NULL)
4870: {
4871: free(partie_reelle);
4872: free(partie_imaginaire);
4873:
4874: (*s_etat_processus).erreur_systeme =
4875: d_es_allocation_memoire;
4876: return(NULL);
4877: }
4878:
4879: chaine[0] = (unsigned char) 0x18;
4880: memcpy(chaine + 1, partie_reelle + 1,
4881: ((size_t) lreel) - 1);
4882: memcpy(chaine + lreel, partie_imaginaire + 1,
4883: ((size_t) limag) - 1);
4884: (*longueur_conversion) = lreel + limag - 1;
4885:
4886: free(partie_reelle);
4887: free(partie_imaginaire);
4888: break;
4889: }
4890:
4891: case 16:
4892: {
4893: unsigned char *partie_reelle;
4894: unsigned char *partie_imaginaire;
4895:
4896: integer8 limag;
4897: integer8 lreel;
4898:
4899: real8 zero;
4900:
4901: if (type_entree == 'I')
4902: {
4903: if ((partie_reelle = formateur_fichier_binaire_nombre(
4904: s_etat_processus, &(*((integer8 *)
4905: valeur_numerique)), 'I', 'R', 8,
4906: &lreel)) == NULL)
4907: {
4908: return(NULL);
4909: }
4910:
4911: zero = 0;
4912:
4913: if ((partie_imaginaire =
4914: formateur_fichier_binaire_nombre(
4915: s_etat_processus, &zero, 'R', 'R', 8,
4916: &limag)) == NULL)
4917: {
4918: free(partie_reelle);
4919: return(NULL);
4920: }
4921: }
4922: else if (type_entree == 'R')
4923: {
4924: if ((partie_reelle = formateur_fichier_binaire_nombre(
4925: s_etat_processus, &(*((real8 *)
4926: valeur_numerique)), 'R', '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 == 'C')
4944: {
4945: if ((partie_reelle = formateur_fichier_binaire_nombre(
4946: s_etat_processus, &((*((complex16 *)
4947: valeur_numerique)).partie_reelle), 'R', 'R', 8,
4948: &lreel)) == NULL)
4949: {
4950: return(NULL);
4951: }
4952:
4953: if ((partie_imaginaire =
4954: formateur_fichier_binaire_nombre(
4955: s_etat_processus, &((*((complex16 *)
4956: valeur_numerique)).partie_imaginaire),
4957: 'R', 'R', 8, &limag)) == NULL)
4958: {
4959: free(partie_reelle);
4960: return(NULL);
4961: }
4962: }
4963: else
4964: {
4965: (*s_etat_processus).erreur_execution =
4966: d_ex_erreur_format_fichier;
4967: return(NULL);
4968: }
4969:
4970: if ((chaine = malloc((((size_t) lreel) + ((size_t) limag)
4971: - 1) * sizeof(unsigned char))) == NULL)
4972: {
4973: free(partie_reelle);
4974: free(partie_imaginaire);
4975:
4976: (*s_etat_processus).erreur_systeme =
4977: d_es_allocation_memoire;
4978: return(NULL);
4979: }
4980:
4981: chaine[0] = (unsigned char) 0x19;
4982: memcpy(chaine + 1, partie_reelle + 1,
4983: ((size_t) lreel) - 1);
4984: memcpy(chaine + lreel, partie_imaginaire + 1,
4985: ((size_t) limag) - 1);
4986: (*longueur_conversion) = lreel + limag - 1;
4987:
4988: free(partie_reelle);
4989: free(partie_imaginaire);
4990: break;
4991: }
4992:
4993: default :
4994: {
4995: (*s_etat_processus).erreur_execution =
4996: d_ex_erreur_format_fichier;
4997: return(NULL);
4998: }
4999: }
5000:
5001: break;
5002: }
5003:
5004: default :
5005: {
5006: (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier;
5007: return(NULL);
5008: }
5009: }
5010:
5011: return(chaine);
5012: }
5013:
5014:
5015: /*
5016: ================================================================================
5017: Routines de conversion d'un objet binaire en struct_objet *
5018: ================================================================================
5019: Entrées : pointeur sur un void *. Si longueur_buffer est strictement inférieur
5020: à zéro, il s'agit d'un file * sinon d'un buffer de type unsigned
5021: char *.
5022: --------------------------------------------------------------------------------
5023: Sorties : pointeur sur un struct_objet nouvellement alloué
5024: --------------------------------------------------------------------------------
5025: Effets de bord : néant
5026: ================================================================================
5027: */
5028:
5029: struct_objet *
5030: lecture_fichier_non_formate(struct_processus *s_etat_processus,
5031: void *argument, integer8 longueur_buffer, logical1 recursivite)
5032: {
5033: file *fichier;
5034:
5035: int j;
5036:
5037: integer8 i;
5038: integer8 longueur;
5039:
5040: struct_liste_chainee *l_element_courant;
5041:
5042: struct_objet *s_objet;
5043: struct_objet *s_objet_elementaire;
5044:
5045: unsigned char octets[8];
5046: unsigned char *buffer;
5047: unsigned char *flux;
5048: unsigned char *ptr;
5049: unsigned char type_objet;
5050:
5051: size_t deplacement;
5052:
5053: if (longueur_buffer < 0)
5054: {
5055: fichier = argument;
5056: buffer = NULL;
5057: ptr = NULL;
5058: }
5059: else
5060: {
5061: buffer = (*((unsigned char **) argument));
5062: ptr = buffer;
5063: fichier = NULL;
5064: }
5065:
5066: if (longueur_buffer < 0)
5067: {
5068: if (fread(octets, (size_t) sizeof(unsigned char),
5069: 1, fichier) != 1)
5070: {
5071: if (feof(fichier))
5072: {
5073: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5074: }
5075: else
5076: {
5077: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
5078: }
5079:
5080: return(NULL);
5081: }
5082: }
5083: else
5084: {
5085: if ((longueur_buffer - (ptr - buffer)) >= 1)
5086: {
5087: octets[0] = *ptr++;
5088: }
5089: else
5090: {
5091: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5092: return(NULL);
5093: }
5094: }
5095:
5096: switch(type_objet = (octets[0] & 0xF0))
5097: {
5098: case 0x00: // Binaire
5099: {
5100: switch(octets[0] & 0x0F)
5101: {
5102: case 0x01: // logical*1
5103: {
5104: deplacement = 1;
5105: break;
5106: }
5107:
5108: case 0x02: // logical*2
5109: {
5110: deplacement = 2;
5111: break;
5112: }
5113:
5114: case 0x04: // logical*4
5115: {
5116: deplacement = 4;
5117: break;
5118: }
5119:
5120: case 0x08: // logical*8
5121: {
5122: deplacement = 8;
5123: break;
5124: }
5125:
5126: default:
5127: {
5128: (*s_etat_processus).erreur_execution =
5129: d_ex_syntaxe;
5130: return(NULL);
5131: }
5132: }
5133:
5134: if (longueur_buffer < 0)
5135: {
5136: if (fread(octets, (size_t) sizeof(unsigned char),
5137: deplacement, fichier) != deplacement)
5138: {
5139: if (feof(fichier))
5140: {
5141: (*s_etat_processus).erreur_execution =
5142: d_ex_syntaxe;
5143: }
5144: else
5145: {
5146: (*s_etat_processus).erreur_systeme =
5147: d_es_erreur_fichier;
5148: }
5149:
5150: return(NULL);
5151: }
5152: }
5153: else
5154: {
5155: if ((longueur_buffer - (ptr - buffer)) >=
5156: (ssize_t) deplacement)
5157: {
5158: for(i = 0; i < (signed) deplacement; i++)
5159: {
5160: octets[i] = *ptr++;
5161: }
5162: }
5163: else
5164: {
5165: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5166: return(NULL);
5167: }
5168: }
5169:
5170: if ((s_objet = allocation(s_etat_processus, BIN)) == NULL)
5171: {
5172: return(NULL);
5173: }
5174:
5175: (*((logical8 *) (*s_objet).objet)) = 0;
5176:
5177: for(i = 0; i < (signed) deplacement; i++)
5178: {
5179: (*((logical8 *) (*s_objet).objet)) |= ((logical8) octets[i])
5180: << (8 * ((((signed) deplacement) - 1) - i));
5181: }
5182:
5183: break;
5184: }
5185:
5186: case 0x10: // Scalaire
5187: {
5188: switch(octets[0] & 0x0C)
5189: {
5190: case 0x00: // Entier
5191: {
5192: switch(octets[0] & 0x03)
5193: {
5194: case 0x00: // integer*1
5195: {
5196: deplacement = 1;
5197: break;
5198: }
5199:
5200: case 0x01: // integer*2
5201: {
5202: deplacement = 2;
5203: break;
5204: }
5205:
5206: case 0x02: // integer*4
5207: {
5208: deplacement = 4;
5209: break;
5210: }
5211:
5212: case 0x03: // integer*8
5213: {
5214: deplacement = 8;
5215: break;
5216: }
5217: }
5218:
5219: if (longueur_buffer < 0)
5220: {
5221: if (fread(octets, (size_t) sizeof(unsigned char),
5222: deplacement, fichier) != deplacement)
5223: {
5224: if (feof(fichier))
5225: {
5226: (*s_etat_processus).erreur_execution =
5227: d_ex_syntaxe;
5228: }
5229: else
5230: {
5231: (*s_etat_processus).erreur_systeme =
5232: d_es_erreur_fichier;
5233: }
5234:
5235: return(NULL);
5236: }
5237: }
5238: else
5239: {
5240: if ((longueur_buffer - (ptr - buffer)) >=
5241: (ssize_t) deplacement)
5242: {
5243: for(i = 0; i < (signed) deplacement; i++)
5244: {
5245: octets[i] = *ptr++;
5246: }
5247: }
5248: else
5249: {
5250: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5251: return(NULL);
5252: }
5253: }
5254:
5255: if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
5256: {
5257: return(NULL);
5258: }
5259:
5260: (*((integer8 *) (*s_objet).objet)) = 0;
5261:
5262: for(i = 0; i < (signed) deplacement; i++)
5263: {
5264: (*((integer8 *) (*s_objet).objet)) |=
5265: ((integer8) octets[i])
5266: << (8 * ((((signed) deplacement) - 1) - i));
5267: }
5268:
5269: break;
5270: }
5271:
5272: case 0x04: // Réel
5273: {
5274: switch(octets[0] & 0x03)
5275: {
5276: case 0x00: // real*4
5277: {
5278: deplacement = 4;
5279: break;
5280: }
5281:
5282: case 0x01: // real*8
5283: {
5284: deplacement = 8;
5285: break;
5286: }
5287:
5288: default:
5289: {
5290: (*s_etat_processus).erreur_execution =
5291: d_ex_syntaxe;
5292: return(NULL);
5293: }
5294: }
5295:
5296: if (longueur_buffer < 0)
5297: {
5298: if (fread(octets, (size_t) sizeof(unsigned char),
5299: deplacement, fichier) != deplacement)
5300: {
5301: if (feof(fichier))
5302: {
5303: (*s_etat_processus).erreur_execution =
5304: d_ex_syntaxe;
5305: }
5306: else
5307: {
5308: (*s_etat_processus).erreur_systeme =
5309: d_es_erreur_fichier;
5310: }
5311:
5312: return(NULL);
5313: }
5314: }
5315: else
5316: {
5317: if ((longueur_buffer - (ptr - buffer)) >=
5318: (ssize_t) deplacement)
5319: {
5320: for(i = 0; i < (signed) deplacement; i++)
5321: {
5322: octets[i] = *ptr++;
5323: }
5324: }
5325: else
5326: {
5327: (*s_etat_processus).erreur_execution =
5328: d_ex_syntaxe;
5329: return(NULL);
5330: }
5331: }
5332:
5333: if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
5334: {
5335: return(NULL);
5336: }
5337:
5338: if (deplacement == 4)
5339: {
5340: union
5341: {
5342: real4 r4;
5343: integer4 i4;
5344: } eq4;
5345:
5346: eq4.i4 = 0;
5347:
5348: for(i = 0; i < (signed) deplacement; i++)
5349: {
5350: eq4.i4 |= ((integer4) octets[i]) <<
5351: (8 * ((((signed) deplacement) - 1) - i));
5352: }
5353:
5354: (*((real8 *) (*s_objet).objet)) = (real8) eq4.r4;
5355: }
5356: else
5357: {
5358: union
5359: {
5360: real8 r8;
5361: integer8 i8;
5362: } eq8;
5363:
5364: eq8.i8 = 0;
5365:
5366: for(i = 0; i < (signed) deplacement; i++)
5367: {
5368: eq8.i8 |= ((integer8) octets[i]) <<
5369: (8 * ((((signed) deplacement) - 1) - i));
5370: }
5371:
5372: (*((real8 *) (*s_objet).objet)) = (real8) eq8.r8;
5373: }
5374:
5375: break;
5376: }
5377:
5378: case 0x08: // Complexe
5379: {
5380: switch(octets[0] & 0x03)
5381: {
5382: case 0x00: // complex*8
5383: {
5384: deplacement = 4;
5385: break;
5386: }
5387:
5388: case 0x01: // complex*16
5389: {
5390: deplacement = 8;
5391: break;
5392: }
5393:
5394: default:
5395: {
5396: (*s_etat_processus).erreur_execution =
5397: d_ex_syntaxe;
5398: return(NULL);
5399: }
5400: }
5401:
5402: if ((s_objet = allocation(s_etat_processus, CPL)) == NULL)
5403: {
5404: return(NULL);
5405: }
5406:
5407: for(j = 0; j < 2; j++)
5408: {
5409: if (longueur_buffer < 0)
5410: {
5411: if (fread(octets, (size_t) sizeof(unsigned char),
5412: deplacement, fichier) != deplacement)
5413: {
5414: liberation(s_etat_processus, s_objet);
5415:
5416: if (feof(fichier))
5417: {
5418: (*s_etat_processus).erreur_execution =
5419: d_ex_syntaxe;
5420: }
5421: else
5422: {
5423: (*s_etat_processus).erreur_systeme =
5424: d_es_erreur_fichier;
5425: }
5426:
5427: return(NULL);
5428: }
5429: }
5430: else
5431: {
5432: if ((longueur_buffer - (ptr - buffer)) >=
5433: (ssize_t) deplacement)
5434: {
5435: for(i = 0; i < (signed) deplacement; i++)
5436: {
5437: octets[i] = *ptr++;
5438: }
5439: }
5440: else
5441: {
5442: liberation(s_etat_processus, s_objet);
5443: (*s_etat_processus).erreur_execution =
5444: d_ex_syntaxe;
5445: return(NULL);
5446: }
5447: }
5448:
5449: if (deplacement == 4)
5450: {
5451: union
5452: {
5453: real4 r4;
5454: integer4 i4;
5455: } eq4;
5456:
5457: eq4.i4 = 0;
5458:
5459: for(i = 0; i < (signed) deplacement; i++)
5460: {
5461: eq4.i4 |= ((integer4) octets[i]) <<
5462: (8 * ((((signed) deplacement) - 1)
5463: - i));
5464: }
5465:
5466: if (j == 0)
5467: {
5468: (*((complex16 *) (*s_objet).objet))
5469: .partie_reelle = (real8) eq4.r4;
5470: }
5471: else
5472: {
5473: (*((complex16 *) (*s_objet).objet))
5474: .partie_imaginaire = (real8) eq4.r4;
5475: }
5476: }
5477: else
5478: {
5479: union
5480: {
5481: real8 r8;
5482: integer8 i8;
5483: } eq8;
5484:
5485: eq8.i8 = 0;
5486:
5487: for(i = 0; i < (signed) deplacement; i++)
5488: {
5489: eq8.i8 |= ((integer8) octets[i]) <<
5490: (8 * ((((signed) deplacement) - 1)
5491: - i));
5492: }
5493:
5494: if (j == 0)
5495: {
5496: (*((complex16 *) (*s_objet).objet))
5497: .partie_reelle = (real8) eq8.r8;
5498: }
5499: else
5500: {
5501: (*((complex16 *) (*s_objet).objet))
5502: .partie_imaginaire = (real8) eq8.r8;
5503: }
5504: }
5505: }
5506:
5507: break;
5508: }
5509:
5510: default:
5511: {
5512: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5513: return(NULL);
5514: }
5515: }
5516:
5517: break;
5518: }
5519:
5520: case 0x40: // Liste
5521: case 0x60: // Expression
5522: case 0x70: // Expression algébrique
5523: {
5524: if ((octets[0] & 0x08) == 0) // Longueur sur 6 bits
5525: {
5526: longueur = (octets[0] & 0x07);
5527: }
5528: else
5529: {
5530: switch(octets[0] & 0x07)
5531: {
5532: case 0x00: // Longueur sur 8 bits
5533: {
5534: if (longueur_buffer < 0)
5535: {
5536: if (fread(octets, (size_t) sizeof(unsigned char),
5537: 1, fichier) != 1)
5538: {
5539: if (feof(fichier))
5540: {
5541: (*s_etat_processus).erreur_execution =
5542: d_ex_syntaxe;
5543: }
5544: else
5545: {
5546: (*s_etat_processus).erreur_systeme =
5547: d_es_erreur_fichier;
5548: }
5549:
5550: return(NULL);
5551: }
5552: }
5553: else
5554: {
5555: if ((longueur_buffer - (ptr - buffer)) >= 1)
5556: {
5557: octets[0] = *ptr++;
5558: }
5559: else
5560: {
5561: (*s_etat_processus).erreur_execution =
5562: d_ex_syntaxe;
5563: return(NULL);
5564: }
5565: }
5566:
5567: longueur = octets[0];
5568: break;
5569: }
5570:
5571: case 0x01: // Longueur sur 16 bits
5572: {
5573: if (longueur_buffer < 0)
5574: {
5575: if (fread(octets, (size_t) sizeof(unsigned char),
5576: 2, fichier) != 2)
5577: {
5578: if (feof(fichier))
5579: {
5580: (*s_etat_processus).erreur_execution =
5581: d_ex_syntaxe;
5582: }
5583: else
5584: {
5585: (*s_etat_processus).erreur_systeme =
5586: d_es_erreur_fichier;
5587: }
5588:
5589: return(NULL);
5590: }
5591: }
5592: else
5593: {
5594: if ((longueur_buffer - (ptr - buffer)) >= 2)
5595: {
5596: for(j = 0; j < 2; octets[j++] = *ptr++);
5597: }
5598: else
5599: {
5600: (*s_etat_processus).erreur_execution =
5601: d_ex_syntaxe;
5602: return(NULL);
5603: }
5604: }
5605:
5606: longueur = (((integer8) (octets[0])) << 8)
5607: | ((integer8) (octets[1]));
5608: break;
5609: }
5610:
5611: case 0x02: // Longueur sur 32 bits
5612: {
5613: if (longueur_buffer < 0)
5614: {
5615: if (fread(octets, (size_t) sizeof(unsigned char),
5616: 4, fichier) != 4)
5617: {
5618: if (feof(fichier))
5619: {
5620: (*s_etat_processus).erreur_execution =
5621: d_ex_syntaxe;
5622: }
5623: else
5624: {
5625: (*s_etat_processus).erreur_systeme =
5626: d_es_erreur_fichier;
5627: }
5628:
5629: return(NULL);
5630: }
5631: }
5632: else
5633: {
5634: if ((longueur_buffer - (ptr - buffer)) >= 4)
5635: {
5636: for(j = 0; j < 4; octets[j++] = *ptr++);
5637: }
5638: else
5639: {
5640: (*s_etat_processus).erreur_execution =
5641: d_ex_syntaxe;
5642: return(NULL);
5643: }
5644: }
5645:
5646: longueur = (((integer8) (octets[0])) << 24)
5647: | (((integer8) (octets[1])) << 16)
5648: | (((integer8) (octets[2])) << 8)
5649: | ((integer8) (octets[3]));
5650: break;
5651: }
5652:
5653: case 0x03: // Longueur sur 64 bits
5654: {
5655: if (longueur_buffer < 0)
5656: {
5657: if (fread(octets, (size_t) sizeof(unsigned char),
5658: 8, fichier) != 8)
5659: {
5660: if (feof(fichier))
5661: {
5662: (*s_etat_processus).erreur_execution =
5663: d_ex_syntaxe;
5664: }
5665: else
5666: {
5667: (*s_etat_processus).erreur_systeme =
5668: d_es_erreur_fichier;
5669: }
5670:
5671: return(NULL);
5672: }
5673: }
5674: else
5675: {
5676: if ((longueur_buffer - (ptr - buffer)) >= 8)
5677: {
5678: for(j = 0; j < 8; octets[j++] = *ptr++);
5679: }
5680: else
5681: {
5682: (*s_etat_processus).erreur_execution =
5683: d_ex_syntaxe;
5684: return(NULL);
5685: }
5686: }
5687:
5688: longueur = (((integer8) (octets[0])) << 56)
5689: | (((integer8) (octets[1])) << 48)
5690: | (((integer8) (octets[2])) << 40)
5691: | (((integer8) (octets[3])) << 32)
5692: | (((integer8) (octets[4])) << 24)
5693: | (((integer8) (octets[5])) << 16)
5694: | (((integer8) (octets[6])) << 8)
5695: | ((integer8) (octets[7]));
5696: break;
5697: }
5698:
5699: default:
5700: {
5701: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5702: return(NULL);
5703: }
5704: }
5705: }
5706:
5707: if (type_objet == 0x40)
5708: {
5709: if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
5710: {
5711: return(NULL);
5712: }
5713: }
5714: else if (type_objet == 0x60)
5715: {
5716: if ((s_objet = allocation(s_etat_processus, RPN)) == NULL)
5717: {
5718: return(NULL);
5719: }
5720: }
5721: else
5722: {
5723: if ((s_objet = allocation(s_etat_processus, ALG)) == NULL)
5724: {
5725: return(NULL);
5726: }
5727: }
5728:
5729: l_element_courant = NULL;
5730:
5731: for(i = 0; i < longueur; i++)
5732: {
5733: // Lecture des éléments de la liste.
5734:
5735: if (longueur_buffer < 0)
5736: {
5737: if ((s_objet_elementaire = lecture_fichier_non_formate(
5738: s_etat_processus, fichier, longueur_buffer, d_vrai))
5739: == NULL)
5740: {
5741: liberation(s_etat_processus, s_objet);
5742: return(NULL);
5743: }
5744: }
5745: else
5746: {
5747: if ((s_objet_elementaire = lecture_fichier_non_formate(
5748: s_etat_processus, &ptr,
5749: longueur_buffer - (ptr - buffer), d_vrai)) == NULL)
5750: {
5751: liberation(s_etat_processus, s_objet);
5752: return(NULL);
5753: }
5754: }
5755:
5756: if (l_element_courant == NULL)
5757: {
5758: if (((*s_objet).objet = allocation_maillon(
5759: s_etat_processus)) == NULL)
5760: {
5761: liberation(s_etat_processus, s_objet_elementaire);
5762: liberation(s_etat_processus, s_objet);
5763: return(NULL);
5764: }
5765:
5766: l_element_courant = (*s_objet).objet;
5767: }
5768: else
5769: {
5770: if (((*l_element_courant).suivant = allocation_maillon(
5771: s_etat_processus)) == NULL)
5772: {
5773: liberation(s_etat_processus, s_objet_elementaire);
5774: liberation(s_etat_processus, s_objet);
5775: return(NULL);
5776: }
5777:
5778: l_element_courant = (*l_element_courant).suivant;
5779: }
5780:
5781: (*l_element_courant).donnee = s_objet_elementaire;
5782: (*l_element_courant).suivant = NULL;
5783: }
5784:
5785: break;
5786: }
5787:
5788: case 0x80: // Chaîne de caractères
5789: {
5790: if ((octets[0] & 0x08) == 0) // Longueur sur 6 bits
5791: {
5792: longueur = (octets[0] & 0x07);
5793: }
5794: else
5795: {
5796: switch(octets[0] & 0x07)
5797: {
5798: case 0x00: // Longueur sur 8 bits
5799: {
5800: if (longueur_buffer < 0)
5801: {
5802: if (fread(octets, (size_t) sizeof(unsigned char),
5803: 1, fichier) != 1)
5804: {
5805: if (feof(fichier))
5806: {
5807: (*s_etat_processus).erreur_execution =
5808: d_ex_syntaxe;
5809: }
5810: else
5811: {
5812: (*s_etat_processus).erreur_systeme =
5813: d_es_erreur_fichier;
5814: }
5815:
5816: return(NULL);
5817: }
5818: }
5819: else
5820: {
5821: if ((longueur_buffer - (ptr - buffer)) >= 1)
5822: {
5823: octets[0] = *ptr++;
5824: }
5825: else
5826: {
5827: (*s_etat_processus).erreur_execution =
5828: d_ex_syntaxe;
5829: return(NULL);
5830: }
5831: }
5832:
5833: longueur = octets[0];
5834: break;
5835: }
5836:
5837: case 0x01: // Longueur sur 16 bits
5838: {
5839: if (longueur_buffer < 0)
5840: {
5841: if (fread(octets, (size_t) sizeof(unsigned char),
5842: 2, fichier) != 2)
5843: {
5844: if (feof(fichier))
5845: {
5846: (*s_etat_processus).erreur_execution =
5847: d_ex_syntaxe;
5848: }
5849: else
5850: {
5851: (*s_etat_processus).erreur_systeme =
5852: d_es_erreur_fichier;
5853: }
5854:
5855: return(NULL);
5856: }
5857: }
5858: else
5859: {
5860: if ((longueur_buffer - (ptr - buffer)) >= 2)
5861: {
5862: for(j = 0; j < 2; octets[j++] = *ptr++);
5863: }
5864: else
5865: {
5866: (*s_etat_processus).erreur_execution =
5867: d_ex_syntaxe;
5868: return(NULL);
5869: }
5870: }
5871:
5872: longueur = (((integer8) (octets[0])) << 8)
5873: | ((integer8) (octets[1]));
5874: break;
5875: }
5876:
5877: case 0x02: // Longueur sur 32 bits
5878: {
5879: if (longueur_buffer < 0)
5880: {
5881: if (fread(octets, (size_t) sizeof(unsigned char),
5882: 4, fichier) != 4)
5883: {
5884: if (feof(fichier))
5885: {
5886: (*s_etat_processus).erreur_execution =
5887: d_ex_syntaxe;
5888: }
5889: else
5890: {
5891: (*s_etat_processus).erreur_systeme =
5892: d_es_erreur_fichier;
5893: }
5894:
5895: return(NULL);
5896: }
5897: }
5898: else
5899: {
5900: if ((longueur_buffer - (ptr - buffer)) >= 4)
5901: {
5902: for(j = 0; j < 4; octets[j++] = *ptr++);
5903: }
5904: else
5905: {
5906: (*s_etat_processus).erreur_execution =
5907: d_ex_syntaxe;
5908: return(NULL);
5909: }
5910: }
5911:
5912: longueur = (((integer8) (octets[0])) << 24)
5913: | (((integer8) (octets[1])) << 16)
5914: | (((integer8) (octets[2])) << 8)
5915: | ((integer8) (octets[3]));
5916: break;
5917: }
5918:
5919: case 0x03: // Longueur sur 64 bits
5920: {
5921: if (longueur_buffer < 0)
5922: {
5923: if (fread(octets, (size_t) sizeof(unsigned char),
5924: 8, fichier) != 8)
5925: {
5926: if (feof(fichier))
5927: {
5928: (*s_etat_processus).erreur_execution =
5929: d_ex_syntaxe;
5930: }
5931: else
5932: {
5933: (*s_etat_processus).erreur_systeme =
5934: d_es_erreur_fichier;
5935: }
5936:
5937: return(NULL);
5938: }
5939: }
5940: else
5941: {
5942: if ((longueur_buffer - (ptr - buffer)) >= 8)
5943: {
5944: for(j = 0; j < 8; octets[j++] = *ptr++);
5945: }
5946: else
5947: {
5948: (*s_etat_processus).erreur_execution =
5949: d_ex_syntaxe;
5950: return(NULL);
5951: }
5952: }
5953:
5954: longueur = (((integer8) (octets[0])) << 56)
5955: | (((integer8) (octets[1])) << 48)
5956: | (((integer8) (octets[2])) << 40)
5957: | (((integer8) (octets[3])) << 32)
5958: | (((integer8) (octets[4])) << 24)
5959: | (((integer8) (octets[5])) << 16)
5960: | (((integer8) (octets[6])) << 8)
5961: | ((integer8) (octets[7]));
5962: break;
5963: }
5964:
5965: default:
5966: {
5967: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5968: return(NULL);
5969: }
5970: }
5971: }
5972:
5973: if (longueur_buffer < 0)
5974: {
5975: if ((flux = malloc(((size_t) longueur) * sizeof(unsigned char)))
5976: == NULL)
5977: {
5978: (*s_etat_processus).erreur_systeme =
5979: d_es_allocation_memoire;
5980: return(NULL);
5981: }
5982:
5983: if (fread(flux, (size_t) sizeof(unsigned char),
5984: (size_t) longueur, fichier) != (size_t) longueur)
5985: {
5986: if (feof(fichier))
5987: {
5988: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
5989: }
5990: else
5991: {
5992: (*s_etat_processus).erreur_systeme =
5993: d_es_erreur_fichier;
5994: }
5995:
5996: return(NULL);
5997: }
5998: }
5999: else
6000: {
6001: if ((longueur_buffer - (ptr - buffer)) < longueur)
6002: {
6003: (*s_etat_processus).erreur_execution =
6004: d_ex_syntaxe;
6005: return(NULL);
6006: }
6007:
6008: flux = ptr;
6009: ptr += longueur;
6010: }
6011:
6012: if ((s_objet = allocation(s_etat_processus, CHN)) == NULL)
6013: {
6014: if (longueur_buffer < 0)
6015: {
6016: free(flux);
6017: }
6018:
6019: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6020: return(NULL);
6021: }
6022:
6023: if (((*s_objet).objet = analyse_flux(s_etat_processus, flux,
6024: longueur)) == NULL)
6025: {
6026: return(NULL);
6027: }
6028:
6029: if (longueur_buffer < 0)
6030: {
6031: free(flux);
6032: }
6033:
6034: break;
6035: }
6036:
6037: case 0x50: // Nom
6038: {
6039: if ((octets[0] & 0x08) == 0) // Longueur sur 6 bits
6040: {
6041: longueur = (octets[0] & 0x07);
6042: }
6043: else
6044: {
6045: switch(octets[0] & 0x07)
6046: {
6047: case 0x00: // Longueur sur 8 bits
6048: {
6049: if (longueur_buffer < 0)
6050: {
6051: if (fread(octets, (size_t) sizeof(unsigned char),
6052: 1, fichier) != 1)
6053: {
6054: if (feof(fichier))
6055: {
6056: (*s_etat_processus).erreur_execution =
6057: d_ex_syntaxe;
6058: }
6059: else
6060: {
6061: (*s_etat_processus).erreur_systeme =
6062: d_es_erreur_fichier;
6063: }
6064:
6065: return(NULL);
6066: }
6067: }
6068: else
6069: {
6070: if ((longueur_buffer - (ptr - buffer)) >= 1)
6071: {
6072: octets[0] = *ptr++;
6073: }
6074: else
6075: {
6076: (*s_etat_processus).erreur_execution =
6077: d_ex_syntaxe;
6078: return(NULL);
6079: }
6080: }
6081:
6082: longueur = octets[0];
6083: break;
6084: }
6085:
6086: case 0x01: // Longueur sur 16 bits
6087: {
6088: if (longueur_buffer < 0)
6089: {
6090: if (fread(octets, (size_t) sizeof(unsigned char),
6091: 2, fichier) != 2)
6092: {
6093: if (feof(fichier))
6094: {
6095: (*s_etat_processus).erreur_execution =
6096: d_ex_syntaxe;
6097: }
6098: else
6099: {
6100: (*s_etat_processus).erreur_systeme =
6101: d_es_erreur_fichier;
6102: }
6103:
6104: return(NULL);
6105: }
6106: }
6107: else
6108: {
6109: if ((longueur_buffer - (ptr - buffer)) >= 2)
6110: {
6111: for(j = 0; j < 2; octets[j++] = *ptr++);
6112: }
6113: else
6114: {
6115: (*s_etat_processus).erreur_execution =
6116: d_ex_syntaxe;
6117: return(NULL);
6118: }
6119: }
6120:
6121: longueur = (((integer8) (octets[0])) << 8)
6122: | ((integer8) (octets[1]));
6123: break;
6124: }
6125:
6126: case 0x02: // Longueur sur 32 bits
6127: {
6128: if (longueur_buffer < 0)
6129: {
6130: if (fread(octets, (size_t) sizeof(unsigned char),
6131: 4, fichier) != 4)
6132: {
6133: if (feof(fichier))
6134: {
6135: (*s_etat_processus).erreur_execution =
6136: d_ex_syntaxe;
6137: }
6138: else
6139: {
6140: (*s_etat_processus).erreur_systeme =
6141: d_es_erreur_fichier;
6142: }
6143:
6144: return(NULL);
6145: }
6146: }
6147: else
6148: {
6149: if ((longueur_buffer - (ptr - buffer)) >= 4)
6150: {
6151: for(j = 0; j < 4; octets[j++] = *ptr++);
6152: }
6153: else
6154: {
6155: (*s_etat_processus).erreur_execution =
6156: d_ex_syntaxe;
6157: return(NULL);
6158: }
6159: }
6160:
6161: longueur = (((integer8) (octets[0])) << 24)
6162: | (((integer8) (octets[1])) << 16)
6163: | (((integer8) (octets[2])) << 8)
6164: | ((integer8) (octets[3]));
6165: break;
6166: }
6167:
6168: case 0x03: // Longueur sur 64 bits
6169: {
6170: if (longueur_buffer < 0)
6171: {
6172: if (fread(octets, (size_t) sizeof(unsigned char),
6173: 8, fichier) != 8)
6174: {
6175: if (feof(fichier))
6176: {
6177: (*s_etat_processus).erreur_execution =
6178: d_ex_syntaxe;
6179: }
6180: else
6181: {
6182: (*s_etat_processus).erreur_systeme =
6183: d_es_erreur_fichier;
6184: }
6185:
6186: return(NULL);
6187: }
6188: }
6189: else
6190: {
6191: if ((longueur_buffer - (ptr - buffer)) >= 8)
6192: {
6193: for(j = 0; j < 8; octets[j++] = *ptr++);
6194: }
6195: else
6196: {
6197: (*s_etat_processus).erreur_execution =
6198: d_ex_syntaxe;
6199: return(NULL);
6200: }
6201: }
6202:
6203: longueur = (((integer8) (octets[0])) << 56)
6204: | (((integer8) (octets[1])) << 48)
6205: | (((integer8) (octets[2])) << 40)
6206: | (((integer8) (octets[3])) << 32)
6207: | (((integer8) (octets[4])) << 24)
6208: | (((integer8) (octets[5])) << 16)
6209: | (((integer8) (octets[6])) << 8)
6210: | ((integer8) (octets[7]));
6211: break;
6212: }
6213:
6214: default:
6215: {
6216: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6217: return(NULL);
6218: }
6219: }
6220: }
6221:
6222: if ((s_objet = allocation(s_etat_processus, NOM)) == NULL)
6223: {
6224: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6225: return(NULL);
6226: }
6227:
6228: if (((*((struct_nom *) (*s_objet).objet)).nom =
6229: malloc((((size_t) longueur) + 1) * sizeof(unsigned char)))
6230: == NULL)
6231: {
6232: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6233: return(NULL);
6234: }
6235:
6236: if (longueur_buffer < 0)
6237: {
6238: if (fread((unsigned char *) (*((struct_nom *) (*s_objet)
6239: .objet)).nom, (size_t) sizeof(unsigned char),
6240: (size_t) longueur, fichier) != (unsigned) longueur)
6241: {
6242: if (feof(fichier))
6243: {
6244: (*s_etat_processus).erreur_execution =
6245: d_ex_syntaxe;
6246: }
6247: else
6248: {
6249: (*s_etat_processus).erreur_systeme =
6250: d_es_erreur_fichier;
6251: }
6252:
6253: liberation(s_etat_processus, s_objet);
6254: return(NULL);
6255: }
6256:
6257: if (fread(octets, (size_t) sizeof(unsigned char),
6258: 1, fichier) != 1)
6259: {
6260: if (feof(fichier))
6261: {
6262: (*s_etat_processus).erreur_execution =
6263: d_ex_syntaxe;
6264: }
6265: else
6266: {
6267: (*s_etat_processus).erreur_systeme =
6268: d_es_erreur_fichier;
6269: }
6270:
6271: liberation(s_etat_processus, s_objet);
6272: return(NULL);
6273: }
6274: }
6275: else
6276: {
6277: if ((longueur_buffer - (ptr - buffer)) >= (longueur + 1))
6278: {
6279: for(j = 0; j < longueur; (*((struct_nom *)
6280: (*s_objet).objet)).nom[j] = *ptr++);
6281: octets[0] = *ptr++;
6282: }
6283: else
6284: {
6285: liberation(s_etat_processus, s_objet);
6286: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6287: return(NULL);
6288: }
6289: }
6290:
6291: (*((struct_nom *) (*s_objet).objet)).nom[longueur] =
6292: d_code_fin_chaine;
6293: (*((struct_nom *) (*s_objet).objet)).symbole =
6294: (octets[0] == 0xFF) ? d_vrai : d_faux;
6295: break;
6296: }
6297:
6298: case 0xE0: // Fonction
6299: {
6300: if ((octets[0] & 0x08) == 0) // Longueur sur 6 bits
6301: {
6302: longueur = (octets[0] & 0x07);
6303: }
6304: else
6305: {
6306: switch(octets[0] & 0x07)
6307: {
6308: case 0x00: // Longueur sur 8 bits
6309: {
6310: if (longueur_buffer < 0)
6311: {
6312: if (fread(octets, (size_t) sizeof(unsigned char),
6313: 1, fichier) != 1)
6314: {
6315: if (feof(fichier))
6316: {
6317: (*s_etat_processus).erreur_execution =
6318: d_ex_syntaxe;
6319: }
6320: else
6321: {
6322: (*s_etat_processus).erreur_systeme =
6323: d_es_erreur_fichier;
6324: }
6325:
6326: return(NULL);
6327: }
6328: }
6329: else
6330: {
6331: if ((longueur_buffer - (ptr - buffer)) >= 1)
6332: {
6333: octets[0] = *ptr++;
6334: }
6335: else
6336: {
6337: (*s_etat_processus).erreur_execution =
6338: d_ex_syntaxe;
6339: return(NULL);
6340: }
6341: }
6342:
6343: longueur = octets[0];
6344: break;
6345: }
6346:
6347: case 0x01: // Longueur sur 16 bits
6348: {
6349: if (longueur_buffer < 0)
6350: {
6351: if (fread(octets, (size_t) sizeof(unsigned char),
6352: 2, fichier) != 2)
6353: {
6354: if (feof(fichier))
6355: {
6356: (*s_etat_processus).erreur_execution =
6357: d_ex_syntaxe;
6358: }
6359: else
6360: {
6361: (*s_etat_processus).erreur_systeme =
6362: d_es_erreur_fichier;
6363: }
6364:
6365: return(NULL);
6366: }
6367: }
6368: else
6369: {
6370: if ((longueur_buffer - (ptr - buffer)) >= 2)
6371: {
6372: for(j = 0; j < 2; octets[j++] = *ptr++);
6373: }
6374: else
6375: {
6376: (*s_etat_processus).erreur_execution =
6377: d_ex_syntaxe;
6378: return(NULL);
6379: }
6380: }
6381:
6382: longueur = (((integer8) (octets[0])) << 8)
6383: | ((integer8) (octets[1]));
6384: break;
6385: }
6386:
6387: case 0x02: // Longueur sur 32 bits
6388: {
6389: if (longueur_buffer < 0)
6390: {
6391: if (fread(octets, (size_t) sizeof(unsigned char),
6392: 4, fichier) != 4)
6393: {
6394: if (feof(fichier))
6395: {
6396: (*s_etat_processus).erreur_execution =
6397: d_ex_syntaxe;
6398: }
6399: else
6400: {
6401: (*s_etat_processus).erreur_systeme =
6402: d_es_erreur_fichier;
6403: }
6404:
6405: return(NULL);
6406: }
6407: }
6408: else
6409: {
6410: if ((longueur_buffer - (ptr - buffer)) >= 4)
6411: {
6412: for(j = 0; j < 4; octets[j++] = *ptr++);
6413: }
6414: else
6415: {
6416: (*s_etat_processus).erreur_execution =
6417: d_ex_syntaxe;
6418: return(NULL);
6419: }
6420: }
6421:
6422: longueur = (((integer8) (octets[0])) << 24)
6423: | (((integer8) (octets[1])) << 16)
6424: | (((integer8) (octets[2])) << 8)
6425: | ((integer8) (octets[3]));
6426: break;
6427: }
6428:
6429: case 0x03: // Longueur sur 64 bits
6430: {
6431: if (longueur_buffer < 0)
6432: {
6433: if (fread(octets, (size_t) sizeof(unsigned char),
6434: 8, fichier) != 8)
6435: {
6436: if (feof(fichier))
6437: {
6438: (*s_etat_processus).erreur_execution =
6439: d_ex_syntaxe;
6440: }
6441: else
6442: {
6443: (*s_etat_processus).erreur_systeme =
6444: d_es_erreur_fichier;
6445: }
6446:
6447: return(NULL);
6448: }
6449: }
6450: else
6451: {
6452: if ((longueur_buffer - (ptr - buffer)) >= 8)
6453: {
6454: for(j = 0; j < 8; octets[j++] = *ptr++);
6455: }
6456: else
6457: {
6458: (*s_etat_processus).erreur_execution =
6459: d_ex_syntaxe;
6460: return(NULL);
6461: }
6462: }
6463:
6464: longueur = (((integer8) (octets[0])) << 56)
6465: | (((integer8) (octets[1])) << 48)
6466: | (((integer8) (octets[2])) << 40)
6467: | (((integer8) (octets[3])) << 32)
6468: | (((integer8) (octets[4])) << 24)
6469: | (((integer8) (octets[5])) << 16)
6470: | (((integer8) (octets[6])) << 8)
6471: | ((integer8) (octets[7]));
6472: break;
6473: }
6474:
6475: default:
6476: {
6477: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6478: return(NULL);
6479: }
6480: }
6481: }
6482:
6483: if ((s_objet = allocation(s_etat_processus, FCT)) == NULL)
6484: {
6485: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6486: return(NULL);
6487: }
6488:
6489: if (((*((struct_fonction *) (*s_objet).objet)).nom_fonction =
6490: malloc((((size_t) longueur) + 1) * sizeof(unsigned char)))
6491: == NULL)
6492: {
6493: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
6494: return(NULL);
6495: }
6496:
6497: if (longueur_buffer < 0)
6498: {
6499: if (fread((unsigned char *) (*((struct_fonction *) (*s_objet)
6500: .objet)).nom_fonction, (size_t) sizeof(unsigned char),
6501: (size_t) longueur, fichier) != (unsigned) longueur)
6502: {
6503: if (feof(fichier))
6504: {
6505: (*s_etat_processus).erreur_execution =
6506: d_ex_syntaxe;
6507: }
6508: else
6509: {
6510: (*s_etat_processus).erreur_systeme =
6511: d_es_erreur_fichier;
6512: }
6513:
6514: liberation(s_etat_processus, s_objet);
6515: return(NULL);
6516: }
6517:
6518: if (fread(octets, (size_t) sizeof(unsigned char),
6519: 8, fichier) != 8)
6520: {
6521: if (feof(fichier))
6522: {
6523: (*s_etat_processus).erreur_execution =
6524: d_ex_syntaxe;
6525: }
6526: else
6527: {
6528: (*s_etat_processus).erreur_systeme =
6529: d_es_erreur_fichier;
6530: }
6531:
6532: liberation(s_etat_processus, s_objet);
6533: return(NULL);
6534: }
6535: }
6536: else
6537: {
6538: if ((longueur_buffer - (ptr - buffer)) >= (longueur + 8))
6539: {
6540: for(j = 0; j < longueur; (*((struct_fonction *)
6541: (*s_objet).objet)).nom_fonction[j] = *ptr++);
6542: for(j = 0; j < 8; octets[j++] = *ptr++);
6543: }
6544: else
6545: {
6546: liberation(s_etat_processus, s_objet);
6547: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6548: return(NULL);
6549: }
6550: }
6551:
6552: (*((struct_fonction *) (*s_objet).objet)).nom_fonction[longueur] =
6553: d_code_fin_chaine;
6554: (*((struct_fonction *) (*s_objet).objet)).nombre_arguments =
6555: (((integer8) (octets[0])) << 56)
6556: | (((integer8) (octets[1])) << 48)
6557: | (((integer8) (octets[2])) << 40)
6558: | (((integer8) (octets[3])) << 32)
6559: | (((integer8) (octets[4])) << 24)
6560: | (((integer8) (octets[5])) << 16)
6561: | (((integer8) (octets[6])) << 8)
6562: | ((integer8) (octets[7]));
6563: break;
6564: }
6565:
6566: default:
6567: {
6568: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6569: return(NULL);
6570: }
6571: }
6572:
6573: if ((longueur_buffer < 0) && (recursivite == d_faux))
6574: {
6575: // Lecture depuis un fichier, on saute le champ de queue qui contient
6576: // la longueur de l'enregistrement.
6577:
6578: if (fread(octets, (size_t) sizeof(unsigned char), 1, fichier) != 1)
6579: {
6580: liberation(s_etat_processus, s_objet);
6581:
6582: if (feof(fichier))
6583: {
6584: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6585: }
6586: else
6587: {
6588: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
6589: }
6590:
6591: return(NULL);
6592: }
6593:
6594: if ((octets[0] & 0x01) != 0)
6595: {
6596: deplacement = (size_t) (((octets[0] & 0x0F) >> 1) + 1);
6597:
6598: if (fread(octets, (size_t) sizeof(unsigned char), deplacement,
6599: fichier) != deplacement)
6600: {
6601: liberation(s_etat_processus, s_objet);
6602:
6603: if (feof(fichier))
6604: {
6605: (*s_etat_processus).erreur_execution = d_ex_syntaxe;
6606: }
6607: else
6608: {
6609: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
6610: }
6611:
6612: return(NULL);
6613: }
6614: }
6615: }
6616:
6617: if (longueur_buffer >= 0)
6618: {
6619: (*((unsigned char **) argument)) = ptr;
6620: }
6621:
6622: return(s_objet);
6623: }
6624:
6625: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>