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