File:  [local] / rpl / src / formateur_fichiers.c
Revision 1.52: download - view: text, annotated - select for diffs - revision graph
Sun Mar 10 17:01:05 2013 UTC (11 years, 1 month ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Première série de patches pour gérer les fichiers non formatés. Fonctionne
pour l'instant pour les listes et les scalaires (entiers et réels)
exclusivement.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.13
    4:   Copyright (C) 1989-2013 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: #define DEBUG_ERREURS
   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, long longueur, long longueur_champ,
   44:         unsigned char format_sortie, unsigned char type,
   45:         long *longueur_effective, long *recursivite, logical1 export_fichier)
   46: {
   47:     /*
   48:      * Traitement du format des fichiers formatés :
   49:      *
   50:      * { "standard*(*)" (format classique sans limitation)
   51:      *   "standard*(Y)" (format classique limité à Y caractères)
   52:      *   "fixed*X(*)"   (format virgule fixe avec une partie
   53:      *                   fractionnaire composée de X chiffres,
   54:      *                   mais dont la longueur est limité par
   55:      *                   la précision de la représentation interne)
   56:      *   "fixed*X(Y)"   (idem, mais longueur totale inférieure ou égale à
   57:      *                   Y caractères)
   58:      *   "scientific*X(*)"
   59:      *   "scientific*X(Y)"
   60:      *   "engineer*X(*)"
   61:      *   "engineer*X(Y)"
   62:      *   "binary*X(*)"
   63:      *   "binary*X(Y)"  (X est la base : 2, 8, 10, 16)
   64:      *   "character*(*)"
   65:      *   "character*(Y)" }
   66:      *
   67:      * Traitement du format des fichiers non formatés :
   68:      *
   69:      * { "integer*1", "integer*2", "integer*4", "integer*8",
   70:      *   "real*4", "real*8", ["real*16",]
   71:      *   "complex*8", "complex*16", ["complex*32",]
   72:      *   "logical*1", "logical*2", "logical*4", logical*8",
   73:      *   "character*n" "character*(*)" }
   74:      */
   75: 
   76:     logical1                    autorisation_parenthese;
   77:     logical1                    format_degenere;
   78:     logical1                    presence_signe;
   79: 
   80:     long                        longueur_chaine_traitee;
   81: 
   82:     struct_liste_chainee        *l_atome;
   83:     struct_liste_chainee        *l_element_courant;
   84:     struct_liste_chainee        *l_element_courant_format;
   85:     struct_liste_chainee        *l_liste1;
   86:     struct_liste_chainee        *l_liste2;
   87: 
   88:     struct_objet                *s_sous_objet;
   89:     struct_objet                *s_sous_objet_1;
   90:     struct_objet                *s_sous_objet_2;
   91:     struct_objet                *s_sous_objet_3;
   92: 
   93:     unsigned char               base[1 + 1];
   94:     unsigned char               *chaine;
   95:     unsigned char               *chaine_fonction;
   96:     unsigned char               *chaine_formatee;
   97:     unsigned char               *chaine_tampon;
   98:     unsigned char               *chaine_sauvegarde;
   99:     unsigned char               *format_chaine;
  100:     unsigned char               *ptre;
  101:     unsigned char               *ptrl;
  102:     unsigned char               tampon[64 + 1];
  103: 
  104:     unsigned long               i;
  105:     unsigned long               j;
  106:     unsigned long               nombre_arguments;
  107:     unsigned long               nombre_arguments_fonction;
  108:     unsigned long               nombre_colonnes;
  109:     unsigned long               nombre_elements;
  110:     unsigned long               nombre_lignes;
  111: 
  112:     integer8                    longueur_liste;
  113:     integer8                    longueur_reelle_chaine;
  114:     integer8                    longueur_totale;
  115:     integer8                    masque_binaire;
  116:     integer8                    position_1;
  117:     integer8                    position_2;
  118:     integer8                    position_3;
  119: 
  120:     (*recursivite)++;
  121: 
  122:     if (type == 'F')
  123:     {
  124:         /*
  125:          * Fichiers formatés
  126:          */
  127: 
  128:         chaine = NULL;
  129:         chaine_formatee = NULL;
  130:         chaine_sauvegarde = NULL;
  131: 
  132:         strcpy(base, " ");
  133: 
  134:         masque_binaire = 0;
  135: 
  136:         if ((*s_objet).type == ALG)
  137:         {
  138: 
  139: /*
  140: --------------------------------------------------------------------------------
  141:   Expression algébrique
  142: --------------------------------------------------------------------------------
  143: */
  144: 
  145:             l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
  146: 
  147:             while(l_element_courant != NULL)
  148:             {
  149:                 if ((*(*l_element_courant).donnee).type == FCT)
  150:                 {
  151:                     if ((strcmp((*((struct_fonction *) (*(*l_element_courant)
  152:                             .donnee).objet)).nom_fonction, "<<") != 0) &&
  153:                             (strcmp((*((struct_fonction *)
  154:                             (*(*l_element_courant)
  155:                             .donnee).objet)).nom_fonction, ">>") != 0))
  156:                     {
  157:                         if ((strcmp((*((struct_fonction *)
  158:                                 (*(*l_element_courant)
  159:                                 .donnee).objet)).nom_fonction, "+") == 0) ||
  160:                                 (strcmp((*((struct_fonction *)
  161:                                 (*(*l_element_courant).donnee).objet))
  162:                                 .nom_fonction, "-") == 0) || (strcmp(
  163:                                 (*((struct_fonction *) (*(*l_element_courant)
  164:                                 .donnee).objet)).nom_fonction, "*") == 0) ||
  165:                                 (strcmp((*((struct_fonction *)
  166:                                 (*(*l_element_courant).donnee).objet))
  167:                                 .nom_fonction,
  168:                                 "/") == 0) || (strcmp((*((struct_fonction *)
  169:                                 (*(*l_element_courant).donnee).objet))
  170:                                 .nom_fonction,
  171:                                 "^") == 0) || (strcmp((*((struct_fonction *)
  172:                                 (*(*l_element_courant).donnee).objet))
  173:                                 .nom_fonction,
  174:                                 "<") == 0) || (strcmp((*((struct_fonction *)
  175:                                 (*(*l_element_courant).donnee).objet))
  176:                                 .nom_fonction,
  177:                                 ">") == 0) || (strcmp((*((struct_fonction *)
  178:                                 (*(*l_element_courant).donnee).objet))
  179:                                 .nom_fonction,
  180:                                 "==") == 0) || (strcmp((*((struct_fonction *)
  181:                                 (*(*l_element_courant).donnee).objet))
  182:                                 .nom_fonction,
  183:                                 "<>") == 0) || (strcmp((*((struct_fonction *)
  184:                                 (*(*l_element_courant).donnee).objet))
  185:                                 .nom_fonction,
  186:                                 "<=") == 0) || (strcmp((*((struct_fonction *)
  187:                                 (*(*l_element_courant).donnee).objet))
  188:                                 .nom_fonction,
  189:                                 "=<") == 0) || (strcmp((*((struct_fonction *)
  190:                                 (*(*l_element_courant).donnee).objet))
  191:                                 .nom_fonction,
  192:                                 ">=") == 0) || (strcmp((*((struct_fonction *)
  193:                                 (*(*l_element_courant).donnee).objet))
  194:                                 .nom_fonction,
  195:                                 "=>") == 0))
  196:                         {
  197:                             if (depilement(s_etat_processus,
  198:                                     &((*s_etat_processus)
  199:                                     .l_base_pile), &s_sous_objet_2) == d_erreur)
  200:                             {
  201:                                 return(NULL);
  202:                             }
  203: 
  204:                             chaine_sauvegarde = (*s_etat_processus)
  205:                                     .instruction_courante;
  206: 
  207:                             if (((*s_etat_processus).instruction_courante =
  208:                                     (unsigned char *) malloc((strlen(
  209:                                     (unsigned char *) (*s_sous_objet_2).objet)
  210:                                     + 2 + 1) * sizeof(unsigned char))) == NULL)
  211:                             {
  212:                                 (*s_etat_processus).instruction_courante =
  213:                                         chaine_sauvegarde;
  214:                                 (*s_etat_processus).erreur_systeme =
  215:                                         d_es_allocation_memoire;
  216:                                 return(NULL);
  217:                             }
  218: 
  219:                             sprintf((*s_etat_processus).instruction_courante,
  220:                                     "'%s'", (unsigned char *)
  221:                                     (*s_sous_objet_2).objet);
  222: 
  223:                             presence_signe = (((*s_etat_processus)
  224:                                     .instruction_courante[1] == '+')
  225:                                     || ((*s_etat_processus)
  226:                                     .instruction_courante[1]
  227:                                     == '-')) ? d_vrai : d_faux;
  228: 
  229:                             recherche_type(s_etat_processus);
  230: 
  231:                             if ((*s_etat_processus).erreur_execution != d_ex)
  232:                             {
  233:                                 // Aucune erreur ne peut être renvoyée.
  234: 
  235:                                 return(NULL);
  236:                             }
  237: 
  238:                             if (depilement(s_etat_processus,
  239:                                     &((*s_etat_processus)
  240:                                     .l_base_pile), &s_sous_objet_3) == d_erreur)
  241:                             {
  242:                                 return(NULL);
  243:                             }
  244: 
  245:                             free((*s_etat_processus).instruction_courante);
  246: 
  247:                             (*s_etat_processus).instruction_courante =
  248:                                     chaine_sauvegarde;
  249: 
  250:                             autorisation_parenthese = d_faux;
  251: 
  252:                             if ((*s_sous_objet_3).type == ALG)
  253:                             {
  254:                                 l_atome = (struct_liste_chainee *)
  255:                                         (*s_sous_objet_3).objet;
  256:                                 chaine_fonction = "";
  257:                                 nombre_arguments_fonction = 0;
  258: 
  259:                                 while(l_atome != NULL)
  260:                                 {
  261:                                     if ((*(*l_atome).donnee).type == FCT)
  262:                                     {
  263:                                         if (strcmp((*((struct_fonction *)
  264:                                                 (*(*l_atome).donnee).objet))
  265:                                                 .nom_fonction, ">>") != 0)
  266:                                         {
  267:                                             chaine_fonction =
  268:                                                     (*((struct_fonction *)
  269:                                                     (*(*l_atome).donnee).objet))
  270:                                                     .nom_fonction;
  271:                                             nombre_arguments_fonction =
  272:                                                     (*((struct_fonction *)
  273:                                                     (*(*l_atome).donnee).objet))
  274:                                                     .nombre_arguments;
  275:                                         }
  276:                                     }
  277: 
  278:                                     l_atome = (*l_atome).suivant;
  279:                                 }
  280: 
  281:                                 if (strcmp((*((struct_fonction *)
  282:                                         (*(*l_element_courant).donnee).objet))
  283:                                         .nom_fonction, "+") == 0)
  284:                                 {
  285:                                     if ((strcmp(chaine_fonction, "AND") == 0) ||
  286:                                             (strcmp(chaine_fonction, "XOR") ==
  287:                                             0) || (strcmp(chaine_fonction, "OR")
  288:                                             == 0))
  289:                                     {
  290:                                         autorisation_parenthese = d_vrai;
  291:                                     }
  292:                                 }
  293:                                 else if (strcmp((*((struct_fonction *)
  294:                                         (*(*l_element_courant).donnee).objet))
  295:                                         .nom_fonction, "-") == 0)
  296:                                 {
  297:                                     if (nombre_arguments_fonction != 0)
  298:                                     {
  299:                                         autorisation_parenthese = d_faux;
  300:                                     }
  301:                                     else
  302:                                     {
  303:                                         autorisation_parenthese = d_vrai;
  304:                                     }
  305:                                 }
  306:                                 else if (strcmp((*((struct_fonction *)
  307:                                         (*(*l_element_courant).donnee).objet))
  308:                                         .nom_fonction, "*") == 0)
  309:                                 {
  310:                                     if ((strcmp(chaine_fonction, "+") == 0) ||
  311:                                             (strcmp(chaine_fonction, "-") == 0)
  312:                                             || (strcmp(chaine_fonction, "AND")
  313:                                             == 0) || (strcmp(chaine_fonction,
  314:                                             "XOR") == 0) || (strcmp(
  315:                                             chaine_fonction, "OR") == 0))
  316:                                     {
  317:                                         autorisation_parenthese = d_vrai;
  318:                                     }
  319:                                 }
  320:                                 else if (strcmp((*((struct_fonction *)
  321:                                         (*(*l_element_courant).donnee).objet))
  322:                                         .nom_fonction, "/") == 0)
  323:                                 {
  324:                                     if (nombre_arguments_fonction != 0)
  325:                                     {
  326:                                         autorisation_parenthese = d_faux;
  327:                                     }
  328:                                     else
  329:                                     {
  330:                                         autorisation_parenthese = d_vrai;
  331:                                     }
  332:                                 }
  333:                                 else if ((strcmp((*((struct_fonction *)
  334:                                         (*(*l_element_courant).donnee).objet))
  335:                                         .nom_fonction, "^") == 0))
  336:                                 {
  337:                                     if (nombre_arguments_fonction != 0)
  338:                                     {
  339:                                         autorisation_parenthese = d_faux;
  340:                                     }
  341:                                     else
  342:                                     {
  343:                                         autorisation_parenthese = d_vrai;
  344:                                     }
  345:                                 }
  346:                             }
  347: 
  348:                             if ((autorisation_parenthese == d_vrai) ||
  349:                                     (presence_signe == d_vrai))
  350:                             {
  351:                                 chaine_sauvegarde = (unsigned char *)
  352:                                         (*s_sous_objet_2).objet;
  353: 
  354:                                 if (((*s_sous_objet_2).objet = (void *)
  355:                                         malloc((strlen(chaine_sauvegarde) + 2
  356:                                         + 1) * sizeof(unsigned char))) == NULL)
  357:                                 {
  358:                                     (*s_etat_processus).erreur_systeme =
  359:                                             d_es_allocation_memoire;
  360:                                     return(NULL);
  361:                                 }
  362: 
  363:                                 sprintf((unsigned char *) (*s_sous_objet_2)
  364:                                         .objet, "(%s)", chaine_sauvegarde);
  365:                                 free(chaine_sauvegarde);
  366:                             }
  367: 
  368:                             liberation(s_etat_processus, s_sous_objet_3);
  369: 
  370:                             if (depilement(s_etat_processus,
  371:                                     &((*s_etat_processus)
  372:                                     .l_base_pile), &s_sous_objet_1) == d_erreur)
  373:                             {
  374:                                 return(NULL);
  375:                             }
  376: 
  377:                             chaine_sauvegarde = (*s_etat_processus)
  378:                                     .instruction_courante;
  379: 
  380:                             if (((*s_etat_processus).instruction_courante =
  381:                                     (unsigned char *) malloc((strlen(
  382:                                     (unsigned char *) (*s_sous_objet_1).objet)
  383:                                     + 2 + 1) * sizeof(unsigned char))) == NULL)
  384:                             {
  385:                                 (*s_etat_processus).instruction_courante =
  386:                                         chaine_sauvegarde;
  387:                                 (*s_etat_processus).erreur_systeme =
  388:                                         d_es_allocation_memoire;
  389:                                 return(NULL);
  390:                             }
  391: 
  392:                             sprintf((*s_etat_processus).instruction_courante,
  393:                                     "'%s'", (unsigned char *)
  394:                                     (*s_sous_objet_1).objet);
  395: 
  396:                             recherche_type(s_etat_processus);
  397: 
  398:                             if ((*s_etat_processus).erreur_execution != d_ex)
  399:                             {
  400:                                 // Aucune erreur ne peut être renvoyée.
  401: 
  402:                                 return(NULL);
  403:                             }
  404: 
  405:                             if (depilement(s_etat_processus,
  406:                                     &((*s_etat_processus)
  407:                                     .l_base_pile), &s_sous_objet_3) == d_erreur)
  408:                             {
  409:                                 return(NULL);
  410:                             }
  411: 
  412:                             free((*s_etat_processus).instruction_courante);
  413: 
  414:                             (*s_etat_processus).instruction_courante =
  415:                                     chaine_sauvegarde;
  416: 
  417:                             autorisation_parenthese = d_faux;
  418: 
  419:                             if ((*s_sous_objet_3).type == ALG)
  420:                             {
  421:                                 l_atome = (struct_liste_chainee *)
  422:                                         (*s_sous_objet_3).objet;
  423:                                 chaine_fonction = "";
  424: 
  425:                                 while(l_atome != NULL)
  426:                                 {
  427:                                     if ((*(*l_atome).donnee).type == FCT)
  428:                                     {
  429:                                         if (strcmp((*((struct_fonction *)
  430:                                                 (*(*l_atome).donnee).objet))
  431:                                                 .nom_fonction, ">>") != 0)
  432:                                         {
  433:                                             chaine_fonction =
  434:                                                     (*((struct_fonction *)
  435:                                                     (*(*l_atome).donnee).objet))
  436:                                                     .nom_fonction;
  437:                                         }
  438:                                     }
  439: 
  440:                                     l_atome = (*l_atome).suivant;
  441:                                 }
  442: 
  443:                                 if ((strcmp((*((struct_fonction *)
  444:                                         (*(*l_element_courant).donnee).objet))
  445:                                         .nom_fonction, "+") == 0) ||
  446:                                         (strcmp((*((struct_fonction *)
  447:                                         (*(*l_element_courant).donnee).objet))
  448:                                         .nom_fonction, "-") == 0))
  449:                                 {
  450:                                     if ((strcmp(chaine_fonction, "AND") == 0) ||
  451:                                             (strcmp(chaine_fonction, "XOR") ==
  452:                                             0) || (strcmp(chaine_fonction, "OR")
  453:                                             == 0))
  454:                                     {
  455:                                         autorisation_parenthese = d_vrai;
  456:                                     }
  457:                                 }
  458:                                 else if ((strcmp((*((struct_fonction *)
  459:                                         (*(*l_element_courant).donnee).objet))
  460:                                         .nom_fonction, "*") == 0) ||
  461:                                         (strcmp((*((struct_fonction *)
  462:                                         (*(*l_element_courant).donnee).objet))
  463:                                         .nom_fonction, "/") == 0))
  464:                                 {
  465:                                     if ((strcmp(chaine_fonction, "+") == 0) ||
  466:                                             (strcmp(chaine_fonction, "-") == 0)
  467:                                             || (strcmp(chaine_fonction, "AND")
  468:                                             == 0) || (strcmp(chaine_fonction,
  469:                                             "XOR") == 0) || (strcmp(
  470:                                             chaine_fonction, "OR") == 0))
  471:                                     {
  472:                                         autorisation_parenthese = d_vrai;
  473:                                     }
  474:                                 }
  475:                                 else if ((strcmp((*((struct_fonction *)
  476:                                         (*(*l_element_courant).donnee).objet))
  477:                                         .nom_fonction, "^") == 0))
  478:                                 {
  479:                                     autorisation_parenthese = d_vrai;
  480:                                 }
  481:                             }
  482: 
  483:                             if (autorisation_parenthese == d_vrai)
  484:                             {
  485:                                 chaine_sauvegarde = (unsigned char *)
  486:                                         (*s_sous_objet_1).objet;
  487: 
  488:                                 if (((*s_sous_objet_1).objet = (void *)
  489:                                         malloc((strlen(chaine_sauvegarde) + 2
  490:                                         + 1) * sizeof(unsigned char))) == NULL)
  491:                                 {
  492:                                     (*s_etat_processus).erreur_systeme =
  493:                                             d_es_allocation_memoire;
  494:                                     return(NULL);
  495:                                 }
  496: 
  497:                                 sprintf((unsigned char *) (*s_sous_objet_1)
  498:                                         .objet, "(%s)", chaine_sauvegarde);
  499:                                 free(chaine_sauvegarde);
  500:                             }
  501: 
  502:                             liberation(s_etat_processus, s_sous_objet_3);
  503: 
  504:                             if ((s_sous_objet = allocation(s_etat_processus,
  505:                                     CHN)) == NULL)
  506:                             {
  507:                                 (*s_etat_processus).erreur_systeme =
  508:                                         d_es_allocation_memoire;
  509:                                 return(NULL);
  510:                             }
  511: 
  512:                             if (((*s_sous_objet).objet = (void *)
  513:                                     malloc((strlen(
  514:                                     (unsigned char *) (*s_sous_objet_1).objet) +
  515:                                     strlen((*((struct_fonction *)
  516:                                     (*(*l_element_courant).donnee).objet))
  517:                                     .nom_fonction) + strlen((unsigned char *)
  518:                                     (*s_sous_objet_2).objet) + 1) *
  519:                                     sizeof(unsigned char))) == NULL)
  520:                             {
  521:                                 (*s_etat_processus).erreur_systeme =
  522:                                         d_es_allocation_memoire;
  523:                                 return(NULL);
  524:                             }
  525: 
  526:                             sprintf((unsigned char *) (*s_sous_objet).objet,
  527:                                     "%s%s%s", (unsigned char *)
  528:                                     (*s_sous_objet_1)
  529:                                     .objet, (*((struct_fonction *)
  530:                                     (*(*l_element_courant).donnee).objet))
  531:                                     .nom_fonction, (unsigned char *)
  532:                                     (*s_sous_objet_2).objet);
  533: 
  534:                             liberation(s_etat_processus, s_sous_objet_1);
  535:                             liberation(s_etat_processus, s_sous_objet_2);
  536: 
  537:                             if (empilement(s_etat_processus,
  538:                                     &((*s_etat_processus)
  539:                                     .l_base_pile), s_sous_objet) == d_erreur)
  540:                             {
  541:                                 return(NULL);
  542:                             }
  543:                         }
  544:                         else if (strcmp((*((struct_fonction *)
  545:                                 (*(*l_element_courant).donnee).objet))
  546:                                 .nom_fonction, "=") == 0)
  547:                         {
  548:                             if (depilement(s_etat_processus,
  549:                                     &((*s_etat_processus).l_base_pile),
  550:                                     &s_sous_objet_2) == d_erreur)
  551:                             {
  552:                                 return(NULL);
  553:                             }
  554: 
  555:                             if (depilement(s_etat_processus,
  556:                                     &((*s_etat_processus).l_base_pile),
  557:                                     &s_sous_objet_1) == d_erreur)
  558:                             {
  559:                                 return(NULL);
  560:                             }
  561: 
  562:                             if ((s_sous_objet = allocation(s_etat_processus,
  563:                                     CHN)) == NULL)
  564:                             {
  565:                                 (*s_etat_processus).erreur_systeme =
  566:                                         d_es_allocation_memoire;
  567:                                 return(NULL);
  568:                             }
  569: 
  570:                             autorisation_parenthese = d_vrai;
  571:                             l_atome = l_element_courant;
  572: 
  573:                             if (l_atome != NULL)
  574:                             {
  575:                                 if ((*l_atome).suivant != NULL)
  576:                                 {
  577:                                     l_atome = (*l_atome).suivant;
  578: 
  579:                                     if ((*(*l_atome).donnee).type == FCT)
  580:                                     {
  581:                                         if (strcmp((*((struct_fonction *)
  582:                                                 (*(*l_atome).donnee).objet))
  583:                                                 .nom_fonction, ">>") == 0)
  584:                                         {
  585:                                             if ((*l_atome).suivant == NULL)
  586:                                             {
  587:                                                 autorisation_parenthese =
  588:                                                         d_faux;
  589:                                             }
  590:                                         }
  591:                                     }
  592:                                 }
  593:                             }
  594: 
  595:                             if (autorisation_parenthese == d_vrai)
  596:                             {
  597:                                 if (((*s_sous_objet).objet =
  598:                                         (void *) malloc((strlen(
  599:                                         (unsigned char *) (*s_sous_objet_1)
  600:                                         .objet) + strlen((*((struct_fonction *)
  601:                                         (*(*l_element_courant).donnee).objet))
  602:                                         .nom_fonction) +
  603:                                         strlen((unsigned char *)
  604:                                         (*s_sous_objet_2).objet) + 2 + 1) *
  605:                                         sizeof(unsigned char))) == NULL)
  606:                                 {
  607:                                     (*s_etat_processus).erreur_systeme =
  608:                                             d_es_allocation_memoire;
  609:                                     return(NULL);
  610:                                 }
  611: 
  612:                                 sprintf((unsigned char *) (*s_sous_objet).objet,
  613:                                         "(%s%s%s)", (unsigned char *)
  614:                                         (*s_sous_objet_1)
  615:                                         .objet, (*((struct_fonction *)
  616:                                         (*(*l_element_courant).donnee).objet))
  617:                                         .nom_fonction, (unsigned char *)
  618:                                         (*s_sous_objet_2).objet);
  619:                             }
  620:                             else
  621:                             {
  622:                                 if (((*s_sous_objet).objet =
  623:                                         (void *) malloc((strlen(
  624:                                         (unsigned char *) (*s_sous_objet_1)
  625:                                         .objet) + strlen((*((struct_fonction *)
  626:                                         (*(*l_element_courant).donnee).objet))
  627:                                         .nom_fonction) + strlen(
  628:                                         (unsigned char *) (*s_sous_objet_2)
  629:                                         .objet) + 1) * sizeof(unsigned char)))
  630:                                         == NULL)
  631:                                 {
  632:                                     (*s_etat_processus).erreur_systeme =
  633:                                             d_es_allocation_memoire;
  634:                                     return(NULL);
  635:                                 }
  636: 
  637:                                 sprintf((unsigned char *) (*s_sous_objet).objet,
  638:                                         "%s%s%s", (unsigned char *)
  639:                                         (*s_sous_objet_1)
  640:                                         .objet, (*((struct_fonction *)
  641:                                         (*(*l_element_courant).donnee).objet))
  642:                                         .nom_fonction, (unsigned char *)
  643:                                         (*s_sous_objet_2).objet);
  644:                             }
  645: 
  646:                             liberation(s_etat_processus, s_sous_objet_1);
  647:                             liberation(s_etat_processus, s_sous_objet_2);
  648: 
  649:                             if (empilement(s_etat_processus,
  650:                                     &((*s_etat_processus).l_base_pile),
  651:                                     s_sous_objet) == d_erreur)
  652:                             {
  653:                                 return(NULL);
  654:                             }
  655:                         }
  656:                         else if (strcmp((*((struct_fonction *)
  657:                                 (*(*l_element_courant).donnee).objet))
  658:                                 .nom_fonction,
  659:                                 "NOT") == 0)
  660:                         {
  661:                             if (depilement(s_etat_processus,
  662:                                     &((*s_etat_processus)
  663:                                     .l_base_pile), &s_sous_objet_1) == d_erreur)
  664:                             {
  665:                                 return(NULL);
  666:                             }
  667: 
  668:                             if ((s_sous_objet = allocation(s_etat_processus,
  669:                                     CHN)) == NULL)
  670:                             {
  671:                                 (*s_etat_processus).erreur_systeme =
  672:                                         d_es_allocation_memoire;
  673:                                 return(NULL);
  674:                             }
  675: 
  676:                             if (((*s_sous_objet).objet = (unsigned char *)
  677:                                     malloc(
  678:                                     (strlen((unsigned char *) (*s_sous_objet_1)
  679:                                     .objet) + 4 + 1) * sizeof(unsigned char)))
  680:                                     == NULL)
  681:                             {
  682:                                 (*s_etat_processus).erreur_systeme =
  683:                                         d_es_allocation_memoire;
  684:                                 return(NULL);
  685:                             }
  686: 
  687:                             sprintf((unsigned char *) (*s_sous_objet).objet,
  688:                                     "%s %s", (*((struct_fonction *)
  689:                                     (*(*l_element_courant).donnee).objet))
  690:                                     .nom_fonction, (unsigned char *)
  691:                                     (*s_sous_objet_1).objet );
  692: 
  693:                             liberation(s_etat_processus, s_sous_objet_1);
  694: 
  695:                             if (empilement(s_etat_processus,
  696:                                     &((*s_etat_processus)
  697:                                     .l_base_pile), s_sous_objet) == d_erreur)
  698:                             {
  699:                                 return(NULL);
  700:                             }
  701:                         }
  702:                         else if ((strcmp((*((struct_fonction *)
  703:                                 (*(*l_element_courant).donnee).objet))
  704:                                 .nom_fonction,
  705:                                 "OR") == 0) || (strcmp((*((struct_fonction *)
  706:                                 (*(*l_element_courant).donnee).objet))
  707:                                 .nom_fonction,
  708:                                 "XOR") == 0) || (strcmp((*((struct_fonction *)
  709:                                 (*(*l_element_courant).donnee).objet))
  710:                                 .nom_fonction,
  711:                                 "AND") == 0))
  712:                         {
  713:                             if (depilement(s_etat_processus,
  714:                                     &((*s_etat_processus)
  715:                                     .l_base_pile), &s_sous_objet_2) == d_erreur)
  716:                             {
  717:                                 return(NULL);
  718:                             }
  719: 
  720:                             if (depilement(s_etat_processus,
  721:                                     &((*s_etat_processus)
  722:                                     .l_base_pile), &s_sous_objet_1) == d_erreur)
  723:                             {
  724:                                 return(NULL);
  725:                             }
  726: 
  727:                             if ((s_sous_objet = allocation(s_etat_processus,
  728:                                     CHN)) == NULL)
  729:                             {
  730:                                 (*s_etat_processus).erreur_systeme =
  731:                                         d_es_allocation_memoire;
  732:                                 return(NULL);
  733:                             }
  734: 
  735:                             if (((*s_sous_objet).objet = (void *)
  736:                                     malloc((strlen(
  737:                                     (unsigned char *) (*s_sous_objet_1).objet) +
  738:                                     strlen((*((struct_fonction *)
  739:                                     (*(*l_element_courant).donnee).objet))
  740:                                     .nom_fonction) + strlen((unsigned char *)
  741:                                     (*s_sous_objet_2).objet) + 2 + 1) *
  742:                                     sizeof(unsigned char))) == NULL)
  743:                             {
  744:                                 (*s_etat_processus).erreur_systeme =
  745:                                         d_es_allocation_memoire;
  746:                                 return(NULL);
  747:                             }
  748: 
  749:                             sprintf((unsigned char *) (*s_sous_objet).objet,
  750:                                     "%s %s %s", (unsigned char *)
  751:                                     (*s_sous_objet_1)
  752:                                     .objet, (*((struct_fonction *)
  753:                                     (*(*l_element_courant).donnee).objet))
  754:                                     .nom_fonction, (unsigned char *)
  755:                                     (*s_sous_objet_2).objet);
  756: 
  757:                             liberation(s_etat_processus, s_sous_objet_1);
  758:                             liberation(s_etat_processus, s_sous_objet_2);
  759: 
  760:                             if (empilement(s_etat_processus,
  761:                                     &((*s_etat_processus)
  762:                                     .l_base_pile), s_sous_objet) == d_erreur)
  763:                             {
  764:                                 return(NULL);
  765:                             }
  766:                         }
  767:                         else
  768:                         {
  769:                             nombre_arguments = (*((struct_fonction *)
  770:                                     (*(*l_element_courant).donnee).objet))
  771:                                     .nombre_arguments;
  772: 
  773:                             if ((chaine = (unsigned char *)
  774:                                     malloc(sizeof(unsigned char))) == NULL)
  775:                             {
  776:                                 (*s_etat_processus).erreur_systeme =
  777:                                         d_es_allocation_memoire;
  778:                                 return(NULL);
  779:                             }
  780:                             
  781:                             chaine[0] = d_code_fin_chaine;
  782: 
  783:                             for(i = 0; i < nombre_arguments; i++)
  784:                             {
  785:                                 if ((nombre_arguments - i) > 1)
  786:                                 {
  787:                                     l_liste1 = (*s_etat_processus).l_base_pile;
  788: 
  789:                                     for(j = 2; j < (nombre_arguments - i); j++)
  790:                                     {
  791:                                         l_liste1 = (*l_liste1).suivant;
  792:                                     }
  793: 
  794:                                     l_liste2 = (*l_liste1).suivant;
  795:                                     (*l_liste1).suivant = (*l_liste2).suivant;
  796:                                     (*l_liste2).suivant = (*s_etat_processus)
  797:                                             .l_base_pile;
  798:                                     (*s_etat_processus).l_base_pile = l_liste2;
  799:                                 }
  800:                                 
  801:                                 if (depilement(s_etat_processus,
  802:                                         &((*s_etat_processus).l_base_pile),
  803:                                         &s_sous_objet) == d_erreur)
  804:                                 {
  805:                                     return(NULL);
  806:                                 }
  807: 
  808:                                 chaine_sauvegarde = chaine;
  809: 
  810:                                 if (strlen(chaine_sauvegarde) == 0)
  811:                                 {
  812:                                     if ((chaine = (unsigned char *)
  813:                                             malloc((strlen((unsigned char *)
  814:                                             (*s_sous_objet).objet) + 1) *
  815:                                             sizeof(unsigned char))) == NULL)
  816:                                     {
  817:                                         (*s_etat_processus).erreur_systeme =
  818:                                                 d_es_allocation_memoire;
  819:                                         return(NULL);
  820:                                     }
  821: 
  822:                                     sprintf(chaine, "%s", (unsigned char *)
  823:                                             (*s_sous_objet).objet);
  824:                                 }
  825:                                 else
  826:                                 {
  827:                                     if ((chaine = (unsigned char *)
  828:                                             malloc((strlen(chaine_sauvegarde)
  829:                                             + 1 + strlen((unsigned char *)
  830:                                             (*s_sous_objet).objet) + 1) *
  831:                                             sizeof(unsigned char))) == NULL)
  832:                                     {
  833:                                         (*s_etat_processus).erreur_systeme =
  834:                                                 d_es_allocation_memoire;
  835:                                         return(NULL);
  836:                                     }
  837: 
  838:                                     sprintf(chaine, "%s,%s", chaine_sauvegarde,
  839:                                             (unsigned char *) (*s_sous_objet)
  840:                                             .objet);
  841:                                 }
  842: 
  843:                                 free(chaine_sauvegarde);
  844:                                 liberation(s_etat_processus, s_sous_objet);
  845:                             }
  846: 
  847:                             chaine_sauvegarde = chaine;
  848: 
  849:                             if ((chaine = (unsigned char *) malloc((strlen(
  850:                                     (*((struct_fonction *)
  851:                                     (*(*l_element_courant)
  852:                                     .donnee).objet)).nom_fonction) + 2 +
  853:                                     strlen(chaine_sauvegarde) + 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)", (*((struct_fonction *)
  862:                                     (*(*l_element_courant).donnee).objet))
  863:                                     .nom_fonction, chaine_sauvegarde);
  864:                             free(chaine_sauvegarde);
  865: 
  866:                             if ((s_sous_objet = allocation(s_etat_processus,
  867:                                     CHN)) == NULL)
  868:                             {
  869:                                 (*s_etat_processus).erreur_systeme =
  870:                                         d_es_allocation_memoire;
  871:                                 return(NULL);
  872:                             }
  873: 
  874:                             (*s_sous_objet).objet = (void *) chaine;
  875: 
  876:                             if (empilement(s_etat_processus,
  877:                                     &((*s_etat_processus)
  878:                                     .l_base_pile), s_sous_objet) == d_erreur)
  879:                             {
  880:                                 return(NULL);
  881:                             }
  882:                         }
  883:                     }
  884:                 }
  885:                 else
  886:                 {
  887:                     if ((s_sous_objet = allocation(s_etat_processus, CHN))
  888:                             == NULL)
  889:                     {
  890:                         (*s_etat_processus).erreur_systeme =
  891:                                 d_es_allocation_memoire;
  892:                         return(NULL);
  893:                     }
  894: 
  895:                     if (((*s_sous_objet).objet = (void *) formateur_fichier(
  896:                             s_etat_processus, (*l_element_courant).donnee,
  897:                             s_format, longueur, longueur_champ, format_sortie,
  898:                             type, longueur_effective, recursivite,
  899:                             export_fichier)) == NULL)
  900:                     {
  901:                         (*s_etat_processus).erreur_systeme =
  902:                                 d_es_allocation_memoire;
  903:                         return(NULL);
  904:                     }
  905: 
  906:                     if (((*(*l_element_courant).donnee).type == ALG)
  907:                             || ((*(*l_element_courant).donnee).type == NOM))
  908:                     {
  909:                         chaine_sauvegarde = (unsigned char *)
  910:                                 (*s_sous_objet).objet;
  911: 
  912:                         if (((*s_sous_objet).objet = malloc((strlen(
  913:                                 chaine_sauvegarde) - 1) *
  914:                                 sizeof(unsigned char))) == NULL)
  915:                         {
  916:                             (*s_etat_processus).erreur_systeme =
  917:                                     d_es_allocation_memoire;
  918:                             return(NULL);
  919:                         }
  920: 
  921:                         ptrl = chaine_sauvegarde;
  922:                         ptre = (unsigned char *) (*s_sous_objet).objet;
  923: 
  924:                         for(ptrl++, i = strlen(chaine_sauvegarde) - 2; i > 0;
  925:                                 i--, *ptre++ = *ptrl++);
  926: 
  927:                         (*ptre) = d_code_fin_chaine;
  928: 
  929:                         free(chaine_sauvegarde);
  930:                     }
  931:                     else if ((*(*l_element_courant).donnee).type == CHN)
  932:                     {
  933:                         chaine_sauvegarde = (unsigned char *)
  934:                                 (*s_sous_objet).objet;
  935: 
  936:                         if (((*s_sous_objet).objet = malloc((strlen(
  937:                                 chaine_sauvegarde) + 3) *
  938:                                 sizeof(unsigned char))) == NULL)
  939:                         {
  940:                             (*s_etat_processus).erreur_systeme =
  941:                                     d_es_allocation_memoire;
  942:                             return(NULL);
  943:                         }
  944: 
  945:                         sprintf((unsigned char *) (*s_sous_objet).objet,
  946:                                 "\"%s\"", chaine_sauvegarde);
  947: 
  948:                         free(chaine_sauvegarde);
  949:                     }
  950: 
  951:                     if (empilement(s_etat_processus, &((*s_etat_processus)
  952:                             .l_base_pile), s_sous_objet) == d_erreur)
  953:                     {
  954:                         return(NULL);
  955:                     }
  956:                 }
  957: 
  958:                 l_element_courant = (*l_element_courant).suivant;
  959:             }
  960: 
  961:             if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  962:                     &s_sous_objet) == d_erreur)
  963:             {
  964:                 return(NULL);
  965:             }
  966: 
  967:             if ((chaine = (unsigned char *) malloc((strlen((unsigned char *)
  968:                     (*s_sous_objet).objet) + 2 + 1) * sizeof(unsigned char)))
  969:                     == NULL)
  970:             {
  971:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  972:                 return(NULL);
  973:             }
  974: 
  975:             sprintf(chaine, "'%s'", (unsigned char *) (*s_sous_objet).objet);
  976:             liberation(s_etat_processus, s_sous_objet);
  977:         }
  978:         else if ((*s_objet).type == BIN)
  979:         {
  980: 
  981: /*
  982: --------------------------------------------------------------------------------
  983:   Entier binaire en base 2, 8, 10 ou 16
  984: --------------------------------------------------------------------------------
  985: */
  986: 
  987:             if (format_sortie != 'B')
  988:             {
  989:                 (*s_etat_processus).erreur_execution =
  990:                         d_ex_erreur_format_fichier;
  991:                 return(NULL);
  992:             }
  993: 
  994:             masque_binaire = masque_entiers_binaires(s_etat_processus);
  995: 
  996:             if ((test_cfsf(s_etat_processus, 43) == d_faux) &&
  997:                     (test_cfsf(s_etat_processus, 44) == d_faux))
  998:             {
  999: 
 1000: /*
 1001: -- Base décimale ---------------------------------------------------------------
 1002: */
 1003: 
 1004:                 sprintf(tampon, "%llu", (*((logical8 *)
 1005:                         ((*s_objet).objet))) & masque_binaire);
 1006:                 strcpy(base, "d");
 1007:             }
 1008:             else if ((test_cfsf(s_etat_processus, 43) == d_vrai) &&
 1009:                     (test_cfsf(s_etat_processus, 44) == d_faux))
 1010:             {
 1011: 
 1012: /*
 1013: -- Base octale -----------------------------------------------------------------
 1014: */
 1015: 
 1016:                 sprintf(tampon, "%llo", (*((logical8 *)
 1017:                         ((*s_objet).objet))) & masque_binaire);
 1018:                 strcpy(base, "o");
 1019:             }
 1020:             else if (test_cfsf(s_etat_processus, 44) == d_vrai)
 1021:             {
 1022: 
 1023: /*
 1024: -- Bases hexadécimale et binaire -----------------------------------------------
 1025: */
 1026: 
 1027:                 sprintf(tampon, "%llX", (*((logical8 *)
 1028:                         ((*s_objet).objet))) & masque_binaire);
 1029: 
 1030:                 if (test_cfsf(s_etat_processus, 43) == d_vrai)
 1031:                 {
 1032:                     strcpy(base, "h");
 1033:                 }
 1034:                 else
 1035:                 {
 1036:                     chaine = (unsigned char *) malloc((strlen(tampon) + 1)
 1037:                             * sizeof(unsigned char));
 1038: 
 1039:                     if (chaine == NULL)
 1040:                     {
 1041:                         (*s_etat_processus).erreur_systeme =
 1042:                                 d_es_allocation_memoire;
 1043:                         return(NULL);
 1044:                     }
 1045: 
 1046:                     strcpy(chaine, tampon);
 1047:                     tampon[0] = 0;
 1048: 
 1049:                     for(i = 0; i < strlen(chaine); i++)
 1050:                     {
 1051:                         switch(chaine[i])
 1052:                         {
 1053:                             case '0' :
 1054:                             {
 1055:                                 strcat(tampon, (i != 0) ? "0000" : "0");
 1056:                                 break;
 1057:                             }
 1058:                             case '1' :
 1059:                             {
 1060:                                     strcat(tampon, (i != 0) ? "0001" : "1");
 1061:                                 break;
 1062:                             }
 1063:                             case '2' :
 1064:                             {
 1065:                                 strcat(tampon, (i != 0) ? "0010" : "10");
 1066:                                 break;
 1067:                             }
 1068:                             case '3' :
 1069:                             {
 1070:                                 strcat(tampon, (i != 0) ? "0011" : "11");
 1071:                                 break;
 1072:                             }
 1073:                             case '4' :
 1074:                             {
 1075:                                 strcat(tampon, (i != 0) ? "0100" : "100");
 1076:                                 break;
 1077:                             }
 1078:                             case '5' :
 1079:                             {
 1080:                                 strcat(tampon, (i != 0) ? "0101" : "101");
 1081:                                 break;
 1082:                             }
 1083:                             case '6' :
 1084:                             {
 1085:                                 strcat(tampon, (i != 0) ? "0110" : "110");
 1086:                                 break;
 1087:                             }
 1088:                             case '7' :
 1089:                             {
 1090:                                 strcat(tampon, (i != 0) ? "0111" : "111");
 1091:                                 break;
 1092:                             }
 1093:                             case '8' :
 1094:                             {
 1095:                                 strcat(tampon, "1000");
 1096:                                 break;
 1097:                             }
 1098:                             case '9' :
 1099:                             {
 1100:                                 strcat(tampon, "1001");
 1101:                                 break;
 1102:                             }
 1103:                             case 'A' :
 1104:                             {
 1105:                                 strcat(tampon, "1010");
 1106:                                 break;
 1107:                             }
 1108:                             case 'B' :
 1109:                             {
 1110:                                 strcat(tampon, "1011");
 1111:                                 break;
 1112:                             }
 1113:                             case 'C' :
 1114:                             {
 1115:                                 strcat(tampon, "1100");
 1116:                                 break;
 1117:                             }
 1118:                             case 'D' :
 1119:                             {
 1120:                                 strcat(tampon, "1101");
 1121:                                 break;
 1122:                             }
 1123:                             case 'E' :
 1124:                             {
 1125:                                 strcat(tampon, "1110");
 1126:                                 break;
 1127:                             }
 1128:                             case 'F' :
 1129:                             {
 1130:                                 strcat(tampon, "1111");
 1131:                                 break;
 1132:                             }
 1133:                         }
 1134:                     }
 1135: 
 1136:                     free(chaine);
 1137:                     strcpy(base, "b");
 1138:                 }
 1139:             }
 1140: 
 1141:             chaine = (unsigned char *) malloc((strlen(tampon) + 4)
 1142:                     * sizeof(unsigned char));
 1143: 
 1144:             if (chaine == NULL)
 1145:             {
 1146:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1147:                 return(NULL);
 1148:             }
 1149: 
 1150:             strcpy(chaine, "# ");
 1151: 
 1152:             strcat(chaine, tampon);
 1153:             strcat(chaine, base);
 1154:         }
 1155:         else if ((*s_objet).type == CHN)
 1156:         {
 1157: 
 1158: /*
 1159: --------------------------------------------------------------------------------
 1160:   Chaîne de caractères
 1161: --------------------------------------------------------------------------------
 1162: */
 1163: 
 1164:             if (format_sortie != 'C')
 1165:             {
 1166:                 (*s_etat_processus).erreur_execution =
 1167:                         d_ex_erreur_format_fichier;
 1168:                 return(NULL);
 1169:             }
 1170: 
 1171:             longueur_reelle_chaine = longueur_chaine(s_etat_processus,
 1172:                     (unsigned char *) (*s_objet).objet);
 1173: 
 1174:             if ((longueur_champ == -1) || (longueur_reelle_chaine <
 1175:                     longueur_champ))
 1176:             {
 1177:                 chaine = (unsigned char *) malloc((strlen((unsigned char *)
 1178:                         ((*s_objet).objet)) + 1) * sizeof(unsigned char));
 1179: 
 1180:                 if (chaine == NULL)
 1181:                 {
 1182:                     (*s_etat_processus).erreur_systeme =
 1183:                             d_es_allocation_memoire;
 1184:                     return(NULL);
 1185:                 }
 1186: 
 1187:                 strcpy(chaine, (unsigned char *) ((*s_objet).objet));
 1188:             }
 1189:             else
 1190:             {
 1191:                 longueur_reelle_chaine = pointeur_ieme_caractere(
 1192:                         s_etat_processus, (unsigned char *)
 1193:                         (*s_objet).objet, longueur_champ)
 1194:                         - ((unsigned char *) (*s_objet).objet);
 1195: 
 1196:                 if ((chaine = malloc((longueur_reelle_chaine + 1) *
 1197:                         sizeof(unsigned char))) == NULL)
 1198:                 {
 1199:                     (*s_etat_processus).erreur_systeme =
 1200:                             d_es_allocation_memoire;
 1201:                     return(NULL);
 1202:                 }
 1203: 
 1204:                 strncpy(chaine, (unsigned char *) ((*s_objet).objet),
 1205:                         longueur_reelle_chaine);
 1206:                 chaine[longueur_reelle_chaine] = d_code_fin_chaine;
 1207:             }
 1208:         }
 1209:         else if ((*s_objet).type == CPL)
 1210:         {
 1211: 
 1212: /*
 1213: --------------------------------------------------------------------------------
 1214:   Complexe
 1215: --------------------------------------------------------------------------------
 1216: */
 1217: 
 1218:             if ((format_sortie != 'S') && (format_sortie != 'F') &&
 1219:                     (format_sortie != 'I') && (format_sortie != 'E'))
 1220:             {
 1221:                 (*s_etat_processus).erreur_execution =
 1222:                         d_ex_erreur_format_fichier;
 1223:                 return(NULL);
 1224:             }
 1225: 
 1226:             if ((chaine_formatee = formateur_fichier_nombre(s_etat_processus,
 1227:                     (void *) ((struct_complexe16 *) ((*s_objet).objet)), 'C',
 1228:                     longueur, longueur_champ, format_sortie)) == NULL)
 1229:             {
 1230:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1231:                 return(NULL);
 1232:             }
 1233: 
 1234:             chaine = (unsigned char *) malloc((strlen(chaine_formatee)
 1235:                     + 1) * sizeof(unsigned char));
 1236: 
 1237:             if (chaine == NULL)
 1238:             {
 1239:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1240:                 return(NULL);
 1241:             }
 1242: 
 1243:             strcpy(chaine, chaine_formatee);
 1244:             free(chaine_formatee);
 1245:         }
 1246:         else if ((*s_objet).type == RPN)
 1247:         {
 1248: 
 1249: /*
 1250: --------------------------------------------------------------------------------
 1251:   Définition
 1252: --------------------------------------------------------------------------------
 1253: */
 1254: 
 1255:             l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
 1256:             chaine_sauvegarde = chaine;
 1257: 
 1258:             while(l_element_courant != NULL)
 1259:             {
 1260:                 if ((chaine_formatee = formateur_fichier(s_etat_processus,
 1261:                         (*l_element_courant).donnee, s_format,
 1262:                         longueur, longueur_champ, format_sortie, type,
 1263:                         longueur_effective, recursivite, export_fichier))
 1264:                         == NULL)
 1265:                 {
 1266:                     return(NULL);
 1267:                 }
 1268: 
 1269:                 if ((*(*l_element_courant).donnee).type == CHN)
 1270:                 {
 1271:                     chaine_tampon = chaine_formatee;
 1272: 
 1273:                     if ((chaine_formatee = (unsigned char *) malloc((strlen(
 1274:                             chaine_tampon) + 3) * sizeof(unsigned char)))
 1275:                             == NULL)
 1276:                     {
 1277:                         (*s_etat_processus).erreur_systeme =
 1278:                                 d_es_allocation_memoire;
 1279:                         return(NULL);
 1280:                     }
 1281: 
 1282:                     sprintf(chaine_formatee, "\"%s\"", chaine_tampon);
 1283:                     free(chaine_tampon);
 1284:                 }
 1285: 
 1286:                 l_element_courant = (*l_element_courant).suivant;
 1287: 
 1288:                 if (chaine != NULL)
 1289:                 {
 1290:                     chaine_sauvegarde = chaine;
 1291: 
 1292:                     if ((chaine = (unsigned char *) malloc((strlen(
 1293:                             chaine_sauvegarde) + strlen(chaine_formatee) + 2) *
 1294:                             sizeof(unsigned char))) == NULL)
 1295:                     {
 1296:                         (*s_etat_processus).erreur_systeme =
 1297:                                 d_es_allocation_memoire;
 1298:                         return(NULL);
 1299:                     }
 1300: 
 1301:                     strcpy(chaine, chaine_sauvegarde);
 1302:                     free(chaine_sauvegarde);
 1303:                     strcat(chaine, " ");
 1304:                     strcat(chaine, chaine_formatee);
 1305:                     free(chaine_formatee);
 1306:                 }
 1307:                 else
 1308:                 {
 1309:                     chaine = chaine_formatee;
 1310:                 }
 1311:             }
 1312: 
 1313:             chaine_sauvegarde = chaine;
 1314:             chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 1) *
 1315:                     sizeof(unsigned char));
 1316: 
 1317:             if (chaine == NULL)
 1318:             {
 1319:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1320:                 free(chaine_sauvegarde);
 1321:                 return(NULL);
 1322:             }
 1323: 
 1324:             chaine_sauvegarde[strlen(chaine_sauvegarde)] = d_code_fin_chaine;
 1325:             strcpy(chaine, chaine_sauvegarde);
 1326:             free(chaine_sauvegarde);
 1327:         }
 1328:         else if ((*s_objet).type == INT)
 1329:         {
 1330: 
 1331: /*
 1332: --------------------------------------------------------------------------------
 1333:   Entier
 1334: --------------------------------------------------------------------------------
 1335: */
 1336: 
 1337:             if ((format_sortie != 'S') && (format_sortie != 'F') &&
 1338:                     (format_sortie != 'I') && (format_sortie != 'E'))
 1339:             {
 1340:                 (*s_etat_processus).erreur_execution =
 1341:                         d_ex_erreur_format_fichier;
 1342:                 return(NULL);
 1343:             }
 1344: 
 1345:             if ((chaine_formatee = formateur_fichier_nombre(s_etat_processus,
 1346:                     (void *) ((integer8 *) ((*s_objet).objet)), 'I',
 1347:                     longueur, longueur_champ, format_sortie)) == NULL)
 1348:             {
 1349:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1350:                 return(NULL);
 1351:             }
 1352: 
 1353:             chaine = (unsigned char *) malloc((strlen(chaine_formatee) + 1)
 1354:                     * sizeof(unsigned char));
 1355: 
 1356:             if (chaine == NULL)
 1357:             {
 1358:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1359:                 return(NULL);
 1360:             }
 1361: 
 1362:             strcpy(chaine, chaine_formatee);
 1363:             free(chaine_formatee);
 1364:         }
 1365:         else if ((*s_objet).type == FCT)
 1366:         {
 1367: 
 1368: /*
 1369: --------------------------------------------------------------------------------
 1370:   Fonction
 1371: --------------------------------------------------------------------------------
 1372: */
 1373: 
 1374:             chaine = (unsigned char *) malloc((strlen((*((struct_fonction *)
 1375:                     ((*s_objet).objet))).nom_fonction) + 1) *
 1376:                     sizeof(unsigned char));
 1377: 
 1378:             if (chaine == NULL)
 1379:             {
 1380:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1381:                 return(NULL);
 1382:             }
 1383: 
 1384:             strcpy(chaine, (unsigned char *) (*((struct_fonction *)
 1385:                     ((*s_objet).objet))).nom_fonction);
 1386:         }
 1387:         else if ((*s_objet).type == LST)
 1388:         {
 1389: 
 1390: /*
 1391: --------------------------------------------------------------------------------
 1392:   Liste
 1393: --------------------------------------------------------------------------------
 1394: */
 1395: 
 1396:             chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
 1397: 
 1398:             if (chaine == NULL)
 1399:             {
 1400:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1401:                 return(NULL);
 1402:             }
 1403: 
 1404:             strcpy(chaine, "{");
 1405: 
 1406:             l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
 1407:             l_element_courant_format = (struct_liste_chainee *)
 1408:                     (*s_format).objet;
 1409:             nombre_elements = 0;
 1410: 
 1411:             while((l_element_courant != NULL) &&
 1412:                     (l_element_courant_format != NULL))
 1413:             {
 1414:                 if ((((*(*l_element_courant_format).donnee).type == LST)
 1415:                         && ((*(*l_element_courant).donnee).type == LST)) ||
 1416:                         (((*(*l_element_courant_format).donnee).type == TBL)
 1417:                         && ((*(*l_element_courant).donnee).type == TBL)))
 1418:                 {
 1419:                     chaine_sauvegarde = chaine;
 1420: 
 1421:                     if ((chaine_formatee = formateur_fichier(s_etat_processus,
 1422:                             (*l_element_courant).donnee,
 1423:                             (*l_element_courant_format).donnee,
 1424:                             0, 0, ' ', 'F', longueur_effective, recursivite,
 1425:                             export_fichier)) == NULL)
 1426:                     {
 1427:                         return(NULL);
 1428:                     }
 1429: 
 1430:                     chaine = (unsigned char *) malloc((strlen(chaine_formatee)
 1431:                             + strlen(chaine_sauvegarde) + 2)
 1432:                             * sizeof(unsigned char));
 1433: 
 1434:                     if (chaine == NULL)
 1435:                     {
 1436:                         (*s_etat_processus).erreur_systeme =
 1437:                                 d_es_allocation_memoire;
 1438:                         return(NULL);
 1439:                     }
 1440: 
 1441:                     strcpy(chaine, chaine_sauvegarde);
 1442:                     free(chaine_sauvegarde);
 1443:                     strcat(chaine, " ");
 1444:                     strcat(chaine, chaine_formatee);
 1445:                     free(chaine_formatee);
 1446:                 }
 1447:                 else if ((*(*l_element_courant_format).donnee).type != CHN)
 1448:                 {
 1449:                     free(chaine);
 1450: 
 1451:                     (*s_etat_processus).erreur_execution =
 1452:                             d_ex_erreur_format_fichier;
 1453:                     return(NULL);
 1454:                 }
 1455:                 else
 1456:                 {
 1457:                     if ((format_chaine = conversion_majuscule((unsigned char *)
 1458:                             (*(*l_element_courant_format).donnee).objet))
 1459:                             == NULL)
 1460:                     {
 1461:                         (*s_etat_processus).erreur_systeme =
 1462:                                 d_es_allocation_memoire;
 1463:                         return(NULL);
 1464:                     }
 1465: 
 1466:                     format_degenere = d_faux;
 1467: 
 1468:                     if (strncmp("STANDARD*", format_chaine, 9) == 0)
 1469:                     {
 1470:                         format_sortie = 'S';
 1471:                         position_1 = 9;
 1472:                         format_degenere = d_vrai;
 1473:                     }
 1474:                     else if (strncmp("BINARY*", format_chaine, 7) == 0)
 1475:                     {
 1476:                         format_sortie = 'B';
 1477:                         position_1 = 7;
 1478:                     }
 1479:                     else if (strncmp("FIXED*", format_chaine, 6) == 0)
 1480:                     {
 1481:                         format_sortie = 'F';
 1482:                         position_1 = 6;
 1483:                     }
 1484:                     else if (strncmp("SCIENTIFIC*", format_chaine, 11) == 0)
 1485:                     {
 1486:                         format_sortie = 'I';
 1487:                         position_1 = 11;
 1488:                     }
 1489:                     else if (strncmp("ENGINEER*", format_chaine, 9) == 0)
 1490:                     {
 1491:                         format_sortie = 'E';
 1492:                         position_1 = 9;
 1493:                     }
 1494:                     else if (strncmp("CHARACTER*", format_chaine, 10) == 0)
 1495:                     {
 1496:                         format_sortie = 'C';
 1497:                         position_1 = 10;
 1498:                         format_degenere = d_vrai;
 1499:                     }
 1500:                     else
 1501:                     {
 1502:                         free(chaine);
 1503:                         free(format_chaine);
 1504: 
 1505:                         (*s_etat_processus).erreur_execution =
 1506:                                 d_ex_erreur_format_fichier;
 1507:                         return(NULL);
 1508:                     }
 1509: 
 1510:                     position_3 = strlen(format_chaine) - 1;
 1511: 
 1512:                     if (format_chaine[position_3] != ')')
 1513:                     {
 1514:                         free(chaine);
 1515:                         free(format_chaine);
 1516: 
 1517:                         (*s_etat_processus).erreur_execution =
 1518:                                 d_ex_erreur_format_fichier;
 1519:                         return(NULL);
 1520:                     }
 1521: 
 1522:                     format_chaine[position_3] = d_code_fin_chaine;
 1523: 
 1524:                     position_2 = position_1;
 1525: 
 1526:                     while(format_chaine[position_2] != '(')
 1527:                     {
 1528:                         if (format_chaine[position_2] == d_code_fin_chaine)
 1529:                         {
 1530:                             free(chaine);
 1531:                             free(format_chaine);
 1532: 
 1533:                             (*s_etat_processus).erreur_execution =
 1534:                                     d_ex_erreur_format_fichier;
 1535:                             return(NULL);
 1536:                         }
 1537: 
 1538:                         position_2++;
 1539:                     }
 1540: 
 1541:                     format_chaine[position_2++] = d_code_fin_chaine;
 1542: 
 1543:                     if (format_degenere == d_faux)
 1544:                     {
 1545:                         if (sscanf(&(format_chaine[position_1]), "%ld",
 1546:                                 &longueur) != 1)
 1547:                         {
 1548:                             free(chaine);
 1549:                             free(format_chaine);
 1550: 
 1551:                             (*s_etat_processus).erreur_execution =
 1552:                                     d_ex_erreur_format_fichier;
 1553:                             return(NULL);
 1554:                         }
 1555:                     }
 1556:                     else
 1557:                     {
 1558:                         longueur = -1;
 1559:                     }
 1560: 
 1561:                     if (strcmp(&(format_chaine[position_2]), "*") != 0)
 1562:                     {
 1563:                         if (sscanf(&(format_chaine[position_2]), "%ld",
 1564:                                 &longueur_champ) != 1)
 1565:                         {
 1566:                             free(chaine);
 1567:                             free(format_chaine);
 1568: 
 1569:                             (*s_etat_processus).erreur_execution =
 1570:                                     d_ex_erreur_format_fichier;
 1571:                             return(NULL);
 1572:                         }
 1573:                     }
 1574:                     else
 1575:                     {
 1576:                         longueur_champ = -1;
 1577:                     }
 1578: 
 1579:                     if ((longueur >= 0) && (longueur_champ >= 0) && (longueur >
 1580:                             longueur_champ))
 1581:                     {
 1582:                         free(chaine);
 1583:                         free(format_chaine);
 1584: 
 1585:                         (*s_etat_processus).erreur_execution =
 1586:                                 d_ex_erreur_format_fichier;
 1587:                         return(NULL);
 1588:                     }
 1589: 
 1590:                     free(format_chaine);
 1591:                 
 1592:                     chaine_sauvegarde = chaine;
 1593: 
 1594:                     if ((chaine_formatee = formateur_fichier(s_etat_processus,
 1595:                             (*l_element_courant).donnee, s_format,
 1596:                             longueur, longueur_champ, format_sortie, type,
 1597:                             longueur_effective, recursivite, export_fichier))
 1598:                             == NULL)
 1599:                     {
 1600:                         free(chaine);
 1601:                         return(NULL);
 1602:                     }
 1603: 
 1604:                     if ((*(*l_element_courant).donnee).type == CHN)
 1605:                     {
 1606:                         chaine = (unsigned char *)
 1607:                                 malloc((strlen(chaine_formatee)
 1608:                                 + strlen(chaine_sauvegarde) + 4)
 1609:                                 * sizeof(unsigned char));
 1610: 
 1611:                         if (chaine == NULL)
 1612:                         {
 1613:                             (*s_etat_processus).erreur_systeme =
 1614:                                     d_es_allocation_memoire;
 1615:                             return(NULL);
 1616:                         }
 1617: 
 1618:                         strcpy(chaine, chaine_sauvegarde);
 1619:                         free(chaine_sauvegarde);
 1620:                         strcat(chaine, " \"");
 1621:                         strcat(chaine, chaine_formatee);
 1622:                         free(chaine_formatee);
 1623:                         strcat(chaine, "\"");
 1624:                     }
 1625:                     else if ((*(*l_element_courant).donnee).type == NOM)
 1626:                     {
 1627:                         chaine = (unsigned char *)
 1628:                                 malloc((strlen(chaine_formatee)
 1629:                                 + strlen(chaine_sauvegarde) + 2)
 1630:                                 * sizeof(unsigned char));
 1631: 
 1632:                         if (chaine == NULL)
 1633:                         {
 1634:                             (*s_etat_processus).erreur_systeme =
 1635:                                     d_es_allocation_memoire;
 1636:                             return(NULL);
 1637:                         }
 1638: 
 1639:                         sprintf(chaine, "%s %s", chaine_sauvegarde,
 1640:                                 chaine_formatee);
 1641:                         free(chaine_formatee);
 1642:                     }
 1643:                     else
 1644:                     {
 1645:                         chaine = (unsigned char *)
 1646:                                 malloc((strlen(chaine_formatee)
 1647:                                 + strlen(chaine_sauvegarde) + 2)
 1648:                                 * sizeof(unsigned char));
 1649: 
 1650:                         if (chaine == NULL)
 1651:                         {
 1652:                             (*s_etat_processus).erreur_systeme =
 1653:                                     d_es_allocation_memoire;
 1654:                             return(NULL);
 1655:                         }
 1656: 
 1657:                         strcpy(chaine, chaine_sauvegarde);
 1658:                         free(chaine_sauvegarde);
 1659:                         strcat(chaine, " ");
 1660:                         strcat(chaine, chaine_formatee);
 1661:                         free(chaine_formatee);
 1662:                     }
 1663:                 }
 1664: 
 1665:                 nombre_elements++;
 1666:                 l_element_courant = (*l_element_courant).suivant;
 1667:                 l_element_courant_format = (*l_element_courant_format).suivant;
 1668:             }
 1669: 
 1670:             if ((l_element_courant != NULL) ||
 1671:                     (l_element_courant_format != NULL))
 1672:             {
 1673:                 free(chaine);
 1674: 
 1675:                 (*s_etat_processus).erreur_execution =
 1676:                         d_ex_erreur_format_fichier;
 1677:                 return(NULL);
 1678:             }
 1679: 
 1680:             chaine_sauvegarde = chaine;
 1681:             chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 3)
 1682:                     * sizeof(unsigned char));
 1683: 
 1684:             if (chaine == NULL)
 1685:             {
 1686:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1687:                 return(NULL);
 1688:             }
 1689: 
 1690:             strcpy(chaine, chaine_sauvegarde);
 1691:             free(chaine_sauvegarde);
 1692:             strcat(chaine, " }");
 1693:         }
 1694:         else if ((*s_objet).type == TBL)
 1695:         {
 1696: 
 1697: /*
 1698: --------------------------------------------------------------------------------
 1699:   Table
 1700: --------------------------------------------------------------------------------
 1701: */
 1702: 
 1703:             if ((*s_format).type != TBL)
 1704:             {
 1705:                 (*s_etat_processus).erreur_execution =
 1706:                         d_ex_erreur_format_fichier;
 1707:                 return(NULL);
 1708:             }
 1709: 
 1710:             l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
 1711:             l_element_courant_format = (struct_liste_chainee *)
 1712:                     (*s_format).objet;
 1713: 
 1714:             if ((*((struct_tableau *) (*s_objet).objet)).nombre_elements !=
 1715:                     (*((struct_tableau *) (*s_format).objet)).nombre_elements)
 1716:             {
 1717:                 (*s_etat_processus).erreur_execution =
 1718:                         d_ex_erreur_format_fichier;
 1719:                 return(NULL);
 1720:             }
 1721: 
 1722:             chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
 1723: 
 1724:             if (chaine == NULL)
 1725:             {
 1726:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1727:                 return(NULL);
 1728:             }
 1729: 
 1730:             strcpy(chaine, "<[");
 1731: 
 1732:             for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
 1733:                     .nombre_elements; i++)
 1734:             {
 1735:                 if ((((*(*((struct_tableau *) (*s_format).objet))
 1736:                         .elements[i]).type == LST) &&
 1737:                         ((*(*((struct_tableau *) (*s_objet).objet)).elements[i])
 1738:                         .type == LST)) ||
 1739:                         (((*(*((struct_tableau *) (*s_format).objet))
 1740:                         .elements[i]).type == TBL) &&
 1741:                         ((*(*((struct_tableau *) (*s_objet).objet)).elements[i])
 1742:                         .type == TBL)))
 1743:                 {
 1744:                     chaine_sauvegarde = chaine;
 1745: 
 1746:                     if ((chaine_formatee = formateur_fichier(s_etat_processus,
 1747:                             (*l_element_courant).donnee,
 1748:                             (*l_element_courant_format).donnee,
 1749:                             0, 0, ' ', 'F', longueur_effective, recursivite,
 1750:                             export_fichier)) == NULL)
 1751:                     {
 1752:                         return(NULL);
 1753:                     }
 1754: 
 1755:                     chaine = (unsigned char *) malloc((strlen(chaine_formatee)
 1756:                             + strlen(chaine_sauvegarde) + 2)
 1757:                             * sizeof(unsigned char));
 1758: 
 1759:                     if (chaine == NULL)
 1760:                     {
 1761:                         (*s_etat_processus).erreur_systeme =
 1762:                                 d_es_allocation_memoire;
 1763:                         return(NULL);
 1764:                     }
 1765: 
 1766:                     strcpy(chaine, chaine_sauvegarde);
 1767:                     free(chaine_sauvegarde);
 1768:                     strcat(chaine, " ");
 1769:                     strcat(chaine, chaine_formatee);
 1770:                     free(chaine_formatee);
 1771:                 }
 1772:                 else if ((*(*((struct_tableau *) (*s_format).objet))
 1773:                         .elements[i]).type != CHN)
 1774:                 {
 1775:                     free(chaine);
 1776: 
 1777:                     (*s_etat_processus).erreur_execution =
 1778:                             d_ex_erreur_format_fichier;
 1779:                     return(NULL);
 1780:                 }
 1781:                 else
 1782:                 {
 1783:                     if ((format_chaine = conversion_majuscule((unsigned char *)
 1784:                             (*(*((struct_tableau *) (*s_format).objet))
 1785:                             .elements[i]).objet)) == NULL)
 1786:                     {
 1787:                         (*s_etat_processus).erreur_systeme =
 1788:                                 d_es_allocation_memoire;
 1789:                         return(NULL);
 1790:                     }
 1791: 
 1792:                     format_degenere = d_faux;
 1793: 
 1794:                     if (strncmp("STANDARD*", format_chaine, 9) == 0)
 1795:                     {
 1796:                         format_sortie = 'S';
 1797:                         position_1 = 9;
 1798:                         format_degenere = d_vrai;
 1799:                     }
 1800:                     else if (strncmp("BINARY*", format_chaine, 7) == 0)
 1801:                     {
 1802:                         format_sortie = 'B';
 1803:                         position_1 = 7;
 1804:                     }
 1805:                     else if (strncmp("FIXED*", format_chaine, 6) == 0)
 1806:                     {
 1807:                         format_sortie = 'F';
 1808:                         position_1 = 6;
 1809:                     }
 1810:                     else if (strncmp("SCIENTIFIC*", format_chaine, 11) == 0)
 1811:                     {
 1812:                         format_sortie = 'I';
 1813:                         position_1 = 11;
 1814:                     }
 1815:                     else if (strncmp("ENGINEER*", format_chaine, 9) == 0)
 1816:                     {
 1817:                         format_sortie = 'E';
 1818:                         position_1 = 9;
 1819:                     }
 1820:                     else if (strncmp("CHARACTER*", format_chaine, 10) == 0)
 1821:                     {
 1822:                         format_sortie = 'C';
 1823:                         position_1 = 10;
 1824:                         format_degenere = d_vrai;
 1825:                     }
 1826:                     else
 1827:                     {
 1828:                         free(chaine);
 1829:                         free(format_chaine);
 1830: 
 1831:                         (*s_etat_processus).erreur_execution =
 1832:                                 d_ex_erreur_format_fichier;
 1833:                         return(NULL);
 1834:                     }
 1835: 
 1836:                     position_3 = strlen(format_chaine);
 1837:                     format_chaine[--position_3] = d_code_fin_chaine;
 1838: 
 1839:                     position_2 = position_1;
 1840: 
 1841:                     while(format_chaine[position_2] != '(')
 1842:                     {
 1843:                         if (format_chaine[position_2] == d_code_fin_chaine)
 1844:                         {
 1845:                             free(chaine);
 1846:                             free(format_chaine);
 1847: 
 1848:                             (*s_etat_processus).erreur_execution =
 1849:                                     d_ex_erreur_format_fichier;
 1850:                             return(NULL);
 1851:                         }
 1852: 
 1853:                         position_2++;
 1854:                     }
 1855: 
 1856:                     format_chaine[position_2++] = d_code_fin_chaine;
 1857: 
 1858:                     if (format_degenere == d_faux)
 1859:                     {
 1860:                         if (sscanf(&(format_chaine[position_1]), "%ld",
 1861:                                 &longueur) != 1)
 1862:                         {
 1863:                             free(chaine);
 1864:                             free(format_chaine);
 1865: 
 1866:                             (*s_etat_processus).erreur_execution =
 1867:                                     d_ex_erreur_format_fichier;
 1868:                             return(NULL);
 1869:                         }
 1870:                     }
 1871:                     else
 1872:                     {
 1873:                         longueur = -1;
 1874:                     }
 1875: 
 1876:                     if (strcmp(&(format_chaine[position_2]), "*") != 0)
 1877:                     {
 1878:                         if (sscanf(&(format_chaine[position_2]), "%ld",
 1879:                                 &longueur_champ) != 1)
 1880:                         {
 1881:                             free(chaine);
 1882:                             free(format_chaine);
 1883: 
 1884:                             (*s_etat_processus).erreur_execution =
 1885:                                     d_ex_erreur_format_fichier;
 1886:                             return(NULL);
 1887:                         }
 1888:                     }
 1889:                     else
 1890:                     {
 1891:                         longueur_champ = -1;
 1892:                     }
 1893: 
 1894:                     if ((longueur >= 0) && (longueur_champ >= 0) && (longueur >
 1895:                             longueur_champ))
 1896:                     {
 1897:                         free(chaine);
 1898:                         free(format_chaine);
 1899: 
 1900:                         (*s_etat_processus).erreur_execution =
 1901:                                 d_ex_erreur_format_fichier;
 1902:                         return(NULL);
 1903:                     }
 1904: 
 1905:                     free(format_chaine);
 1906:                 
 1907:                     chaine_sauvegarde = chaine;
 1908: 
 1909:                     if ((chaine_formatee = formateur_fichier(s_etat_processus,
 1910:                             (*((struct_tableau *) (*s_objet).objet))
 1911:                             .elements[i], s_format,
 1912:                             longueur, longueur_champ, format_sortie, type,
 1913:                             longueur_effective, recursivite, export_fichier))
 1914:                             == NULL)
 1915:                     {
 1916:                         return(NULL);
 1917:                     }
 1918: 
 1919:                     if ((*(*((struct_tableau *) (*s_objet).objet))
 1920:                             .elements[i]).type == CHN)
 1921:                     {
 1922:                         chaine = (unsigned char *)
 1923:                                 malloc((strlen(chaine_formatee)
 1924:                                 + strlen(chaine_sauvegarde) + 4)
 1925:                                 * sizeof(unsigned char));
 1926: 
 1927:                         if (chaine == 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:                         strcat(chaine, "\"");
 1940:                     }
 1941:                     else if ((*(*((struct_tableau *) (*s_objet).objet))
 1942:                             .elements[i]).type == NOM)
 1943:                     {
 1944:                         chaine = (unsigned char *)
 1945:                                 malloc((strlen(chaine_formatee)
 1946:                                 + strlen(chaine_sauvegarde) + 2)
 1947:                                 * sizeof(unsigned char));
 1948: 
 1949:                         if (chaine == NULL)
 1950:                         {
 1951:                             (*s_etat_processus).erreur_systeme =
 1952:                                     d_es_allocation_memoire;
 1953:                             return(NULL);
 1954:                         }
 1955: 
 1956:                         sprintf(chaine, "%s %s", chaine_sauvegarde,
 1957:                                 chaine_formatee);
 1958:                         free(chaine_formatee);
 1959:                     }
 1960:                     else
 1961:                     {
 1962:                         chaine = (unsigned char *)
 1963:                                 malloc((strlen(chaine_formatee)
 1964:                                 + strlen(chaine_sauvegarde) + 2)
 1965:                                 * sizeof(unsigned char));
 1966: 
 1967:                         if (chaine == NULL)
 1968:                         {
 1969:                             (*s_etat_processus).erreur_systeme =
 1970:                                     d_es_allocation_memoire;
 1971:                             return(NULL);
 1972:                         }
 1973: 
 1974:                         strcpy(chaine, chaine_sauvegarde);
 1975:                         free(chaine_sauvegarde);
 1976:                         strcat(chaine, " ");
 1977:                         strcat(chaine, chaine_formatee);
 1978:                         free(chaine_formatee);
 1979:                     }
 1980:                 }
 1981:             }
 1982: 
 1983:             chaine_sauvegarde = chaine;
 1984:             chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 4)
 1985:                     * sizeof(unsigned char));
 1986: 
 1987:             if (chaine == NULL)
 1988:             {
 1989:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1990:                 return(NULL);
 1991:             }
 1992: 
 1993:             strcpy(chaine, chaine_sauvegarde);
 1994:             free(chaine_sauvegarde);
 1995:             strcat(chaine, " ]>");
 1996:         }
 1997:         else if ((*s_objet).type == MCX)
 1998:         {
 1999: 
 2000: /*
 2001: --------------------------------------------------------------------------------
 2002:   Matrice complexe
 2003: --------------------------------------------------------------------------------
 2004: */
 2005: 
 2006:             if ((format_sortie != 'S') && (format_sortie != 'F') &&
 2007:                     (format_sortie != 'I') && (format_sortie != 'E'))
 2008:             {
 2009:                 (*s_etat_processus).erreur_execution =
 2010:                         d_ex_erreur_format_fichier;
 2011:                 return(NULL);
 2012:             }
 2013: 
 2014:             nombre_lignes = (*((struct_matrice *) ((*s_objet).objet)))
 2015:                     .nombre_lignes;
 2016:             nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet)))
 2017:                     .nombre_colonnes;
 2018: 
 2019:             chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
 2020: 
 2021:             if (chaine != NULL)
 2022:             {
 2023:                 strcpy(chaine, "[[");
 2024: 
 2025:                 for(i = 0; i < nombre_lignes; i++)
 2026:                 {
 2027:                     for(j = 0; j < nombre_colonnes; j++)
 2028:                     {
 2029:                         if ((chaine_formatee =
 2030:                                 formateur_fichier_nombre(s_etat_processus,
 2031:                                 (void *) &(((struct_complexe16 **)
 2032:                                 ((*((struct_matrice *)
 2033:                                 ((*s_objet).objet))).tableau))[i][j]), 'C',
 2034:                                 longueur, longueur_champ, format_sortie))
 2035:                                 == NULL)
 2036:                         {
 2037:                             (*s_etat_processus).erreur_systeme =
 2038:                                     d_es_allocation_memoire;
 2039:                             return(NULL);
 2040:                         }
 2041: 
 2042:                         chaine_sauvegarde = chaine;
 2043:                         chaine = (unsigned char *) malloc(
 2044:                                 (strlen(chaine_sauvegarde) +
 2045:                                 strlen(chaine_formatee) + 2)
 2046:                                 * sizeof(unsigned char));
 2047: 
 2048:                         if (chaine == NULL)
 2049:                         {
 2050:                             (*s_etat_processus).erreur_systeme =
 2051:                                     d_es_allocation_memoire;
 2052:                             return(NULL);
 2053:                         }
 2054: 
 2055:                         strcpy(chaine, chaine_sauvegarde);
 2056:                         free(chaine_sauvegarde);
 2057:                         strcat(chaine, " ");
 2058:                         strcat(chaine, chaine_formatee);
 2059:                         free(chaine_formatee);
 2060:                     }
 2061: 
 2062:                     chaine_sauvegarde = chaine;
 2063:                     if (test_cfsf(s_etat_processus, 45) == d_vrai)
 2064:                     {
 2065:                         chaine = (unsigned char *) malloc(
 2066:                                 (strlen(chaine_sauvegarde) + 6)
 2067:                                 * sizeof(unsigned char));
 2068: 
 2069:                         if (chaine == NULL)
 2070:                         {
 2071:                             (*s_etat_processus).erreur_systeme =
 2072:                                     d_es_allocation_memoire;
 2073:                             return(NULL);
 2074:                         }
 2075: 
 2076:                         strcpy(chaine, chaine_sauvegarde);
 2077:                         free(chaine_sauvegarde);
 2078:                         strcat(chaine, " ]\n [");
 2079:                     }
 2080:                     else
 2081:                     {
 2082:                         chaine = (unsigned char *) malloc(
 2083:                                 (strlen(chaine_sauvegarde) + 4)
 2084:                                 * sizeof(unsigned char));
 2085: 
 2086:                         if (chaine == NULL)
 2087:                         {
 2088:                             (*s_etat_processus).erreur_systeme =
 2089:                                     d_es_allocation_memoire;
 2090:                             return(NULL);
 2091:                         }
 2092: 
 2093:                         strcpy(chaine, chaine_sauvegarde);
 2094:                         free(chaine_sauvegarde);
 2095:                         strcat(chaine, " ][");
 2096:                     }
 2097:                 }
 2098: 
 2099:                 if (test_cfsf(s_etat_processus, 45) == d_vrai)
 2100:                 {
 2101:                     chaine[strlen(chaine) - 3] = ']';
 2102:                     chaine[strlen(chaine) - 2] = 0;
 2103: 
 2104:                     chaine_sauvegarde = chaine;
 2105:                     chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
 2106:                             + 1) * sizeof(unsigned char));
 2107: 
 2108:                     if (chaine == NULL)
 2109:                     {
 2110:                         (*s_etat_processus).erreur_systeme =
 2111:                                 d_es_allocation_memoire;
 2112:                         return(NULL);
 2113:                     }
 2114: 
 2115:                     strcpy(chaine, chaine_sauvegarde);
 2116:                     free(chaine_sauvegarde);
 2117:                 }
 2118:                 else
 2119:                 {
 2120:                     chaine[strlen(chaine) - 2] = ']';
 2121:                     chaine[strlen(chaine) - 1] = 0;
 2122: 
 2123:                     chaine_sauvegarde = chaine;
 2124:                     chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
 2125:                             + 2) * sizeof(unsigned char));
 2126: 
 2127:                     if (chaine == NULL)
 2128:                     {
 2129:                         (*s_etat_processus).erreur_systeme =
 2130:                                 d_es_allocation_memoire;
 2131:                         return(NULL);
 2132:                     }
 2133: 
 2134:                     strcpy(chaine, chaine_sauvegarde);
 2135:                     free(chaine_sauvegarde);
 2136:                     strcat(chaine, "]");
 2137:                 }
 2138:             }
 2139:         }
 2140:         else if ((*s_objet).type == MIN)
 2141:         {
 2142: 
 2143: /*
 2144: --------------------------------------------------------------------------------
 2145:   Matrice entière
 2146: --------------------------------------------------------------------------------
 2147: */
 2148: 
 2149:             if ((format_sortie != 'S') && (format_sortie != 'F') &&
 2150:                     (format_sortie != 'I') && (format_sortie != 'E'))
 2151:             {
 2152:                 (*s_etat_processus).erreur_execution =
 2153:                         d_ex_erreur_format_fichier;
 2154:                 return(NULL);
 2155:             }
 2156: 
 2157:             nombre_lignes = (*((struct_matrice *) ((*s_objet).objet)))
 2158:                     .nombre_lignes;
 2159:             nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet)))
 2160:                     .nombre_colonnes;
 2161: 
 2162:             chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
 2163: 
 2164:             if (chaine != NULL)
 2165:             {
 2166:                 strcpy(chaine, "[[");
 2167: 
 2168:                 for(i = 0; i < nombre_lignes; i++)
 2169:                 {
 2170:                     for(j = 0; j < nombre_colonnes; j++)
 2171:                     {
 2172:                         if ((chaine_formatee =
 2173:                                 formateur_fichier_nombre(s_etat_processus,
 2174:                                 (void *) &(((integer8 **) ((*((struct_matrice *)
 2175:                                 ((*s_objet).objet))).tableau))[i][j]), 'I',
 2176:                                 longueur, longueur_champ, format_sortie))
 2177:                                 == NULL)
 2178:                         {
 2179:                             (*s_etat_processus).erreur_systeme =
 2180:                                     d_es_allocation_memoire;
 2181:                             return(NULL);
 2182:                         }
 2183: 
 2184:                         chaine_sauvegarde = chaine;
 2185:                         chaine = (unsigned char *) malloc(
 2186:                                 (strlen(chaine_sauvegarde) +
 2187:                                 strlen(chaine_formatee) + 2)
 2188:                                 * sizeof(unsigned char));
 2189: 
 2190:                         if (chaine == NULL)
 2191:                         {
 2192:                             (*s_etat_processus).erreur_systeme =
 2193:                                     d_es_allocation_memoire;
 2194:                             return(NULL);
 2195:                         }
 2196: 
 2197:                         strcpy(chaine, chaine_sauvegarde);
 2198:                         free(chaine_sauvegarde);
 2199:                         strcat(chaine, " ");
 2200:                         strcat(chaine, chaine_formatee);
 2201:                         free(chaine_formatee);
 2202:                     }
 2203: 
 2204:                     chaine_sauvegarde = chaine;
 2205:                     if (test_cfsf(s_etat_processus, 45) == d_vrai)
 2206:                     {
 2207:                         chaine = (unsigned char *) malloc(
 2208:                                 (strlen(chaine_sauvegarde) + 6)
 2209:                                 * sizeof(unsigned char));
 2210: 
 2211:                         if (chaine == NULL)
 2212:                         {
 2213:                             (*s_etat_processus).erreur_systeme =
 2214:                                     d_es_allocation_memoire;
 2215:                             return(NULL);
 2216:                         }
 2217: 
 2218:                         strcpy(chaine, chaine_sauvegarde);
 2219:                         free(chaine_sauvegarde);
 2220:                         strcat(chaine, " ]\n [");
 2221:                     }
 2222:                     else
 2223:                     {
 2224:                         chaine = (unsigned char *) malloc(
 2225:                                 (strlen(chaine_sauvegarde) + 4)
 2226:                                 * sizeof(unsigned char));
 2227: 
 2228:                         if (chaine == NULL)
 2229:                         {
 2230:                             (*s_etat_processus).erreur_systeme =
 2231:                                     d_es_allocation_memoire;
 2232:                             return(NULL);
 2233:                         }
 2234: 
 2235:                         strcpy(chaine, chaine_sauvegarde);
 2236:                         free(chaine_sauvegarde);
 2237:                         strcat(chaine, " ][");
 2238:                     }
 2239:                 }
 2240: 
 2241:                 if (test_cfsf(s_etat_processus, 45) == d_vrai)
 2242:                 {
 2243:                     chaine[strlen(chaine) - 3] = ']';
 2244:                     chaine[strlen(chaine) - 2] = 0;
 2245: 
 2246:                     chaine_sauvegarde = chaine;
 2247:                     chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
 2248:                             + 1) * sizeof(unsigned char));
 2249: 
 2250:                     if (chaine == NULL)
 2251:                     {
 2252:                         (*s_etat_processus).erreur_systeme =
 2253:                                 d_es_allocation_memoire;
 2254:                         return(NULL);
 2255:                     }
 2256: 
 2257:                     strcpy(chaine, chaine_sauvegarde);
 2258:                     free(chaine_sauvegarde);
 2259:                 }
 2260:                 else
 2261:                 {
 2262:                     chaine[strlen(chaine) - 2] = ']';
 2263:                     chaine[strlen(chaine) - 1] = 0;
 2264: 
 2265:                     chaine_sauvegarde = chaine;
 2266:                     chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
 2267:                             + 2) * sizeof(unsigned char));
 2268: 
 2269:                     if (chaine == NULL)
 2270:                     {
 2271:                         (*s_etat_processus).erreur_systeme =
 2272:                                 d_es_allocation_memoire;
 2273:                         return(NULL);
 2274:                     }
 2275: 
 2276:                     strcpy(chaine, chaine_sauvegarde);
 2277:                     free(chaine_sauvegarde);
 2278:                     strcat(chaine, "]");
 2279:                 }
 2280:             }
 2281:         }
 2282:         else if ((*s_objet).type == MRL)
 2283:         {
 2284: 
 2285: /*
 2286: --------------------------------------------------------------------------------
 2287:   Matrice réelle
 2288: --------------------------------------------------------------------------------
 2289: */
 2290: 
 2291:             if ((format_sortie != 'S') && (format_sortie != 'F') &&
 2292:                     (format_sortie != 'I') && (format_sortie != 'E'))
 2293:             {
 2294:                 (*s_etat_processus).erreur_execution =
 2295:                         d_ex_erreur_format_fichier;
 2296:                 return(NULL);
 2297:             }
 2298: 
 2299:             nombre_lignes = (*((struct_matrice *) ((*s_objet).objet)))
 2300:                     .nombre_lignes;
 2301:             nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet)))
 2302:                     .nombre_colonnes;
 2303: 
 2304:             chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
 2305: 
 2306:             if (chaine != NULL)
 2307:             {
 2308:                 strcpy(chaine, "[[");
 2309: 
 2310:                 for(i = 0; i < nombre_lignes; i++)
 2311:                 {
 2312:                     for(j = 0; j < nombre_colonnes; j++)
 2313:                     {
 2314:                         if ((chaine_formatee =
 2315:                                 formateur_fichier_nombre(s_etat_processus,
 2316:                                 (void *) &(((real8 **) ((*((struct_matrice *)
 2317:                                 ((*s_objet).objet))).tableau))[i][j]), 'R',
 2318:                                 longueur, longueur_champ, format_sortie))
 2319:                                 == NULL)
 2320:                         {
 2321:                             (*s_etat_processus).erreur_systeme =
 2322:                                     d_es_allocation_memoire;
 2323:                             return(NULL);
 2324:                         }
 2325: 
 2326:                         chaine_sauvegarde = chaine;
 2327:                         chaine = (unsigned char *) malloc(
 2328:                                 (strlen(chaine_sauvegarde) +
 2329:                                 strlen(chaine_formatee) + 2)
 2330:                                 * sizeof(unsigned char));
 2331: 
 2332:                         if (chaine == NULL)
 2333:                         {
 2334:                             (*s_etat_processus).erreur_systeme =
 2335:                                     d_es_allocation_memoire;
 2336:                             return(NULL);
 2337:                         }
 2338: 
 2339:                         strcpy(chaine, chaine_sauvegarde);
 2340:                         free(chaine_sauvegarde);
 2341:                         strcat(chaine, " ");
 2342:                         strcat(chaine, chaine_formatee);
 2343:                         free(chaine_formatee);
 2344:                     }
 2345: 
 2346:                     chaine_sauvegarde = chaine;
 2347:                     if (test_cfsf(s_etat_processus, 45) == d_vrai)
 2348:                     {
 2349:                         chaine = (unsigned char *) malloc(
 2350:                                 (strlen(chaine_sauvegarde) + 6)
 2351:                                 * sizeof(unsigned char));
 2352: 
 2353:                         if (chaine == NULL)
 2354:                         {
 2355:                             (*s_etat_processus).erreur_systeme =
 2356:                                     d_es_allocation_memoire;
 2357:                             return(NULL);
 2358:                         }
 2359: 
 2360:                         strcpy(chaine, chaine_sauvegarde);
 2361:                         free(chaine_sauvegarde);
 2362:                         strcat(chaine, " ]\n [");
 2363:                     }
 2364:                     else
 2365:                     {
 2366:                         chaine = (unsigned char *) malloc(
 2367:                                 (strlen(chaine_sauvegarde) + 4)
 2368:                                 * sizeof(unsigned char));
 2369: 
 2370:                         if (chaine == NULL)
 2371:                         {
 2372:                             (*s_etat_processus).erreur_systeme =
 2373:                                     d_es_allocation_memoire;
 2374:                             return(NULL);
 2375:                         }
 2376: 
 2377:                         strcpy(chaine, chaine_sauvegarde);
 2378:                         free(chaine_sauvegarde);
 2379:                         strcat(chaine, " ][");
 2380:                     }
 2381:                 }
 2382: 
 2383:                 if (test_cfsf(s_etat_processus, 45) == d_vrai)
 2384:                 {
 2385:                     chaine[strlen(chaine) - 3] = ']';
 2386:                     chaine[strlen(chaine) - 2] = 0;
 2387: 
 2388:                     chaine_sauvegarde = chaine;
 2389:                     chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
 2390:                             + 1) * sizeof(unsigned char));
 2391: 
 2392:                     if (chaine == NULL)
 2393:                     {
 2394:                         (*s_etat_processus).erreur_systeme =
 2395:                                 d_es_allocation_memoire;
 2396:                         return(NULL);
 2397:                     }
 2398: 
 2399:                     strcpy(chaine, chaine_sauvegarde);
 2400:                     free(chaine_sauvegarde);
 2401:                 }
 2402:                 else
 2403:                 {
 2404:                     chaine[strlen(chaine) - 2] = ']';
 2405:                     chaine[strlen(chaine) - 1] = 0;
 2406: 
 2407:                     chaine_sauvegarde = chaine;
 2408:                     chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
 2409:                             + 2) * sizeof(unsigned char));
 2410: 
 2411:                     if (chaine == NULL)
 2412:                     {
 2413:                         (*s_etat_processus).erreur_systeme =
 2414:                                 d_es_allocation_memoire;
 2415:                         return(NULL);
 2416:                     }
 2417: 
 2418:                     strcpy(chaine, chaine_sauvegarde);
 2419:                     free(chaine_sauvegarde);
 2420:                     strcat(chaine, "]");
 2421:                 }
 2422:             }
 2423:         }
 2424:         else if ((*s_objet).type == NOM)
 2425:         {
 2426: 
 2427: /*
 2428: --------------------------------------------------------------------------------
 2429:   Nom
 2430: --------------------------------------------------------------------------------
 2431: */
 2432: 
 2433:             chaine = (unsigned char *) malloc((strlen((*((struct_nom *)
 2434:                     (*s_objet).objet)).nom) + 3) * sizeof(unsigned char));
 2435: 
 2436:             if (chaine == NULL)
 2437:             {
 2438:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2439:                 return(NULL);
 2440:             }
 2441: 
 2442:             sprintf(chaine, "'%s'", (*((struct_nom *) (*s_objet).objet)).nom);
 2443:         }
 2444:         else if ((*s_objet).type == REL)
 2445:         {
 2446: 
 2447: /*
 2448: --------------------------------------------------------------------------------
 2449:   Réel
 2450: --------------------------------------------------------------------------------
 2451: */
 2452: 
 2453:             if ((format_sortie != 'S') && (format_sortie != 'F') &&
 2454:                     (format_sortie != 'I') && (format_sortie != 'E'))
 2455:             {
 2456:                 (*s_etat_processus).erreur_execution =
 2457:                         d_ex_erreur_format_fichier;
 2458:                 return(NULL);
 2459:             }
 2460: 
 2461:             if ((chaine_formatee = formateur_fichier_nombre(s_etat_processus,
 2462:                     (void *) ((real8 *) ((*s_objet).objet)), 'R',
 2463:                     longueur, longueur_champ, format_sortie)) == NULL)
 2464:             {
 2465:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2466:                 return(NULL);
 2467:             }
 2468: 
 2469:             chaine = (unsigned char *) malloc((strlen(chaine_formatee) + 1)
 2470:                     * sizeof(unsigned char));
 2471: 
 2472:             if (chaine == NULL)
 2473:             {
 2474:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2475:                 return(NULL);
 2476:             }
 2477: 
 2478:             strcpy(chaine, chaine_formatee);
 2479:             free(chaine_formatee);
 2480:         }
 2481:         else if ((*s_objet).type == VCX)
 2482:         {
 2483: 
 2484: /*
 2485: --------------------------------------------------------------------------------
 2486:   Vecteur complexe
 2487: --------------------------------------------------------------------------------
 2488: */
 2489: 
 2490:             if ((format_sortie != 'S') && (format_sortie != 'F') &&
 2491:                     (format_sortie != 'I') && (format_sortie != 'E'))
 2492:             {
 2493:                 (*s_etat_processus).erreur_execution =
 2494:                         d_ex_erreur_format_fichier;
 2495:                 return(NULL);
 2496:             }
 2497: 
 2498:             nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet)))
 2499:                     .taille;
 2500: 
 2501:             chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
 2502: 
 2503:             if (chaine != NULL)
 2504:             {
 2505:                 strcpy(chaine, "[");
 2506: 
 2507:                 for(i = 0; i < nombre_colonnes; i++)
 2508:                 {
 2509:                     if ((chaine_formatee =
 2510:                             formateur_fichier_nombre(s_etat_processus,
 2511:                             (void *) &(((struct_complexe16 *)
 2512:                             ((*((struct_vecteur *)
 2513:                             ((*s_objet).objet))).tableau))[i]), 'C',
 2514:                             longueur, longueur_champ, format_sortie)) == NULL)
 2515:                     {
 2516:                         (*s_etat_processus).erreur_systeme =
 2517:                                 d_es_allocation_memoire;
 2518:                         return(NULL);
 2519:                     }
 2520: 
 2521:                     chaine_sauvegarde = chaine;
 2522:                     chaine = (unsigned char *) malloc(
 2523:                             (strlen(chaine_sauvegarde) + strlen(chaine_formatee)
 2524:                             + 2) * sizeof(unsigned char));
 2525: 
 2526:                     if (chaine == NULL)
 2527:                     {
 2528:                         (*s_etat_processus).erreur_systeme =
 2529:                                 d_es_allocation_memoire;
 2530:                         return(NULL);
 2531:                     }
 2532: 
 2533:                     strcpy(chaine, chaine_sauvegarde);
 2534:                     free(chaine_sauvegarde);
 2535:                     strcat(chaine, " ");
 2536:                     strcat(chaine, chaine_formatee);
 2537:                     free(chaine_formatee);
 2538:                 }
 2539: 
 2540:                 chaine_sauvegarde = chaine;
 2541:                 chaine = (unsigned char *) malloc(
 2542:                         (strlen(chaine_sauvegarde) + 3)
 2543:                         * sizeof(unsigned char));
 2544: 
 2545:                 if (chaine == NULL)
 2546:                 {
 2547:                     (*s_etat_processus).erreur_systeme =
 2548:                             d_es_allocation_memoire;
 2549:                     return(NULL);
 2550:                 }
 2551: 
 2552:                 strcpy(chaine, chaine_sauvegarde);
 2553:                 free(chaine_sauvegarde);
 2554:                 strcat(chaine, " ]");
 2555:             }
 2556:         }
 2557:         else if ((*s_objet).type == VIN)
 2558:         {
 2559: 
 2560: /*
 2561: --------------------------------------------------------------------------------
 2562:   Vecteur entier
 2563: --------------------------------------------------------------------------------
 2564: */
 2565: 
 2566:             if ((format_sortie != 'S') && (format_sortie != 'F') &&
 2567:                     (format_sortie != 'I') && (format_sortie != 'E'))
 2568:             {
 2569:                 (*s_etat_processus).erreur_execution =
 2570:                         d_ex_erreur_format_fichier;
 2571:                 return(NULL);
 2572:             }
 2573: 
 2574:             nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet)))
 2575:                     .taille;
 2576: 
 2577:             chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
 2578: 
 2579:             if (chaine != NULL)
 2580:             {
 2581:                 strcpy(chaine, "[");
 2582: 
 2583:                 for(i = 0; i < nombre_colonnes; i++)
 2584:                 {
 2585:                     if ((chaine_formatee =
 2586:                             formateur_fichier_nombre(s_etat_processus,
 2587:                             (void *) &(((integer8 *) ((*((struct_vecteur *)
 2588:                             ((*s_objet).objet))).tableau))[i]), 'I',
 2589:                             longueur, longueur_champ, format_sortie)) == NULL)
 2590:                     {
 2591:                         (*s_etat_processus).erreur_systeme =
 2592:                                 d_es_allocation_memoire;
 2593:                         return(NULL);
 2594:                     }
 2595: 
 2596:                     chaine_sauvegarde = chaine;
 2597:                     chaine = (unsigned char *) malloc(
 2598:                             (strlen(chaine_sauvegarde) + strlen(chaine_formatee)
 2599:                             + 2) * sizeof(unsigned char));
 2600: 
 2601:                     if (chaine == NULL)
 2602:                     {
 2603:                         (*s_etat_processus).erreur_systeme =
 2604:                                 d_es_allocation_memoire;
 2605:                         return(NULL);
 2606:                     }
 2607: 
 2608:                     strcpy(chaine, chaine_sauvegarde);
 2609:                     free(chaine_sauvegarde);
 2610:                     strcat(chaine, " ");
 2611:                     strcat(chaine, chaine_formatee);
 2612:                     free(chaine_formatee);
 2613:                 }
 2614: 
 2615:                 chaine_sauvegarde = chaine;
 2616:                 chaine = (unsigned char *) malloc(
 2617:                         (strlen(chaine_sauvegarde) + 3)
 2618:                         * sizeof(unsigned char));
 2619: 
 2620:                 if (chaine == NULL)
 2621:                 {
 2622:                     (*s_etat_processus).erreur_systeme =
 2623:                             d_es_allocation_memoire;
 2624:                     return(NULL);
 2625:                 }
 2626: 
 2627:                 strcpy(chaine, chaine_sauvegarde);
 2628:                 free(chaine_sauvegarde);
 2629:                 strcat(chaine, " ]");
 2630:             }
 2631:         }
 2632:         else if ((*s_objet).type == VRL)
 2633:         {
 2634: 
 2635: /*
 2636: --------------------------------------------------------------------------------
 2637:   Vecteur réel
 2638: --------------------------------------------------------------------------------
 2639: */
 2640: 
 2641:             if ((format_sortie != 'S') && (format_sortie != 'F') &&
 2642:                     (format_sortie != 'I') && (format_sortie != 'E'))
 2643:             {
 2644:                 (*s_etat_processus).erreur_execution =
 2645:                         d_ex_erreur_format_fichier;
 2646:                 return(NULL);
 2647:             }
 2648: 
 2649:             nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet)))
 2650:                     .taille;
 2651: 
 2652:             chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
 2653: 
 2654:             if (chaine != NULL)
 2655:             {
 2656:                 strcpy(chaine, "[");
 2657: 
 2658:                 for(i = 0; i < nombre_colonnes; i++)
 2659:                 {
 2660:                     if ((chaine_formatee =
 2661:                             formateur_fichier_nombre(s_etat_processus,
 2662:                             (void *) &(((real8 *) ((*((struct_vecteur *)
 2663:                             ((*s_objet).objet))).tableau))[i]), 'R',
 2664:                             longueur, longueur_champ, format_sortie)) == NULL)
 2665:                     {
 2666:                         (*s_etat_processus).erreur_systeme =
 2667:                                 d_es_allocation_memoire;
 2668:                         return(NULL);
 2669:                     }
 2670: 
 2671:                     chaine_sauvegarde = chaine;
 2672:                     chaine = (unsigned char *) malloc(
 2673:                             (strlen(chaine_sauvegarde) + strlen(chaine_formatee)
 2674:                             + 2) * sizeof(unsigned char));
 2675: 
 2676:                     if (chaine == NULL)
 2677:                     {
 2678:                         (*s_etat_processus).erreur_systeme =
 2679:                                 d_es_allocation_memoire;
 2680:                         return(NULL);
 2681:                     }
 2682: 
 2683:                     strcpy(chaine, chaine_sauvegarde);
 2684:                     free(chaine_sauvegarde);
 2685:                     strcat(chaine, " ");
 2686:                     strcat(chaine, chaine_formatee);
 2687:                     free(chaine_formatee);
 2688:                 }
 2689: 
 2690:                 chaine_sauvegarde = chaine;
 2691:                 chaine = (unsigned char *) malloc(
 2692:                         (strlen(chaine_sauvegarde) + 3)
 2693:                         * sizeof(unsigned char));
 2694: 
 2695:                 if (chaine == NULL)
 2696:                 {
 2697:                     (*s_etat_processus).erreur_systeme =
 2698:                             d_es_allocation_memoire;
 2699:                     return(NULL);
 2700:                 }
 2701: 
 2702:                 strcpy(chaine, chaine_sauvegarde);
 2703:                 free(chaine_sauvegarde);
 2704:                 strcat(chaine, " ]");
 2705:             }
 2706:         }
 2707:         else
 2708:         {
 2709:             // Type non exportable
 2710: 
 2711:             (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier;
 2712:             free(chaine);
 2713: 
 2714:             return(NULL);
 2715:         }
 2716: 
 2717:         (*longueur_effective) = strlen(chaine) + 1;
 2718:     }
 2719:     else
 2720:     {
 2721:         /*
 2722:          * Fichiers non formatés
 2723:          */
 2724: 
 2725: #define __zone() \
 2726:         do { int _i; \
 2727:             for(_i = 0; _i < longueur_totale; _i++) \
 2728:                 printf("%02X ", chaine[_i]); printf("\b\n"); } while(0)
 2729: 
 2730:         /*
 2731:          * Chaque enregistrement est composé d'une donnée (une liste)
 2732:          * suivie de sa longueur en octets et d'un champ binaire indiquant
 2733:          * le format (integer*1,2,4 ou 8) d'écriture de cette longueur.
 2734:          * Les données contenues dans ces fichiers sont associées à un
 2735:          * descripteur de type.
 2736:          *
 2737:          * Attention : les fichiers non formatés ne sont pas portables
 2738:          * d'une architecture à l'autre.
 2739:          *
 2740:          * Structure d'un enregistrement :
 2741:          * [en-tête][.........données..........][longueur + type de longueur]
 2742:          *
 2743:          * Longueur : (pour l'instruction backspace)
 2744:          *
 2745:          * XXXXXXX0                             longueur sur 7 bits
 2746:          * XXXX0011 XXXXXXXX XXXX0011           longueur sur 16 bits
 2747:          * MSB(1/2) LSB      MSB(2/2)
 2748:          * XXXX0101 XXXXXXXX XXXXXXXX XXXX0101  longueur sur 24 bits
 2749:          * XXXX0111 XXXXXXXX XXXXXXXX XXXXXXXX
 2750:          *          XXXX0111                    longueur sur 32 bits
 2751:          * XXXX1001 XXXXXXXX XXXXXXXX XXXXXXXX
 2752:          *          XXXXXXXX XXXX1001           longueur sur 40 bits
 2753:          * XXXX1011 XXXXXXXX XXXXXXXX XXXXXXXX
 2754:          *          XXXXXXXX XXXXXXXX XXXX1011  longueur sur 48 bits
 2755:          * XXXX1101 XXXXXXXX XXXXXXXX XXXXXXXX
 2756:          *          XXXXXXXX XXXXXXXX XXXXXXXX
 2757:          *          XXXX1101                    longueur sur 56 bits
 2758:          * XXXX1111 XXXXXXXX XXXXXXXX XXXXXXXX
 2759:          *          XXXXXXXX XXXXXXXX XXXXXXXX
 2760:          *          XXXXXXXX XXXX1111           longueur sur 64 bits
 2761:          *
 2762:          * Structures des enregistrements :
 2763:          * chaque type de donnée est associé à une en-tête binaire comprenant
 2764:          * le type de données ainsi que toutes autres informations utiles.
 2765:          *
 2766:          * Représentation binaire :
 2767:          *
 2768:          * 1/ scalaires
 2769:          * 0000 XXXX                Binaire sur XXXX octets
 2770:          *
 2771:          * TYPE
 2772:          * 0001 00 00               integer*1
 2773:          * 0001 00 01               integer*2
 2774:          * 0001 00 10               integer*4
 2775:          * 0001 00 11               integer*8
 2776:          *
 2777:          * 0001 01 00               real*4
 2778:          * 0001 01 01               real*8
 2779:          *
 2780:          * 0001 10 00               complex*8
 2781:          * 0001 10 01               complex*16
 2782:          *
 2783:          * 0010 00 00               vecteur integer*1 (dimensions integer*1)
 2784:          * 0010 01 00               vecteur integer*1 (dimensions integer*2)
 2785:          * 0010 10 00               vecteur integer*1 (dimensions integer*4)
 2786:          * 0010 11 00               vecteur integer*1 (dimensions integer*8)
 2787:          * 0010 00 01               vecteur integer*2 (dimensions integer*1)
 2788:          * 0010 01 01               vecteur integer*2 (dimensions integer*2)
 2789:          * 0010 10 01               vecteur integer*2 (dimensions integer*4)
 2790:          * 0010 11 01               vecteur integer*2 (dimensions integer*8)
 2791:          * 0010 00 10               vecteur integer*4 (dimensions integer*1)
 2792:          * 0010 01 10               vecteur integer*4 (dimensions integer*2)
 2793:          * 0010 10 10               vecteur integer*4 (dimensions integer*4)
 2794:          * 0010 11 10               vecteur integer*4 (dimensions integer*8)
 2795:          * 0010 00 11               vecteur integer*8 (dimensions integer*1)
 2796:          * 0010 01 11               vecteur integer*8 (dimensions integer*2)
 2797:          * 0010 10 11               vecteur integer*8 (dimensions integer*4)
 2798:          * 0010 11 11               vecteur integer*8 (dimensions integer*8)
 2799:          *
 2800:          * 0011 00 00               matrice integer*1 (dimensions integer*1)
 2801:          * 0011 01 00               matrice integer*1 (dimensions integer*2)
 2802:          * 0011 10 00               matrice integer*1 (dimensions integer*4)
 2803:          * 0011 11 00               matrice integer*1 (dimensions integer*8)
 2804:          * 0011 00 01               matrice integer*2 (dimensions integer*1)
 2805:          * 0011 01 01               matrice integer*2 (dimensions integer*2)
 2806:          * 0011 10 01               matrice integer*2 (dimensions integer*4)
 2807:          * 0011 11 01               matrice integer*2 (dimensions integer*8)
 2808:          * 0011 00 10               matrice integer*4 (dimensions integer*1)
 2809:          * 0011 01 10               matrice integer*4 (dimensions integer*2)
 2810:          * 0011 10 10               matrice integer*4 (dimensions integer*4)
 2811:          * 0011 11 10               matrice integer*4 (dimensions integer*8)
 2812:          * 0011 00 11               matrice integer*8 (dimensions integer*1)
 2813:          * 0011 01 11               matrice integer*8 (dimensions integer*2)
 2814:          * 0011 10 11               matrice integer*8 (dimensions integer*4)
 2815:          * 0011 11 11               matrice integer*8 (dimensions integer*8)
 2816:          *
 2817:          * 0100 0 XXX               liste de longueur XXX
 2818:          * 0100 10 00               liste de longueur integer*1
 2819:          * 0100 10 01               liste de longueur integer*2
 2820:          * 0100 10 10               liste de longueur integer*4
 2821:          * 0100 10 11               liste de longueur integer*8
 2822:          *
 2823:          * 0101 0 XXX               nom de longueur XXX
 2824:          * 0101 10 LL               nom de longueur integer*LL
 2825:          *
 2826:          * 0110 0 XXX               expression RPN
 2827:          * 0110 10 LL
 2828:          *
 2829:          * 0111 0 XXX               expression algébrique
 2830:          * 0111 10 LL
 2831:          *
 2832:          * 1000 0 XXX               chaîne de caractères
 2833:          * 1000 10 LL
 2834:          *
 2835:          * 1001 0 XXX               table de longueur XXX
 2836:          * 1001 10 00               table de longueur integer*1
 2837:          * 1001 10 01               table de longueur integer*2
 2838:          * 1001 10 10               table de longueur integer*4
 2839:          * 1001 10 11               table de longueur integer*8
 2840:          *
 2841:          * 1010 00 10               vecteur real*4 (dimensions integer*1)
 2842:          * 1010 01 10               vecteur real*4 (dimensions integer*2)
 2843:          * 1010 10 10               vecteur real*4 (dimensions integer*4)
 2844:          * 1010 11 10               vecteur real*4 (dimensions integer*8)
 2845:          * 1010 00 11               vecteur real*8 (dimensions integer*1)
 2846:          * 1010 01 11               vecteur real*8 (dimensions integer*2)
 2847:          * 1010 10 11               vecteur real*8 (dimensions integer*4)
 2848:          * 1010 11 11               vecteur real*8 (dimensions integer*8)
 2849:          * 1011 00 10               vecteur complex*8 (dimensions integer*1)
 2850:          * 1011 01 10               vecteur complex*8 (dimensions integer*2)
 2851:          * 1011 10 10               vecteur complex*8 (dimensions integer*4)
 2852:          * 1011 11 10               vecteur complex*8 (dimensions integer*8)
 2853:          * 1011 00 11               vecteur complex*16 (dimensions integer*1)
 2854:          * 1011 01 11               vecteur complex*16 (dimensions integer*2)
 2855:          * 1011 10 11               vecteur complex*16 (dimensions integer*4)
 2856:          * 1011 11 11               vecteur complex*16 (dimensions integer*8)
 2857:          *
 2858:          * 1100 00 10               matrice real*4 (dimensions integer*1)
 2859:          * 1100 01 10               matrice real*4 (dimensions integer*2)
 2860:          * 1100 10 10               matrice real*4 (dimensions integer*4)
 2861:          * 1100 11 10               matrice real*4 (dimensions integer*8)
 2862:          * 1100 00 11               matrice real*8 (dimensions integer*1)
 2863:          * 1100 01 11               matrice real*8 (dimensions integer*2)
 2864:          * 1100 10 11               matrice real*8 (dimensions integer*4)
 2865:          * 1100 11 11               matrice real*8 (dimensions integer*8)
 2866:          * 1101 00 10               matrice complex*8 (dimensions integer*1)
 2867:          * 1101 01 10               matrice complex*8 (dimensions integer*2)
 2868:          * 1101 10 10               matrice complex*8 (dimensions integer*4)
 2869:          * 1101 11 10               matrice complex*8 (dimensions integer*8)
 2870:          * 1101 00 11               matrice complex*16 (dimensions integer*1)
 2871:          * 1101 01 11               matrice complex*16 (dimensions integer*2)
 2872:          * 1101 10 11               matrice complex*16 (dimensions integer*4)
 2873:          * 1101 11 11               matrice complex*16 (dimensions integer*8)
 2874:          *
 2875:          * Les longueurs indiquées par le champ LL suivent l'en-tête :
 2876:          *      00 : integer*1
 2877:          *      01 : integer*2
 2878:          *      10 : integer*4
 2879:          *      11 : integer*8
 2880:          *
 2881:          * [En-tête][longueur_1][longueur_2][données]
 2882:          * le nombre de champs longueur dépendant des types d'enregistrement.
 2883:          *
 2884:          * Toutes les autres combinaisons sont invalides.
 2885:          */
 2886: 
 2887:         chaine = NULL;
 2888:         chaine_formatee = NULL;
 2889:         chaine_sauvegarde = NULL;
 2890: 
 2891:         if ((*s_objet).type == ALG)
 2892:         {
 2893: 
 2894: /*
 2895: --------------------------------------------------------------------------------
 2896:   Expression algébrique
 2897: --------------------------------------------------------------------------------
 2898: */
 2899: 
 2900:         }
 2901:         else if ((*s_objet).type == BIN)
 2902:         {
 2903: 
 2904: /*
 2905: --------------------------------------------------------------------------------
 2906:   Entier binaire en base 2, 8, 10 ou 16
 2907: --------------------------------------------------------------------------------
 2908: */
 2909: 
 2910:         }
 2911:         else if ((*s_objet).type == CHN)
 2912:         {
 2913: 
 2914: /*
 2915: --------------------------------------------------------------------------------
 2916:   Chaîne de caractères
 2917:   Poids fort 1000 0XXX (longueur inférieure à 2**3-1
 2918:              1000 10LL (autres longueurs)
 2919: --------------------------------------------------------------------------------
 2920: */
 2921: 
 2922:             longueur_reelle_chaine = longueur_chaine(s_etat_processus,
 2923:                     (unsigned char *) (*s_objet).objet);
 2924: 
 2925:             if ((longueur_champ == -1) || (longueur_reelle_chaine <
 2926:                     longueur_champ))
 2927:             {
 2928:                 // Le format est CHARACTER*(*). On copie dans la sortie
 2929:                 // la chaine en évaluant les caractères échappés.
 2930: 
 2931:                 if ((chaine = formateur_flux(s_etat_processus, (unsigned char *)
 2932:                         (*s_objet).objet, &longueur_chaine_traitee)) == NULL)
 2933:                 {
 2934:                     return(NULL);
 2935:                 }
 2936:             }
 2937:             else
 2938:             {
 2939:                 // Format de type CHARACTER*(n)
 2940: 
 2941:                 if ((chaine_sauvegarde = formateur_flux(s_etat_processus,
 2942:                         (unsigned char *) (*s_objet).objet,
 2943:                         &longueur_chaine_traitee)) == NULL)
 2944:                 {
 2945:                     return(NULL);
 2946:                 }
 2947: 
 2948:                 if ((chaine = malloc(longueur_champ * sizeof(unsigned char)))
 2949:                             == NULL)
 2950:                 {
 2951:                     (*s_etat_processus).erreur_systeme =
 2952:                             d_es_allocation_memoire;
 2953:                     return(NULL);
 2954:                 }
 2955: 
 2956:                 memcpy(chaine, chaine_sauvegarde, longueur_champ);
 2957:                 longueur_chaine_traitee = longueur_champ;
 2958:                 free(chaine_sauvegarde);
 2959:             }
 2960: 
 2961:             chaine_sauvegarde = chaine;
 2962: 
 2963:             if (longueur_chaine_traitee < (1LL << 3))
 2964:             {
 2965:                 if ((chaine = malloc((longueur_chaine_traitee + 1)
 2966:                         * sizeof(unsigned char))) == NULL)
 2967:                 {
 2968:                     (*s_etat_processus).erreur_systeme =
 2969:                             d_es_allocation_memoire;
 2970:                     return(NULL);
 2971:                 }
 2972: 
 2973:                 chaine[0] = 0x80 | (longueur_chaine_traitee & 0x7);
 2974: 
 2975:                 memcpy(chaine + 1, chaine_sauvegarde, longueur_chaine_traitee);
 2976:                 longueur_totale = longueur_chaine_traitee + 1;
 2977:             }
 2978:             else if (longueur_chaine_traitee < (1LL << 8))
 2979:             {
 2980:                 if ((chaine = malloc((longueur_chaine_traitee + 2)
 2981:                         * sizeof(unsigned char))) == NULL)
 2982:                 {
 2983:                     (*s_etat_processus).erreur_systeme =
 2984:                             d_es_allocation_memoire;
 2985:                     return(NULL);
 2986:                 }
 2987: 
 2988:                 chaine[0] = 0x88;
 2989:                 chaine[1] = (unsigned char) (longueur_chaine_traitee & 0xFF);
 2990: 
 2991:                 memcpy(chaine + 2, chaine_sauvegarde, longueur_chaine_traitee);
 2992:                 longueur_totale = longueur_chaine_traitee + 2;
 2993:             }
 2994:             else if (longueur_chaine_traitee < (1LL << 16))
 2995:             {
 2996:                 if ((chaine = malloc((longueur_chaine_traitee + 3)
 2997:                         * sizeof(unsigned char))) == NULL)
 2998:                 {
 2999:                     (*s_etat_processus).erreur_systeme =
 3000:                             d_es_allocation_memoire;
 3001:                     return(NULL);
 3002:                 }
 3003: 
 3004:                 chaine[0] = 0x89;
 3005:                 chaine[1] = (unsigned char) ((longueur_chaine_traitee >> 8)
 3006:                         & 0xFF);
 3007:                 chaine[2] = (unsigned char) (longueur_chaine_traitee & 0xFF);
 3008: 
 3009:                 memcpy(chaine + 3, chaine_sauvegarde, longueur_chaine_traitee);
 3010:                 longueur_totale = longueur_chaine_traitee + 3;
 3011:             }
 3012:             else if (longueur_chaine_traitee < (1LL << 32))
 3013:             {
 3014:                 if ((chaine = malloc((longueur_chaine_traitee + 5)
 3015:                         * sizeof(unsigned char))) == NULL)
 3016:                 {
 3017:                     (*s_etat_processus).erreur_systeme =
 3018:                             d_es_allocation_memoire;
 3019:                     return(NULL);
 3020:                 }
 3021: 
 3022:                 chaine[0] = 0x8A;
 3023:                 chaine[1] = (unsigned char) ((longueur_chaine_traitee >> 24)
 3024:                         & 0xFF);
 3025:                 chaine[2] = (unsigned char) ((longueur_chaine_traitee >> 16)
 3026:                         & 0xFF);
 3027:                 chaine[3] = (unsigned char) ((longueur_chaine_traitee >> 8)
 3028:                         & 0xFF);
 3029:                 chaine[4] = (unsigned char) (longueur_chaine_traitee & 0xFF);
 3030: 
 3031:                 memcpy(chaine + 5, chaine_sauvegarde, longueur_chaine_traitee);
 3032:                 longueur_totale = longueur_chaine_traitee + 5;
 3033:             }
 3034:             else
 3035:             {
 3036:                 if ((chaine = malloc((longueur_chaine_traitee + 9)
 3037:                         * sizeof(unsigned char))) == NULL)
 3038:                 {
 3039:                     (*s_etat_processus).erreur_systeme =
 3040:                             d_es_allocation_memoire;
 3041:                     return(NULL);
 3042:                 }
 3043: 
 3044:                 chaine[0] = 0x8B;
 3045:                 chaine[1] = (unsigned char) ((longueur_chaine_traitee >> 56)
 3046:                         & 0xFF);
 3047:                 chaine[2] = (unsigned char) ((longueur_chaine_traitee >> 48)
 3048:                         & 0xFF);
 3049:                 chaine[3] = (unsigned char) ((longueur_chaine_traitee >> 40)
 3050:                         & 0xFF);
 3051:                 chaine[4] = (unsigned char) ((longueur_chaine_traitee >> 32)
 3052:                         & 0xFF);
 3053:                 chaine[5] = (unsigned char) ((longueur_chaine_traitee >> 24)
 3054:                         & 0xFF);
 3055:                 chaine[6] = (unsigned char) ((longueur_chaine_traitee >> 16)
 3056:                         & 0xFF);
 3057:                 chaine[7] = (unsigned char) ((longueur_chaine_traitee >> 8)
 3058:                         & 0xFF);
 3059:                 chaine[8] = (unsigned char) (longueur_chaine_traitee & 0xFF);
 3060: 
 3061:                 memcpy(chaine + 9, chaine_sauvegarde, longueur_chaine_traitee);
 3062:                 longueur_totale = longueur_chaine_traitee + 9;
 3063:             }
 3064: 
 3065:             (*longueur_effective) = longueur_totale;
 3066:         }
 3067:         else if ((*s_objet).type == CPL)
 3068:         {
 3069: 
 3070: /*
 3071: --------------------------------------------------------------------------------
 3072:   Complexe
 3073:   Poids fort 0001 10
 3074: --------------------------------------------------------------------------------
 3075: */
 3076: 
 3077:             if (format_sortie != 'C')
 3078:             {
 3079:                 (*s_etat_processus).erreur_execution =
 3080:                         d_ex_erreur_format_fichier;
 3081:                 return(NULL);
 3082:             }
 3083: 
 3084:             if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus,
 3085:                     (*s_objet).objet, 'C', 'C', longueur, longueur_effective))
 3086:                     == NULL)
 3087:             {
 3088:                 return(NULL);
 3089:             }
 3090:         }
 3091:         else if ((*s_objet).type == RPN)
 3092:         {
 3093: 
 3094: /*
 3095: --------------------------------------------------------------------------------
 3096:   Définition
 3097: --------------------------------------------------------------------------------
 3098: */
 3099:         }
 3100:         else if ((*s_objet).type == INT)
 3101:         {
 3102: 
 3103: /*
 3104: --------------------------------------------------------------------------------
 3105:   Entier
 3106:   Poids fort 0001 00
 3107: --------------------------------------------------------------------------------
 3108: */
 3109: 
 3110:             if ((format_sortie != 'I') && (format_sortie != 'R')
 3111:                     && (format_sortie != 'C'))
 3112:             {
 3113:                 (*s_etat_processus).erreur_execution =
 3114:                         d_ex_erreur_format_fichier;
 3115:                 return(NULL);
 3116:             }
 3117: 
 3118:             if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus,
 3119:                     (*s_objet).objet, 'I', format_sortie, longueur,
 3120:                     longueur_effective)) == NULL)
 3121:             {
 3122:                 return(NULL);
 3123:             }
 3124:         }
 3125:         else if ((*s_objet).type == FCT)
 3126:         {
 3127: 
 3128: /*
 3129: --------------------------------------------------------------------------------
 3130:   Fonction
 3131: --------------------------------------------------------------------------------
 3132: */
 3133: 
 3134:         }
 3135:         else if ((*s_objet).type == LST)
 3136:         {
 3137: 
 3138: /*
 3139: --------------------------------------------------------------------------------
 3140:   Liste
 3141:   Poids fort 0100
 3142: --------------------------------------------------------------------------------
 3143: */
 3144: 
 3145:             chaine = malloc(sizeof(unsigned char));
 3146: 
 3147:             if (chaine == NULL)
 3148:             {
 3149:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3150:                 return(NULL);
 3151:             }
 3152: 
 3153:             // Calcul de la longueur de la liste.
 3154: 
 3155:             longueur_liste = 0;
 3156:             l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
 3157: 
 3158:             while(l_element_courant != NULL)
 3159:             {
 3160:                 l_element_courant = (*l_element_courant).suivant;
 3161:                 longueur_liste++;
 3162:             }
 3163: 
 3164:             if (longueur_liste < (1LL << 3))
 3165:             {
 3166:                 chaine[0] = 0x40 | (longueur_liste & 0x7);
 3167:             }
 3168:             else if (longueur_liste < (1LL << 8))
 3169:             {
 3170:                 chaine[0] = 0x48;
 3171:             }
 3172:             else if (longueur_liste < (1LL << 16))
 3173:             {
 3174:                 chaine[0] = 0x49;
 3175:             }
 3176:             else if (longueur_liste < (1LL << 32))
 3177:             {
 3178:                 chaine[0] = 0x4A;
 3179:             }
 3180:             else
 3181:             {
 3182:                 chaine[0] = 0x4B;
 3183:             }
 3184: 
 3185:             longueur_totale = 1;
 3186: 
 3187:             if ((chaine[0] & 0x8) != 0)
 3188:             {
 3189:                 switch(chaine[0] & 0x03)
 3190:                 {
 3191:                     case 0x00 :
 3192:                     {
 3193:                         longueur_totale += 1;
 3194: 
 3195:                         if ((chaine = realloc(chaine, longueur_totale *
 3196:                                 sizeof(unsigned char))) == NULL)
 3197:                         {
 3198:                             (*s_etat_processus).erreur_systeme =
 3199:                                     d_es_allocation_memoire;
 3200:                             return(NULL);
 3201:                         }
 3202: 
 3203:                         chaine[longueur_totale - 1] =
 3204:                                 (unsigned char) (longueur_liste & 0xFF);
 3205:                         break;
 3206:                     }
 3207: 
 3208:                     case 0x01 :
 3209:                     {
 3210:                         longueur_totale += 2;
 3211: 
 3212:                         if ((chaine = realloc(chaine, longueur_totale *
 3213:                                 sizeof(unsigned char))) == NULL)
 3214:                         {
 3215:                             (*s_etat_processus).erreur_systeme =
 3216:                                     d_es_allocation_memoire;
 3217:                             return(NULL);
 3218:                         }
 3219: 
 3220:                         chaine[longueur_totale - 2] =
 3221:                                 (unsigned char) ((longueur_liste >> 8) & 0xFF);
 3222:                         chaine[longueur_totale - 1] =
 3223:                                 (unsigned char) (longueur_liste & 0xFF);
 3224:                         break;
 3225:                     }
 3226: 
 3227:                     case 0x02 :
 3228:                     {
 3229:                         longueur_totale += 4;
 3230: 
 3231:                         if ((chaine = realloc(chaine, longueur_totale *
 3232:                                 sizeof(unsigned char))) == NULL)
 3233:                         {
 3234:                             (*s_etat_processus).erreur_systeme =
 3235:                                     d_es_allocation_memoire;
 3236:                             return(NULL);
 3237:                         }
 3238: 
 3239:                         chaine[longueur_totale - 4] =
 3240:                                 (unsigned char) ((longueur_liste >> 24) & 0xFF);
 3241:                         chaine[longueur_totale - 3] =
 3242:                                 (unsigned char) ((longueur_liste >> 16) & 0xFF);
 3243:                         chaine[longueur_totale - 2] =
 3244:                                 (unsigned char) ((longueur_liste >> 8) & 0xFF);
 3245:                         chaine[longueur_totale - 1] =
 3246:                                 (unsigned char) (longueur_liste & 0xFF);
 3247:                         break;
 3248:                     }
 3249: 
 3250:                     case 0x03 :
 3251:                     {
 3252:                         longueur_totale += 8;
 3253: 
 3254:                         if ((chaine = realloc(chaine, longueur_totale *
 3255:                                 sizeof(unsigned char))) == NULL)
 3256:                         {
 3257:                             (*s_etat_processus).erreur_systeme =
 3258:                                     d_es_allocation_memoire;
 3259:                             return(NULL);
 3260:                         }
 3261: 
 3262:                         chaine[longueur_totale - 8] =
 3263:                                 (unsigned char) ((longueur_liste >> 56) & 0xFF);
 3264:                         chaine[longueur_totale - 7] =
 3265:                                 (unsigned char) ((longueur_liste >> 48) & 0xFF);
 3266:                         chaine[longueur_totale - 6] =
 3267:                                 (unsigned char) ((longueur_liste >> 40) & 0xFF);
 3268:                         chaine[longueur_totale - 5] =
 3269:                                 (unsigned char) ((longueur_liste >> 32) & 0xFF);
 3270:                         chaine[longueur_totale - 4] =
 3271:                                 (unsigned char) ((longueur_liste >> 24) & 0xFF);
 3272:                         chaine[longueur_totale - 3] =
 3273:                                 (unsigned char) ((longueur_liste >> 16) & 0xFF);
 3274:                         chaine[longueur_totale - 2] =
 3275:                                 (unsigned char) ((longueur_liste >> 8) & 0xFF);
 3276:                         chaine[longueur_totale - 1] =
 3277:                                 (unsigned char) (longueur_liste & 0xFF);
 3278:                         break;
 3279:                     }
 3280: 
 3281:                     default :
 3282:                     {
 3283:                         BUG(1, printf("Internal format error\n"));
 3284:                     }
 3285:                 }
 3286:             }
 3287: 
 3288:             l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
 3289:             l_element_courant_format = (struct_liste_chainee *)
 3290:                     (*s_format).objet;
 3291:             nombre_elements = 0;
 3292: 
 3293:             while((l_element_courant != NULL) &&
 3294:                     (l_element_courant_format != NULL))
 3295:             {
 3296:                 if ((((*(*l_element_courant_format).donnee).type == LST)
 3297:                         && ((*(*l_element_courant).donnee).type == LST)) ||
 3298:                         (((*(*l_element_courant_format).donnee).type == TBL)
 3299:                         && ((*(*l_element_courant).donnee).type == TBL)))
 3300:                 {
 3301:                     if ((chaine_formatee = formateur_fichier(s_etat_processus,
 3302:                             (*l_element_courant).donnee,
 3303:                             (*l_element_courant_format).donnee, 0, 0, ' ', 'U',
 3304:                             longueur_effective, recursivite, export_fichier))
 3305:                             == NULL)
 3306:                     {
 3307:                         return(NULL);
 3308:                     }
 3309: 
 3310:                     if ((chaine = realloc(chaine, (longueur_totale +
 3311:                             (*longueur_effective)) * sizeof(unsigned char)))
 3312:                             == NULL)
 3313:                     {
 3314:                         (*s_etat_processus).erreur_systeme =
 3315:                                 d_es_allocation_memoire;
 3316:                         return(NULL);
 3317:                     }
 3318: 
 3319:                     memcpy(&(chaine[longueur_totale]), chaine_formatee,
 3320:                             (*longueur_effective));
 3321:                     longueur_totale += (*longueur_effective);
 3322:                     free(chaine_formatee);
 3323:                 }
 3324:                 else if ((*(*l_element_courant_format).donnee).type != CHN)
 3325:                 {
 3326:                     free(chaine);
 3327: 
 3328:                     (*s_etat_processus).erreur_execution =
 3329:                             d_ex_erreur_format_fichier;
 3330:                     return(NULL);
 3331:                 }
 3332:                 else
 3333:                 {
 3334:                     if ((format_chaine = conversion_majuscule((unsigned char *)
 3335:                             (*(*l_element_courant_format).donnee).objet))
 3336:                             == NULL)
 3337:                     {
 3338:                         (*s_etat_processus).erreur_systeme =
 3339:                                 d_es_allocation_memoire;
 3340:                         return(NULL);
 3341:                     }
 3342: 
 3343:                     if (strncmp("INTEGER*", format_chaine, 8) == 0)
 3344:                     {
 3345:                         format_sortie = 'I';
 3346:                         position_1 = 8;
 3347:                     }
 3348:                     else if (strncmp("LOGICAL*", format_chaine, 8) == 0)
 3349:                     {
 3350:                         format_sortie = 'L';
 3351:                         position_1 = 8;
 3352:                     }
 3353:                     else if (strncmp("REAL*", format_chaine, 5) == 0)
 3354:                     {
 3355:                         format_sortie = 'R';
 3356:                         position_1 = 5;
 3357:                     }
 3358:                     else if (strncmp("COMPLEX*", format_chaine, 8) == 0)
 3359:                     {
 3360:                         format_sortie = 'C';
 3361:                         position_1 = 8;
 3362:                     }
 3363:                     else if (strncmp("CHARACTER*", format_chaine, 10) == 0)
 3364:                     {
 3365:                         format_sortie = 'S';
 3366:                         position_1 = 10;
 3367:                         format_degenere = d_vrai;
 3368:                     }
 3369:                     else
 3370:                     {
 3371:                         free(chaine);
 3372:                         free(format_chaine);
 3373: 
 3374:                         (*s_etat_processus).erreur_execution =
 3375:                                 d_ex_erreur_format_fichier;
 3376:                         return(NULL);
 3377:                     }
 3378: 
 3379:                     if (format_chaine[position_1] == d_code_fin_chaine)
 3380:                     {
 3381:                         free(chaine);
 3382:                         free(format_chaine);
 3383: 
 3384:                         (*s_etat_processus).erreur_execution =
 3385:                                 d_ex_erreur_format_fichier;
 3386:                         return(NULL);
 3387:                     }
 3388: 
 3389:                     if (strcmp(&(format_chaine[position_1]), "(*)") != 0)
 3390:                     {
 3391:                         if (sscanf(&(format_chaine[position_1]), "%ld",
 3392:                                 &longueur) != 1)
 3393:                         {
 3394:                             free(chaine);
 3395:                             free(format_chaine);
 3396: 
 3397:                             (*s_etat_processus).erreur_execution =
 3398:                                     d_ex_erreur_format_fichier;
 3399:                             return(NULL);
 3400:                         }
 3401: 
 3402:                         longueur_champ = longueur;
 3403:                     }
 3404:                     else
 3405:                     {
 3406:                         longueur_champ = -1;
 3407:                         longueur = -1;
 3408:                     }
 3409: 
 3410:                     free(format_chaine);
 3411:                 
 3412:                     if ((chaine_formatee = formateur_fichier(s_etat_processus,
 3413:                             (*l_element_courant).donnee, s_format,
 3414:                             longueur, longueur_champ, format_sortie, type,
 3415:                             longueur_effective, recursivite, export_fichier))
 3416:                             == NULL)
 3417:                     {
 3418:                         free(chaine);
 3419:                         return(NULL);
 3420:                     }
 3421: 
 3422:                     if ((chaine = realloc(chaine,
 3423:                             (longueur_totale + (*longueur_effective))
 3424:                             * sizeof(unsigned char))) == NULL)
 3425:                     {
 3426:                         (*s_etat_processus).erreur_systeme =
 3427:                                 d_es_allocation_memoire;
 3428:                         return(NULL);
 3429:                     }
 3430: 
 3431:                     memcpy(&(chaine[longueur_totale]), chaine_formatee,
 3432:                             (*longueur_effective));
 3433:                     longueur_totale += (*longueur_effective);
 3434:                     free(chaine_formatee);
 3435:                 }
 3436: 
 3437:                 nombre_elements++;
 3438:                 l_element_courant = (*l_element_courant).suivant;
 3439:                 l_element_courant_format = (*l_element_courant_format).suivant;
 3440:             }
 3441: 
 3442:             if ((l_element_courant != NULL) ||
 3443:                     (l_element_courant_format != NULL))
 3444:             {
 3445:                 free(chaine);
 3446: 
 3447:                 (*s_etat_processus).erreur_execution =
 3448:                         d_ex_erreur_format_fichier;
 3449:                 return(NULL);
 3450:             }
 3451: 
 3452:             (*longueur_effective) = longueur_totale;
 3453:         }
 3454:         else if ((*s_objet).type == TBL)
 3455:         {
 3456: 
 3457: /*
 3458: --------------------------------------------------------------------------------
 3459:   Table
 3460: --------------------------------------------------------------------------------
 3461: */
 3462:         }
 3463:         else if ((*s_objet).type == MCX)
 3464:         {
 3465: 
 3466: /*
 3467: --------------------------------------------------------------------------------
 3468:   Matrice complexe
 3469: --------------------------------------------------------------------------------
 3470: */
 3471:         }
 3472:         else if ((*s_objet).type == MIN)
 3473:         {
 3474: 
 3475: /*
 3476: --------------------------------------------------------------------------------
 3477:   Matrice entière
 3478: --------------------------------------------------------------------------------
 3479: */
 3480:         }
 3481:         else if ((*s_objet).type == MRL)
 3482:         {
 3483: 
 3484: /*
 3485: --------------------------------------------------------------------------------
 3486:   Matrice réelle
 3487: --------------------------------------------------------------------------------
 3488: */
 3489:         }
 3490:         else if ((*s_objet).type == NOM)
 3491:         {
 3492: 
 3493: /*
 3494: --------------------------------------------------------------------------------
 3495:   Nom
 3496: --------------------------------------------------------------------------------
 3497: */
 3498:         }
 3499:         else if ((*s_objet).type == REL)
 3500:         {
 3501: 
 3502: /*
 3503: --------------------------------------------------------------------------------
 3504:   Réel
 3505:   Poids fort 0001 01
 3506: --------------------------------------------------------------------------------
 3507: */
 3508: 
 3509:             if ((format_sortie != 'R') && (format_sortie != 'C'))
 3510:             {
 3511:                 (*s_etat_processus).erreur_execution =
 3512:                         d_ex_erreur_format_fichier;
 3513:                 return(NULL);
 3514:             }
 3515: 
 3516:             if ((chaine = formateur_fichier_binaire_nombre(s_etat_processus,
 3517:                     (*s_objet).objet, 'R', format_sortie,
 3518:                     longueur, longueur_effective)) == NULL)
 3519:             {
 3520:                 return(NULL);
 3521:             }
 3522:         }
 3523:         else if ((*s_objet).type == VCX)
 3524:         {
 3525: 
 3526: /*
 3527: --------------------------------------------------------------------------------
 3528:   Vecteur complexe
 3529: --------------------------------------------------------------------------------
 3530: */
 3531:         }
 3532:         else if ((*s_objet).type == VIN)
 3533:         {
 3534: 
 3535: /*
 3536: --------------------------------------------------------------------------------
 3537:   Vecteur entier
 3538: --------------------------------------------------------------------------------
 3539: */
 3540:         }
 3541:         else if ((*s_objet).type == VRL)
 3542:         {
 3543: 
 3544: /*
 3545: --------------------------------------------------------------------------------
 3546:   Vecteur réel
 3547: --------------------------------------------------------------------------------
 3548: */
 3549:         }
 3550:         else
 3551:         {
 3552:             // Type non exportable
 3553: 
 3554:             (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier;
 3555:             free(chaine);
 3556: 
 3557:             return(NULL);
 3558:         }
 3559: 
 3560:         // On n'ajoute la longueur de l'enregistrement que dans le cas
 3561:         // où le format est utilisé dans un fichier.
 3562: 
 3563:         if (((*recursivite) == 1) && (export_fichier == d_vrai))
 3564:         {
 3565:             // Ajout de la longueur totale en fin d'enregistrement.
 3566: 
 3567:             longueur_totale = (*longueur_effective);
 3568: 
 3569:             if (longueur_totale < (((integer8) 1) << 7))
 3570:             {
 3571:                 tampon[0] = ((longueur_totale + 1) << 1) & 0xFF;
 3572: 
 3573:                 if ((chaine = realloc(chaine, (longueur_totale + 1)
 3574:                         * sizeof(unsigned char))) == NULL)
 3575:                 {
 3576:                     (*s_etat_processus).erreur_systeme =
 3577:                             d_es_allocation_memoire;
 3578:                     return(NULL);
 3579:                 }
 3580: 
 3581:                 // XXXX XXX0
 3582:                 memcpy(&(chaine[longueur_totale]), tampon, 1);
 3583:                 longueur_totale += 1;
 3584:             }
 3585:             else if (longueur_totale < (((integer8) 1) << 16))
 3586:             {
 3587:                 longueur_totale++;
 3588: 
 3589:                 for(i = 0; i < 7; i++)
 3590:                 {
 3591:                     if ((longueur_totale < (((integer8) 1) << (8 * (i + 2))))
 3592:                             || (i == 6))
 3593:                     {
 3594:                         // MSB (4 bits de poids fort)
 3595:                         tampon[0] = ((longueur_totale >> 8) & 0xF0)
 3596:                                 | 0x1 /* longueur supérieure à 7 bits */
 3597:                                 | ((i + 1) << 1);
 3598: 
 3599:                         for(j = 0; j <= i; j++)
 3600:                         {
 3601:                             tampon[(i - j) + 1] = (longueur_totale >> (j + 1))
 3602:                                     & 0xFF;
 3603:                         }
 3604: 
 3605:                         // MSB (4 bits de poids faible)
 3606:                         tampon[i + 2] = (((longueur_totale >> 8) & 0x0F) << 4)
 3607:                                 | 0x1 /* longueur supérieure à 7 bits */
 3608:                                 | ((i + 1) << 1);
 3609:                         break;
 3610:                     }
 3611:                 }
 3612: 
 3613:                 if ((chaine = realloc(chaine, (longueur_totale + 3)
 3614:                         * sizeof(unsigned char))) == NULL)
 3615:                 {
 3616:                     (*s_etat_processus).erreur_systeme =
 3617:                             d_es_allocation_memoire;
 3618:                     return(NULL);
 3619:                 }
 3620: 
 3621:                 memcpy(&(chaine[longueur_totale]), tampon, 3);
 3622:                 longueur_totale += 3;
 3623:             }
 3624:             else if (longueur_totale < (((integer8) 1) << 32))
 3625:             {
 3626:             }
 3627: 
 3628:             __zone();
 3629:             (*longueur_effective) = longueur_totale;
 3630:         }
 3631:     }
 3632: 
 3633:     (*recursivite)--;
 3634: 
 3635:     return(chaine);
 3636: }
 3637: 
 3638: 
 3639: /*
 3640: ================================================================================
 3641:   Routines qui transforment un nombre entier, réel ou complexe en chaîne de
 3642:   caractères suivant le format courant
 3643: ================================================================================
 3644:   Entrées : pointeur générique sur la donnée numérique à convertir,
 3645:   type de l'entité (I, R ou C).
 3646: --------------------------------------------------------------------------------
 3647:   Sorties : chaîne de caractères allouée dans la routine
 3648: --------------------------------------------------------------------------------
 3649:   Effets de bord : néant
 3650: ================================================================================
 3651: */
 3652: 
 3653: /*
 3654: --------------------------------------------------------------------------------
 3655:   Formatage des complexes, réels et entiers
 3656: --------------------------------------------------------------------------------
 3657: */
 3658: 
 3659: unsigned char *
 3660: formateur_fichier_nombre(struct_processus *s_etat_processus,
 3661:         void *valeur_numerique, unsigned char type,
 3662:         long longueur, long longueur_champ, unsigned char format)
 3663: {
 3664:     unsigned char               *chaine;
 3665:     unsigned char               *construction_chaine;
 3666:     unsigned char               *sauvegarde;
 3667:     unsigned char               *tampon;
 3668: 
 3669:     chaine = NULL;
 3670: 
 3671:     switch(type)
 3672:     {
 3673:         case 'C' :
 3674:         {
 3675:             construction_chaine = (unsigned char *) malloc(
 3676:                     2 * sizeof(unsigned char));
 3677: 
 3678:             if (construction_chaine == NULL)
 3679:             {
 3680:                 (*s_etat_processus).erreur_systeme =
 3681:                         d_es_allocation_memoire;
 3682:                 return(NULL);
 3683:             }
 3684: 
 3685:             strcpy(construction_chaine, "(");
 3686: 
 3687:             tampon = formateur_fichier_reel(s_etat_processus,
 3688:                     (void *) &((*((struct_complexe16 *)
 3689:                     valeur_numerique)).partie_reelle), 'R',
 3690:                     longueur, longueur_champ, format);
 3691: 
 3692:             if (tampon == NULL)
 3693:             {
 3694:                 (*s_etat_processus).erreur_systeme =
 3695:                         d_es_allocation_memoire;
 3696:                 return(NULL);
 3697:             }
 3698: 
 3699:             sauvegarde = construction_chaine;
 3700: 
 3701:             construction_chaine = (unsigned char *) malloc(
 3702:                     (strlen(sauvegarde) + strlen(tampon) + 2)
 3703:                     * sizeof(unsigned char));
 3704: 
 3705:             if (construction_chaine == NULL)
 3706:             {
 3707:                 (*s_etat_processus).erreur_systeme =
 3708:                         d_es_allocation_memoire;
 3709:                 return(NULL);
 3710:             }
 3711: 
 3712:             strcpy(construction_chaine, sauvegarde);
 3713:             free(sauvegarde);
 3714:             strcat(construction_chaine, tampon);
 3715:             free(tampon);
 3716: 
 3717:             strcat(construction_chaine, ",");
 3718: 
 3719:             tampon = formateur_fichier_reel(s_etat_processus,
 3720:                     (void *) &((*((struct_complexe16 *)
 3721:                     valeur_numerique)).partie_imaginaire), 'R',
 3722:                     longueur, longueur_champ, format);
 3723: 
 3724:             if (tampon == NULL)
 3725:             {
 3726:                 (*s_etat_processus).erreur_systeme =
 3727:                         d_es_allocation_memoire;
 3728:                 return(NULL);
 3729:             }
 3730: 
 3731:             sauvegarde = construction_chaine;
 3732: 
 3733:             construction_chaine = (unsigned char *) malloc(
 3734:                     (strlen(sauvegarde) + strlen(tampon) + 2)
 3735:                     * sizeof(unsigned char));
 3736: 
 3737:             if (construction_chaine == NULL)
 3738:             {
 3739:                 (*s_etat_processus).erreur_systeme =
 3740:                         d_es_allocation_memoire;
 3741:                 return(NULL);
 3742:             }
 3743: 
 3744:             strcpy(construction_chaine, sauvegarde);
 3745:             free(sauvegarde);
 3746:             strcat(construction_chaine, tampon);
 3747:             free(tampon);
 3748:             strcat(construction_chaine, ")");
 3749: 
 3750:             chaine = construction_chaine;
 3751: 
 3752:             break;
 3753:         }
 3754: 
 3755:         case 'R' :
 3756:         {
 3757:             chaine = formateur_fichier_reel(s_etat_processus,
 3758:                     valeur_numerique, 'R', longueur, longueur_champ,
 3759:                     format);
 3760: 
 3761:             if (chaine == NULL)
 3762:             {
 3763:                 (*s_etat_processus).erreur_systeme =
 3764:                         d_es_allocation_memoire;
 3765:                 return(NULL);
 3766:             }
 3767: 
 3768:             break;
 3769:         }
 3770: 
 3771:         default :
 3772:         case 'I' :
 3773:         {
 3774:             chaine = formateur_fichier_reel(s_etat_processus,
 3775:                     valeur_numerique, 'I', longueur, longueur_champ,
 3776:                     format);
 3777: 
 3778:             if (chaine == NULL)
 3779:             {
 3780:                 (*s_etat_processus).erreur_systeme =
 3781:                         d_es_allocation_memoire;
 3782:                 return(NULL);
 3783:             }
 3784: 
 3785:             break;
 3786:         }
 3787:     }
 3788: 
 3789:     return(chaine);
 3790: }
 3791: 
 3792: 
 3793: /*
 3794: --------------------------------------------------------------------------------
 3795:   Formateur des réels et entiers
 3796: --------------------------------------------------------------------------------
 3797: */
 3798: 
 3799: unsigned char *
 3800: formateur_fichier_reel(struct_processus *s_etat_processus,
 3801:         void *valeur_numerique, unsigned char type,
 3802:         long longueur, long longueur_champ,
 3803:         unsigned char format_sortie)
 3804: {
 3805:     real8                   mantisse;
 3806:     real8                   tampon_reel;
 3807: 
 3808:     integer8                tampon_entier;
 3809: 
 3810:     long                    correction;
 3811:     long                    exposant;
 3812:     long                    longueur_utile;
 3813:     long                    longueur_utile_limite;
 3814: 
 3815:     unsigned char           *chaine;
 3816:     unsigned char           format[16 + 1];
 3817:     unsigned char           mode[3 + 1];
 3818:     unsigned char           tampon[16 + 1];
 3819: 
 3820:     unsigned long           i;
 3821: 
 3822:     chaine = (unsigned char *) malloc((32 + 1) * sizeof(unsigned char));
 3823: 
 3824:     if (chaine == NULL)
 3825:     {
 3826:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3827:         return(NULL);
 3828:     }
 3829: 
 3830:     if (type == 'R')
 3831:     {
 3832:         tampon_reel = *((real8 *) valeur_numerique);
 3833: 
 3834:         if (tampon_reel > ((real8) 0))
 3835:         {
 3836:             exposant = (long) floor(log10(tampon_reel));
 3837:         }
 3838:         else if (tampon_reel < ((real8) 0))
 3839:         {
 3840:             exposant = (long) floor(log10(-tampon_reel));
 3841:         }
 3842:         else
 3843:         {
 3844:             exposant = 0;
 3845:         }
 3846: 
 3847:         mantisse = (*((real8 *) valeur_numerique)) / pow(10, exposant);
 3848:     }
 3849:     else
 3850:     {
 3851:         tampon_entier = *((integer8 *) valeur_numerique);
 3852: 
 3853:         if (tampon_entier > ((integer8) 0))
 3854:         {
 3855:             exposant = (long) floor(log10(tampon_entier));
 3856:         }
 3857:         else if (tampon_entier < ((integer8) 0))
 3858:         {
 3859:             exposant = (long) floor(log10(-tampon_entier));
 3860:         }
 3861:         else
 3862:         {
 3863:             exposant = 0;
 3864:         }
 3865: 
 3866:         mantisse = (*((integer8 *) valeur_numerique)) / pow(10, exposant);
 3867:     }
 3868: 
 3869:     longueur_utile = longueur;
 3870:     longueur_utile_limite = 15;
 3871: 
 3872:     if (longueur_utile > longueur_utile_limite)
 3873:     {
 3874:         longueur_utile = longueur_utile_limite;
 3875:     }
 3876: 
 3877:     if (format_sortie == 'S')
 3878:     {
 3879:         strcpy(mode, "STD");
 3880:     }
 3881:     else if (format_sortie == 'C')
 3882:     {
 3883:         strcpy(mode, "SCI");
 3884:     }
 3885:     else if (format_sortie == 'F')
 3886:     {
 3887:         strcpy(mode, "FIX");
 3888:     }
 3889:     else
 3890:     {
 3891:         strcpy(mode, "ENG");
 3892:     }
 3893: 
 3894:     if ((strcmp(mode, "SCI") == 0) ||
 3895:             ((strcmp(mode, "STD") == 0) && ((exposant >
 3896:             longueur_utile_limite) ||
 3897:             (exposant < -longueur_utile_limite))) ||
 3898:             ((strcmp(mode, "FIX") == 0) &&
 3899:             ((exposant >= longueur_utile_limite) ||
 3900:             (exposant < -longueur_utile))))
 3901:     {
 3902:         chaine[0] = 0;
 3903:         format[0] = 0;
 3904: 
 3905:         if (strcmp(mode, "STD") == 0)
 3906:         {
 3907:             longueur_utile = longueur_utile_limite - 1;
 3908:         }
 3909: 
 3910:         sprintf(format, "%%.%luf", longueur_utile);
 3911:             
 3912:         sprintf(tampon, format, mantisse);
 3913:         strcpy(chaine, tampon);
 3914:         strcat(chaine, "E");
 3915:         sprintf(tampon, "%ld", exposant);
 3916:         strcat(chaine, tampon);
 3917:     }
 3918:     else if (strcmp(mode, "FIX") == 0)
 3919:     {
 3920:         chaine[0] = 0;
 3921:         format[0] = 0;
 3922: 
 3923:         if (longueur_utile + exposant >= longueur_utile_limite)
 3924:         {
 3925:             longueur_utile = longueur_utile_limite - (exposant + 1);
 3926:         }
 3927: 
 3928:         sprintf(format, "%%.%luf", longueur_utile);
 3929: 
 3930:         sprintf(tampon, format, (mantisse * pow(10, exposant)));
 3931:         strcpy(chaine, tampon);
 3932:     }
 3933:     else if (strcmp(mode, "ENG") == 0)
 3934:     {
 3935:         chaine[0] = 0;
 3936:         format[0] = 0;
 3937: 
 3938:         correction = labs(exposant) % 3;
 3939: 
 3940:         if (exposant < 0)
 3941:         {
 3942:             if (correction == 0)
 3943:             {
 3944:                 correction = 3;
 3945:             }
 3946: 
 3947:             correction =  3 - correction;
 3948:         }
 3949: 
 3950:         longueur_utile -= correction;
 3951:         sprintf(format, "%%.%luf", longueur_utile);
 3952: 
 3953:         sprintf(tampon, format, (mantisse * pow(10, correction)));
 3954:         strcpy(chaine, tampon);
 3955:         strcat(chaine, "E");
 3956:         sprintf(tampon, "%ld", (exposant - correction));
 3957:         strcat(chaine, tampon);
 3958:     }
 3959:     else
 3960:     {
 3961:         if (type == 'I')
 3962:         {
 3963:             chaine[0] = 0;
 3964:             sprintf(tampon, "%lld", *((integer8 *) valeur_numerique));
 3965:         }
 3966:         else
 3967:         {
 3968:             chaine[0] = 0;
 3969:             format[0] = 0;
 3970: 
 3971:             if (exposant >= 0)
 3972:             {
 3973:                 sprintf(format, "%%.%luf", (longueur_utile_limite - exposant
 3974:                         - 1));
 3975:             }
 3976:             else
 3977:             {
 3978:                 sprintf(format, "%%.%luf", longueur_utile_limite);
 3979:             }
 3980: 
 3981:             sprintf(tampon, format, *((real8 *) valeur_numerique));
 3982: 
 3983:             i = strlen(tampon) - 1;
 3984:             while(tampon[i] == '0')
 3985:             {
 3986:                 tampon[i] = 0;
 3987:                 i--;
 3988:             }
 3989: 
 3990:             if (ds_imposition_separateur_decimal == d_faux)
 3991:             {
 3992:                 i = strlen(tampon) - 1;
 3993:                 if (tampon[i] == '.')
 3994:                 {
 3995:                     tampon[i] = 0;
 3996:                 }
 3997:             }
 3998:         }
 3999: 
 4000:         strcpy(chaine, tampon);
 4001:     }
 4002: 
 4003:     if (longueur_champ >= 0)
 4004:     {
 4005:         if (strlen(chaine) > (size_t) longueur_champ)
 4006:         {
 4007:             for(i = 0; i < (unsigned long) longueur_champ; i++)
 4008:             {
 4009:                 chaine[i] = '*';
 4010:             }
 4011: 
 4012:             chaine[i] = d_code_fin_chaine;
 4013:         }
 4014:     }
 4015: 
 4016:     return(chaine);
 4017: }
 4018: 
 4019: 
 4020: /*
 4021: --------------------------------------------------------------------------------
 4022:   Mêmes fonctions mais pour les fichiers binaires
 4023: --------------------------------------------------------------------------------
 4024: */
 4025: 
 4026: unsigned char *
 4027: formateur_fichier_binaire_nombre(struct_processus *s_etat_processus,
 4028:         void *valeur_numerique, unsigned char type_entree,
 4029:         unsigned char type, long longueur, long *longueur_conversion)
 4030: {
 4031:     unsigned char               *chaine;
 4032: 
 4033:     switch(type)
 4034:     {
 4035:         case 'I' :
 4036:         {
 4037:             if (type_entree != type)
 4038:             {
 4039:                 (*s_etat_processus).erreur_execution = d_ex_representation;
 4040:                 return(NULL);
 4041:             }
 4042: 
 4043:             switch(longueur)
 4044:             {
 4045:                 case 1:
 4046:                 {
 4047:                     if ((*((integer8 *) valeur_numerique)) !=
 4048:                             ((integer1) (*((integer8 *) valeur_numerique))))
 4049:                     {
 4050:                         (*s_etat_processus).erreur_execution =
 4051:                                 d_ex_representation;
 4052:                         return(NULL);
 4053:                     }
 4054: 
 4055:                     if ((chaine = malloc(2 * sizeof(unsigned char))) == NULL)
 4056:                     {
 4057:                         (*s_etat_processus).erreur_systeme =
 4058:                                 d_es_allocation_memoire;
 4059:                         return(NULL);
 4060:                     }
 4061: 
 4062:                     (*longueur_conversion) = 2;
 4063:                     chaine[0] = 0x10;
 4064:                     chaine[1] = (*((integer8 *) valeur_numerique)) & 0xFF;
 4065:                     break;
 4066:                 }
 4067: 
 4068:                 case 2:
 4069:                 {
 4070:                     if ((*((integer8 *) valeur_numerique)) !=
 4071:                             ((integer2) (*((integer8 *) valeur_numerique))))
 4072:                     {
 4073:                         (*s_etat_processus).erreur_execution =
 4074:                                 d_ex_representation;
 4075:                         return(NULL);
 4076:                     }
 4077: 
 4078:                     if ((chaine = malloc(3 * sizeof(unsigned char))) == NULL)
 4079:                     {
 4080:                         (*s_etat_processus).erreur_systeme =
 4081:                                 d_es_allocation_memoire;
 4082:                         return(NULL);
 4083:                     }
 4084: 
 4085:                     (*longueur_conversion) = 3;
 4086:                     chaine[0] = 0x11;
 4087:                     chaine[1] = ((*((integer8 *) valeur_numerique)) >> 8)
 4088:                             & 0xFF;
 4089:                     chaine[2] = (*((integer8 *) valeur_numerique)) & 0xFF;
 4090:                     break;
 4091:                 }
 4092: 
 4093:                 case 4:
 4094:                 {
 4095:                     if ((*((integer8 *) valeur_numerique)) !=
 4096:                             ((integer2) (*((integer8 *) valeur_numerique))))
 4097:                     {
 4098:                         (*s_etat_processus).erreur_execution =
 4099:                                 d_ex_representation;
 4100:                         return(NULL);
 4101:                     }
 4102: 
 4103:                     if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL)
 4104:                     {
 4105:                         (*s_etat_processus).erreur_systeme =
 4106:                                 d_es_allocation_memoire;
 4107:                         return(NULL);
 4108:                     }
 4109: 
 4110:                     (*longueur_conversion) = 5;
 4111:                     chaine[0] = 0x12;
 4112:                     chaine[1] = ((*((integer8 *) valeur_numerique)) >> 24)
 4113:                             & 0xFF;
 4114:                     chaine[2] = ((*((integer8 *) valeur_numerique)) >> 16)
 4115:                             & 0xFF;
 4116:                     chaine[3] = ((*((integer8 *) valeur_numerique)) >> 8)
 4117:                             & 0xFF;
 4118:                     chaine[4] = (*((integer8 *) valeur_numerique)) & 0xFF;
 4119:                     break;
 4120:                 }
 4121: 
 4122:                 case 8:
 4123:                 {
 4124:                     if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL)
 4125:                     {
 4126:                         (*s_etat_processus).erreur_systeme =
 4127:                                 d_es_allocation_memoire;
 4128:                         return(NULL);
 4129:                     }
 4130: 
 4131:                     (*longueur_conversion) = 9;
 4132:                     chaine[0] = 0x13;
 4133:                     chaine[1] = ((*((integer8 *) valeur_numerique)) >> 56)
 4134:                             & 0xFF;
 4135:                     chaine[2] = ((*((integer8 *) valeur_numerique)) >> 48)
 4136:                             & 0xFF;
 4137:                     chaine[3] = ((*((integer8 *) valeur_numerique)) >> 40)
 4138:                             & 0xFF;
 4139:                     chaine[4] = ((*((integer8 *) valeur_numerique)) >> 32)
 4140:                             & 0xFF;
 4141:                     chaine[5] = ((*((integer8 *) valeur_numerique)) >> 24)
 4142:                             & 0xFF;
 4143:                     chaine[6] = ((*((integer8 *) valeur_numerique)) >> 16)
 4144:                             & 0xFF;
 4145:                     chaine[7] = ((*((integer8 *) valeur_numerique)) >> 8)
 4146:                             & 0xFF;
 4147:                     chaine[8] = (*((integer8 *) valeur_numerique)) & 0xFF;
 4148:                     break;
 4149:                 }
 4150: 
 4151:                 default :
 4152:                 {
 4153:                     (*s_etat_processus).erreur_execution =
 4154:                             d_ex_erreur_format_fichier;
 4155:                     return(NULL);
 4156:                 }
 4157:             }
 4158: 
 4159:             break;
 4160:         }
 4161: 
 4162:         case 'R' :
 4163:         {
 4164:             switch(longueur)
 4165:             {
 4166:                 case 4:
 4167:                 {
 4168:                     real8           valeur;
 4169:                     real8           vinf;
 4170:                     real8           vsup;
 4171: 
 4172:                     union
 4173:                     {
 4174:                         real4       r4;
 4175:                         integer4    i4;
 4176:                     }               eq4;
 4177: 
 4178:                     if (type_entree == 'R')
 4179:                     {
 4180:                         valeur = (*((real8 *) valeur_numerique));
 4181:                     }
 4182:                     else if (type_entree == 'I')
 4183:                     {
 4184:                         valeur = (*((integer8 *) valeur_numerique));
 4185:                     }
 4186:                     else
 4187:                     {
 4188:                         (*s_etat_processus).erreur_execution =
 4189:                                 d_ex_representation;
 4190:                         return(NULL);
 4191:                     }
 4192: 
 4193:                     if (valeur > 0)
 4194:                     {
 4195:                         vinf = nextafter(valeur, 0);
 4196:                         vsup = nextafter(valeur, valeur * 2);
 4197:                     }
 4198:                     else
 4199:                     {
 4200:                         vinf = nextafter(valeur, valeur * 2);
 4201:                         vsup = nextafter(valeur, 0);
 4202:                     }
 4203: 
 4204:                     if (!((vinf <= ((real4) valeur)) &&
 4205:                             (((real4) valeur) <= vsup)))
 4206:                     {
 4207:                         (*s_etat_processus).erreur_execution =
 4208:                                 d_ex_representation;
 4209:                         return(NULL);
 4210:                     }
 4211: 
 4212:                     if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL)
 4213:                     {
 4214:                         (*s_etat_processus).erreur_systeme =
 4215:                                 d_es_allocation_memoire;
 4216:                         return(NULL);
 4217:                     }
 4218: 
 4219:                     eq4.r4 = (real4) valeur;
 4220:                     (*longueur_conversion) = 5;
 4221:                     chaine[0] = 0x14;
 4222:                     chaine[1] = (eq4.i4 >> 24) & 0xFF;
 4223:                     chaine[2] = (eq4.i4 >> 16) & 0xFF;
 4224:                     chaine[3] = (eq4.i4 >> 8) & 0xFF;
 4225:                     chaine[4] = eq4.i4 & 0xFF;
 4226:                     break;
 4227:                 }
 4228: 
 4229:                 case 8:
 4230:                 {
 4231:                     union
 4232:                     {
 4233:                         real8       r8;
 4234:                         integer8    i8;
 4235:                     }               eq8;
 4236: 
 4237:                     if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL)
 4238:                     {
 4239:                         (*s_etat_processus).erreur_systeme =
 4240:                                 d_es_allocation_memoire;
 4241:                         return(NULL);
 4242:                     }
 4243: 
 4244:                     if (type_entree == 'I')
 4245:                     {
 4246:                         eq8.r8 = (*((integer8 *) valeur_numerique));
 4247:                     }
 4248:                     else if (type_entree == 'R')
 4249:                     {
 4250:                         eq8.r8 = (*((real8 *) valeur_numerique));
 4251:                     }
 4252:                     else
 4253:                     {
 4254:                         (*s_etat_processus).erreur_execution =
 4255:                                 d_ex_representation;
 4256:                         return(NULL);
 4257:                     }
 4258: 
 4259:                     (*longueur_conversion) = 9;
 4260:                     chaine[0] = 0x15;
 4261:                     chaine[1] = (eq8.i8 >> 56) & 0xFF;
 4262:                     chaine[2] = (eq8.i8 >> 48) & 0xFF;
 4263:                     chaine[3] = (eq8.i8 >> 40) & 0xFF;
 4264:                     chaine[4] = (eq8.i8 >> 32) & 0xFF;
 4265:                     chaine[5] = (eq8.i8 >> 24) & 0xFF;
 4266:                     chaine[6] = (eq8.i8 >> 16) & 0xFF;
 4267:                     chaine[7] = (eq8.i8 >> 8) & 0xFF;
 4268:                     chaine[8] = eq8.i8 & 0xFF;
 4269:                     break;
 4270:                 }
 4271: 
 4272:                 default :
 4273:                 {
 4274:                     (*s_etat_processus).erreur_execution =
 4275:                             d_ex_erreur_format_fichier;
 4276:                     return(NULL);
 4277:                 }
 4278:             }
 4279: 
 4280:             break;
 4281:         }
 4282: 
 4283:         case 'C' :
 4284:         {
 4285:             switch(longueur)
 4286:             {
 4287:                 case 8:
 4288:                 {
 4289:                     unsigned char       *partie_reelle;
 4290:                     unsigned char       *partie_imaginaire;
 4291: 
 4292:                     long                limag;
 4293:                     long                lreel;
 4294: 
 4295:                     real8               zero;
 4296: 
 4297:                     if (type_entree == 'I')
 4298:                     {
 4299:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4300:                                 s_etat_processus, &(*((integer8 *)
 4301:                                 valeur_numerique)), 'I', 'R', 4,
 4302:                                 &lreel)) == NULL)
 4303:                         {
 4304:                             return(NULL);
 4305:                         }
 4306: 
 4307:                         zero = 0;
 4308: 
 4309:                         if ((partie_imaginaire =
 4310:                                 formateur_fichier_binaire_nombre(
 4311:                                 s_etat_processus, &zero, 'R', 'R', 4,
 4312:                                 &limag)) == NULL)
 4313:                         {
 4314:                             free(partie_reelle);
 4315:                             return(NULL);
 4316:                         }
 4317:                     }
 4318:                     else if (type_entree == 'R')
 4319:                     {
 4320:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4321:                                 s_etat_processus, &(*((real8 *)
 4322:                                 valeur_numerique)), 'R', 'R', 4,
 4323:                                 &lreel)) == NULL)
 4324:                         {
 4325:                             return(NULL);
 4326:                         }
 4327: 
 4328:                         zero = 0;
 4329: 
 4330:                         if ((partie_imaginaire =
 4331:                                 formateur_fichier_binaire_nombre(
 4332:                                 s_etat_processus, &zero, 'R', 'R', 4,
 4333:                                 &limag)) == NULL)
 4334:                         {
 4335:                             free(partie_reelle);
 4336:                             return(NULL);
 4337:                         }
 4338:                     }
 4339:                     else if (type_entree == 'C')
 4340:                     {
 4341:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4342:                                 s_etat_processus, &((*((complex16 *)
 4343:                                 valeur_numerique)).partie_reelle), 'R', 'R', 4,
 4344:                                 &lreel)) == NULL)
 4345:                         {
 4346:                             return(NULL);
 4347:                         }
 4348: 
 4349:                         if ((partie_imaginaire =
 4350:                                 formateur_fichier_binaire_nombre(
 4351:                                 s_etat_processus, &((*((complex16 *)
 4352:                                 valeur_numerique)).partie_imaginaire),
 4353:                                 'R', 'R', 4, &limag)) == NULL)
 4354:                         {
 4355:                             free(partie_reelle);
 4356:                             return(NULL);
 4357:                         }
 4358:                     }
 4359:                     else
 4360:                     {
 4361:                         (*s_etat_processus).erreur_execution =
 4362:                                 d_ex_erreur_format_fichier;
 4363:                         return(NULL);
 4364:                     }
 4365: 
 4366:                     if ((chaine = malloc((lreel + limag - 1) *
 4367:                             sizeof(unsigned char))) == NULL)
 4368:                     {
 4369:                         free(partie_reelle);
 4370:                         free(partie_imaginaire);
 4371: 
 4372:                         (*s_etat_processus).erreur_systeme =
 4373:                                 d_es_allocation_memoire;
 4374:                         return(NULL);
 4375:                     }
 4376: 
 4377:                     chaine[0] = 0x18;
 4378:                     memcpy(chaine + 1, partie_reelle + 1, lreel - 1);
 4379:                     memcpy(chaine + lreel, partie_imaginaire + 1, limag - 1);
 4380:                     (*longueur_conversion) = lreel + limag - 1;
 4381: 
 4382:                     free(partie_reelle);
 4383:                     free(partie_imaginaire);
 4384:                     break;
 4385:                 }
 4386: 
 4387:                 case 16:
 4388:                 {
 4389:                     unsigned char       *partie_reelle;
 4390:                     unsigned char       *partie_imaginaire;
 4391: 
 4392:                     long                limag;
 4393:                     long                lreel;
 4394:                     real8               zero;
 4395: 
 4396:                     if (type_entree == 'I')
 4397:                     {
 4398:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4399:                                 s_etat_processus, &(*((integer8 *)
 4400:                                 valeur_numerique)), 'I', 'R', 8,
 4401:                                 &lreel)) == NULL)
 4402:                         {
 4403:                             return(NULL);
 4404:                         }
 4405: 
 4406:                         zero = 0;
 4407: 
 4408:                         if ((partie_imaginaire =
 4409:                                 formateur_fichier_binaire_nombre(
 4410:                                 s_etat_processus, &zero, 'R', 'R', 8,
 4411:                                 &limag)) == NULL)
 4412:                         {
 4413:                             free(partie_reelle);
 4414:                             return(NULL);
 4415:                         }
 4416:                     }
 4417:                     else if (type_entree == 'R')
 4418:                     {
 4419:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4420:                                 s_etat_processus, &(*((real8 *)
 4421:                                 valeur_numerique)), 'R', 'R', 8,
 4422:                                 &lreel)) == NULL)
 4423:                         {
 4424:                             return(NULL);
 4425:                         }
 4426: 
 4427:                         zero = 0;
 4428: 
 4429:                         if ((partie_imaginaire =
 4430:                                 formateur_fichier_binaire_nombre(
 4431:                                 s_etat_processus, &zero, 'R', 'R', 8,
 4432:                                 &limag)) == NULL)
 4433:                         {
 4434:                             free(partie_reelle);
 4435:                             return(NULL);
 4436:                         }
 4437:                     }
 4438:                     else if (type_entree == 'C')
 4439:                     {
 4440:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4441:                                 s_etat_processus, &((*((complex16 *)
 4442:                                 valeur_numerique)).partie_reelle), 'R', 'R', 8,
 4443:                                 &lreel)) == NULL)
 4444:                         {
 4445:                             return(NULL);
 4446:                         }
 4447: 
 4448:                         if ((partie_imaginaire =
 4449:                                 formateur_fichier_binaire_nombre(
 4450:                                 s_etat_processus, &((*((complex16 *)
 4451:                                 valeur_numerique)).partie_imaginaire),
 4452:                                 'R', 'R', 8, &limag)) == NULL)
 4453:                         {
 4454:                             free(partie_reelle);
 4455:                             return(NULL);
 4456:                         }
 4457:                     }
 4458:                     else
 4459:                     {
 4460:                         (*s_etat_processus).erreur_execution =
 4461:                                 d_ex_erreur_format_fichier;
 4462:                         return(NULL);
 4463:                     }
 4464: 
 4465:                     if ((chaine = malloc((lreel + limag - 1) *
 4466:                             sizeof(unsigned char))) == NULL)
 4467:                     {
 4468:                         free(partie_reelle);
 4469:                         free(partie_imaginaire);
 4470: 
 4471:                         (*s_etat_processus).erreur_systeme =
 4472:                                 d_es_allocation_memoire;
 4473:                         return(NULL);
 4474:                     }
 4475: 
 4476:                     chaine[0] = 0x19;
 4477:                     memcpy(chaine + 1, partie_reelle + 1, lreel - 1);
 4478:                     memcpy(chaine + lreel, partie_imaginaire + 1, limag - 1);
 4479:                     (*longueur_conversion) = lreel + limag - 1;
 4480: 
 4481:                     free(partie_reelle);
 4482:                     free(partie_imaginaire);
 4483:                     break;
 4484:                 }
 4485: 
 4486:                 default :
 4487:                 {
 4488:                     (*s_etat_processus).erreur_execution =
 4489:                             d_ex_erreur_format_fichier;
 4490:                     return(NULL);
 4491:                 }
 4492:             }
 4493: 
 4494:             break;
 4495:         }
 4496: 
 4497:         default :
 4498:         {
 4499:             (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier;
 4500:             return(NULL);
 4501:         }
 4502:     }
 4503: 
 4504:     return(chaine);
 4505: }
 4506: 
 4507: 
 4508: /*
 4509: ================================================================================
 4510:   Routines de conversion d'un objet binaire en struct_objet *
 4511: ================================================================================
 4512:   Entrées : pointeur sur un void *. Si longueur_buffer est strictement inférieur
 4513:             à zéro, il s'agit d'un file * sinon d'un buffer de type unsigned
 4514:             char *.
 4515: --------------------------------------------------------------------------------
 4516:   Sorties : pointeur sur un struct_objet nouvellement alloué
 4517: --------------------------------------------------------------------------------
 4518:   Effets de bord : néant
 4519: ================================================================================
 4520: */
 4521: 
 4522: struct_objet *
 4523: lecture_fichier_non_formate(struct_processus *s_etat_processus,
 4524:         void *argument, integer8 longueur_buffer, logical1 recursivite)
 4525: {
 4526:     file                        *fichier;
 4527: 
 4528:     integer8                    i;
 4529:     integer8                    longueur;
 4530: 
 4531:     struct_liste_chainee        *l_element_courant;
 4532: 
 4533:     struct_objet                *s_objet;
 4534:     struct_objet                *s_objet_elementaire;
 4535: 
 4536:     unsigned char               octets[8];
 4537:     unsigned char               *buffer;
 4538:     unsigned char               *ptr;
 4539: 
 4540:     size_t                      deplacement;
 4541: 
 4542:     if (longueur_buffer < 0)
 4543:     {
 4544:         fichier = argument;
 4545:         buffer = NULL;
 4546:         ptr = NULL;
 4547:     }
 4548:     else
 4549:     {
 4550:         buffer = argument;
 4551:         ptr = buffer;
 4552:         fichier = NULL;
 4553:     }
 4554: 
 4555: 
 4556:     if (longueur_buffer < 0)
 4557:     {
 4558:         if (fread(octets, (size_t) sizeof(unsigned char),
 4559:                 1, fichier) != 1)
 4560:         {
 4561:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 4562:             return(NULL);
 4563:         }
 4564:     }
 4565:     else
 4566:     {
 4567:         octets[0] = *ptr++;
 4568:     }
 4569: 
 4570:     switch(octets[0] & 0xF0)
 4571:     {
 4572:         case 0x10:  // Scalaire
 4573:         {
 4574:             switch(octets[0] & 0x0C)
 4575:             {
 4576:                 case 0x00:  // Entier
 4577:                 {
 4578:                     if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
 4579:                     {
 4580:                         return(NULL);
 4581:                     }
 4582: 
 4583:                     switch(octets[0] & 0x03)
 4584:                     {
 4585:                         case 0x00:  // integer*1
 4586:                         {
 4587:                             deplacement = 1;
 4588:                             break;
 4589:                         }
 4590: 
 4591:                         case 0x01:  // integer*2
 4592:                         {
 4593:                             deplacement = 2;
 4594:                             break;
 4595:                         }
 4596: 
 4597:                         case 0x02:  // integer*4
 4598:                         {
 4599:                             deplacement = 4;
 4600:                             break;
 4601:                         }
 4602: 
 4603:                         case 0x03:  // integer*8
 4604:                         {
 4605:                             deplacement = 8;
 4606:                             break;
 4607:                         }
 4608:                     }
 4609: 
 4610:                     if (longueur_buffer < 0)
 4611:                     {
 4612:                         if (fread(octets, (size_t) sizeof(unsigned char),
 4613:                                 deplacement, fichier) != deplacement)
 4614:                         {
 4615:                             (*s_etat_processus).erreur_systeme =
 4616:                                     d_es_erreur_fichier;
 4617:                             return(NULL);
 4618:                         }
 4619:                     }
 4620:                     else
 4621:                     {
 4622:                         for(i = 0; i < (signed) deplacement; i++)
 4623:                         {
 4624:                             octets[i] = *ptr++;
 4625:                         }
 4626:                     }
 4627: 
 4628:                     (*((integer8 *) (*s_objet).objet)) = 0;
 4629: 
 4630:                     for(i = 0; i < (signed) deplacement; i++)
 4631:                     {
 4632:                         (*((integer8 *) (*s_objet).objet)) |=
 4633:                                 octets[i] << (8 * ((deplacement - 1) - i));
 4634:                     }
 4635: 
 4636:                     break;
 4637:                 }
 4638: 
 4639:                 case 0x04:  // Réel
 4640:                 {
 4641:                     if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
 4642:                     {
 4643:                         return(NULL);
 4644:                     }
 4645: 
 4646:                     switch(octets[0] & 0x03)
 4647:                     {
 4648:                         case 0x00:  // real*4
 4649:                         {
 4650:                             deplacement = 4;
 4651:                             break;
 4652:                         }
 4653: 
 4654:                         case 0x01:  // real*8
 4655:                         {
 4656:                             deplacement = 8;
 4657:                             break;
 4658:                         }
 4659: 
 4660:                         default:
 4661:                         {
 4662:                             (*s_etat_processus).erreur_execution =
 4663:                                     d_ex_syntaxe;
 4664:                             return(NULL);
 4665:                         }
 4666:                     }
 4667: 
 4668:                     if (longueur_buffer < 0)
 4669:                     {
 4670:                         if (fread(octets, (size_t) sizeof(unsigned char),
 4671:                                 deplacement, fichier) != deplacement)
 4672:                         {
 4673:                             (*s_etat_processus).erreur_systeme =
 4674:                                     d_es_erreur_fichier;
 4675:                             return(NULL);
 4676:                         }
 4677:                     }
 4678:                     else
 4679:                     {
 4680:                         for(i = 0; i < (signed) deplacement; i++)
 4681:                         {
 4682:                             octets[i] = *ptr++;
 4683:                         }
 4684:                     }
 4685: 
 4686:                     if (deplacement == 4)
 4687:                     {
 4688:                         union
 4689:                         {
 4690:                             real4       r4;
 4691:                             integer4    i4;
 4692:                         } eq4;
 4693: 
 4694:                         eq4.i4 = 0;
 4695: 
 4696:                         for(i = 0; i < (signed) deplacement; i++)
 4697:                         {
 4698:                             eq4.i4 |= ((integer4) octets[i]) <<
 4699:                                     (8 * ((deplacement - 1) - i));
 4700:                         }
 4701: 
 4702:                         (*((real8 *) (*s_objet).objet)) = (real8) eq4.r4;
 4703:                     }
 4704:                     else
 4705:                     {
 4706:                         union
 4707:                         {
 4708:                             real8       r8;
 4709:                             integer8    i8;
 4710:                         } eq8;
 4711: 
 4712:                         eq8.i8 = 0;
 4713: 
 4714:                         for(i = 0; i < (signed) deplacement; i++)
 4715:                         {
 4716:                             eq8.i8 |= ((integer8) octets[i]) <<
 4717:                                     (8 * ((deplacement - 1) - i));
 4718:                         }
 4719: 
 4720:                         (*((real8 *) (*s_objet).objet)) = (real8) eq8.r8;
 4721:                     }
 4722: 
 4723:                     break;
 4724:                 }
 4725: 
 4726:                 case 0x08:  // Complexe
 4727:                 {
 4728:                     if ((s_objet = allocation(s_etat_processus, CPL)) == NULL)
 4729:                     {
 4730:                         return(NULL);
 4731:                     }
 4732: 
 4733:                     break;
 4734:                 }
 4735: 
 4736:                 default:
 4737:                 {
 4738:                     (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 4739:                     return(NULL);
 4740:                 }
 4741:             }
 4742: 
 4743:             break;
 4744:         }
 4745: 
 4746:         case 0x40:  // Liste
 4747:         {
 4748:             if ((octets[0] & 0x08) == 0)    // Longueur sur 6 bits
 4749:             {
 4750:                 longueur = (octets[0] & 0x07);
 4751:             }
 4752:             else
 4753:             {
 4754:                 switch(octets[0] & 0x07)
 4755:                 {
 4756:                     case 0x00:          // Longueur sur 8 bits
 4757:                     {
 4758:                         if (longueur_buffer < 0)
 4759:                         {
 4760:                             if (fread(octets, (size_t) sizeof(unsigned char),
 4761:                                     1, fichier) != 1)
 4762:                             {
 4763:                                 (*s_etat_processus).erreur_systeme =
 4764:                                         d_es_erreur_fichier;
 4765:                                 return(NULL);
 4766:                             }
 4767:                         }
 4768:                         else
 4769:                         {
 4770:                             octets[0] = *ptr++;
 4771:                         }
 4772: 
 4773:                         longueur = octets[0];
 4774:                         break;
 4775:                     }
 4776: 
 4777:                     case 0x01:          // Longueur sur 16 bits
 4778:                     {
 4779:                         if (longueur_buffer < 0)
 4780:                         {
 4781:                             if (fread(octets, (size_t) sizeof(unsigned char),
 4782:                                     2, fichier) != 2)
 4783:                             {
 4784:                                 (*s_etat_processus).erreur_systeme =
 4785:                                         d_es_erreur_fichier;
 4786:                                 return(NULL);
 4787:                             }
 4788:                         }
 4789:                         else
 4790:                         {
 4791:                             octets[0] = *ptr++;
 4792:                             octets[1] = *ptr++;
 4793:                         }
 4794: 
 4795:                         longueur = (((integer8) (octets[0])) << 8)
 4796:                                 | ((integer8) (octets[1]));
 4797:                         break;
 4798:                     }
 4799: 
 4800:                     case 0x02:          // Longueur sur 32 bits
 4801:                     {
 4802:                         if (longueur_buffer < 0)
 4803:                         {
 4804:                             if (fread(octets, (size_t) sizeof(unsigned char),
 4805:                                     4, fichier) != 4)
 4806:                             {
 4807:                                 (*s_etat_processus).erreur_systeme =
 4808:                                         d_es_erreur_fichier;
 4809:                                 return(NULL);
 4810:                             }
 4811:                         }
 4812:                         else
 4813:                         {
 4814:                             octets[0] = *ptr++;
 4815:                             octets[1] = *ptr++;
 4816:                             octets[2] = *ptr++;
 4817:                             octets[3] = *ptr++;
 4818:                         }
 4819: 
 4820:                         longueur = (((integer8) (octets[0])) << 24)
 4821:                                 | (((integer8) (octets[1])) << 16)
 4822:                                 | (((integer8) (octets[2])) << 8)
 4823:                                 | ((integer8) (octets[3]));
 4824:                         break;
 4825:                     }
 4826: 
 4827:                     case 0x03:          // Longueur sur 64 bits
 4828:                     {
 4829:                         if (longueur_buffer < 0)
 4830:                         {
 4831:                             if (fread(octets, (size_t) sizeof(unsigned char),
 4832:                                     8, fichier) != 8)
 4833:                             {
 4834:                                 (*s_etat_processus).erreur_systeme =
 4835:                                         d_es_erreur_fichier;
 4836:                                 return(NULL);
 4837:                             }
 4838:                         }
 4839:                         else
 4840:                         {
 4841:                             octets[0] = *ptr++;
 4842:                             octets[1] = *ptr++;
 4843:                             octets[2] = *ptr++;
 4844:                             octets[3] = *ptr++;
 4845:                             octets[4] = *ptr++;
 4846:                             octets[5] = *ptr++;
 4847:                             octets[6] = *ptr++;
 4848:                             octets[7] = *ptr++;
 4849:                         }
 4850: 
 4851:                         longueur = (((integer8) (octets[0])) << 56)
 4852:                                 | (((integer8) (octets[1])) << 48)
 4853:                                 | (((integer8) (octets[2])) << 40)
 4854:                                 | (((integer8) (octets[3])) << 32)
 4855:                                 | (((integer8) (octets[4])) << 24)
 4856:                                 | (((integer8) (octets[5])) << 16)
 4857:                                 | (((integer8) (octets[6])) << 8)
 4858:                                 | ((integer8) (octets[7]));
 4859:                         break;
 4860:                     }
 4861: 
 4862:                     default:
 4863:                     {
 4864:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 4865:                         return(NULL);
 4866:                     }
 4867:                 }
 4868:             }
 4869: 
 4870:             if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
 4871:             {
 4872:                 return(NULL);
 4873:             }
 4874: 
 4875:             l_element_courant = NULL;
 4876: 
 4877:             for(i = 0; i < longueur; i++)
 4878:             {
 4879:                 // Lecture des éléments de la liste.
 4880: 
 4881:                 if (longueur_buffer < 0)
 4882:                 {
 4883:                     if ((s_objet_elementaire = lecture_fichier_non_formate(
 4884:                             s_etat_processus, fichier, longueur_buffer, d_vrai))
 4885:                             == NULL)
 4886:                     {
 4887:                         liberation(s_etat_processus, s_objet);
 4888:                         return(NULL);
 4889:                     }
 4890:                 }
 4891:                 else
 4892:                 {
 4893:                     if ((s_objet_elementaire = lecture_fichier_non_formate(
 4894:                             s_etat_processus, &ptr,
 4895:                             longueur_buffer - (ptr - buffer), d_vrai)) == NULL)
 4896:                     {
 4897:                         liberation(s_etat_processus, s_objet);
 4898:                         return(NULL);
 4899:                     }
 4900:                 }
 4901: 
 4902:                 if (l_element_courant == NULL)
 4903:                 {
 4904:                     if (((*s_objet).objet = allocation_maillon(
 4905:                             s_etat_processus)) == NULL)
 4906:                     {
 4907:                         liberation(s_etat_processus, s_objet_elementaire);
 4908:                         liberation(s_etat_processus, s_objet);
 4909:                         return(NULL);
 4910:                     }
 4911: 
 4912:                     l_element_courant = (*s_objet).objet;
 4913:                 }
 4914:                 else
 4915:                 {
 4916:                     if (((*l_element_courant).suivant = allocation_maillon(
 4917:                             s_etat_processus)) == NULL)
 4918:                     {
 4919:                         liberation(s_etat_processus, s_objet_elementaire);
 4920:                         liberation(s_etat_processus, s_objet);
 4921:                         return(NULL);
 4922:                     }
 4923: 
 4924:                     l_element_courant = (*l_element_courant).suivant;
 4925:                 }
 4926: 
 4927:                 (*l_element_courant).donnee = s_objet_elementaire;
 4928:                 (*l_element_courant).suivant = NULL;
 4929:             }
 4930: 
 4931:             break;
 4932:         }
 4933: 
 4934:         case 0x80:  // Chaîne de caractères
 4935:         {
 4936:             s_objet = NULL;
 4937:             break;
 4938:         }
 4939: 
 4940:         default:
 4941:         {
 4942:             (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 4943:             return(NULL);
 4944:         }
 4945:     }
 4946: 
 4947:     if ((longueur_buffer < 0) && (recursivite == d_faux))
 4948:     {
 4949:         // Lecture depuis un fichier, on saute le champ de queue qui contient
 4950:         // la longueur de l'enregistrement.
 4951: 
 4952:         if (fread(octets, (size_t) sizeof(unsigned char), 1, fichier) != 1)
 4953:         {
 4954:             liberation(s_etat_processus, s_objet);
 4955: 
 4956:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 4957:             return(NULL);
 4958:         }
 4959: 
 4960:         if ((octets[0] & 0x01) != 0)
 4961:         {
 4962:             deplacement = ((octets[0] & 0x0F) >> 1) + 1;
 4963: 
 4964:             if (fread(octets, (size_t) sizeof(unsigned char), deplacement,
 4965:                     fichier) != deplacement)
 4966:             {
 4967:                 liberation(s_etat_processus, s_objet);
 4968: 
 4969:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 4970:                 return(NULL);
 4971:             }
 4972:         }
 4973:     }
 4974: 
 4975:     return(s_objet);
 4976: }
 4977: 
 4978: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>