File:  [local] / rpl / src / formateur_fichiers.c
Revision 1.53: download - view: text, annotated - select for diffs - revision graph
Sun Mar 10 22:15:48 2013 UTC (11 years, 1 month ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Suite des patches pour l'intégration des fichiers non formatés. La
commande BACKSPACE fonctionne maintenant avec les fichiers non formatés. Un
problème majeur a été corrigé dans BACKSPACE sur le fonctionnement avec
les fichiers formatés (problème d'échappement des guillemets).

    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:          * LSB(1/2) MSB      LSB(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:                         // LSB (4 bits de poids fort)
 3595:                         tampon[0] = (longueur_totale & 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] =
 3602:                                     (longueur_totale >> (8 * (j + 1)))
 3603:                                     & 0xFF;
 3604:                         }
 3605: 
 3606:                         // LSB (4 bits de poids faible)
 3607:                         tampon[i + 2] = ((longueur_totale & 0x0F) << 4)
 3608:                                 | 0x1 /* longueur supérieure à 7 bits */
 3609:                                 | ((i + 1) << 1);
 3610:                         break;
 3611:                     }
 3612:                 }
 3613: 
 3614:                 if ((chaine = realloc(chaine, (longueur_totale + 3)
 3615:                         * sizeof(unsigned char))) == NULL)
 3616:                 {
 3617:                     (*s_etat_processus).erreur_systeme =
 3618:                             d_es_allocation_memoire;
 3619:                     return(NULL);
 3620:                 }
 3621: 
 3622:                 memcpy(&(chaine[longueur_totale]), tampon, 3);
 3623:                 longueur_totale += 3;
 3624:             }
 3625:             else if (longueur_totale < (((integer8) 1) << 32))
 3626:             {
 3627:             }
 3628: 
 3629:             __zone();
 3630:             (*longueur_effective) = longueur_totale;
 3631:         }
 3632:     }
 3633: 
 3634:     (*recursivite)--;
 3635: 
 3636:     return(chaine);
 3637: }
 3638: 
 3639: 
 3640: /*
 3641: ================================================================================
 3642:   Routines qui transforment un nombre entier, réel ou complexe en chaîne de
 3643:   caractères suivant le format courant
 3644: ================================================================================
 3645:   Entrées : pointeur générique sur la donnée numérique à convertir,
 3646:   type de l'entité (I, R ou C).
 3647: --------------------------------------------------------------------------------
 3648:   Sorties : chaîne de caractères allouée dans la routine
 3649: --------------------------------------------------------------------------------
 3650:   Effets de bord : néant
 3651: ================================================================================
 3652: */
 3653: 
 3654: /*
 3655: --------------------------------------------------------------------------------
 3656:   Formatage des complexes, réels et entiers
 3657: --------------------------------------------------------------------------------
 3658: */
 3659: 
 3660: unsigned char *
 3661: formateur_fichier_nombre(struct_processus *s_etat_processus,
 3662:         void *valeur_numerique, unsigned char type,
 3663:         long longueur, long longueur_champ, unsigned char format)
 3664: {
 3665:     unsigned char               *chaine;
 3666:     unsigned char               *construction_chaine;
 3667:     unsigned char               *sauvegarde;
 3668:     unsigned char               *tampon;
 3669: 
 3670:     chaine = NULL;
 3671: 
 3672:     switch(type)
 3673:     {
 3674:         case 'C' :
 3675:         {
 3676:             construction_chaine = (unsigned char *) malloc(
 3677:                     2 * sizeof(unsigned char));
 3678: 
 3679:             if (construction_chaine == NULL)
 3680:             {
 3681:                 (*s_etat_processus).erreur_systeme =
 3682:                         d_es_allocation_memoire;
 3683:                 return(NULL);
 3684:             }
 3685: 
 3686:             strcpy(construction_chaine, "(");
 3687: 
 3688:             tampon = formateur_fichier_reel(s_etat_processus,
 3689:                     (void *) &((*((struct_complexe16 *)
 3690:                     valeur_numerique)).partie_reelle), 'R',
 3691:                     longueur, longueur_champ, format);
 3692: 
 3693:             if (tampon == NULL)
 3694:             {
 3695:                 (*s_etat_processus).erreur_systeme =
 3696:                         d_es_allocation_memoire;
 3697:                 return(NULL);
 3698:             }
 3699: 
 3700:             sauvegarde = construction_chaine;
 3701: 
 3702:             construction_chaine = (unsigned char *) malloc(
 3703:                     (strlen(sauvegarde) + strlen(tampon) + 2)
 3704:                     * sizeof(unsigned char));
 3705: 
 3706:             if (construction_chaine == NULL)
 3707:             {
 3708:                 (*s_etat_processus).erreur_systeme =
 3709:                         d_es_allocation_memoire;
 3710:                 return(NULL);
 3711:             }
 3712: 
 3713:             strcpy(construction_chaine, sauvegarde);
 3714:             free(sauvegarde);
 3715:             strcat(construction_chaine, tampon);
 3716:             free(tampon);
 3717: 
 3718:             strcat(construction_chaine, ",");
 3719: 
 3720:             tampon = formateur_fichier_reel(s_etat_processus,
 3721:                     (void *) &((*((struct_complexe16 *)
 3722:                     valeur_numerique)).partie_imaginaire), 'R',
 3723:                     longueur, longueur_champ, format);
 3724: 
 3725:             if (tampon == NULL)
 3726:             {
 3727:                 (*s_etat_processus).erreur_systeme =
 3728:                         d_es_allocation_memoire;
 3729:                 return(NULL);
 3730:             }
 3731: 
 3732:             sauvegarde = construction_chaine;
 3733: 
 3734:             construction_chaine = (unsigned char *) malloc(
 3735:                     (strlen(sauvegarde) + strlen(tampon) + 2)
 3736:                     * sizeof(unsigned char));
 3737: 
 3738:             if (construction_chaine == NULL)
 3739:             {
 3740:                 (*s_etat_processus).erreur_systeme =
 3741:                         d_es_allocation_memoire;
 3742:                 return(NULL);
 3743:             }
 3744: 
 3745:             strcpy(construction_chaine, sauvegarde);
 3746:             free(sauvegarde);
 3747:             strcat(construction_chaine, tampon);
 3748:             free(tampon);
 3749:             strcat(construction_chaine, ")");
 3750: 
 3751:             chaine = construction_chaine;
 3752: 
 3753:             break;
 3754:         }
 3755: 
 3756:         case 'R' :
 3757:         {
 3758:             chaine = formateur_fichier_reel(s_etat_processus,
 3759:                     valeur_numerique, 'R', longueur, longueur_champ,
 3760:                     format);
 3761: 
 3762:             if (chaine == NULL)
 3763:             {
 3764:                 (*s_etat_processus).erreur_systeme =
 3765:                         d_es_allocation_memoire;
 3766:                 return(NULL);
 3767:             }
 3768: 
 3769:             break;
 3770:         }
 3771: 
 3772:         default :
 3773:         case 'I' :
 3774:         {
 3775:             chaine = formateur_fichier_reel(s_etat_processus,
 3776:                     valeur_numerique, 'I', longueur, longueur_champ,
 3777:                     format);
 3778: 
 3779:             if (chaine == NULL)
 3780:             {
 3781:                 (*s_etat_processus).erreur_systeme =
 3782:                         d_es_allocation_memoire;
 3783:                 return(NULL);
 3784:             }
 3785: 
 3786:             break;
 3787:         }
 3788:     }
 3789: 
 3790:     return(chaine);
 3791: }
 3792: 
 3793: 
 3794: /*
 3795: --------------------------------------------------------------------------------
 3796:   Formateur des réels et entiers
 3797: --------------------------------------------------------------------------------
 3798: */
 3799: 
 3800: unsigned char *
 3801: formateur_fichier_reel(struct_processus *s_etat_processus,
 3802:         void *valeur_numerique, unsigned char type,
 3803:         long longueur, long longueur_champ,
 3804:         unsigned char format_sortie)
 3805: {
 3806:     real8                   mantisse;
 3807:     real8                   tampon_reel;
 3808: 
 3809:     integer8                tampon_entier;
 3810: 
 3811:     long                    correction;
 3812:     long                    exposant;
 3813:     long                    longueur_utile;
 3814:     long                    longueur_utile_limite;
 3815: 
 3816:     unsigned char           *chaine;
 3817:     unsigned char           format[16 + 1];
 3818:     unsigned char           mode[3 + 1];
 3819:     unsigned char           tampon[16 + 1];
 3820: 
 3821:     unsigned long           i;
 3822: 
 3823:     chaine = (unsigned char *) malloc((32 + 1) * sizeof(unsigned char));
 3824: 
 3825:     if (chaine == NULL)
 3826:     {
 3827:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 3828:         return(NULL);
 3829:     }
 3830: 
 3831:     if (type == 'R')
 3832:     {
 3833:         tampon_reel = *((real8 *) valeur_numerique);
 3834: 
 3835:         if (tampon_reel > ((real8) 0))
 3836:         {
 3837:             exposant = (long) floor(log10(tampon_reel));
 3838:         }
 3839:         else if (tampon_reel < ((real8) 0))
 3840:         {
 3841:             exposant = (long) floor(log10(-tampon_reel));
 3842:         }
 3843:         else
 3844:         {
 3845:             exposant = 0;
 3846:         }
 3847: 
 3848:         mantisse = (*((real8 *) valeur_numerique)) / pow(10, exposant);
 3849:     }
 3850:     else
 3851:     {
 3852:         tampon_entier = *((integer8 *) valeur_numerique);
 3853: 
 3854:         if (tampon_entier > ((integer8) 0))
 3855:         {
 3856:             exposant = (long) floor(log10(tampon_entier));
 3857:         }
 3858:         else if (tampon_entier < ((integer8) 0))
 3859:         {
 3860:             exposant = (long) floor(log10(-tampon_entier));
 3861:         }
 3862:         else
 3863:         {
 3864:             exposant = 0;
 3865:         }
 3866: 
 3867:         mantisse = (*((integer8 *) valeur_numerique)) / pow(10, exposant);
 3868:     }
 3869: 
 3870:     longueur_utile = longueur;
 3871:     longueur_utile_limite = 15;
 3872: 
 3873:     if (longueur_utile > longueur_utile_limite)
 3874:     {
 3875:         longueur_utile = longueur_utile_limite;
 3876:     }
 3877: 
 3878:     if (format_sortie == 'S')
 3879:     {
 3880:         strcpy(mode, "STD");
 3881:     }
 3882:     else if (format_sortie == 'C')
 3883:     {
 3884:         strcpy(mode, "SCI");
 3885:     }
 3886:     else if (format_sortie == 'F')
 3887:     {
 3888:         strcpy(mode, "FIX");
 3889:     }
 3890:     else
 3891:     {
 3892:         strcpy(mode, "ENG");
 3893:     }
 3894: 
 3895:     if ((strcmp(mode, "SCI") == 0) ||
 3896:             ((strcmp(mode, "STD") == 0) && ((exposant >
 3897:             longueur_utile_limite) ||
 3898:             (exposant < -longueur_utile_limite))) ||
 3899:             ((strcmp(mode, "FIX") == 0) &&
 3900:             ((exposant >= longueur_utile_limite) ||
 3901:             (exposant < -longueur_utile))))
 3902:     {
 3903:         chaine[0] = 0;
 3904:         format[0] = 0;
 3905: 
 3906:         if (strcmp(mode, "STD") == 0)
 3907:         {
 3908:             longueur_utile = longueur_utile_limite - 1;
 3909:         }
 3910: 
 3911:         sprintf(format, "%%.%luf", longueur_utile);
 3912:             
 3913:         sprintf(tampon, format, mantisse);
 3914:         strcpy(chaine, tampon);
 3915:         strcat(chaine, "E");
 3916:         sprintf(tampon, "%ld", exposant);
 3917:         strcat(chaine, tampon);
 3918:     }
 3919:     else if (strcmp(mode, "FIX") == 0)
 3920:     {
 3921:         chaine[0] = 0;
 3922:         format[0] = 0;
 3923: 
 3924:         if (longueur_utile + exposant >= longueur_utile_limite)
 3925:         {
 3926:             longueur_utile = longueur_utile_limite - (exposant + 1);
 3927:         }
 3928: 
 3929:         sprintf(format, "%%.%luf", longueur_utile);
 3930: 
 3931:         sprintf(tampon, format, (mantisse * pow(10, exposant)));
 3932:         strcpy(chaine, tampon);
 3933:     }
 3934:     else if (strcmp(mode, "ENG") == 0)
 3935:     {
 3936:         chaine[0] = 0;
 3937:         format[0] = 0;
 3938: 
 3939:         correction = labs(exposant) % 3;
 3940: 
 3941:         if (exposant < 0)
 3942:         {
 3943:             if (correction == 0)
 3944:             {
 3945:                 correction = 3;
 3946:             }
 3947: 
 3948:             correction =  3 - correction;
 3949:         }
 3950: 
 3951:         longueur_utile -= correction;
 3952:         sprintf(format, "%%.%luf", longueur_utile);
 3953: 
 3954:         sprintf(tampon, format, (mantisse * pow(10, correction)));
 3955:         strcpy(chaine, tampon);
 3956:         strcat(chaine, "E");
 3957:         sprintf(tampon, "%ld", (exposant - correction));
 3958:         strcat(chaine, tampon);
 3959:     }
 3960:     else
 3961:     {
 3962:         if (type == 'I')
 3963:         {
 3964:             chaine[0] = 0;
 3965:             sprintf(tampon, "%lld", *((integer8 *) valeur_numerique));
 3966:         }
 3967:         else
 3968:         {
 3969:             chaine[0] = 0;
 3970:             format[0] = 0;
 3971: 
 3972:             if (exposant >= 0)
 3973:             {
 3974:                 sprintf(format, "%%.%luf", (longueur_utile_limite - exposant
 3975:                         - 1));
 3976:             }
 3977:             else
 3978:             {
 3979:                 sprintf(format, "%%.%luf", longueur_utile_limite);
 3980:             }
 3981: 
 3982:             sprintf(tampon, format, *((real8 *) valeur_numerique));
 3983: 
 3984:             i = strlen(tampon) - 1;
 3985:             while(tampon[i] == '0')
 3986:             {
 3987:                 tampon[i] = 0;
 3988:                 i--;
 3989:             }
 3990: 
 3991:             if (ds_imposition_separateur_decimal == d_faux)
 3992:             {
 3993:                 i = strlen(tampon) - 1;
 3994:                 if (tampon[i] == '.')
 3995:                 {
 3996:                     tampon[i] = 0;
 3997:                 }
 3998:             }
 3999:         }
 4000: 
 4001:         strcpy(chaine, tampon);
 4002:     }
 4003: 
 4004:     if (longueur_champ >= 0)
 4005:     {
 4006:         if (strlen(chaine) > (size_t) longueur_champ)
 4007:         {
 4008:             for(i = 0; i < (unsigned long) longueur_champ; i++)
 4009:             {
 4010:                 chaine[i] = '*';
 4011:             }
 4012: 
 4013:             chaine[i] = d_code_fin_chaine;
 4014:         }
 4015:     }
 4016: 
 4017:     return(chaine);
 4018: }
 4019: 
 4020: 
 4021: /*
 4022: --------------------------------------------------------------------------------
 4023:   Mêmes fonctions mais pour les fichiers binaires
 4024: --------------------------------------------------------------------------------
 4025: */
 4026: 
 4027: unsigned char *
 4028: formateur_fichier_binaire_nombre(struct_processus *s_etat_processus,
 4029:         void *valeur_numerique, unsigned char type_entree,
 4030:         unsigned char type, long longueur, long *longueur_conversion)
 4031: {
 4032:     unsigned char               *chaine;
 4033: 
 4034:     switch(type)
 4035:     {
 4036:         case 'I' :
 4037:         {
 4038:             if (type_entree != type)
 4039:             {
 4040:                 (*s_etat_processus).erreur_execution = d_ex_representation;
 4041:                 return(NULL);
 4042:             }
 4043: 
 4044:             switch(longueur)
 4045:             {
 4046:                 case 1:
 4047:                 {
 4048:                     if ((*((integer8 *) valeur_numerique)) !=
 4049:                             ((integer1) (*((integer8 *) valeur_numerique))))
 4050:                     {
 4051:                         (*s_etat_processus).erreur_execution =
 4052:                                 d_ex_representation;
 4053:                         return(NULL);
 4054:                     }
 4055: 
 4056:                     if ((chaine = malloc(2 * sizeof(unsigned char))) == NULL)
 4057:                     {
 4058:                         (*s_etat_processus).erreur_systeme =
 4059:                                 d_es_allocation_memoire;
 4060:                         return(NULL);
 4061:                     }
 4062: 
 4063:                     (*longueur_conversion) = 2;
 4064:                     chaine[0] = 0x10;
 4065:                     chaine[1] = (*((integer8 *) valeur_numerique)) & 0xFF;
 4066:                     break;
 4067:                 }
 4068: 
 4069:                 case 2:
 4070:                 {
 4071:                     if ((*((integer8 *) valeur_numerique)) !=
 4072:                             ((integer2) (*((integer8 *) valeur_numerique))))
 4073:                     {
 4074:                         (*s_etat_processus).erreur_execution =
 4075:                                 d_ex_representation;
 4076:                         return(NULL);
 4077:                     }
 4078: 
 4079:                     if ((chaine = malloc(3 * sizeof(unsigned char))) == NULL)
 4080:                     {
 4081:                         (*s_etat_processus).erreur_systeme =
 4082:                                 d_es_allocation_memoire;
 4083:                         return(NULL);
 4084:                     }
 4085: 
 4086:                     (*longueur_conversion) = 3;
 4087:                     chaine[0] = 0x11;
 4088:                     chaine[1] = ((*((integer8 *) valeur_numerique)) >> 8)
 4089:                             & 0xFF;
 4090:                     chaine[2] = (*((integer8 *) valeur_numerique)) & 0xFF;
 4091:                     break;
 4092:                 }
 4093: 
 4094:                 case 4:
 4095:                 {
 4096:                     if ((*((integer8 *) valeur_numerique)) !=
 4097:                             ((integer2) (*((integer8 *) valeur_numerique))))
 4098:                     {
 4099:                         (*s_etat_processus).erreur_execution =
 4100:                                 d_ex_representation;
 4101:                         return(NULL);
 4102:                     }
 4103: 
 4104:                     if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL)
 4105:                     {
 4106:                         (*s_etat_processus).erreur_systeme =
 4107:                                 d_es_allocation_memoire;
 4108:                         return(NULL);
 4109:                     }
 4110: 
 4111:                     (*longueur_conversion) = 5;
 4112:                     chaine[0] = 0x12;
 4113:                     chaine[1] = ((*((integer8 *) valeur_numerique)) >> 24)
 4114:                             & 0xFF;
 4115:                     chaine[2] = ((*((integer8 *) valeur_numerique)) >> 16)
 4116:                             & 0xFF;
 4117:                     chaine[3] = ((*((integer8 *) valeur_numerique)) >> 8)
 4118:                             & 0xFF;
 4119:                     chaine[4] = (*((integer8 *) valeur_numerique)) & 0xFF;
 4120:                     break;
 4121:                 }
 4122: 
 4123:                 case 8:
 4124:                 {
 4125:                     if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL)
 4126:                     {
 4127:                         (*s_etat_processus).erreur_systeme =
 4128:                                 d_es_allocation_memoire;
 4129:                         return(NULL);
 4130:                     }
 4131: 
 4132:                     (*longueur_conversion) = 9;
 4133:                     chaine[0] = 0x13;
 4134:                     chaine[1] = ((*((integer8 *) valeur_numerique)) >> 56)
 4135:                             & 0xFF;
 4136:                     chaine[2] = ((*((integer8 *) valeur_numerique)) >> 48)
 4137:                             & 0xFF;
 4138:                     chaine[3] = ((*((integer8 *) valeur_numerique)) >> 40)
 4139:                             & 0xFF;
 4140:                     chaine[4] = ((*((integer8 *) valeur_numerique)) >> 32)
 4141:                             & 0xFF;
 4142:                     chaine[5] = ((*((integer8 *) valeur_numerique)) >> 24)
 4143:                             & 0xFF;
 4144:                     chaine[6] = ((*((integer8 *) valeur_numerique)) >> 16)
 4145:                             & 0xFF;
 4146:                     chaine[7] = ((*((integer8 *) valeur_numerique)) >> 8)
 4147:                             & 0xFF;
 4148:                     chaine[8] = (*((integer8 *) valeur_numerique)) & 0xFF;
 4149:                     break;
 4150:                 }
 4151: 
 4152:                 default :
 4153:                 {
 4154:                     (*s_etat_processus).erreur_execution =
 4155:                             d_ex_erreur_format_fichier;
 4156:                     return(NULL);
 4157:                 }
 4158:             }
 4159: 
 4160:             break;
 4161:         }
 4162: 
 4163:         case 'R' :
 4164:         {
 4165:             switch(longueur)
 4166:             {
 4167:                 case 4:
 4168:                 {
 4169:                     real8           valeur;
 4170:                     real8           vinf;
 4171:                     real8           vsup;
 4172: 
 4173:                     union
 4174:                     {
 4175:                         real4       r4;
 4176:                         integer4    i4;
 4177:                     }               eq4;
 4178: 
 4179:                     if (type_entree == 'R')
 4180:                     {
 4181:                         valeur = (*((real8 *) valeur_numerique));
 4182:                     }
 4183:                     else if (type_entree == 'I')
 4184:                     {
 4185:                         valeur = (*((integer8 *) valeur_numerique));
 4186:                     }
 4187:                     else
 4188:                     {
 4189:                         (*s_etat_processus).erreur_execution =
 4190:                                 d_ex_representation;
 4191:                         return(NULL);
 4192:                     }
 4193: 
 4194:                     if (valeur > 0)
 4195:                     {
 4196:                         vinf = nextafter(valeur, 0);
 4197:                         vsup = nextafter(valeur, valeur * 2);
 4198:                     }
 4199:                     else
 4200:                     {
 4201:                         vinf = nextafter(valeur, valeur * 2);
 4202:                         vsup = nextafter(valeur, 0);
 4203:                     }
 4204: 
 4205:                     if (!((vinf <= ((real4) valeur)) &&
 4206:                             (((real4) valeur) <= vsup)))
 4207:                     {
 4208:                         (*s_etat_processus).erreur_execution =
 4209:                                 d_ex_representation;
 4210:                         return(NULL);
 4211:                     }
 4212: 
 4213:                     if ((chaine = malloc(5 * sizeof(unsigned char))) == NULL)
 4214:                     {
 4215:                         (*s_etat_processus).erreur_systeme =
 4216:                                 d_es_allocation_memoire;
 4217:                         return(NULL);
 4218:                     }
 4219: 
 4220:                     eq4.r4 = (real4) valeur;
 4221:                     (*longueur_conversion) = 5;
 4222:                     chaine[0] = 0x14;
 4223:                     chaine[1] = (eq4.i4 >> 24) & 0xFF;
 4224:                     chaine[2] = (eq4.i4 >> 16) & 0xFF;
 4225:                     chaine[3] = (eq4.i4 >> 8) & 0xFF;
 4226:                     chaine[4] = eq4.i4 & 0xFF;
 4227:                     break;
 4228:                 }
 4229: 
 4230:                 case 8:
 4231:                 {
 4232:                     union
 4233:                     {
 4234:                         real8       r8;
 4235:                         integer8    i8;
 4236:                     }               eq8;
 4237: 
 4238:                     if ((chaine = malloc(9 * sizeof(unsigned char))) == NULL)
 4239:                     {
 4240:                         (*s_etat_processus).erreur_systeme =
 4241:                                 d_es_allocation_memoire;
 4242:                         return(NULL);
 4243:                     }
 4244: 
 4245:                     if (type_entree == 'I')
 4246:                     {
 4247:                         eq8.r8 = (*((integer8 *) valeur_numerique));
 4248:                     }
 4249:                     else if (type_entree == 'R')
 4250:                     {
 4251:                         eq8.r8 = (*((real8 *) valeur_numerique));
 4252:                     }
 4253:                     else
 4254:                     {
 4255:                         (*s_etat_processus).erreur_execution =
 4256:                                 d_ex_representation;
 4257:                         return(NULL);
 4258:                     }
 4259: 
 4260:                     (*longueur_conversion) = 9;
 4261:                     chaine[0] = 0x15;
 4262:                     chaine[1] = (eq8.i8 >> 56) & 0xFF;
 4263:                     chaine[2] = (eq8.i8 >> 48) & 0xFF;
 4264:                     chaine[3] = (eq8.i8 >> 40) & 0xFF;
 4265:                     chaine[4] = (eq8.i8 >> 32) & 0xFF;
 4266:                     chaine[5] = (eq8.i8 >> 24) & 0xFF;
 4267:                     chaine[6] = (eq8.i8 >> 16) & 0xFF;
 4268:                     chaine[7] = (eq8.i8 >> 8) & 0xFF;
 4269:                     chaine[8] = eq8.i8 & 0xFF;
 4270:                     break;
 4271:                 }
 4272: 
 4273:                 default :
 4274:                 {
 4275:                     (*s_etat_processus).erreur_execution =
 4276:                             d_ex_erreur_format_fichier;
 4277:                     return(NULL);
 4278:                 }
 4279:             }
 4280: 
 4281:             break;
 4282:         }
 4283: 
 4284:         case 'C' :
 4285:         {
 4286:             switch(longueur)
 4287:             {
 4288:                 case 8:
 4289:                 {
 4290:                     unsigned char       *partie_reelle;
 4291:                     unsigned char       *partie_imaginaire;
 4292: 
 4293:                     long                limag;
 4294:                     long                lreel;
 4295: 
 4296:                     real8               zero;
 4297: 
 4298:                     if (type_entree == 'I')
 4299:                     {
 4300:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4301:                                 s_etat_processus, &(*((integer8 *)
 4302:                                 valeur_numerique)), 'I', 'R', 4,
 4303:                                 &lreel)) == NULL)
 4304:                         {
 4305:                             return(NULL);
 4306:                         }
 4307: 
 4308:                         zero = 0;
 4309: 
 4310:                         if ((partie_imaginaire =
 4311:                                 formateur_fichier_binaire_nombre(
 4312:                                 s_etat_processus, &zero, 'R', 'R', 4,
 4313:                                 &limag)) == NULL)
 4314:                         {
 4315:                             free(partie_reelle);
 4316:                             return(NULL);
 4317:                         }
 4318:                     }
 4319:                     else if (type_entree == 'R')
 4320:                     {
 4321:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4322:                                 s_etat_processus, &(*((real8 *)
 4323:                                 valeur_numerique)), 'R', 'R', 4,
 4324:                                 &lreel)) == NULL)
 4325:                         {
 4326:                             return(NULL);
 4327:                         }
 4328: 
 4329:                         zero = 0;
 4330: 
 4331:                         if ((partie_imaginaire =
 4332:                                 formateur_fichier_binaire_nombre(
 4333:                                 s_etat_processus, &zero, 'R', 'R', 4,
 4334:                                 &limag)) == NULL)
 4335:                         {
 4336:                             free(partie_reelle);
 4337:                             return(NULL);
 4338:                         }
 4339:                     }
 4340:                     else if (type_entree == 'C')
 4341:                     {
 4342:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4343:                                 s_etat_processus, &((*((complex16 *)
 4344:                                 valeur_numerique)).partie_reelle), 'R', 'R', 4,
 4345:                                 &lreel)) == NULL)
 4346:                         {
 4347:                             return(NULL);
 4348:                         }
 4349: 
 4350:                         if ((partie_imaginaire =
 4351:                                 formateur_fichier_binaire_nombre(
 4352:                                 s_etat_processus, &((*((complex16 *)
 4353:                                 valeur_numerique)).partie_imaginaire),
 4354:                                 'R', 'R', 4, &limag)) == NULL)
 4355:                         {
 4356:                             free(partie_reelle);
 4357:                             return(NULL);
 4358:                         }
 4359:                     }
 4360:                     else
 4361:                     {
 4362:                         (*s_etat_processus).erreur_execution =
 4363:                                 d_ex_erreur_format_fichier;
 4364:                         return(NULL);
 4365:                     }
 4366: 
 4367:                     if ((chaine = malloc((lreel + limag - 1) *
 4368:                             sizeof(unsigned char))) == NULL)
 4369:                     {
 4370:                         free(partie_reelle);
 4371:                         free(partie_imaginaire);
 4372: 
 4373:                         (*s_etat_processus).erreur_systeme =
 4374:                                 d_es_allocation_memoire;
 4375:                         return(NULL);
 4376:                     }
 4377: 
 4378:                     chaine[0] = 0x18;
 4379:                     memcpy(chaine + 1, partie_reelle + 1, lreel - 1);
 4380:                     memcpy(chaine + lreel, partie_imaginaire + 1, limag - 1);
 4381:                     (*longueur_conversion) = lreel + limag - 1;
 4382: 
 4383:                     free(partie_reelle);
 4384:                     free(partie_imaginaire);
 4385:                     break;
 4386:                 }
 4387: 
 4388:                 case 16:
 4389:                 {
 4390:                     unsigned char       *partie_reelle;
 4391:                     unsigned char       *partie_imaginaire;
 4392: 
 4393:                     long                limag;
 4394:                     long                lreel;
 4395:                     real8               zero;
 4396: 
 4397:                     if (type_entree == 'I')
 4398:                     {
 4399:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4400:                                 s_etat_processus, &(*((integer8 *)
 4401:                                 valeur_numerique)), 'I', 'R', 8,
 4402:                                 &lreel)) == NULL)
 4403:                         {
 4404:                             return(NULL);
 4405:                         }
 4406: 
 4407:                         zero = 0;
 4408: 
 4409:                         if ((partie_imaginaire =
 4410:                                 formateur_fichier_binaire_nombre(
 4411:                                 s_etat_processus, &zero, 'R', 'R', 8,
 4412:                                 &limag)) == NULL)
 4413:                         {
 4414:                             free(partie_reelle);
 4415:                             return(NULL);
 4416:                         }
 4417:                     }
 4418:                     else if (type_entree == 'R')
 4419:                     {
 4420:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4421:                                 s_etat_processus, &(*((real8 *)
 4422:                                 valeur_numerique)), 'R', 'R', 8,
 4423:                                 &lreel)) == NULL)
 4424:                         {
 4425:                             return(NULL);
 4426:                         }
 4427: 
 4428:                         zero = 0;
 4429: 
 4430:                         if ((partie_imaginaire =
 4431:                                 formateur_fichier_binaire_nombre(
 4432:                                 s_etat_processus, &zero, 'R', 'R', 8,
 4433:                                 &limag)) == NULL)
 4434:                         {
 4435:                             free(partie_reelle);
 4436:                             return(NULL);
 4437:                         }
 4438:                     }
 4439:                     else if (type_entree == 'C')
 4440:                     {
 4441:                         if ((partie_reelle = formateur_fichier_binaire_nombre(
 4442:                                 s_etat_processus, &((*((complex16 *)
 4443:                                 valeur_numerique)).partie_reelle), 'R', 'R', 8,
 4444:                                 &lreel)) == NULL)
 4445:                         {
 4446:                             return(NULL);
 4447:                         }
 4448: 
 4449:                         if ((partie_imaginaire =
 4450:                                 formateur_fichier_binaire_nombre(
 4451:                                 s_etat_processus, &((*((complex16 *)
 4452:                                 valeur_numerique)).partie_imaginaire),
 4453:                                 'R', 'R', 8, &limag)) == NULL)
 4454:                         {
 4455:                             free(partie_reelle);
 4456:                             return(NULL);
 4457:                         }
 4458:                     }
 4459:                     else
 4460:                     {
 4461:                         (*s_etat_processus).erreur_execution =
 4462:                                 d_ex_erreur_format_fichier;
 4463:                         return(NULL);
 4464:                     }
 4465: 
 4466:                     if ((chaine = malloc((lreel + limag - 1) *
 4467:                             sizeof(unsigned char))) == NULL)
 4468:                     {
 4469:                         free(partie_reelle);
 4470:                         free(partie_imaginaire);
 4471: 
 4472:                         (*s_etat_processus).erreur_systeme =
 4473:                                 d_es_allocation_memoire;
 4474:                         return(NULL);
 4475:                     }
 4476: 
 4477:                     chaine[0] = 0x19;
 4478:                     memcpy(chaine + 1, partie_reelle + 1, lreel - 1);
 4479:                     memcpy(chaine + lreel, partie_imaginaire + 1, limag - 1);
 4480:                     (*longueur_conversion) = lreel + limag - 1;
 4481: 
 4482:                     free(partie_reelle);
 4483:                     free(partie_imaginaire);
 4484:                     break;
 4485:                 }
 4486: 
 4487:                 default :
 4488:                 {
 4489:                     (*s_etat_processus).erreur_execution =
 4490:                             d_ex_erreur_format_fichier;
 4491:                     return(NULL);
 4492:                 }
 4493:             }
 4494: 
 4495:             break;
 4496:         }
 4497: 
 4498:         default :
 4499:         {
 4500:             (*s_etat_processus).erreur_execution = d_ex_erreur_format_fichier;
 4501:             return(NULL);
 4502:         }
 4503:     }
 4504: 
 4505:     return(chaine);
 4506: }
 4507: 
 4508: 
 4509: /*
 4510: ================================================================================
 4511:   Routines de conversion d'un objet binaire en struct_objet *
 4512: ================================================================================
 4513:   Entrées : pointeur sur un void *. Si longueur_buffer est strictement inférieur
 4514:             à zéro, il s'agit d'un file * sinon d'un buffer de type unsigned
 4515:             char *.
 4516: --------------------------------------------------------------------------------
 4517:   Sorties : pointeur sur un struct_objet nouvellement alloué
 4518: --------------------------------------------------------------------------------
 4519:   Effets de bord : néant
 4520: ================================================================================
 4521: */
 4522: 
 4523: struct_objet *
 4524: lecture_fichier_non_formate(struct_processus *s_etat_processus,
 4525:         void *argument, integer8 longueur_buffer, logical1 recursivite)
 4526: {
 4527:     file                        *fichier;
 4528: 
 4529:     int                         j;
 4530: 
 4531:     integer8                    i;
 4532:     integer8                    longueur;
 4533: 
 4534:     struct_liste_chainee        *l_element_courant;
 4535: 
 4536:     struct_objet                *s_objet;
 4537:     struct_objet                *s_objet_elementaire;
 4538: 
 4539:     unsigned char               octets[8];
 4540:     unsigned char               *buffer;
 4541:     unsigned char               *flux;
 4542:     unsigned char               *ptr;
 4543: 
 4544:     size_t                      deplacement;
 4545: 
 4546:     if (longueur_buffer < 0)
 4547:     {
 4548:         fichier = argument;
 4549:         buffer = NULL;
 4550:         ptr = NULL;
 4551:     }
 4552:     else
 4553:     {
 4554:         buffer = argument;
 4555:         ptr = buffer;
 4556:         fichier = NULL;
 4557:     }
 4558: 
 4559:     if (longueur_buffer < 0)
 4560:     {
 4561:         if (fread(octets, (size_t) sizeof(unsigned char),
 4562:                 1, fichier) != 1)
 4563:         {
 4564:             if (feof(fichier))
 4565:             {
 4566:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 4567:             }
 4568:             else
 4569:             {
 4570:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 4571:             }
 4572: 
 4573:             return(NULL);
 4574:         }
 4575:     }
 4576:     else
 4577:     {
 4578:         if ((longueur_buffer - (ptr - buffer)) >= 1)
 4579:         {
 4580:             octets[0] = *ptr++;
 4581:         }
 4582:         else
 4583:         {
 4584:             (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 4585:             return(NULL);
 4586:         }
 4587:     }
 4588: 
 4589:     switch(octets[0] & 0xF0)
 4590:     {
 4591:         case 0x10:  // Scalaire
 4592:         {
 4593:             switch(octets[0] & 0x0C)
 4594:             {
 4595:                 case 0x00:  // Entier
 4596:                 {
 4597:                     switch(octets[0] & 0x03)
 4598:                     {
 4599:                         case 0x00:  // integer*1
 4600:                         {
 4601:                             deplacement = 1;
 4602:                             break;
 4603:                         }
 4604: 
 4605:                         case 0x01:  // integer*2
 4606:                         {
 4607:                             deplacement = 2;
 4608:                             break;
 4609:                         }
 4610: 
 4611:                         case 0x02:  // integer*4
 4612:                         {
 4613:                             deplacement = 4;
 4614:                             break;
 4615:                         }
 4616: 
 4617:                         case 0x03:  // integer*8
 4618:                         {
 4619:                             deplacement = 8;
 4620:                             break;
 4621:                         }
 4622:                     }
 4623: 
 4624:                     if (longueur_buffer < 0)
 4625:                     {
 4626:                         if (fread(octets, (size_t) sizeof(unsigned char),
 4627:                                 deplacement, fichier) != deplacement)
 4628:                         {
 4629:                             if (feof(fichier))
 4630:                             {
 4631:                                 (*s_etat_processus).erreur_execution =
 4632:                                         d_ex_syntaxe;
 4633:                             }
 4634:                             else
 4635:                             {
 4636:                                 (*s_etat_processus).erreur_systeme =
 4637:                                         d_es_erreur_fichier;
 4638:                             }
 4639: 
 4640:                             return(NULL);
 4641:                         }
 4642:                     }
 4643:                     else
 4644:                     {
 4645:                         if ((longueur_buffer - (ptr - buffer)) >=
 4646:                                 (ssize_t) deplacement)
 4647:                         {
 4648:                             for(i = 0; i < (signed) deplacement; i++)
 4649:                             {
 4650:                                 octets[i] = *ptr++;
 4651:                             }
 4652:                         }
 4653:                         else
 4654:                         {
 4655:                             (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 4656:                             return(NULL);
 4657:                         }
 4658:                     }
 4659: 
 4660:                     if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
 4661:                     {
 4662:                         return(NULL);
 4663:                     }
 4664: 
 4665:                     (*((integer8 *) (*s_objet).objet)) = 0;
 4666: 
 4667:                     for(i = 0; i < (signed) deplacement; i++)
 4668:                     {
 4669:                         (*((integer8 *) (*s_objet).objet)) |=
 4670:                                 octets[i] << (8 * ((deplacement - 1) - i));
 4671:                     }
 4672: 
 4673:                     break;
 4674:                 }
 4675: 
 4676:                 case 0x04:  // Réel
 4677:                 {
 4678:                     switch(octets[0] & 0x03)
 4679:                     {
 4680:                         case 0x00:  // real*4
 4681:                         {
 4682:                             deplacement = 4;
 4683:                             break;
 4684:                         }
 4685: 
 4686:                         case 0x01:  // real*8
 4687:                         {
 4688:                             deplacement = 8;
 4689:                             break;
 4690:                         }
 4691: 
 4692:                         default:
 4693:                         {
 4694:                             (*s_etat_processus).erreur_execution =
 4695:                                     d_ex_syntaxe;
 4696:                             return(NULL);
 4697:                         }
 4698:                     }
 4699: 
 4700:                     if (longueur_buffer < 0)
 4701:                     {
 4702:                         if (fread(octets, (size_t) sizeof(unsigned char),
 4703:                                 deplacement, fichier) != deplacement)
 4704:                         {
 4705:                             if (feof(fichier))
 4706:                             {
 4707:                                 (*s_etat_processus).erreur_execution =
 4708:                                         d_ex_syntaxe;
 4709:                             }
 4710:                             else
 4711:                             {
 4712:                                 (*s_etat_processus).erreur_systeme =
 4713:                                         d_es_erreur_fichier;
 4714:                             }
 4715: 
 4716:                             return(NULL);
 4717:                         }
 4718:                     }
 4719:                     else
 4720:                     {
 4721:                         if ((longueur_buffer - (ptr - buffer)) >=
 4722:                                 (ssize_t) deplacement)
 4723:                         {
 4724:                             for(i = 0; i < (signed) deplacement; i++)
 4725:                             {
 4726:                                 octets[i] = *ptr++;
 4727:                             }
 4728:                         }
 4729:                         else
 4730:                         {
 4731:                             (*s_etat_processus).erreur_execution =
 4732:                                     d_ex_syntaxe;
 4733:                             return(NULL);
 4734:                         }
 4735:                     }
 4736: 
 4737:                     if ((s_objet = allocation(s_etat_processus, REL)) == NULL)
 4738:                     {
 4739:                         return(NULL);
 4740:                     }
 4741: 
 4742:                     if (deplacement == 4)
 4743:                     {
 4744:                         union
 4745:                         {
 4746:                             real4       r4;
 4747:                             integer4    i4;
 4748:                         } eq4;
 4749: 
 4750:                         eq4.i4 = 0;
 4751: 
 4752:                         for(i = 0; i < (signed) deplacement; i++)
 4753:                         {
 4754:                             eq4.i4 |= ((integer4) octets[i]) <<
 4755:                                     (8 * ((deplacement - 1) - i));
 4756:                         }
 4757: 
 4758:                         (*((real8 *) (*s_objet).objet)) = (real8) eq4.r4;
 4759:                     }
 4760:                     else
 4761:                     {
 4762:                         union
 4763:                         {
 4764:                             real8       r8;
 4765:                             integer8    i8;
 4766:                         } eq8;
 4767: 
 4768:                         eq8.i8 = 0;
 4769: 
 4770:                         for(i = 0; i < (signed) deplacement; i++)
 4771:                         {
 4772:                             eq8.i8 |= ((integer8) octets[i]) <<
 4773:                                     (8 * ((deplacement - 1) - i));
 4774:                         }
 4775: 
 4776:                         (*((real8 *) (*s_objet).objet)) = (real8) eq8.r8;
 4777:                     }
 4778: 
 4779:                     break;
 4780:                 }
 4781: 
 4782:                 case 0x08:  // Complexe
 4783:                 {
 4784:                     switch(octets[0] & 0x03)
 4785:                     {
 4786:                         case 0x00:  // complex*8
 4787:                         {
 4788:                             deplacement = 4;
 4789:                             break;
 4790:                         }
 4791: 
 4792:                         case 0x01:  // complex*16
 4793:                         {
 4794:                             deplacement = 8;
 4795:                             break;
 4796:                         }
 4797: 
 4798:                         default:
 4799:                         {
 4800:                             (*s_etat_processus).erreur_execution =
 4801:                                     d_ex_syntaxe;
 4802:                             return(NULL);
 4803:                         }
 4804:                     }
 4805: 
 4806:                     if ((s_objet = allocation(s_etat_processus, CPL)) == NULL)
 4807:                     {
 4808:                         return(NULL);
 4809:                     }
 4810: 
 4811:                     for(j = 0; j < 2; j++)
 4812:                     {
 4813:                         if (longueur_buffer < 0)
 4814:                         {
 4815:                             if (fread(octets, (size_t) sizeof(unsigned char),
 4816:                                     deplacement, fichier) != deplacement)
 4817:                             {
 4818:                                 liberation(s_etat_processus, s_objet);
 4819: 
 4820:                                 if (feof(fichier))
 4821:                                 {
 4822:                                     (*s_etat_processus).erreur_execution =
 4823:                                             d_ex_syntaxe;
 4824:                                 }
 4825:                                 else
 4826:                                 {
 4827:                                     (*s_etat_processus).erreur_systeme =
 4828:                                             d_es_erreur_fichier;
 4829:                                 }
 4830: 
 4831:                                 return(NULL);
 4832:                             }
 4833:                         }
 4834:                         else
 4835:                         {
 4836:                             if ((longueur_buffer - (ptr - buffer)) >=
 4837:                                     (ssize_t) deplacement)
 4838:                             {
 4839:                                 for(i = 0; i < (signed) deplacement; i++)
 4840:                                 {
 4841:                                     octets[i] = *ptr++;
 4842:                                 }
 4843:                             }
 4844:                             else
 4845:                             {
 4846:                                 liberation(s_etat_processus, s_objet);
 4847:                                 (*s_etat_processus).erreur_execution =
 4848:                                         d_ex_syntaxe;
 4849:                                 return(NULL);
 4850:                             }
 4851:                         }
 4852: 
 4853:                         if (deplacement == 4)
 4854:                         {
 4855:                             union
 4856:                             {
 4857:                                 real4       r4;
 4858:                                 integer4    i4;
 4859:                             } eq4;
 4860: 
 4861:                             eq4.i4 = 0;
 4862: 
 4863:                             for(i = 0; i < (signed) deplacement; i++)
 4864:                             {
 4865:                                 eq4.i4 |= ((integer4) octets[i]) <<
 4866:                                         (8 * ((deplacement - 1) - i));
 4867:                             }
 4868: 
 4869:                             if (j == 0)
 4870:                             {
 4871:                                 (*((complex16 *) (*s_objet).objet))
 4872:                                         .partie_reelle = (real8) eq4.r4;
 4873:                             }
 4874:                             else
 4875:                             {
 4876:                                 (*((complex16 *) (*s_objet).objet))
 4877:                                         .partie_imaginaire = (real8) eq4.r4;
 4878:                             }
 4879:                         }
 4880:                         else
 4881:                         {
 4882:                             union
 4883:                             {
 4884:                                 real8       r8;
 4885:                                 integer8    i8;
 4886:                             } eq8;
 4887: 
 4888:                             eq8.i8 = 0;
 4889: 
 4890:                             for(i = 0; i < (signed) deplacement; i++)
 4891:                             {
 4892:                                 eq8.i8 |= ((integer8) octets[i]) <<
 4893:                                         (8 * ((deplacement - 1) - i));
 4894:                             }
 4895: 
 4896:                             if (j == 0)
 4897:                             {
 4898:                                 (*((complex16 *) (*s_objet).objet))
 4899:                                         .partie_reelle = (real8) eq8.r8;
 4900:                             }
 4901:                             else
 4902:                             {
 4903:                                 (*((complex16 *) (*s_objet).objet))
 4904:                                         .partie_imaginaire = (real8) eq8.r8;
 4905:                             }
 4906:                         }
 4907:                     }
 4908: 
 4909:                     break;
 4910:                 }
 4911: 
 4912:                 default:
 4913:                 {
 4914:                     (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 4915:                     return(NULL);
 4916:                 }
 4917:             }
 4918: 
 4919:             break;
 4920:         }
 4921: 
 4922:         case 0x40:  // Liste
 4923:         {
 4924:             if ((octets[0] & 0x08) == 0)    // Longueur sur 6 bits
 4925:             {
 4926:                 longueur = (octets[0] & 0x07);
 4927:             }
 4928:             else
 4929:             {
 4930:                 switch(octets[0] & 0x07)
 4931:                 {
 4932:                     case 0x00:          // Longueur sur 8 bits
 4933:                     {
 4934:                         if (longueur_buffer < 0)
 4935:                         {
 4936:                             if (fread(octets, (size_t) sizeof(unsigned char),
 4937:                                     1, fichier) != 1)
 4938:                             {
 4939:                                 if (feof(fichier))
 4940:                                 {
 4941:                                     (*s_etat_processus).erreur_execution =
 4942:                                             d_ex_syntaxe;
 4943:                                 }
 4944:                                 else
 4945:                                 {
 4946:                                     (*s_etat_processus).erreur_systeme =
 4947:                                             d_es_erreur_fichier;
 4948:                                 }
 4949: 
 4950:                                 return(NULL);
 4951:                             }
 4952:                         }
 4953:                         else
 4954:                         {
 4955:                             if ((longueur_buffer - (ptr - buffer)) >= 1)
 4956:                             {
 4957:                                 octets[0] = *ptr++;
 4958:                             }
 4959:                             else
 4960:                             {
 4961:                                 (*s_etat_processus).erreur_execution =
 4962:                                         d_ex_syntaxe;
 4963:                                 return(NULL);
 4964:                             }
 4965:                         }
 4966: 
 4967:                         longueur = octets[0];
 4968:                         break;
 4969:                     }
 4970: 
 4971:                     case 0x01:          // Longueur sur 16 bits
 4972:                     {
 4973:                         if (longueur_buffer < 0)
 4974:                         {
 4975:                             if (fread(octets, (size_t) sizeof(unsigned char),
 4976:                                     2, fichier) != 2)
 4977:                             {
 4978:                                 if (feof(fichier))
 4979:                                 {
 4980:                                     (*s_etat_processus).erreur_execution =
 4981:                                             d_ex_syntaxe;
 4982:                                 }
 4983:                                 else
 4984:                                 {
 4985:                                     (*s_etat_processus).erreur_systeme =
 4986:                                             d_es_erreur_fichier;
 4987:                                 }
 4988: 
 4989:                                 return(NULL);
 4990:                             }
 4991:                         }
 4992:                         else
 4993:                         {
 4994:                             if ((longueur_buffer - (ptr - buffer)) >= 2)
 4995:                             {
 4996:                                 for(j = 0; j < 2; octets[j++] = *ptr++);
 4997:                             }
 4998:                             else
 4999:                             {
 5000:                                 (*s_etat_processus).erreur_execution =
 5001:                                         d_ex_syntaxe;
 5002:                                 return(NULL);
 5003:                             }
 5004:                         }
 5005: 
 5006:                         longueur = (((integer8) (octets[0])) << 8)
 5007:                                 | ((integer8) (octets[1]));
 5008:                         break;
 5009:                     }
 5010: 
 5011:                     case 0x02:          // Longueur sur 32 bits
 5012:                     {
 5013:                         if (longueur_buffer < 0)
 5014:                         {
 5015:                             if (fread(octets, (size_t) sizeof(unsigned char),
 5016:                                     4, fichier) != 4)
 5017:                             {
 5018:                                 if (feof(fichier))
 5019:                                 {
 5020:                                     (*s_etat_processus).erreur_execution =
 5021:                                             d_ex_syntaxe;
 5022:                                 }
 5023:                                 else
 5024:                                 {
 5025:                                     (*s_etat_processus).erreur_systeme =
 5026:                                             d_es_erreur_fichier;
 5027:                                 }
 5028: 
 5029:                                 return(NULL);
 5030:                             }
 5031:                         }
 5032:                         else
 5033:                         {
 5034:                             if ((longueur_buffer - (ptr - buffer)) >= 4)
 5035:                             {
 5036:                                 for(j = 0; j < 4; octets[j++] = *ptr++);
 5037:                             }
 5038:                             else
 5039:                             {
 5040:                                 (*s_etat_processus).erreur_execution =
 5041:                                         d_ex_syntaxe;
 5042:                                 return(NULL);
 5043:                             }
 5044:                         }
 5045: 
 5046:                         longueur = (((integer8) (octets[0])) << 24)
 5047:                                 | (((integer8) (octets[1])) << 16)
 5048:                                 | (((integer8) (octets[2])) << 8)
 5049:                                 | ((integer8) (octets[3]));
 5050:                         break;
 5051:                     }
 5052: 
 5053:                     case 0x03:          // Longueur sur 64 bits
 5054:                     {
 5055:                         if (longueur_buffer < 0)
 5056:                         {
 5057:                             if (fread(octets, (size_t) sizeof(unsigned char),
 5058:                                     8, fichier) != 8)
 5059:                             {
 5060:                                 if (feof(fichier))
 5061:                                 {
 5062:                                     (*s_etat_processus).erreur_execution =
 5063:                                             d_ex_syntaxe;
 5064:                                 }
 5065:                                 else
 5066:                                 {
 5067:                                     (*s_etat_processus).erreur_systeme =
 5068:                                             d_es_erreur_fichier;
 5069:                                 }
 5070: 
 5071:                                 return(NULL);
 5072:                             }
 5073:                         }
 5074:                         else
 5075:                         {
 5076:                             if ((longueur_buffer - (ptr - buffer)) >= 8)
 5077:                             {
 5078:                                 for(j = 0; j < 8; octets[j++] = *ptr++);
 5079:                             }
 5080:                             else
 5081:                             {
 5082:                                 (*s_etat_processus).erreur_execution =
 5083:                                         d_ex_syntaxe;
 5084:                                 return(NULL);
 5085:                             }
 5086:                         }
 5087: 
 5088:                         longueur = (((integer8) (octets[0])) << 56)
 5089:                                 | (((integer8) (octets[1])) << 48)
 5090:                                 | (((integer8) (octets[2])) << 40)
 5091:                                 | (((integer8) (octets[3])) << 32)
 5092:                                 | (((integer8) (octets[4])) << 24)
 5093:                                 | (((integer8) (octets[5])) << 16)
 5094:                                 | (((integer8) (octets[6])) << 8)
 5095:                                 | ((integer8) (octets[7]));
 5096:                         break;
 5097:                     }
 5098: 
 5099:                     default:
 5100:                     {
 5101:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 5102:                         return(NULL);
 5103:                     }
 5104:                 }
 5105:             }
 5106: 
 5107:             if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
 5108:             {
 5109:                 return(NULL);
 5110:             }
 5111: 
 5112:             l_element_courant = NULL;
 5113: 
 5114:             for(i = 0; i < longueur; i++)
 5115:             {
 5116:                 // Lecture des éléments de la liste.
 5117: 
 5118:                 if (longueur_buffer < 0)
 5119:                 {
 5120:                     if ((s_objet_elementaire = lecture_fichier_non_formate(
 5121:                             s_etat_processus, fichier, longueur_buffer, d_vrai))
 5122:                             == NULL)
 5123:                     {
 5124:                         liberation(s_etat_processus, s_objet);
 5125:                         return(NULL);
 5126:                     }
 5127:                 }
 5128:                 else
 5129:                 {
 5130:                     if ((s_objet_elementaire = lecture_fichier_non_formate(
 5131:                             s_etat_processus, &ptr,
 5132:                             longueur_buffer - (ptr - buffer), d_vrai)) == NULL)
 5133:                     {
 5134:                         liberation(s_etat_processus, s_objet);
 5135:                         return(NULL);
 5136:                     }
 5137:                 }
 5138: 
 5139:                 if (l_element_courant == NULL)
 5140:                 {
 5141:                     if (((*s_objet).objet = allocation_maillon(
 5142:                             s_etat_processus)) == NULL)
 5143:                     {
 5144:                         liberation(s_etat_processus, s_objet_elementaire);
 5145:                         liberation(s_etat_processus, s_objet);
 5146:                         return(NULL);
 5147:                     }
 5148: 
 5149:                     l_element_courant = (*s_objet).objet;
 5150:                 }
 5151:                 else
 5152:                 {
 5153:                     if (((*l_element_courant).suivant = allocation_maillon(
 5154:                             s_etat_processus)) == NULL)
 5155:                     {
 5156:                         liberation(s_etat_processus, s_objet_elementaire);
 5157:                         liberation(s_etat_processus, s_objet);
 5158:                         return(NULL);
 5159:                     }
 5160: 
 5161:                     l_element_courant = (*l_element_courant).suivant;
 5162:                 }
 5163: 
 5164:                 (*l_element_courant).donnee = s_objet_elementaire;
 5165:                 (*l_element_courant).suivant = NULL;
 5166:             }
 5167: 
 5168:             break;
 5169:         }
 5170: 
 5171:         case 0x80:  // Chaîne de caractères
 5172:         {
 5173:             if ((octets[0] & 0x08) == 0)    // Longueur sur 6 bits
 5174:             {
 5175:                 longueur = (octets[0] & 0x07);
 5176:             }
 5177:             else
 5178:             {
 5179:                 switch(octets[0] & 0x07)
 5180:                 {
 5181:                     case 0x00:          // Longueur sur 8 bits
 5182:                     {
 5183:                         if (longueur_buffer < 0)
 5184:                         {
 5185:                             if (fread(octets, (size_t) sizeof(unsigned char),
 5186:                                     1, fichier) != 1)
 5187:                             {
 5188:                                 if (feof(fichier))
 5189:                                 {
 5190:                                     (*s_etat_processus).erreur_execution =
 5191:                                             d_ex_syntaxe;
 5192:                                 }
 5193:                                 else
 5194:                                 {
 5195:                                     (*s_etat_processus).erreur_systeme =
 5196:                                             d_es_erreur_fichier;
 5197:                                 }
 5198: 
 5199:                                 return(NULL);
 5200:                             }
 5201:                         }
 5202:                         else
 5203:                         {
 5204:                             if ((longueur_buffer - (ptr - buffer)) >= 1)
 5205:                             {
 5206:                                 octets[0] = *ptr++;
 5207:                             }
 5208:                             else
 5209:                             {
 5210:                                 (*s_etat_processus).erreur_execution =
 5211:                                         d_ex_syntaxe;
 5212:                                 return(NULL);
 5213:                             }
 5214:                         }
 5215: 
 5216:                         longueur = octets[0];
 5217:                         break;
 5218:                     }
 5219: 
 5220:                     case 0x01:          // Longueur sur 16 bits
 5221:                     {
 5222:                         if (longueur_buffer < 0)
 5223:                         {
 5224:                             if (fread(octets, (size_t) sizeof(unsigned char),
 5225:                                     2, fichier) != 2)
 5226:                             {
 5227:                                 if (feof(fichier))
 5228:                                 {
 5229:                                     (*s_etat_processus).erreur_execution =
 5230:                                             d_ex_syntaxe;
 5231:                                 }
 5232:                                 else
 5233:                                 {
 5234:                                     (*s_etat_processus).erreur_systeme =
 5235:                                             d_es_erreur_fichier;
 5236:                                 }
 5237: 
 5238:                                 return(NULL);
 5239:                             }
 5240:                         }
 5241:                         else
 5242:                         {
 5243:                             if ((longueur_buffer - (ptr - buffer)) >= 2)
 5244:                             {
 5245:                                 for(j = 0; j < 2; octets[j++] = *ptr++);
 5246:                             }
 5247:                             else
 5248:                             {
 5249:                                 (*s_etat_processus).erreur_execution =
 5250:                                         d_ex_syntaxe;
 5251:                                 return(NULL);
 5252:                             }
 5253:                         }
 5254: 
 5255:                         longueur = (((integer8) (octets[0])) << 8)
 5256:                                 | ((integer8) (octets[1]));
 5257:                         break;
 5258:                     }
 5259: 
 5260:                     case 0x02:          // Longueur sur 32 bits
 5261:                     {
 5262:                         if (longueur_buffer < 0)
 5263:                         {
 5264:                             if (fread(octets, (size_t) sizeof(unsigned char),
 5265:                                     4, fichier) != 4)
 5266:                             {
 5267:                                 if (feof(fichier))
 5268:                                 {
 5269:                                     (*s_etat_processus).erreur_execution =
 5270:                                             d_ex_syntaxe;
 5271:                                 }
 5272:                                 else
 5273:                                 {
 5274:                                     (*s_etat_processus).erreur_systeme =
 5275:                                             d_es_erreur_fichier;
 5276:                                 }
 5277: 
 5278:                                 return(NULL);
 5279:                             }
 5280:                         }
 5281:                         else
 5282:                         {
 5283:                             if ((longueur_buffer - (ptr - buffer)) >= 4)
 5284:                             {
 5285:                                 for(j = 0; j < 4; octets[j++] = *ptr++);
 5286:                             }
 5287:                             else
 5288:                             {
 5289:                                 (*s_etat_processus).erreur_execution =
 5290:                                         d_ex_syntaxe;
 5291:                                 return(NULL);
 5292:                             }
 5293:                         }
 5294: 
 5295:                         longueur = (((integer8) (octets[0])) << 24)
 5296:                                 | (((integer8) (octets[1])) << 16)
 5297:                                 | (((integer8) (octets[2])) << 8)
 5298:                                 | ((integer8) (octets[3]));
 5299:                         break;
 5300:                     }
 5301: 
 5302:                     case 0x03:          // Longueur sur 64 bits
 5303:                     {
 5304:                         if (longueur_buffer < 0)
 5305:                         {
 5306:                             if (fread(octets, (size_t) sizeof(unsigned char),
 5307:                                     8, fichier) != 8)
 5308:                             {
 5309:                                 if (feof(fichier))
 5310:                                 {
 5311:                                     (*s_etat_processus).erreur_execution =
 5312:                                             d_ex_syntaxe;
 5313:                                 }
 5314:                                 else
 5315:                                 {
 5316:                                     (*s_etat_processus).erreur_systeme =
 5317:                                             d_es_erreur_fichier;
 5318:                                 }
 5319: 
 5320:                                 return(NULL);
 5321:                             }
 5322:                         }
 5323:                         else
 5324:                         {
 5325:                             if ((longueur_buffer - (ptr - buffer)) >= 8)
 5326:                             {
 5327:                                 for(j = 0; j < 8; octets[j++] = *ptr++);
 5328:                             }
 5329:                             else
 5330:                             {
 5331:                                 (*s_etat_processus).erreur_execution =
 5332:                                         d_ex_syntaxe;
 5333:                                 return(NULL);
 5334:                             }
 5335:                         }
 5336: 
 5337:                         longueur = (((integer8) (octets[0])) << 56)
 5338:                                 | (((integer8) (octets[1])) << 48)
 5339:                                 | (((integer8) (octets[2])) << 40)
 5340:                                 | (((integer8) (octets[3])) << 32)
 5341:                                 | (((integer8) (octets[4])) << 24)
 5342:                                 | (((integer8) (octets[5])) << 16)
 5343:                                 | (((integer8) (octets[6])) << 8)
 5344:                                 | ((integer8) (octets[7]));
 5345:                         break;
 5346:                     }
 5347: 
 5348:                     default:
 5349:                     {
 5350:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 5351:                         return(NULL);
 5352:                     }
 5353:                 }
 5354:             }
 5355: 
 5356:             if (longueur_buffer < 0)
 5357:             {
 5358:                 if ((flux = malloc(longueur * sizeof(unsigned char))) == NULL)
 5359:                 {
 5360:                     (*s_etat_processus).erreur_systeme =
 5361:                             d_es_allocation_memoire;
 5362:                     return(NULL);
 5363:                 }
 5364: 
 5365:                 if (fread(flux, (size_t) sizeof(unsigned char),
 5366:                         longueur, fichier) != (size_t) longueur)
 5367:                 {
 5368:                     if (feof(fichier))
 5369:                     {
 5370:                         (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 5371:                     }
 5372:                     else
 5373:                     {
 5374:                         (*s_etat_processus).erreur_systeme =
 5375:                                 d_es_erreur_fichier;
 5376:                     }
 5377: 
 5378:                     return(NULL);
 5379:                 }
 5380:             }
 5381:             else
 5382:             {
 5383:                 if ((longueur_buffer - (ptr - buffer)) < longueur)
 5384:                 {
 5385:                     (*s_etat_processus).erreur_execution =
 5386:                             d_ex_syntaxe;
 5387:                     return(NULL);
 5388:                 }
 5389: 
 5390:                 flux = ptr;
 5391:                 ptr += longueur;
 5392:             }
 5393: 
 5394:             if ((s_objet = allocation(s_etat_processus, CHN)) == NULL)
 5395:             {
 5396:                 if (longueur_buffer < 0)
 5397:                 {
 5398:                     free(flux);
 5399:                 }
 5400: 
 5401:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 5402:                 return(NULL);
 5403:             }
 5404: 
 5405:             if (((*s_objet).objet = analyse_flux(s_etat_processus, flux,
 5406:                     longueur)) == NULL)
 5407:             {
 5408:                 return(NULL);
 5409:             }
 5410: 
 5411:             if (longueur_buffer < 0)
 5412:             {
 5413:                 free(flux);
 5414:             }
 5415: 
 5416:             break;
 5417:         }
 5418: 
 5419:         default:
 5420:         {
 5421:             (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 5422:             return(NULL);
 5423:         }
 5424:     }
 5425: 
 5426:     if ((longueur_buffer < 0) && (recursivite == d_faux))
 5427:     {
 5428:         // Lecture depuis un fichier, on saute le champ de queue qui contient
 5429:         // la longueur de l'enregistrement.
 5430: 
 5431:         if (fread(octets, (size_t) sizeof(unsigned char), 1, fichier) != 1)
 5432:         {
 5433:             liberation(s_etat_processus, s_objet);
 5434: 
 5435:             if (feof(fichier))
 5436:             {
 5437:                 (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 5438:             }
 5439:             else
 5440:             {
 5441:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 5442:             }
 5443: 
 5444:             return(NULL);
 5445:         }
 5446: 
 5447:         if ((octets[0] & 0x01) != 0)
 5448:         {
 5449:             deplacement = ((octets[0] & 0x0F) >> 1) + 1;
 5450: 
 5451:             if (fread(octets, (size_t) sizeof(unsigned char), deplacement,
 5452:                     fichier) != deplacement)
 5453:             {
 5454:                 liberation(s_etat_processus, s_objet);
 5455: 
 5456:                 if (feof(fichier))
 5457:                 {
 5458:                     (*s_etat_processus).erreur_execution = d_ex_syntaxe;
 5459:                 }
 5460:                 else
 5461:                 {
 5462:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
 5463:                 }
 5464: 
 5465:                 return(NULL);
 5466:             }
 5467:         }
 5468:     }
 5469: 
 5470:     return(s_objet);
 5471: }
 5472: 
 5473: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>