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