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