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