File:  [local] / rpl / src / formateur_fichiers.c
Revision 1.101: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:42 2020 UTC (4 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_32, HEAD
Modification du copyright.

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

CVSweb interface <joel.bertrand@systella.fr>