_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D ' I N T E R E T   G E N E R A L  :                                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Dans ce fichier, se trouvent toutes                                                                            */
/*                  les fonctions d'interet general, et                                                                              */
/*                  en particulier celles de manipulation                                                                            */
/*                  des chaines de caracteres et celles                                                                              */
/*                  de gestion de fichiers.                                                                                          */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xig/fonct$vv$FON' :                                                                                            */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N C L U D E S   S Y S T E M E S  :                                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION, avant l'introduction de la date et de l'heure dans 'PRINT_DEFAUT(...)' de      */
                                        /* '$xil/defi_c1.v?$DEF', il y avait ici :                                                   */
                                        /*                                                                                           */
                                        /*                  @include  <sys/types.h>                                                  */
                                        /*                                                                                           */
                                        /* Or malheureusement, par exemple avec 'SYSTEME_NWS3000_NEWSOS', le type 'time_t' est       */
                                        /* defini dans '<sys/types.h>' et non pas dans '<times.h>', d'ou ce deplacement...           */

                                        /* Definit le format des informations relatives a un fichier.                                */
                                        /* ATTENTION, le 20110531134310, le :                                                        */
                                        /*                                                                                           */
                                        /*                  @include  <sys/stat.h>>                                                  */
                                        /*                                                                                           */
                                        /* a ete deplace vers 'v $xil/defi_c1$vv$DEF 20110531134318' et ce a cause du programme      */
                                        /* 'v $xcg/PhaseCrit.01$K Chmod'...                                                          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N T R O L E   D E S   E D I T I O N S   D E   C O M P T E U R S  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

DEFV(Common,DEFV(Logical,ZINT(editer_la_valeur_des_compteurs_de_reference_lors_du__RETU_Commande,FAUX)));
                                        /* Introduit le 20130518210530 afin de pouvoir editer les '*_____compteur_de_reference'      */
                                        /* lors du 'RETU_Commande' si besoin est. Cela fut deplace ici le 20180314120036...          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H A I N E S   D E   C A R A C T E R E S   T R E S   U T I L I S E E S  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* Le 20180402010510, ces definitions ont ete placees dans 'v $xig/allocation$vv$FON'        */
                                        /* a cause d'un probleme de reference en avant dans la fonction 'chain_Acopie(...)' qui      */
                                        /* reference la fonction 'allocation_memoire_et_generation_des_format_EGAr(...)'...          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A I T E M E N T   D E S   F O R M A T S   D E   S O R T I E   ( D E B U T )  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____Ftraitement_des_formats_de_sortie_VERSION_01));
                                        /* Introduit le 20030316100732.                                                              */
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____Ftraitement_des_formats_de_sortie_VERSION_02));
                                        /* Introduit le 20030316100732.                                                              */
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

                                        /* Les definitions 'BASIQUE____Prer?(...)' ont ete introduites le 20030209102905 et sont     */
                                        /* destinees a se substituer a 'PRINT_ATTENTION(...)', 'PRINT_ERREUR(...)' et a 'Prer?(...)' */
                                        /* tant que ces dernieres ne sont pas disponibles ou interdites d'utilisation comme dans     */
                                        /* 'chain_Acopie_avec_conversions_possibles_majuscules_minuscules(...)' pour des raisons     */
                                        /* de bouclage. Au passage, avant le 20030210100518, le nom etait 'PROVISOIRE_Prer?(...)'.   */

#if       (PRECISION_DU_Int==SIMPLE_PRECISION)
#                   define    BFd                                                                                                       \
                                        "d"                                                                                             \
                                        /* Introduit le 20120224091908 ("BFd" pour "BASIQUE____FORMAT_d"...).                        */
#Aif      (PRECISION_DU_Int==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Int==SIMPLE_PRECISION)

#if       (PRECISION_DU_Int==DOUBLE_PRECISION)
#                   define    BFd                                                                                                       \
                                        "ld"                                                                                            \
                                        /* Introduit le 20120224091908 ("BFd" pour "BASIQUE____FORMAT_d"...).                        */
#Aif      (PRECISION_DU_Int==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Int==DOUBLE_PRECISION)

#define   BASIQUE____Prin0(format)                                                                                                      \
                    Bblock                                                                                                              \
                    CAL2(FPrin0(stream_Prin,FLUSHER_LE_FILE,format));                                                                   \
                    Eblock
#define   BASIQUE____Prin1(format,x1)                                                                                                   \
                    Bblock                                                                                                              \
                    CAL2(FPrin1(stream_Prin,FLUSHER_LE_FILE,format,x1));                                                                \
                    Eblock
#define   BASIQUE____Prin2(format,x1,x2)                                                                                                \
                    Bblock                                                                                                              \
                    CAL2(FPrin2(stream_Prin,FLUSHER_LE_FILE,format,x1,x2));                                                             \
                    Eblock
#define   BASIQUE____Prin3(format,x1,x2,x3)                                                                                             \
                    Bblock                                                                                                              \
                    CAL2(FPrin3(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3));                                                          \
                    Eblock
#define   BASIQUE____Prin4(format,x1,x2,x3,x4)                                                                                          \
                    Bblock                                                                                                              \
                    CAL2(FPrin4(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4));                                                       \
                    Eblock
#define   BASIQUE____Prin5(format,x1,x2,x3,x4,x5)                                                                                       \
                    Bblock                                                                                                              \
                    CAL2(FPrin5(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5));                                                    \
                    Eblock
#define   BASIQUE____Prin6(format,x1,x2,x3,x4,x5,x6)                                                                                    \
                    Bblock                                                                                                              \
                    CAL2(FPrin6(stream_Prin,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6));                                                 \
                    Eblock

                                        /* Les definitions 'BASIQUE____Prin?(...)' ont ete introduites le 20111122162534 et sont     */
                                        /* destinees a se substituer a 'Prin?(....)' tant que 'print_defaut(...)' n'est pas encore   */
                                        /* defini...                                                                                 */
                                        /*                                                                                           */
                                        /* ATTENTION : on notera que tout ou partie de ces definitions sont inutiles...              */

#define   BASIQUE____Prme0(format)                                                                                                      \
                    Bblock                                                                                                              \
                    CAL3(FPrin0(stream_Prme,FLUSHER_LE_FILE,format));                                                                   \
                    Eblock
#define   BASIQUE____Prme1(format,x1)                                                                                                   \
                    Bblock                                                                                                              \
                    CAL3(FPrin1(stream_Prme,FLUSHER_LE_FILE,format,x1));                                                                \
                    Eblock
#define   BASIQUE____Prme2(format,x1,x2)                                                                                                \
                    Bblock                                                                                                              \
                    CAL3(FPrin2(stream_Prme,FLUSHER_LE_FILE,format,x1,x2));                                                             \
                    Eblock
#define   BASIQUE____Prme3(format,x1,x2,x3)                                                                                             \
                    Bblock                                                                                                              \
                    CAL3(FPrin3(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3));                                                          \
                    Eblock
#define   BASIQUE____Prme4(format,x1,x2,x3,x4)                                                                                          \
                    Bblock                                                                                                              \
                    CAL3(FPrin4(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4));                                                       \
                    Eblock
#define   BASIQUE____Prme5(format,x1,x2,x3,x4,x5)                                                                                       \
                    Bblock                                                                                                              \
                    CAL3(FPrin5(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5));                                                    \
                    Eblock
#define   BASIQUE____Prme6(format,x1,x2,x3,x4,x5,x6)                                                                                    \
                    Bblock                                                                                                              \
                    CAL3(FPrin6(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6));                                                 \
                    Eblock
#define   BASIQUE____Prme7(format,x1,x2,x3,x4,x5,x6,x7)                                                                                 \
                    Bblock                                                                                                              \
                    CAL3(FPrin7(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7));                                              \
                    Eblock
#define   BASIQUE____Prme8(format,x1,x2,x3,x4,x5,x6,x7,x8)                                                                              \
                    Bblock                                                                                                              \
                    CAL3(FPrin8(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8));                                           \
                    Eblock
#define   BASIQUE____Prme9(format,x1,x2,x3,x4,x5,x6,x7,x8,x9)                                                                           \
                    Bblock                                                                                                              \
                    CAL3(FPrin9(stream_Prme,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6,x7,x8,x9));                                        \
                    Eblock

                                        /* Les definitions 'BASIQUE____Prme?(...)' ont ete introduites le 20111122162534 et sont     */
                                        /* destinees a se substituer a 'Prme?(....)' tant que 'print_defaut(...)' n'est pas encore   */
                                        /* defini...                                                                                 */
                                        /*                                                                                           */
                                        /* ATTENTION : on notera que tout ou partie de ces definitions sont inutiles...              */
                                        /*                                                                                           */
                                        /* La procedure 'BASIQUE____Prme7(...)' a ete introduite le 20170405152035...                */
                                        /*                                                                                           */
                                        /* La procedure 'BASIQUE____Prme8(...)' a ete introduite le 20170519165959...                */
                                        /*                                                                                           */
                                        /* La procedure 'BASIQUE____Prme9(...)' a ete introduite le 20170520052528...                */

#define   BASIQUE____Prer                                                                                                               \
                    Bblock                                                                                                              \
                    CAL1(FPrin7(stream_Prer                                                                                             \
                               ,FLUSHER_LE_FILE                                                                                         \
                               ,"[%s=%s][%s]['%s']['%s']['%s(...)'#%d] ERREUR : "                                                       \
                               ,Gvar_sHOTE                                                                                              \
                               ,Gvar_HOST                                                                                               \
                               ,identifiant_de_branches_paralleles                                                                      \
                               ,NOM_DE_LA_COMMANDE_COURANTE                                                                             \
                               ,FICHIER_COURANT_RELATIF                                                                                 \
                               ,NomDeLaFonctionCourante                                                                                 \
                               ,LIGNE_COURANTE                                                                                          \
                                )                                                                                                       \
                         );                                                                                                             \
                    Eblock                                                                                                              \
                                        /* Introduit le 20120113152736 pour avoir le plus possible d'information...                  */ \
                                        /*                                                                                           */ \
                                        /* Le 'nom_de_la_commande_courante' a ete introduit le 20120119120322...                     */ \
                                        /*                                                                                           */ \
                                        /* Le test de 'ADRESSE_NON_ENCORE_DEFINIE' a ete introduit le 20120201101058 a cause de      */ \
                                        /* 'v $xil/defi_c1$vv$DEF nom_de_la_commande_courante' ou 'chain_Acopie(...)' est utilisee   */ \
                                        /* et donc s'il y a alors un probleme de 'Malo(...)' le 'nom_de_la_commande_courante' n'est  */ \
                                        /* donc pas (encore) defini et ne peut donc etre edite...                                    */ \
                                        /*                                                                                           */ \
                                        /* Les informations {Gvar_sHOTE,Gvar_HOST,identifiant_de_branches_paralleles} ont ete        */ \
                                        /* introduites le 20120224104558...                                                          */ \
                                        /*                                                                                           */ \
                                        /* J'ai "betement" tente d'introduire la date au format 'AAAAMMJJhhmmss' le 20120224110341   */ \
                                        /* par un appel a :                                                                          */ \
                                        /*                                                                                           */ \
                                        /*                  SYSTEM("date '+%Y%m%d%H%M%S'")                                           */ \
                                        /*                                                                                           */ \
                                        /* mais evidemment, cela ne marche pas car la date est editee sur 'STANDARD_OUT' et non      */ \
                                        /* pas mise dans une chaine de caracteres resultat de 'SYSTEM(...)' !                        */

#define   BASICNU____Prer0(format)                                                                                                      \
                    Bblock                                                                                                              \
                    CAL1(FPrin0(stream_Prer,FLUSHER_LE_FILE,format));                                                                   \
                    Eblock
#define   BASICNU____Prer1(format,x1)                                                                                                   \
                    Bblock                                                                                                              \
                    CAL1(FPrin1(stream_Prer,FLUSHER_LE_FILE,format,x1));                                                                \
                    Eblock
#define   BASICNU____Prer2(format,x1,x2)                                                                                                \
                    Bblock                                                                                                              \
                    CAL1(FPrin2(stream_Prer,FLUSHER_LE_FILE,format,x1,x2));                                                             \
                    Eblock
#define   BASICNU____Prer3(format,x1,x2,x3)                                                                                             \
                    Bblock                                                                                                              \
                    CAL1(FPrin3(stream_Prer,FLUSHER_LE_FILE,format,x1,x2,x3));                                                          \
                    Eblock
#define   BASICNU____Prer4(format,x1,x2,x3,x4)                                                                                          \
                    Bblock                                                                                                              \
                    CAL1(FPrin4(stream_Prer,FLUSHER_LE_FILE,format,x1,x2,x3,x4));                                                       \
                    Eblock
#define   BASICNU____Prer5(format,x1,x2,x3,x4,x5)                                                                                       \
                    Bblock                                                                                                              \
                    CAL1(FPrin5(stream_Prer,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5));                                                    \
                    Eblock
#define   BASICNU____Prer6(format,x1,x2,x3,x4,x5,x6)                                                                                    \
                    Bblock                                                                                                              \
                    CAL1(FPrin6(stream_Prer,FLUSHER_LE_FILE,format,x1,x2,x3,x4,x5,x6));                                                 \
                    Eblock

                                        /* Les definitions 'BASICNU____Prer?(...)' ont ete introduites le 20120119133419 afin de     */
                                        /* permettre a plusieurs messages de se succeder sur la meme ligne suivant :                 */
                                        /*                                                                                           */
                                        /*                  BASIQUE____Prer?(...);                                                   */
                                        /*                  BASICNU____Prer?(...);                                                   */
                                        /*                  BASICNU____Prer?(...);                                                   */
                                        /*                  BASICNU____Prer?(...);                                                   */
                                        /*                                                                                           */
                                        /* La racine "BASICNU" vient de "BASIQUE" et de "nu" (c'est-a-dire sans une introduction     */
                                        /* grace 'BASIQUE____Prer'...                                                                */

#define   BASIQUE____Prer0(format)                                                                                                      \
                    Bblock                                                                                                              \
                    BASIQUE____Prer;                                                                                                    \
                    BASICNU____Prer0(format);                                                                                           \
                    Eblock
#define   BASIQUE____Prer1(format,x1)                                                                                                   \
                    Bblock                                                                                                              \
                    BASIQUE____Prer;                                                                                                    \
                    BASICNU____Prer1(format,x1);                                                                                        \
                    Eblock
#define   BASIQUE____Prer2(format,x1,x2)                                                                                                \
                    Bblock                                                                                                              \
                    BASIQUE____Prer;                                                                                                    \
                    BASICNU____Prer2(format,x1,x2);                                                                                     \
                    Eblock
#define   BASIQUE____Prer3(format,x1,x2,x3)                                                                                             \
                    Bblock                                                                                                              \
                    BASIQUE____Prer;                                                                                                    \
                    BASICNU____Prer3(format,x1,x2,x3);                                                                                  \
                    Eblock
#define   BASIQUE____Prer4(format,x1,x2,x3,x4)                                                                                          \
                    Bblock                                                                                                              \
                    BASIQUE____Prer;                                                                                                    \
                    BASICNU____Prer4(format,x1,x2,x3,x4);                                                                               \
                    Eblock
#define   BASIQUE____Prer5(format,x1,x2,x3,x4,x5)                                                                                       \
                    Bblock                                                                                                              \
                    BASIQUE____Prer;                                                                                                    \
                    BASICNU____Prer5(format,x1,x2,x3,x4,x5);                                                                            \
                    Eblock
#define   BASIQUE____Prer6(format,x1,x2,x3,x4,x5,x6)                                                                                    \
                    Bblock                                                                                                              \
                    BASIQUE____Prer;                                                                                                    \
                    BASICNU____Prer6(format,x1,x2,x3,x4,x5,x6);                                                                         \
                    Eblock

                                        /* Les definitions 'BASIQUE____Prer?(...)' ont ete introduites le 20030209102905 et sont     */
                                        /* destinees a se substituer a 'PRINT_ATTENTION(...)', 'PRINT_ERREUR(...)' et a 'Prer?(...)' */
                                        /* tant que ces dernieres ne sont pas disponibles ou interdites d'utilisation comme dans     */
                                        /* 'chain_Acopie_avec_conversions_possibles_majuscules_minuscules(...)' pour des raisons     */
                                        /* de bouclage. Au passage, avant le 20030210100518, le nom etait 'PROVISOIRE_Prer?(...)'.   */
                                        /*                                                                                           */
                                        /* ATTENTION : on notera que tout ou partie de ces definitions sont inutiles...              */

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_01

#    ifdef     Ftraitement_des_formats_de_sortie
                                        /* Test introduit le 20210923094653 suite a 'v $xi/INCLUDES_min$I 20210923091729'...         */
#         undef     Ftraitement_des_formats_de_sortie
#    Aifdef    Ftraitement_des_formats_de_sortie
#    Eifdef    Ftraitement_des_formats_de_sortie

#    define    Ftraitement_des_formats_de_sortie(format)                                                                                \
                         ptCARA(format)                                                                                                 \
                                        /* Tout ceci est destine a permettre l'utilisation de 'FPrin?(...)' tant que la "veritable"  */ \
                                        /* fonction 'Ftraitement_des_formats_de_sortie(...)' n'a pas ete definie. On notera que      */ \
                                        /* celle-ci attend la definition des fonctions de gestion des chaines de caracteres pour     */ \
                                        /* etre elle-meme veritablement definie...                                                   */ \
                                        /*                                                                                           */ \
                                        /* Le 20020702094637, j'ai remplace le 'Cara(...)' par un 'ptCARA(...)' car, d'apres la      */ \
                                        /* modification 'v $xil/defi_c1$vv$DEF 20020701155821', il semble que cela soit ce qu'il     */ \
                                        /* faut pour qu'il n'y ait pas de problemes de compilation...                                */
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_01
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_01

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_02
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_02
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_02

#define   ERREUR_CHAINE_NON_DEFINIE                                                                                                     \
                    Bblock                                                                                                              \
                    BASIQUE____Prer1("Chaine non definie dans '%s(...)'.\n",NomDeLaFonctionCourante);                                   \
                    Eblock                                                                                                              \
                                        /* Procedure introduite le 20071227105226...                                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O M P A R A I S O N   D E   D E U X   C H A I N E S   D E   C A R A C T E R E S  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionL

                                        /* ATTENTION, le 19961119133825, la fonction 'chain_compare(...)' a ete mise en tete afin de */
                                        /* permettre son utilisation dans la procedure 'DEBUT_DE_COMPACTAGE_DES_K_LF_DES_Prer(...)'  */
                                        /* utile a 'PRINT_DEFAUT(...)'.                                                              */
                                        /*                                                                                           */
                                        /* Le 20120131165441, la fonction 'chain_compare(...)' a ete mise encore plus en tete a      */
                                        /* cause de 'allocation_memoire_avec_validation(...)' qui l'utilise via des 'Gval(...)'s.    */

DEFV(Common,DEFV(Int,INIT(chain_compare_____index_des_derniers_caracteres_identiques,UNDEF)));
                                        /* Index des derniers caracteres identiques (introduit le 20160512110539)...                 */

DEFV(Common,DEFV(FonctionL,chain_compare(chaineA1,chaineA2)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineA1)));
                                        /* Argument 1,                                                                               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA2)));
                                        /* Argument 2.                                                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(resultat,FAUX));
                                        /* Resultat (VRAI/FAUX) du test de comparaison :                                             */
                                        /*                                                                                           */
                                        /*                  VRAI si les deux chaines sont identiques strictement,                    */
                                        /*                  FAUX dans le cas contraire.                                              */
                                        /*                                                                                           */
     /*..............................................................................................................................*/
     Test(IFET(IFET(IFNE(IDENTITE(chaineA1),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA1),ADRESSE_NON_ENCORE_DEFINIE))
              ,IFET(IFNE(IDENTITE(chaineA2),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA2),ADRESSE_NON_ENCORE_DEFINIE))
               )
          )
          Bblock
          DEFV(Int,INIT(index,PREMIER_CARACTERE));
                                        /* Index de comparaison des deux chaines, caractere par caractere.                           */

          Tant(IFET(IFEQ(ITb0(chaineA1,INDX(index,PREMIER_CARACTERE))
                        ,ITb0(chaineA2,INDX(index,PREMIER_CARACTERE))
                         )
                   ,IFEQ(resultat,FAUX)
                    )
               )
               Bblock
               Test(IFEQ(ITb0(CHOI(chaineA1,chaineA2),INDX(index,PREMIER_CARACTERE)),END_OF_CHAIN))
                    Bblock
                    EGAL(resultat,VRAI);
                                        /* Le resultat est positif uniquement lorsque l'on a trouve le caractere de fin de chaine    */
                                        /* sur les deux chaines simultanement.                                                       */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               INCR(index,I);
               Eblock
          ETan

          EGAL(chain_compare_____index_des_derniers_caracteres_identiques,SOUS(index,I));
                                        /* Cela peut toujours servir, par exemple, pour definir une "mesure" de la difference        */
                                        /* de deux chaines (introduit le 20160512110539)...                                          */
          Eblock
     ATes
          Bblock
          Test(IFET(IFET(IFEQ(IDENTITE(chaineA1),ADRESSE_NON_DEFINIE),IFEQ(IDENTITE(chaineA1),ADRESSE_NON_ENCORE_DEFINIE))
                   ,IFET(IFEQ(IDENTITE(chaineA2),ADRESSE_NON_DEFINIE),IFEQ(IDENTITE(chaineA2),ADRESSE_NON_ENCORE_DEFINIE))
                    )
               )
               Bblock
               EGAL(resultat,VRAI);
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETes

     RETU(resultat);
     Eblock

EFonctionL

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        L I B E R A T I O N   M E M O I R E   A V E C   V A L I D A T I O N  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

DEFV(Common,DEFV(Positive,INIT(gCALZ_Free_____compteur_de_tous_les_gCALZ_Free,ZERO)));
                                        /* Compteur des 'Free(...)'s introduit le 20180315085050 et mis ici le 20221028182436...     */
DEFV(Common,DEFV(Positive,INIT(CALZ_FreCC_____compteur_de_tous_les_CALZ_FreCC,ZERO)));
DEFV(Common,DEFV(Positive,INIT(CALZ_FreDD_____compteur_de_tous_les_CALZ_FreDD,ZERO)));
DEFV(Common,DEFV(Positive,INIT(CALZ_FreFF_____compteur_de_tous_les_CALZ_FreFF,ZERO)));
DEFV(Common,DEFV(Positive,INIT(CALZ_FreII_____compteur_de_tous_les_CALZ_FreII,ZERO)));
DEFV(Common,DEFV(Positive,INIT(CALZ_FreLL_____compteur_de_tous_les_CALZ_FreLL,ZERO)));
DEFV(Common,DEFV(Positive,INIT(CALZ_FrePP_____compteur_de_tous_les_CALZ_FrePP,ZERO)));
DEFV(Common,DEFV(Positive,INIT(CALZ_FreSS_____compteur_de_tous_les_CALZ_FreSS,ZERO)));
                                        /* Compteurs des 'Fre?(...)'s introduit le 20180315085050 et mis ici le 20221028182436...    */

#ifdef    gCALZ_Free_VERSION_01                                                 /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
                                        /* Introduit le 20221028173819...                                                            */
#Aifdef   gCALZ_Free_VERSION_01                                                 /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   gCALZ_Free_VERSION_01                                                 /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    gCALZ_Free_VERSION_02                                                 /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
                                        /* Introduit le 20221028173819...                                                            */
#    define    GENERE__FonctionI_gCALZ_Free(nom_et_arguments_de_la_fonction,X)                                                          \
                                        /* ATTENTION : a cause de 'v $xcg/LArgTypFo$vv$Z' reference par 'v $xcg/gen$EXT$Z' il est    */ \
                                        /* imperation que les 'DEFV(...)'s qui suivent et qui definissent les arguments de la        */ \
                                        /* fonction soient tabules en premiere colonne...                                            */ \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Positive,POINTERU(compteur)));                                                                                       \
DEFV(Argument,DEFV(Void,POINTERv(pointeur)));                                                                                           \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     INIT_ERROR;                                                                                                                        \
     /*..............................................................................................................................*/ \
     Test(IFNE(pointeur,ADRESSE_PLUS_DEFINIE))                                                                                          \
                                        /* Test introduit le 20240704075933 suite a un probleme rencontre quelques jours avant       */ \
                                        /* ('v $xiii/di_image$FON EDEFV.imageF.imageR_flottante..' ou la desallocation de            */ \
                                        /* 'imageA_flottante' etait faite deux fois...).                                             */ \
          Bblock                                                                                                                        \
          CALZ(Fre ## X(pointeur));                                                                                                     \
                                                                                                                                        \
                                        /* Jusqu'au 20240704122720, il y avait ici :                                                 */ \
                                        /*                                                                                           */ \
                                        /*                  EGAL(pointeur,ADRESSE_PLUS_DEFINIE);                                     */ \
                                        /*                                                                                           */ \
                                        /* ou (?) :                                                                                  */ \
                                        /*                                                                                           */ \
                                        /*                  EGAL(INDIRECT(pointeur),ADRESSE_PLUS_DEFINIE);                           */ \
                                        /*                                                                                           */ \
                                        /* (ces problemes ayant et vus lors de la modification du 20240704075933 qui ne provoquait   */ \
                                        /* pas, si besoin etait, le message d'erreur suivant. En fait cette reinitialisation ne      */ \
                                        /* peut que figurer dans 'v $xil/defi_c1$vv$DEF 20240704123617'...                           */ \
                                                                                                                                        \
          INCK(gCALZ_Free_____compteur_de_tous_les_gCALZ_Free);                                                                         \
          INCK(INDIRECT(compteur));                                                                                                     \
          Eblock                                                                                                                        \
     ATes                                                                                                                               \
          Bblock                                                                                                                        \
          BASIQUE____Prer0("Un pointeur d'allocation memoire est desalloue plus d'une fois.\n");                                        \
          Eblock                                                                                                                        \
     ETes                                                                                                                               \
                                                                                                                                        \
     RETU_ERROR;                                                                                                                        \
     Eblock                                                                                                                             \
                                        /* Procedure introduite le 20221028135041, de meme que les fonctions qui suivent...          */

BFonctionI

DEFV(Common,GENERE__FonctionI_gCALZ_Free(FgCALZ_FreeCC(compteur,pointeur),CC))                      /* Common,DEFV(Fonction,) :      */

EFonctionI


BFonctionI

DEFV(Common,GENERE__FonctionI_gCALZ_Free(FgCALZ_FreeDD(compteur,pointeur),DD))                      /* Common,DEFV(Fonction,) :      */

EFonctionI


BFonctionI

DEFV(Common,GENERE__FonctionI_gCALZ_Free(FgCALZ_FreeFF(compteur,pointeur),FF))                      /* Common,DEFV(Fonction,) :      */

EFonctionI


BFonctionI

DEFV(Common,GENERE__FonctionI_gCALZ_Free(FgCALZ_FreeII(compteur,pointeur),II))                      /* Common,DEFV(Fonction,) :      */

EFonctionI


BFonctionI

DEFV(Common,GENERE__FonctionI_gCALZ_Free(FgCALZ_FreeLL(compteur,pointeur),LL))                      /* Common,DEFV(Fonction,) :      */

EFonctionI


BFonctionI

DEFV(Common,GENERE__FonctionI_gCALZ_Free(FgCALZ_FreePP(compteur,pointeur),PP))                      /* Common,DEFV(Fonction,) :      */

EFonctionI


BFonctionI

DEFV(Common,GENERE__FonctionI_gCALZ_Free(FgCALZ_FreeSS(compteur,pointeur),SS))                      /* Common,DEFV(Fonction,) :      */

EFonctionI
#Aifdef   gCALZ_Free_VERSION_02                                                 /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   gCALZ_Free_VERSION_02                                                 /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A L L O C A T I O N   M E M O I R E   A V E C   V A L I D A T I O N  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(l_usage_de_la_memoire_allouee_est_correct,sequence_si_erreur_d_usage)    \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(Malo_____valider_si_possible_l_utilisation_de_la_memoire_allouee))                                     \
                         Bblock                                                                                                         \
                         Test(EST_VRAI(l_usage_de_la_memoire_allouee_est_correct))                                                      \
                                        /* Cas ou l'utilisation qui a ete faite de la memoire allouee par 'Malo(...)' semble         */ \
                                        /* correcte...                                                                               */ \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                                        /* Cas ou l'utilisation qui a ete faite de la memoire allouee par 'Malo(...)' semble         */ \
                                        /* incorrecte :                                                                              */ \
                              Bblock                                                                                                    \
                              BASIQUE____Prer0("Debordement de la memoire allouee par 'Malo(...)'.\n");                                 \
                                        /* Le 20041024095621 je note qu'il est essentiel d'utiliser ici 'BASIQUE____Prer0(...)'      */ \
                                        /* et non pas 'PRINT_ERREUR(...)' car, en effet, l'utilisation de cette derniere pourrait    */ \
                                        /* conduire a une suite infinie d'appels correspondant a un defaut dans l'allocation         */ \
                                        /* memoire via 'chain_Aconcaten2(...)' par exemple...                                        */ \
                                                                                                                                        \
                              BLOC(sequence_si_erreur_d_usage);                                                                         \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Procedure generale de test de la memoire allouee par 'Malo(...)' introduite le            */ \
                                        /* 20041023101837 a cause du probleme 'v $xig/fonct$vv$FON 20041020113351'.                  */

BFonctionC

DEFV(Common,DEFV(Positive,INIT(allocation_memoire_avec_validation_____compteur_de_tous_les_Malo,ZERO)));
DEFV(Common,DEFV(Positive,INIT(allocation_memoire_avec_validation_____increment_du_compteur_de_tous_les_Malo,I)));
                                        /* Compteur des 'Malo(...)'s introduit le 20180315085050. L'increment a ete introduit le     */
                                        /* 20180401072925 pour 'v $xig/fonct$vv$DEF 20180401073120'...                               */

DEFV(Common,DEFV(Positive,INIT(GET_PARAMETRES_____compteur_des_ciMalo,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_PARAMETRES_____compteur_des_cpMalo,ZERO)));
                                        /* Compteur des 'Malo(...)'s de 'GET_PARAMETRES(...)' introduit le 20180317120410...         */
                                        /*                                                                                           */
                                        /* Il a ete dedouble en 'ciMalo' et 'cpMalo' le 20180406171830...                            */

DEFV(Common,DEFV(Logical,SINT(allocation_memoire_avec_validation_____valider_par_rapport_a_MemorySizeMB,VRAI)));
                                        /* Indicateur de controle introduit le 20120201124441...                                     */
DEFV(Local,DEFV(Logical,INIT(allocation_memoire_avec_validation_____les_parametres_locaux_relatifs_a_MemorySizeMB_sont_connus,FAUX)));
DEFV(Local,DEFV(Int,INIT(allocation_memoire_avec_validation_____MemorySizeMB__,VALEUR_PAR_DEFAUT_DE_MemorySizeMB)));
DEFV(Local,DEFV(Int,INIT(allocation_memoire_avec_validation_____PCMemorySizeMB,VALEUR_PAR_DEFAUT_DE_PCMemorySizeMB)));
                                        /* Ceci a ete introduit le 20120201072840 afin de reduire la duree de l'allocation...        */
                                        /*                                                                                           */
                                        /* Le 20120201124441, les 'UNDEF's ont ete remplaces par les 'VALEUR_PAR_DEFAUT_DE_...'      */
                                        /* afin d'eviter des problemes arithmetiques dans les 'PRENDRE_UN_POURCENTAGE(...)'s         */
                                        /* ci-apres lorsqu'ils n'ont pas ete definis dynamiquement...                                */

DEFV(Local,DEFV(Int,INIT(allocation_memoire_avec_validation_____cumul_de_tous_les_nombre_d_octets_demandes_effectif,ZERO)));
                                        /* Ce cumul a ete introduit le 20120131183248. On notera qu'il ne fait que l'objet de        */
                                        /* 'INCR(...)' et jamais de 'DECR(...)' tout simplement parce que 'Free(...)' ne sait        */
                                        /* pas combien il libere d'octets : dommage...                                               */

DEFV(Common,DEFV(Positive,SINT(allocation_memoire_avec_validation_____Amarge_de_securite
                              ,AMARGE_DE_SECURITE_POUR_ALLOCATION_MEMOIRE_AVEC_VALIDATION
                               )
                 )
     );
DEFV(Common,DEFV(Positive,SINT(allocation_memoire_avec_validation_____Bmarge_de_securite
                              ,BMARGE_DE_SECURITE_POUR_ALLOCATION_MEMOIRE_AVEC_VALIDATION
                               )
                 )
     );
                                        /* Ceci a ete introduit (provisoirement ?) le 20041020113351 a cause d'un probleme           */
                                        /* rencontre a ce moment-la sur '$LACT16' (et uniquement sur cette MACHINE).                 */
                                        /*                                                                                           */
                                        /* A priori, cette marge de securite 'B' est inutile. Jusqu'au 20051019113924, la valeur     */
                                        /* par defaut etait 'UN' et est passee a cette date a la valeur 'ZERO', plus logique et qui  */
                                        /* correspond au fonctionnement normal, sans anomalie et qui resoud (provisoirement...)      */
                                        /* de plus le probleme (toujours incompris a cette date) du 20051019113924...                */
                                        /*                                                                                           */
                                        /* Le 20051026151255, j'ai introduit en plus de cette marge "additive" 'B', une marge        */
                                        /* "multiplicative" 'A'...                                                                   */
                                        /*                                                                                           */
                                        /* Le probleme rencontre aux environs du 20041020113351 sur '$LACT16' etait le suivant :     */
                                        /*                                                                                           */
                                        /*                  xrv                                                                      */
                                        /*                  echo                1                                            |    \  */
                                        /*                  AXPB.01$X           ne=0 fichier==                                       */
                                        /*                  ---------                                                                */
                                        /*                                                                                           */
                                        /* (ou bien avec tout autre programme de '$xrv' du meme type) donne le message :             */
                                        /*                                                                                           */
                                        /*                  Segmentation fault                                                       */
                                        /*                                                                                           */
                                        /* qui semble apparaitre dans 'v $xig/fonct$vv$FON CALS.Fclos.file_Rdescriptor..' comme      */
                                        /* l'a montre l'utilisation de la commande '/usr/bin/strace' (et en entrant alors la         */
                                        /* valeur '1' interactivement sur 'STREAM_IN'). On notera au passage que faire :             */
                                        /*                                                                                           */
                                        /*                  echo                1                                            |    \  */
                                        /*                  $xrv/AXPB.01$X      ne=0 fichier==                                       */
                                        /*                  --------------                                                           */
                                        /*                                                                                           */
                                        /* ne provoque pas l'anomalie. Je dois avouer que je n'ai pas compris (a cette date) la      */
                                        /* source du probleme, mais que je suspecte malgre tout mes allocations memoires. Au         */
                                        /* passage, l'execution de ce programme via 'debug' ne provoque pas ce phenomene, de         */
                                        /* meme que si le programme est compile en mode '$mDEBUG'...                                 */
                                        /*                                                                                           */
                                        /* D'autre part, faire (le 20041022110437) :                                                 */
                                        /*                                                                                           */
                                        /*                  Bblock                                                                   */
                                        /*                  DEFV(File,POINTERs(file_Rdescriptor));                                   */
                                        /*                  EGAL(file_Rdescriptor,Fopen(fichier_des_valeurs_effectif,file_Rmode));   */
                                        /*                  CALS(Fclos(file_Rdescriptor));                                           */
                                        /*                  Eblock                                                                   */
                                        /*                                                                                           */
                                        /* devant l'appel a 'v $xrv/ARITHMET.11$I Fload_fichier_formatte_Float' fait disparaitre     */
                                        /* le probleme, mais qu'est-ce que cela prouve ?                                             */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* Le 20041021120856, j'ai active l'option :                                                 */
                                        /*                                                                                           */
                                        /*                  setenv              MALLOC_CHECK_       1                                */
                                        /*                                                                                           */
                                        /* qui active le mode "DEBUG" de 'malloc(...)'. Cela a donne le message :                    */
                                        /*                                                                                           */
                                        /*                  free(): invalid pointer 0x???????!                                       */
                                        /*                                                                                           */
                                        /* dans le 'Fclos(...)' evoque precedemment et ou '0x???????' est precisemment egal a        */
                                        /* l'adresse du descripteur 'file_Rdescriptor' du fichier que l'on souhaite fermer. Mais     */
                                        /* cette fois-ci, ce message apparait meme si l'option 'fichier=' est suivie d'un nom de     */
                                        /* fichier ou encore si l'option "ne=" est suivie d'un nombre d'elements non nul. Malgre     */
                                        /* tout, la-encore, ce probleme n'apparait que sur '$LACT16'. On notera aussi que si         */
                                        /* l'on itere la sequence :                                                                  */
                                        /*                                                                                           */
                                        /*                  EGAL(file_Rdescriptor,Fopen(No,file_Rmode));                             */
                                        /*                  CALS(Fclos(file_Rdescriptor));                                           */
                                        /*                                                                                           */
                                        /* on doit obtenir toujours la meme valeur pour 'file_Rdescriptor' ; or ce n'est plus le     */
                                        /* cas lorsque cette anomalie apparait : 'file_Rdescriptor' progresse constamment, ce qui    */
                                        /* signifie bien que l'espace memoire ainsi pointe n'est pas restitue...                     */
                                        /*                                                                                           */
                                        /* D'autre part, faire (le 20041022110437) :                                                 */
                                        /*                                                                                           */
                                        /*                  Repe(...)                                                                */
                                        /*                       Bblock                                                              */
                                        /*                       EGAL(file_Rdescriptor,Fopen(No,file_Rmode));                        */
                                        /*                       CALS(Fclos(file_Rdescriptor));                                      */
                                        /*                       Eblock                                                              */
                                        /*                  ERep                                                                     */
                                        /*                                                                                           */
                                        /* a l'entree de 'v $xig/fonct$vv$FON Fload_fichier_formatte_Float' montre que l'anomalie    */
                                        /* "free(): invalid pointer" n'est pas systematique au cours de cette iteration...           */
                                        /*                                                                                           */
                                        /* Le 20050102174313, concernant ce probleme il y a peut-etre du nouveau. En effet dans la   */
                                        /* definition de 'EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(...)' il y avait une erreur     */
                                        /* grave de desallocation memoire (voir 'v $xil/defi_c1$vv$DEF 20050102173617'). C'etait     */
                                        /* peut-etre la la cause du probleme decrit ci-dessus. Malheureusement, en annulant la mise  */
                                        /* a jour 'v $xil/defi_c1$vv$DEF 20050102173617' et en donnant la valeur 'ZERO' au parametre */
                                        /* 'allocation_memoire_avec_validation_____Bmarge_de_securite' ci-dessus, le phenomene ne    */
                                        /* se manifeste plus ; on ne peut donc savoir si c'etait-la la cause du probleme...          */
                                        /*                                                                                           */
                                        /* Le 20051019113924, dans 'v $xivP/disk.000000009/face.2/.REFL.w.53.$U 20051019103503',     */
                                        /* le probleme renait de ses cendres. Le message :                                           */
                                        /*                                                                                           */
                                        /*                  Segmentation fault                                                       */
                                        /*                                                                                           */
                                        /* apparaissant (comme dans le probleme decrit ci-dessus ?) lors du 'munmap(...)' du fichier */
                                        /* comme la commande '/usr/bin/strace' l'a montre. Comme precedemment, le probleme s'est     */
                                        /* manifeste a cause de l'absence de 'ne=$Npart'. Puis, cela a pu etre simplifie et          */
                                        /* reproduit avec d'autres commandes, et par exemple :                                       */
                                        /*                                                                                           */
                                        /*                  $xrv/neutre$X       fichier=$xTV/THETA                                   */
                                        /*                                                                                           */
                                        /* mais l'ensemble des tests qui suivent furent effectues avec '$xrv/extrema.01$X' qui       */
                                        /* presente l'avantage de sorir peu de choses (quand il fonctionne correctement) et ce       */
                                        /* quel que soit la taille du fichier argument. Le fichier '$xTV/THETA' contient {0,0,...}   */
                                        /* (sans signes), sachant qu'il faut qu'il ait au moins 34 lignes (soit 68 octets). D'autre  */
                                        /* part :                                                                                    */
                                        /*                                                                                           */
                                        /*                  xTG                                                                      */
                                        /*                  $xrv/extrema.01$X   fichier=THETA                                        */
                                        /*                                                                                           */
                                        /* lui, fonctionne bien. Comme dans le probleme anterieur, la commande '/usr/bin/strace'     */
                                        /* a permis de voir que l'anomalie se situait lors du 'munmap(...)' du fichier (dans         */
                                        /* 'v $xrv/ARITHMET.11$I lTRANSFORMAT_01'), alors que l'acces avait eu lieu correctement     */
                                        /* et que sa taille avait bien ete trouvee egale a 68 octets. Au passage, si besoin est,     */
                                        /* ce fichier peut etre recree par :                                                         */
                                        /*                                                                                           */
                                        /*                  repeat    34        echo      "0"                 >>! $xTV/THETA         */
                                        /*                                                                                           */
                                        /* Le 20051019155925, je note que :                                                          */
                                        /*                                                                                           */
                                        /*                  $xrv/extrema.01$X   BMargeMalo=3 fichier=$xTV/THETA                      */
                                        /*                                                                                           */
                                        /* (ou toute autre valeur superieure ou egale a 3 pour "BMargeMalo=") fonctionne tout a fait */
                                        /* correctement...                                                                           */
                                        /*                                                                                           */
                                        /* Le 20051020130117, je note qu'activer l'option :                                          */
                                        /*                                                                                           */
                                        /*                  setenv              MALLOC_CHECK_       1                                */
                                        /*                                                                                           */
                                        /* implique un fonctionnement correct de '$xrv/extrema.01$X' avec malgre tout le message :   */
                                        /*                                                                                           */
                                        /*                  malloc: using debugging hooks                                            */
                                        /*                  free(): invalid pointer 0x???????!                                       */
                                        /*                                                                                           */
                                        /* qui laisse supposer un probleme. Le 20051025171705, j'ai introduit la fonction            */
                                        /* 'mtrace(...)' au debut du programme 'v $xrv/extrema.01$K' en positionnant les             */
                                        /* variable '$MALLOC_CHECK_' et '$MALLOC_TRACE' (qui donne le nom d'un fichier dans          */
                                        /* lequel 'mtrace(...)' trace les 'malloc(...)' et les 'free(...)') que j'avais moi-aussi    */
                                        /* trace en modifiant les fonctions 'v $xig/fonct$vv$FON allocation_memoire_avec_validation' */
                                        /* et 'v $xil/defi_c1$vv$DEF FreCC' afin d'editer les allocations et les releases de memoire */
                                        /* (ATTENTION : en ce qui concerne 'FreCC(...)', l'edition de la chaine pointee par le       */
                                        /* pointeur doit avoir lieu AVANT la liberation par 'Free(...)' car, en effet, apres cette   */
                                        /* fonction de liberation, le debut de la chaine n'est plus valide...). Le melange synchrone */
                                        /* des sorties de '$MALLOC_TRACE' et des miennes a donne le resultat suivant (en ajoutant    */
                                        /* en plus l'action de '/usr/bin/strace') :                                                  */
                                        /*                                                                                           */
                                        /*        Malo=0x9a26550                                                                     */
                                        /*    --- @ $xbg/fonction$SO:(allocation_memoire_avec_validation+0x22)[0x4aface] + 0x9a26550 */
                                        /*   |                                                                             --------- */
                                        /*   |                                                                             0x39      */
                                        /*   |                                                                                       */
                                        /*   |    FreCC=fichier=%[][ ,.; :+=><{}()*?!/\|`#@^$%&_0-9A-Za-z  '"-] 0x9a26550            */
                                        /*    --> @ $xbg/fonction$SO:(FconversionC+0x2b0)[0x4c42ec] - 0x9a26550                      */
                                        /*                                                            ---------                      */
                                        /*                                                                                           */
                                        /*        FreCC=fichier=/users/colonna/TeMpOrAiReS/xxxx 0x9a264b8                            */
                                        /*        @ $xrv/extrema.01$X:(main+0x4845)[0x804f41d] - 0x9a264b8                           */
                                        /*                                                                                           */
                                        /*        FreCC=fichier= 0x9a263a0                                                           */
                                        /*        @ $xrv/extrema.01$X:(main+0x4860)[0x804f438] - 0x9a263a0                           */
                                        /*                                                                                           */
                                        /*        Malo=0x9a23bd8                                                                     */
                                        /*        @ $xbg/fonction$SO:(allocation_memoire_avec_validation+0x22)[0x4aface] + 0x9a23bd8 */
                                        /*                                                                                 0x39      */
                                        /*                                                                                           */
                                        /*        Malo=0x9a26590                                                                     */
                                        /*        @ $xbg/fonction$SO:(allocation_memoire_avec_validation+0x22)[0x4aface] + 0x9a26590 */
                                        /*                                                                                 0x45      */
                                        /*                                                                                           */
                                        /*        freF=0x9a26590                                                                     */
                                        /*        @ $xbg/fonction$SO:(Fsize_fichier+0x124)[0x4b3db0] - 0x9a26590                     */
                                        /*                                                                                           */
                                        /*        open("$xTV/THETA",O_RDONLY) = 3                                                    */
                                        /*    --- @ /lib/tls/libc.so.6:(_IO_fopen+0x23)[0x5ad083] + 0x9a26550 0x5c                   */
                                        /*   |                                                      ---------                        */
                                        /*   |    close(3) = 0                                                                       */
                                        /*    --> @ /lib/tls/libc.so.6:(fclose+0xed)[0x5ad37d] - 0x9a26550                           */
                                        /*                                                       ---------                           */
                                        /*        munmap(0x3ffe0000,4096)                                                            */
                                        /*        free(): invalid pointer 0x9a26550!                                                 */
                                        /*                                ---------                                                  */
                                        /*                                                                                           */
                                        /* (dans '$MALLOC_TRACE' le "+" signifie 'malloc(...)' et le "-" signifie 'free(...)').      */
                                        /* Ainsi, le "invalid pointer" semble bien interne a '/lib/tls/libc.so.6' et ne semble pas   */
                                        /* venir de mes propres allocations, puisque j'ai rendu proprement le pointeur '0x9a26550'   */
                                        /* alors que '/lib/tls/libc.so.6' n'en n'a pas fait autant. Or on notera que c'est le        */
                                        /* 'munmap(...)' qui cree le "Segmentation fault""...                                        */
                                        /*                                                                                           */
                                        /* Au passage, les experiences precedentes ont montre que seulement 75% des 'Malo(...)'      */
                                        /* relatifs a des chaines etaient associes a des 'FreCC(....)'...                            */
                                        /*                                                                                           */
                                        /* Le 20051021104700, je note quelque chose d'etonnant :                                     */
                                        /*                                                                                           */
                                        /*                  $xrv/extrema.01$X   fichier=$xTV/THETA                                   */
                                        /*                                                                                           */
                                        /* (apres avoir remplace toutes les variables par leurs valeurs) execute sous '$SH', avant   */
                                        /* d'avoir appele '$CSH' fonctionne correctement. Mais, des que '$CSH' a ete appele, c'est   */
                                        /* trop tard ; par contre '$SH', puis '$CSH -f' donne le bon resultat...                     */
                                        /*                                                                                           */
                                        /* Le 20051024131303, la cause semble etre en 'v $xig/fonct$vv$DEF 20051024130450', alors    */
                                        /* que le 20051025102718, les tests montrent que le "Segmentation fault" apparait lors du    */
                                        /* 'Fclos(...)' situe a la fin de 'v $xig/fonct$vv$FON GENERE__FonctionI_Fload' (et plus     */
                                        /* precisemment dans la fonction 'munmap(...)' que 'Fclos(...)' appelle). Quel est donc le   */
                                        /* lien entre les deux ?                                                                     */
                                        /*                                                                                           */
                                        /* Le 20051115135738, je note que la modification 'v $xig/fonct$vv$FON 20051114124617'       */
                                        /* a (de nouveau) fait disparaitre le probleme sur '$LACT16', meme en jouant sur les         */
                                        /* parametres "AMargeMalo=" et "BMargeMalo=", mais jusqu'a quand ?                           */
                                        /*                                                                                           */
                                        /* Le 20051207151403, le probleme est reapparu sur '$LACT16' lors de la creation du          */
                                        /* programme 'v $xrv/store_image$K' (toujours dans la fonction 'munmap(...)'). Je suis       */
                                        /* plus en plus convaincu de la responsabilite de cette MACHINE et on notera au passage      */
                                        /* que compiler en mode DEBUG contourne ce probleme, sachant qu'alors l'edition de liens     */
                                        /* se fait en statique. En fait, le 20051208140342, j'ai note que ce n'etait pas le mode     */
                                        /* DEBUG, mais bien l'edition de liens en statique qui permettait de contourner le           */
                                        /* probleme...                                                                               */
                                        /*                                                                                           */
                                        /* Le 20051209104948, ne sachant plus qoi faire, j'ai active, uniquement sur '$LACT16',      */
                                        /* l'option 'MALLOC_CHECK_' ('v $FbugsL 20051209104948').                                    */
                                        /*                                                                                           */
                                        /* Puis, le 20051209162956, sur '$CMAP28', j'ai genere le fichier :                          */
                                        /*                                                                                           */
                                        /*        repeat   10        echo      0         >>! $xe/TEST                                */
                                        /*                                                                                           */
                                        /* puis la commande :                                                                        */
                                        /*                                                                                           */
                                        /*        $xrv/store_image.x  ne=10 LISTE_X=$xe/TEST LISTE_Y=$xe/TEST R=$xiim/IMAGE          */
                                        /*                                                                                           */
                                        /* qui provoque systematiquement le defaut "Segmentation fault" sur '$LACT16', fut lancee    */
                                        /* sur les MACHINEs suivantes :                                                              */
                                        /*                                                                                           */
                                        /*                  anvers.polytechnique.fr                                                  */
                                        /*                                      Red Hat Linux release 9 (Shrike)                     */
                                        /*                                      gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5)           */
                                        /*                  argentine.polytechnique.fr                                               */
                                        /*                                      Fedora Core release 3 (Heidelberg)                   */
                                        /*                                      gcc 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)             */
                                        /*                  auber.polytechnique.fr                                                   */
                                        /*                                      Fedora Core release 4 (Stentz)                       */
                                        /*                                      gcc 4.0.1 20050727 (Red Hat 4.0.1-5)                 */
                                        /*                  avron.polytechnique.fr                                                   */
                                        /*                                      Fedora Core release 3 (Heidelberg)                   */
                                        /*                                      gcc 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)             */
                                        /*                  balard.polytechnique.fr                                                  */
                                        /*                                      Fedora Core release 1 (Yarrow)                       */
                                        /*                                      gcc 3.3.2 20031022 (Red Hat Linux 3.3.2-1)           */
                                        /*                  belair.polytechnique.fr                                                  */
                                        /*                                      Debian GNU 3.0                                       */
                                        /*                                      gcc 2.95.4                                           */
                                        /*                  bizot.polytechnique.fr                                                   */
                                        /*                  bolivar.polytechnique.fr                                                 */
                                        /*                  bonsergent.polytechnique.fr                                              */
                                        /*                                      Fedora Core release 4 (Stentz)                       */
                                        /*                                      gcc 4.0.1 20050727 (Red Hat 4.0.1-5)                 */
                                        /*                  boucicaut.polytechnique.fr                                               */
                                        /*                                      CentOS release 4.1 (Final)                           */
                                        /*                                      gcc 3.4.3 20050227 (Red Hat 3.4.3-22.1)              */
                                        /*                  boulets.polytechnique.fr                                                 */
                                        /*                  cedre.polytechnique.fr                                                   */
                                        /*                                      Debian GNU 3.0                                       */
                                        /*                                      gcc 2.95.4                                           */
                                        /*                  cmapx.polytechnique.fr                                                   */
                                        /*                                      Debian GNU/Linux 3.1                                 */
                                        /*                                      gcc 3.3.5 (Debian 1:3.3.5-13)                        */
                                        /*                  corvisart.polytechnique.fr                                               */
                                        /*                                      Fedora Core release 1 (Yarrow)                       */
                                        /*                                      gcc 3.3.2 20031022 (Red Hat Linux 3.3.2-1)           */
                                        /*                  danube.polytechnique.fr                                                  */
                                        /*                                      Red Hat Linux release 9 (Shrike)                     */
                                        /*                                      gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5)           */
                                        /*                  duroc.polytechnique.fr                                                   */
                                        /*                                      Fedora Core release 1 (Yarrow)                       */
                                        /*                                      gcc 3.3.2 20031022 (Red Hat Linux 3.3.2-1)           */
                                        /*                  eiffel.polytechnique.fr                                                  */
                                        /*                                      Fedora Core release 3 (Heidelberg)                   */
                                        /*                                      gcc 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)             */
                                        /*                  glaciere.polytechnique.fr                                                */
                                        /*                                      Fedora Core release 4 (Stentz)                       */
                                        /*                                      gcc 4.0.1 20050727 (Red Hat 4.0.1-5)                 */
                                        /*                  hoche.polytechnique.fr                                                   */
                                        /*                                      Red Hat Linux release 7.3 (Valhalla)                 */
                                        /*                                      gcc 3.2.1                                            */
                                        /*                  javel.polytechnique.fr                                                   */
                                        /*                                      Red Hat Linux release 7.2 (Enigma)                   */
                                        /*                                      gcc 2.96                                             */
                                        /*                  jourdain.polytechnique.fr                                                */
                                        /*                                      Linux Mandrake release 7.0 (Air)                     */
                                        /*                                      Kernel 2.2.14-15mdk on an i686                       */
                                        /*                                      gcc 2.95.2                                           */
                                        /*                  mirabeau.polytechnique.fr                                                */
                                        /*                                      Fedora Core release 2 (Tettnang)                     */
                                        /*                                      gcc 3.3.3 20040412 (Red Hat Linux 3.3.3-7)           */
                                        /*                  nation.polytechnique.fr                                                  */
                                        /*                                      Fedora Core release 2 (Tettnang)                     */
                                        /*                                      gcc 3.3.3 20040412 (Red Hat Linux 3.3.3-7)           */
                                        /*                  opera.polytechnique.fr                                                   */
                                        /*                                      Red Hat Linux release 7.3 (Valhalla)                 */
                                        /*                                      gcc 2.96                                             */
                                        /*                  pasteur.polytechnique.fr                                                 */
                                        /*                                      Fedora Core release 4 (Stentz)                       */
                                        /*                                      gcc 4.0.1 20050727 (Red Hat 4.0.1-5)                 */
                                        /*                  plaisance.polytechnique.fr                                               */
                                        /*                                      Fedora Core release 4 (Stentz)                       */
                                        /*                                      gcc 4.0.1 20050727 (Red Hat 4.0.1-5)                 */
                                        /*                  quinet.polytechnique.fr                                                  */
                                        /*                                      Red Hat Linux release 9 (Shrike)                     */
                                        /*                                      gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5)           */
                                        /*                  rivoli.polytechnique.fr                                                  */
                                        /*                                      Fedora Core release 3 (Heidelberg)                   */
                                        /*                                      gcc 3.4.3 20050227 (Red Hat 3.4.3-22.fc3)            */
                                        /*                  simplon.polytechnique.fr                                                 */
                                        /*                                      Fedora Core release 3 (Heidelberg)                   */
                                        /*                                      gcc 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)             */
                                        /*                  telegraphe.polytechnique.fr                                              */
                                        /*                                      Fedora Core release 3 (Heidelberg)                   */
                                        /*                                      gcc 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)             */
                                        /*                  tolbiac.polytechnique.fr                                                 */
                                        /*                                      Fedora Core release 2 (Tettnang)                     */
                                        /*                                      gcc 3.3.3 20040412 (Red Hat Linux 3.3.3-7)           */
                                        /*                  trinite.polytechnique.fr                                                 */
                                        /*                                      Red Hat Linux release 9 (Shrike)                     */
                                        /*                                      gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5)           */
                                        /*                  vaneau.polytechnique.fr                                                  */
                                        /*                                      Fedora Core release 1 (Yarrow)                       */
                                        /*                                      gcc 3.3.2 20031022 (Red Hat Linux 3.3.2-1)           */
                                        /*                                                                                           */
                                        /* (les informations de "release" et de "version" ont ete ajoutees le 20051219104653...)     */
                                        /* et le defaut "Segmentation fault" ne s'est jamais produit. Le defaut semble bien venir    */
                                        /* de '$LACT16' :                                                                            */
                                        /*                                                                                           */
                                        /*                  $LACT16                                                                  */
                                        /*                                      Fedora Core release 0.95 (Severn)                    */
                                        /*                                      gcc 3.3.1 20030930 (Red Hat Linux 3.3.1-6)           */
                                        /*                                                                                           */
                                        /* (au niveau "release" et de "version", '$LACT16' est differente des autres MACHINEs...)    */
                                        /* et non de moi, ce qui justifie l'action de contournement mise en place le 20051209104948  */
                                        /* ('v $FbugsL 20051209104948')...                                                           */

DEFV(Common,DEFV(Logical,SINT(Malo_____valider_si_possible_l_utilisation_de_la_memoire_allouee,VRAI)));
                                        /* Ceci a ete introduit le 20041023101837 a cause du probleme decrit dans le commentaire     */
                                        /* ci-dessus ('v $xig/fonct$vv$FON 20041020113351').                                         */
                                        /*                                                                                           */
                                        /* Le nom est 'Malo_____v...' et non pas 'allocation_memoire_avec_validation_____v...' car,  */
                                        /* en effet, il est utilise dans 'VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(...)' */
                                        /* c'est-a-dire en dehors de 'allocation_memoire_avec_validation(...)'.                      */

DEFV(Common,DEFV(Logical,SINT(allocation_memoire_avec_validation_____signaler_explicitement_l_abort_de_non_allocation,VRAI)));
                                        /* Pour 'v $xiirs/.CAYA.G1.0129.4.$U SignalerAbortNonAllocation' cela a ete introduit le     */
                                        /* 20200727115320 afin de pouvoir "traiter" des fichiers vides...                            */

DEFV(Common,DEFV(FonctionC,POINTERc(allocation_memoire_avec_validation(nombre_d_octets_demandes
                                                                      ,commande_courante
                                                                      ,fichier_courant
                                                                      ,fonction_courante
                                                                      ,ligne_courante
                                                                       )
                                    )
                 )
     )
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme est un pointeur vers la          */
                                        /* memoire allouee, d'ou le type 'FonctionC'. Le resultat pourra donc etre place dans        */
                                        /* variable POINTERc...                                                                      */
                                        /*                                                                                           */
                                        /* Cette fonction a ete introduite le 20000224152926 suite a des ennuis avec le programme    */
                                        /* 'v $xrk/rdn_walk.52$K' sur 'SYSTEME_APC_LinuxRedHat_GCC'...                               */
DEFV(Argument,DEFV(Int,nombre_d_octets_demandes));
                                        /* Nombre d'octets demandes. On notera l'usage de 'Int' (et non pas de 'Positive') pour      */
                                        /* des raisons de compatibilite avec les usages de 'allocation_memoire_avec_validation(...)' */
                                        /* et aussi avec 'vrai_Malo_de_base(...)'.                                                   */
DEFV(Argument,DEFV(CHAR,DTb0(commande_courante)));
DEFV(Argument,DEFV(CHAR,DTb0(fichier_courant)));
DEFV(Argument,DEFV(CHAR,DTb0(fonction_courante)));
DEFV(Argument,DEFV(Int,ligne_courante));
                                        /* Ces trois arguments ont ete introduits le 20120113140943 afin d'identifier precisemment   */
                                        /* l'origine d'un probleme d'allocation memoire, comme cela s'est vu a cette date avec       */
                                        /* 'v $xci/format.01$K SET_DIMENSIONS_2D_SANS_VALIDATION' (ou 'Xmax' et 'Ymax' s'etaient     */
                                        /* retrouves negatifs...).                                                                   */
                                        /*                                                                                           */
                                        /* La 'commande_courante' a ete introduite le 20120119120322...                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(la_demande_d_allocation_a_ete_faite_et_a_ete_satisfaite,FAUX));
                                        /* Introduit le 20120131165441...                                                            */
     DEFV(TailleMalo,INIT(nombre_d_octets_demandes_effectif
                         ,AXPB(allocation_memoire_avec_validation_____Amarge_de_securite
                              ,nombre_d_octets_demandes
                              ,allocation_memoire_avec_validation_____Bmarge_de_securite
                               )
                          )
          );
                                        /* Nombre d'octets effectivement demandes incluant la marge de securite (introduit sous      */
                                        /* cete forme le 20091210075050).                                                            */
                                        /*                                                                                           */
                                        /* Le 20120201181808, 'TailleMalo' a remplace 'Int'...                                       */
     DEFV(CHAR,INIT(POINTERc(zone_memoire_allouee),CHAINE_UNDEF));
                                        /* Afin de permettre la validation de la memoire allouee...                                  */
     /*..............................................................................................................................*/
     Test(IZGT(nombre_d_octets_demandes))
          Bblock
          Test(IL_FAUT(allocation_memoire_avec_validation_____valider_par_rapport_a_MemorySizeMB))
                                        /* Test introduit le 20120201124441...                                                       */
               Bblock
               Test(EST_FAUX(allocation_memoire_avec_validation_____les_parametres_locaux_relatifs_a_MemorySizeMB_sont_connus))
                    Bblock
                    EGAL(allocation_memoire_avec_validation_____MemorySizeMB__
                        ,sHOTE_____TAILLE_DE_LA_MEMOIRE_EN_MEGA_OCTETS
                         );
                    EGAL(allocation_memoire_avec_validation_____PCMemorySizeMB
                        ,sHOTE_____TAILLE_DE_LA_MEMOIRE_DE_REFERENCE_EN_MEGA_OCTETS
                         );
                                        /* Optimisation introduite le 20120201072840 afin de ne pas ralentir l'allocation memoire    */
                                        /* avec des 'Gval(...)'s...                                                                  */
                                        /*                                                                                           */
                                        /* Pour la petite histoire, la commande :                                                    */
                                        /*                                                                                           */
                                        /*                  $xci/init$X         standard=VRAI R=...                                  */
                                        /*                                                                                           */
                                        /* executee a la date du 20120201075350 a fait 55392 appels a 'Malo(...)' !                  */
                                        /*                                                                                           */
                                        /* Le 20120213121357, je note que la fonction 'sysinfo(...)' permettrait d'obtenir la taille */
                                        /* de la memoire disponible ('freeram'), mais que l'utiliser a la place de '$MemorySizeMB'   */
                                        /* serait tres dangereux car, en effet, alors beaucoup de '$X' pourraient se trouver tres    */
                                        /* temporairement dans l'impossibilite de travailler, provoquant ainsi de nombreux aborts    */
                                        /* ci-apres...                                                                               */
                                        /*                                                                                           */
                                        /* Le 20140921104516, je rappelle un ajustement eventuel de '$PCMemorySizeMB' via, par       */
                                        /* exemple, 'v $xcg/parallele.1N$K AJUSTER_AUTOMATIQUEMENT_PCMemorySizeMB' et donc via       */
                                        /* 'execRVB' en particulier...                                                               */

                    Test(IZLE(allocation_memoire_avec_validation_____MemorySizeMB__))
                         Bblock
                         BASIQUE____Prer1("la variable '$MemorySizeMB' est incorrecte (elle vaut %" ## BFd ## ") : "
                                         ,allocation_memoire_avec_validation_____MemorySizeMB__
                                          );

                         EGAL(allocation_memoire_avec_validation_____MemorySizeMB__,VALEUR_PAR_DEFAUT_DE_MemorySizeMB);
                                        /* Introduit le 20120201104700 afin d'eviter des catastrophes...                             */

                         BASICNU____Prer1("la valeur %" ## BFd ## " est forcee.\n"
                                         ,allocation_memoire_avec_validation_____MemorySizeMB__
                                          );
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IZLE(allocation_memoire_avec_validation_____PCMemorySizeMB))
                         Bblock
                         BASIQUE____Prer1("la variable '$PCMemorySizeMB' est incorrecte (elle vaut %" ## BFd ## ") : "
                                         ,allocation_memoire_avec_validation_____PCMemorySizeMB
                                          );

                         EGAL(allocation_memoire_avec_validation_____PCMemorySizeMB,VALEUR_PAR_DEFAUT_DE_PCMemorySizeMB);
                                        /* Introduit le 20120201104700 afin d'eviter des catastrophes...                             */

                         BASICNU____Prer1("la valeur %" ## BFd ## " est forcee.\n"
                                         ,allocation_memoire_avec_validation_____PCMemorySizeMB
                                          );
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    EGAL(allocation_memoire_avec_validation_____les_parametres_locaux_relatifs_a_MemorySizeMB_sont_connus,VRAI);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFET(IL_FAUT(allocation_memoire_avec_validation_____valider_par_rapport_a_MemorySizeMB)
                   ,IFGT(nombre_d_octets_demandes_effectif
                        ,INTE(PRENDRE_UN_POURCENTAGE(MEG2(allocation_memoire_avec_validation_____MemorySizeMB__)
                                                    ,allocation_memoire_avec_validation_____PCMemorySizeMB
                                                     )
                              )
                         )
                    )
               )
                                        /* Ce test par rapport a '$MemorySizeMB' et '$PCMemorySizeMB' a ete introduit le             */
                                        /* 20120131165441 afin de pouvoir eviter "a la demande" de saturer trop une MACHINE...       */
                                        /*                                                                                           */
                                        /* On notera le 20120201091623 qu'il serait evidemment preferable de tester le nombre        */
                                        /* d'octets demandes par rapport a ce qui effectivement libre a cet instant precis,          */
                                        /* plutot que par rapport a la memoire physique totale (qui peut etre completement           */
                                        /* occupee...). Malheureusement, je ne sais comment faire...                                 */
               Bblock
                                        /* Cas ou la demande d'allocation ne semble pas raisonnable : elle n'est pas faite...        */
               Eblock
          ATes
               Bblock
                                        /* Cas ou la demande d'allocation semble raisonnable :                                       */
               EGAp(zone_memoire_allouee,vrai_Malo_de_base_effectif(nombre_d_octets_demandes_effectif));
                                        /* Allocation de la memoire demandee.                                                        */
               INCR(allocation_memoire_avec_validation_____compteur_de_tous_les_Malo
                   ,allocation_memoire_avec_validation_____increment_du_compteur_de_tous_les_Malo
                    );
                                        /* Et comptage introduit le 20180315085050...                                                */

               Test(IFEQ(IDENTITE(zone_memoire_allouee),PLUS_DE_MEMOIRE_LIBRE))
                    Bblock
                    Eblock
               ATes
                    Bblock
                    INCR(allocation_memoire_avec_validation_____cumul_de_tous_les_nombre_d_octets_demandes_effectif
                        ,nombre_d_octets_demandes_effectif
                         );
                                        /* Ce cumul a ete introduit le 20120131183248. On notera qu'il ne fait que l'objet de        */
                                        /* 'INCR(...)' et jamais de 'DECR(...)' tout simplement parce que 'Free(...)' ne sait        */
                                        /* pas combien il libere d'octets : dommage...                                               */

                    EGAL(la_demande_d_allocation_a_ete_faite_et_a_ete_satisfaite,VRAI);
                                        /* Et tout est bon...                                                                        */
                    Eblock
               ETes
               Eblock
          ETes
          Eblock
     ATes
          Bblock
                                        /* Lorsque le nombre d'octets demande est incorrect, on ne fait pas la demande et on         */
                                        /* sortira brutalement ci-apres via un 'Exit(...)'...                                        */
          Eblock
     ETes

     Test(EST_FAUX(la_demande_d_allocation_a_ete_faite_et_a_ete_satisfaite))
          Bblock
                                        /* ATTENTION, on ne peut utiliser 'PRINT_ERREUR(...)' car cette procedure utilise des        */
                                        /* fonctions qui ne sont pas encore definies (comme 'chain_Aconcaten6(...)' ou encore        */
                                        /* 'chain_numero(...)').                                                                     */
          Test(EST_VRAI(allocation_memoire_avec_validation_____signaler_explicitement_l_abort_de_non_allocation))
                                        /* Test introduit le 20200727115320...                                                       */
               Bblock
               BASIQUE____Prer0("l'allocation memoire est impossible : "
                                );
               BASICNU____Prer1(INTRODUCTION_FORMAT ## BFd ## " octet(s) etai(en)t demande(s)"
                               ,nombre_d_octets_demandes
                                );

               Test(IFNE(nombre_d_octets_demandes,nombre_d_octets_demandes_effectif))
                    Bblock
                    BASICNU____Prer1(" (soit %" ## BFd ## " octet(s)"
                                    ,nombre_d_octets_demandes_effectif
                                     );
                    BASICNU____Prer2(" avec la marge de securite {AMargeMalo=%" ## BFd ## ",BMargeMalo=%" ## BFd ## "})"
                                    ,allocation_memoire_avec_validation_____Amarge_de_securite
                                    ,allocation_memoire_avec_validation_____Bmarge_de_securite
                                     );
                                        /* Message introduit le 20091210075050...                                                    */
                    Eblock
               ATes
                    Bblock
                    BASICNU____Prer0(" (sans marge de securite)"
                                     );
                                        /* Message introduit le 20091210075050...                                                    */
                    Eblock
               ETes

               Test(IFEQ(IDENTITE(zone_memoire_allouee),PLUS_DE_MEMOIRE_LIBRE))
                    Bblock
                    BASICNU____Prer0(" alors qu'il n'y a plus de memoire libre"
                                     );
                                        /* Message introduit le 20120131173256...                                                    */
                    Eblock
               ATes
                    Bblock
                    BASICNU____Prer0(" alors que ce nombre doit etre strictement positif"
                                     );
                    BASICNU____Prer1(" et inferieur ou egal a %" ## BFd ## " a priori"
                                    ,INTE(PRENDRE_UN_POURCENTAGE(MEG2(allocation_memoire_avec_validation_____MemorySizeMB__)
                                                                ,allocation_memoire_avec_validation_____PCMemorySizeMB
                                                                 )
                                          )
                                     );
                                        /* Message introduit le 20120131173256...                                                    */
                    Eblock
               ETes

               BASICNU____Prer0(".\n"
                                );

               BASIQUE____Prer1("La commande '%s' est donc brutalement abortee afin d'eviter la propagation de cette anomalie.\n"
                               ,NOM_DE_LA_COMMANDE_COURANTE
                                );
                                        /* ATTENTION, on ne peut utiliser 'PRINT_ERREUR(...)' car cette procedure utilise des        */
                                        /* fonctions qui ne sont pas encore definies (comme 'chain_Aconcaten6(...)' ou encore        */
                                        /* 'chain_numero(...)').                                                                     */
                                        /*                                                                                           */
                                        /* Le 20120919183223 "brutalement" a ete introduit afin de rappeler que l'arret est          */
                                        /* immediat (dans le 'Exit(...)' qui suit)...                                                */
               Eblock
          ATes
               Bblock
                                        /* Dans ce cas, l'abort est silencieux...                                                    */
               Eblock
          ETes

          Abort(ERREUR24);
                                        /* Que faire d'autre que cette sortie brutale afin que cette grosse anomalie ne se           */
                                        /* propage pas sous forme de violations memoire ?                                            */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU(zone_memoire_allouee);
                                        /* Renvoi d'un pointeur sur la memoire allouee.                                              */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   L A   T A I L L E   D ' U N E   C H A I N E   D E                                                      */
/*        C A R A C T E R E S   N O N   C O M P R I S   L E   " E N D _ O F _ C H A I N '  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION : les fonctions 'chain_Xtaille(...)' et 'chain_taille(...)' sont placees devant */
                                        /* la fonction 'chain_recherche_d_un_caractere(...)' car cette derniere les utilisent, et    */
                                        /* qu'alors un ordre different donne sur 'SYSTEME_HP7??_HPUX_CC' le message suivant :        */
                                        /*                                                                                           */
                                        /*        cc: ...: warning 533: Inconsistent type declaration for function "chain_taille".   */
                                        /*                                                                                           */
                                        /* lors de la compilation du fichier "bootstrappable '$xbg/fonction$c".                      */
                                        /*                                                                                           */
                                        /* Le 20041023220032, les fonctions 'chain_Xtaille(...)' et 'chain_taille(...)' ont ete      */
                                        /* placees ici pour que 'VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(...)'          */
                                        /* puisse l'utiliser ensuite...                                                              */

BFonctionI

DEFV(Common,DEFV(Int,INIT(chain_Xtaille_____index_du_premier_caractere,UNDEF)));
DEFV(Common,DEFV(Int,INIT(chain_Xtaille_____index_du_dernier_caractere,UNDEF)));
                                        /* Index du premier et du dernier caractere...                                               */
                                        /*                                                                                           */
                                        /* ATTENTION : il est tres important de noter qu'il convient d'utiliser immediatement        */
                                        /* ces deux valeurs, car, en effet, de nombreuses procedures de type 'Prin?(...)' ou         */
                                        /* encore 'Prer?(...)' utilisent plus ou moins directement 'chain_Xtaille(...)'.             */

DEFV(Common,DEFV(FonctionI,chain_Xtaille(chaineA)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine argument, dont la taille (non compris le 'END_OF_CHAIN') sera                      */
                                        /* renvoye par le 'RETU', d'ou le type 'FonctionI' de cette fonction.                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(taille,ZERO));
                                        /* Et sa taille.                                                                             */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
                                        /* Ce test a ete introduit le 20010410091210 apres des essais d'initialisation d'arguments   */
                                        /* du type 'v $xcp/Lconstantes$K constante_recherchee' avec 'ADRESSE_NON_ENCORE_DEFINIE'     */
                                        /* au lieu de l'habituel 'NOM_UNDEF_VIDE', cette initialisation ayant ete tentee             */
                                        /* initialement dans 'v $xig/edite$vv$FON Fedition_des_constantes_fondamentales' en tant     */
                                        /* qu'argument declare de type 'Common' (comme l'est par exemple l'argument                  */
                                        /* 'v $xig/edite$vv$FON signer_les_valeurs_numeriques_dans_Fedition_des_constantes_...').    */
          Bblock
          DEFV(Int,INIT(index,PREMIER_CARACTERE));
                                        /* Index de la chaine argument,                                                              */

          EGAL(chain_Xtaille_____index_du_premier_caractere,index);
                                        /* Index du premier caractere.                                                               */

          Tant(IFNE(ITb0(chaineA,INDX(index,PREMIER_CARACTERE)),END_OF_CHAIN))
               Bblock
               INCR(taille,I);
                                        /* Calcul de la longueur (hors 'END_OF_CHAIN') de la chaine argument.                        */
               INCR(index,I);
               Eblock
          ETan

          EGAL(chain_Xtaille_____index_du_dernier_caractere,SOUS(index,I));
                                        /* Index du dernier caractere.                                                               */
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU(taille);
                                        /* Renvoi de la longueur de chaine argument (non compris 'END_OF_CHAIN').                    */
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   L A   T A I L L E   D ' U N E   C H A I N E   D E                                                      */
/*        C A R A C T E R E S   Y   C O M P R I S   L E   " E N D _ O F _ C H A I N '  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION : les fonctions 'chain_Xtaille(...)' et 'chain_taille(...)' sont placees devant */
                                        /* la fonction 'chain_recherche_d_un_caractere(...)' car cette derniere les utilisent, et    */
                                        /* qu'alors un ordre different donne sur 'SYSTEME_HP7??_HPUX_CC' le message suivant :        */
                                        /*                                                                                           */
                                        /*        cc: ...: warning 533: Inconsistent type declaration for function "chain_taille".   */
                                        /*                                                                                           */
                                        /* lors de la compilation du fichier "bootstrappable '$xbg/fonction$c".                      */

BFonctionI

DEFV(Common,DEFV(FonctionI,chain_taille(chaineA)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine argument, dont la taille (y compris le 'END_OF_CHAIN') sera                        */
                                        /* renvoye par le 'RETU', d'ou le type 'FonctionI' de cette fonction.                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(ADD2(chain_Xtaille(chaineA),SIZC(C_VIDE)));
                                        /* Renvoi de la longueur de chaine argument (y compris 'END_OF_CHAIN').                      */
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O M P T A G E   D E S   O C C U R E N C E S   D ' U N   C A R A C T E R E   D A N S   U N E   C H A I N E  :             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,chain_comptage_des_occurences_d_un_caractere(chaineA,caractereA)))
                                        /* Fonction introduite le 20071227102607...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine argument, dans laquelle on va compter kes occurence d'un caractere donne           */
                                        /* 'caractereA'.                                                                             */
DEFV(Argument,DEFV(CHAR,caractereA));
                                        /* Caractere recherche dans la chaine...                                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(compteur,ZERO));
                                        /* Compteur des occurences de 'caractereA'.                                                  */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          DEFV(Int,INIT(index,PREMIER_CARACTERE));
                                        /* Index de la chaine argument.                                                              */

          Tant(IFNE(ITb0(chaineA,INDX(index,PREMIER_CARACTERE)),END_OF_CHAIN))
               Bblock
               Test(IFEQ(ITb0(chaineA,INDX(index,PREMIER_CARACTERE)),caractereA))
                    Bblock
                    INCK(compteur);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               INCR(index,I);
               Eblock
          ETan
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
          Eblock
     ETes

     RETU(compteur);
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D E   L ' I N D E X   D E   L A   P R E M I E R E   O C C U R E N C E                                  */
/*        D ' U N   C A R A C T E R E   D A N S   U N E   C H A I N E  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION : les fonctions 'chain_recherche_premier_caractere(...)' et                     */
                                        /* 'chain_recherche_dernier_caractere(...)' sont placees devant toutes les autres fonctions  */
                                        /* depuis l'edition de la date dans 'PRINT_DEFAUT(...)', ce qui autrement donnerait (sur     */
                                        /* 'SYSTEME_SGIND?GA_IRIX_CC') le message suivant :                                          */
                                        /*                                                                                           */
                                        /*   cfe: Error: fonction.c, line ...: redeclaration of 'chain_recherche_dernier_caractere'; */
                                        /*                                     previous declaration at line ... in file 'fonction.c' */
                                        /*                                                                                           */
                                        /* lors de la compilation du fichier '$xbg/fonction$K".                                      */

BFonctionI

DEFV(Common,DEFV(FonctionI,chain_recherche_premier_caractere(chaineA,index_de_debut_de_recherche,caractereA)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine argument, dans laquelle on va rechercher la premiere occurence d'un caractere      */
                                        /* donne 'caractereA'.                                                                       */
DEFV(Argument,DEFV(Int,index_de_debut_de_recherche));
                                        /* Index du premier caractere ou commencer la recherche...                                   */
DEFV(Argument,DEFV(CHAR,caractereA));
                                        /* Caractere recherche dans la chaine...                                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(index,index_de_debut_de_recherche));
                                        /* Index de la chaine argument.                                                              */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          Tant(IFET(IFNE(ITb0(chaineA,INDX(index,PREMIER_CARACTERE)),END_OF_CHAIN)
                   ,IFNE(ITb0(chaineA,INDX(index,PREMIER_CARACTERE)),caractereA)
                    )
               )
               Bblock
               INCR(index,I);
               Eblock
          ETan
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU(index);
                                        /* Renvoi de l'index de la premiere occurence du caractere recherche, ou bien de celle de    */
                                        /* 'END_OF_CHAIN' si on ne l'a pas trouve...                                                 */
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D E   L ' I N D E X   D E   L A   D E R N I E R E   O C C U R E N C E                                  */
/*        D ' U N   C A R A C T E R E   D A N S   U N E   C H A I N E  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION : les fonctions 'chain_recherche_premier_caractere(...)' et                     */
                                        /* 'chain_recherche_dernier_caractere(...)' sont placees devant toutes les autres fonctions  */
                                        /* depuis l'edition de la date dans 'PRINT_DEFAUT(...)', ce qui autrement donnerait (sur     */
                                        /* 'SYSTEME_SGIND?GA_IRIX_CC') le message suivant :                                          */
                                        /*                                                                                           */
                                        /*   cfe: Error: fonction.c, line ...: redeclaration of 'chain_recherche_dernier_caractere'; */
                                        /*                                     previous declaration at line ... in file 'fonction.c' */
                                        /*                                                                                           */
                                        /* lors de la compilation du fichier '$xbg/fonction$K".                                      */

BFonctionI

DEFV(Common,DEFV(FonctionI,chain_recherche_dernier_caractere(chaineA,caractereA)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine argument, dans laquelle on va rechercher la derniere occurence d'un caractere      */
                                        /* donne 'caractereA'.                                                                       */
DEFV(Argument,DEFV(CHAR,caractereA));
                                        /* Caractere recherche dans la chaine...                                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(index_du_END_OF_CHAIN,chain_recherche_premier_caractere(chaineA,PREMIER_CARACTERE,END_OF_CHAIN)));
                                        /* Index du caractere 'END_OF_CHAIN' dans la chaine Argument.                                */
     DEFV(Int,INIT(index_de_la_derniere_occurence_de_caractereA,PRED(PREMIER_CARACTERE)));
                                        /* Index de la derniere occurence du caractere recherche, initialise "devant" la chaine...   */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          DEFV(Int,INIT(index_de_caractereA,PRED(PREMIER_CARACTERE)));
                                        /* Index courant du caractere recherche.                                                     */

          Tant(IFLT(index_de_caractereA,index_du_END_OF_CHAIN))
               Bblock
               EGAL(index_de_la_derniere_occurence_de_caractereA,index_de_caractereA);
                                        /* Mise a jour de l'index de la derniere occurence du caractere recherche.                   */
               EGAL(index_de_caractereA
                   ,chain_recherche_premier_caractere(chaineA
                                                     ,SUCC(index_de_la_derniere_occurence_de_caractereA)
                                                     ,caractereA
                                                      )
                    );
                                        /* Mise a jour de l'index de la derniere occurence du caractere recherche.                   */
               Eblock
          ETan
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU(index_de_la_derniere_occurence_de_caractereA);
                                        /* Renvoi de l'index de la derniere occurence du caractere recherche, ou bien celui qui      */
                                        /* precede la chaine Argument si on ne l'a pas trouve...                                     */
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   G E N E R A L E   D E S   M E S S A G E S   D ' E R R E U R  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* ATTENTION, le 19980420092917, 'PRINT_DEFAUT_____vient_d_apparaitre' a du etre place ici   */
                                        /* car il y est des plus utiles...                                                           */

DEFV(Common,DEFV(Logical,ZINT(PRINT_DEFAUT_____vient_d_apparaitre,FAUX)));
                                        /* Indicateur utile pour minimiser le nombre de changements de ligne en cas de defaut...     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E S T   D ' U N   C A R A C T E R E   ( E S T - C E   U N   C O D E   D E   C O N T R O L E )  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionL

DEFV(Common,DEFV(FonctionL,est_ce_un_code_de_controle(caractere_a_tester)))
DEFV(Argument,DEFV(CHAR,caractere_a_tester));
                                        /* Caractere dont on cherche a savoir si c'est un caractere de controle ou pas...            */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(IFLT(caractere_a_tester,K_BLANC));
                                        /* Le test "effectif" pour savoir si 'caractere_a_tester' est un code controle est en        */
                                        /* realite tres naif...                                                                      */
     Eblock

EFonctionL

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E S T   D ' U N   C A R A C T E R E   ( E S T - C E   A L P H A - N U M E R I Q U E ? )  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionL

                                        /* ATTENTION, le 19980420092917, la fonction 'est_ce_alpha_numerique(...)' a ete implantee   */
                                        /* avant les fonctions de copies car, en effet, 'MOVE_CARACTERE(...)' l'utilise...           */

#define   EST_CE_ALPHA_NUMERIQUE(VRAI_ou_FAUX,valeur,caractere_permute_minuscules_et_majuscules)                                        \
                    Bblock                                                                                                              \
                    EGAL(c_est_alpha_numerique,VRAI_ou_FAUX);                                                                           \
                    EGAL(est_ce_alpha_numerique_____valeur_numerique,valeur);                                                           \
                    EGAL(est_ce_alpha_numerique_____caractere_permute_minuscules_et_majuscules                                          \
                        ,caractere_permute_minuscules_et_majuscules                                                                     \
                         );                                                                                                             \
                    Eblock

#define   C_EST_ALPHA_NUMERIQUE(code_caractere,caractere_permute_minuscules_et_majuscules)                                              \
                    Ca1e(code_caractere)                                                                                                \
                         Bblock                                                                                                         \
                         EST_CE_ALPHA_NUMERIQUE(VRAI                                                                                    \
                                               ,VALEUR_NUMERIQUE_D_UN_CARACTERE_NON_HEXADECIMAL                                         \
                                               ,caractere_permute_minuscules_et_majuscules                                              \
                                                );                                                                                      \
                         Eblock                                                                                                         \
                    ECa1
#define   C_EST_ALPHA_NUMERIQUE_NUMERIQUE(code_caractere,caractere_permute_minuscules_et_majuscules,valeur)                             \
                    Ca1e(code_caractere)                                                                                                \
                         Bblock                                                                                                         \
                         EST_CE_ALPHA_NUMERIQUE(VRAI,valeur,caractere_permute_minuscules_et_majuscules);                                \
                                                                                                                                        \
                         Test(IFEQ(valeur,VALEUR_NUMERIQUE_D_UN_CARACTERE_NON_HEXADECIMAL))                                             \
                              Bblock                                                                                                    \
                              BASIQUE____Prer0("le test de discrimination des codes-hexadecimaux est incoherent : "                     \
                                               );                                                                                       \
                              BASICNU____Prer1("le code non hexa-decimal vaut %" ## BFd ## "\n"                                         \
                                              ,VALEUR_NUMERIQUE_D_UN_CARACTERE_NON_HEXADECIMAL                                          \
                                               );                                                                                       \
                                        /* ATTENTION, jusqu'au 19980420092917, il y avait ici :                                      */ \
                                        /*                                                                                           */ \
                                        /*        PRINT_ERREUR("le test de discrimination des codes-hexadecimaux est incoherent");   */ \
                                        /*        CAL1(Prer1("\n le code 'non hexa-decimal vaut %d"                                  */ \
                                        /*                  ,VALEUR_NUMERIQUE_D_UN_CARACTERE_NON_HEXADECIMAL                         */ \
                                        /*                   )                                                                       */ \
                                        /*             );                                                                            */ \
                                        /*                                                                                           */ \
                                        /* mais ce code utilise les fonctions de copie (et d'autres choses encore...) qui ne sont    */ \
                                        /* definies qu'apres. D'ou la l'utilisation de 'CAL1(BASIQUE____Prer?(...))'.                */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION, jusqu'au 20030917094227, il y avait ici :                                      */ \
                                        /*                                                                                           */ \
                                        /*        CAL1(BASIQUE____Prer1("\n le code 'non hexa-decimal vaut %d"                       */ \
                                        /*                             ,VALEUR_NUMERIQUE_D_UN_CARACTERE_NON_HEXADECIMAL              */ \
                                        /*                              )                                                            */ \
                                        /*             );                                                                            */ \
                                        /*                                                                                           */ \
                                        /* que je n'explique pas...                                                                  */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ECa1

#define   CE_N_EST_PAS_ALPHA_NUMERIQUE(code_caractere,caractere_permute_minuscules_et_majuscules)                                       \
                    Ca1e(code_caractere)                                                                                                \
                         Bblock                                                                                                         \
                         EST_CE_ALPHA_NUMERIQUE(FAUX                                                                                    \
                                               ,VALEUR_NUMERIQUE_D_UN_CARACTERE_NON_HEXADECIMAL                                         \
                                               ,caractere_permute_minuscules_et_majuscules                                              \
                                                );                                                                                      \
                         Eblock                                                                                                         \
                    ECa1

DEFV(Common,DEFV(Logical,SINT(est_ce_alpha_numerique_____END_OF_CHAIN_doit_etre_dans_la_liste,VRAI)));
                                        /* Cet indicateur a ete introduit le 20040906151114 afin d'etre utilise dans                 */
                                        /* 'v $xcp/car_controle$K est_ce_alpha_numerique_____END_OF_CHAIN_doit_etre_dans_la_liste'.  */
                                        /*                                                                                           */
                                        /* ATTENTION : 'est_ce_alpha_numerique_____END_OF_CHAIN_doit_etre_dans_la_liste' est un      */
                                        /* indicateur de controle de fonctionnement de 'est_ce_alpha_numerique(...)' et non pas      */
                                        /* pas un resultat renvoye (comme le sont les autres 'est_ce_alpha_numerique_____*' qui      */
                                        /* suivent...).                                                                              */

DEFV(Common,DEFV(Logical,SINT(est_ce_alpha_numerique_____c_est_un_code_de_controle,LUNDEF)));
                                        /* Permet de savoir au retour de 'est_ce_alpha_numerique(...)' si 'caractere_a_tester'       */
                                        /* est un code controle (ceci fut introduit le 20070713155741...).                           */
DEFV(Common,DEFV(Logical,SINT(est_ce_alpha_numerique_____le_caractere_a_tester_est_dans_la_liste,LUNDEF)));
                                        /* Permet de savoir au retour de 'est_ce_alpha_numerique(...)' si 'caractere_a_tester'       */
                                        /* etait dans la liste ('VRAI') ou pas ('FAUX'). Ceci a ete introduit le 19991027163239      */
                                        /* lors de l'introduction de la commande 'v $xcp/car_controle$K'.                            */
                                        /*                                                                                           */
                                        /* On notera bien que 'est_ce_alpha_numerique_____le_caractere_a_tester_est_dans_la_liste',  */
                                        /* indicateur renvoye par 'est_ce_alpha_numerique(...)', ne signifie pas que le caractere    */
                                        /* teste est alpha-numerique, mais plutot qu'il figure dans la liste definie par 'Choi(...)' */
                                        /* dans cette fonction et que l'une des deux procedures 'C_EST_ALPHA_NUMERIQUE(...)' et      */
                                        /* 'CE_N_EST_PAS_ALPHA_NUMERIQUE(...)' l'a reconnu ; les caracteres dits "non reconnus"      */
                                        /* sont ceux qui correspondent au 'Defo' du 'Choi(...)'...                                   */
DEFV(Common,DEFV(Int,INIT(est_ce_alpha_numerique_____valeur_numerique,UNDEF)));
                                        /* Valeur numerique renvoyee en cas de caractere de type "decimal" ou "hexa-decimal".        */
DEFV(Common,DEFV(CHAR,INIT(est_ce_alpha_numerique_____caractere_permute_minuscules_et_majuscules,K_UNDEF)));
                                        /* Caractere obtenu par substitution "Minuscule <--> Majuscule" de 'caractere_a_tester'      */
                                        /* lorsque cela a un sens (introduit le 20090108085904).                                     */

DEFV(Common,DEFV(FonctionL,est_ce_alpha_numerique(caractere_a_tester)))
DEFV(Argument,DEFV(CHAR,caractere_a_tester));
                                        /* Caractere dont on cherche a savoir s'il est alpha-numerique ou pas...                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(c_est_alpha_numerique,FAUX));
                                        /* Indicateur logique indiquant s'il s'agit d'un caractere alpha-numerique ('VRAI') ou       */
                                        /* non ('FAUX'). ATTENTION, jusqu'au 19980420092917, sa valeur initiale etait 'LUNDEF'       */
                                        /* mais ayant modife la sequence 'Defo' ci-apres, il est plus logique d'initialiser avec     */
                                        /* la valeur 'FAUX' qui correspond effectivement a tous les cas non traites...               */
     /*..............................................................................................................................*/
     EGAL(est_ce_alpha_numerique_____le_caractere_a_tester_est_dans_la_liste,VRAI);
                                        /* A priori, le caractere 'caractere_a_tester' est dans la liste des caracteres reconnus.    */

     EGAL(est_ce_alpha_numerique_____c_est_un_code_de_controle,est_ce_un_code_de_controle(caractere_a_tester));
                                        /* Le test "effectif" pour savoir si 'caractere_a_tester' est un code controle est en        */
                                        /* realite tres naif...                                                                      */

     Choi(caractere_a_tester)
          Bblock

                                        /* Nota : cette facon de faire pour assurer le test des caracteres pourrait etre consideree  */
                                        /* par certains comme extremement lourde et maladroite, mais en fait, il n'en est rien, car  */
                                        /* en effet, le but est ici d'etre completement independant des codes des caracteres...      */

          C_EST_ALPHA_NUMERIQUE(END_OF_CHAIN,END_OF_CHAIN)
                                        /* A cause de 'MOVE_CARACTERE_____ne_deplacer_que_les_caracteres_alpha_numeriques', le       */
                                        /* test sur 'END_OF_CHAIN' a ete ajoute le 19980420092917.                                   */

          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_LF,K_LF)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_BLANC,K_BLANC)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_EXCLAMATION,K_EXCLAMATION)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_QUOTE,K_QUOTE)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_DIESE,K_DIESE)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_DOLLAR,K_DOLLAR)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_POUR_CENT,K_POUR_CENT)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_ET,K_ET)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_APOSTROPHE,K_APOSTROPHE)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_PG,K_PG)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_PD,K_PD)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_ETOILE,K_ETOILE)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_PLUS,K_PLUS)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_VIRGULE,K_VIRGULE)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_MOINS,K_MOINS)

          C_EST_ALPHA_NUMERIQUE(K_POINT,K_POINT)

          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_SLASH,K_SLASH)

          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_0,K_0,ZERO)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_1,K_1,UN)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_2,K_2,DEUX)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_3,K_3,TROIS)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_4,K_4,QUATRE)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_5,K_5,CINQ)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_6,K_6,SIX)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_7,K_7,SEPT)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_8,K_8,HUIT)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_9,K_9,NEUF)

          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_DEUX_POINTS,K_DEUX_POINTS)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_POINT_VIRGULE,K_POINT_VIRGULE)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_INFERIEUR,K_INFERIEUR)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_EGAL,K_EGAL)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_SUPERIEUR,K_SUPERIEUR)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_INTERROGATION,K_INTERROGATION)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_A_ROND,K_A_ROND)

          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_A,K_a,DIX)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_B,K_b,ONZE)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_C,K_c,DOUZE)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_D,K_d,TREIZE)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_E,K_e,QUATORZE)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_F,K_f,QUINZE)

          C_EST_ALPHA_NUMERIQUE(K_G,K_g)
          C_EST_ALPHA_NUMERIQUE(K_H,K_h)
          C_EST_ALPHA_NUMERIQUE(K_I,K_i)
          C_EST_ALPHA_NUMERIQUE(K_J,K_j)
          C_EST_ALPHA_NUMERIQUE(K_K,K_k)
          C_EST_ALPHA_NUMERIQUE(K_L,K_l)
          C_EST_ALPHA_NUMERIQUE(K_M,K_m)
          C_EST_ALPHA_NUMERIQUE(K_N,K_n)
          C_EST_ALPHA_NUMERIQUE(K_O,K_o)
          C_EST_ALPHA_NUMERIQUE(K_P,K_p)
          C_EST_ALPHA_NUMERIQUE(K_Q,K_q)
          C_EST_ALPHA_NUMERIQUE(K_R,K_r)
          C_EST_ALPHA_NUMERIQUE(K_S,K_s)
          C_EST_ALPHA_NUMERIQUE(K_T,K_t)
          C_EST_ALPHA_NUMERIQUE(K_U,K_u)
          C_EST_ALPHA_NUMERIQUE(K_V,K_v)
          C_EST_ALPHA_NUMERIQUE(K_W,K_w)
          C_EST_ALPHA_NUMERIQUE(K_X,K_x)
          C_EST_ALPHA_NUMERIQUE(K_Y,K_y)
          C_EST_ALPHA_NUMERIQUE(K_Z,K_z)

          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_CG,K_CG)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_ANTI_SLASH,K_ANTI_SLASH)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_CD,K_CD)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_CIRCONFLEXE,K_CIRCONFLEXE)

          C_EST_ALPHA_NUMERIQUE(K_UNDERSCORE,K_UNDERSCORE)

          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_ANTI_QUOTE,K_ANTI_QUOTE)

          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_a,K_A,DIX)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_b,K_B,ONZE)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_c,K_C,DOUZE)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_d,K_D,TREIZE)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_e,K_E,QUATORZE)
          C_EST_ALPHA_NUMERIQUE_NUMERIQUE(K_f,K_F,QUINZE)

          C_EST_ALPHA_NUMERIQUE(K_g,K_G)
          C_EST_ALPHA_NUMERIQUE(K_h,K_H)
          C_EST_ALPHA_NUMERIQUE(K_i,K_I)
          C_EST_ALPHA_NUMERIQUE(K_j,K_J)
          C_EST_ALPHA_NUMERIQUE(K_k,K_K)
          C_EST_ALPHA_NUMERIQUE(K_l,K_L)
          C_EST_ALPHA_NUMERIQUE(K_m,K_M)
          C_EST_ALPHA_NUMERIQUE(K_n,K_N)
          C_EST_ALPHA_NUMERIQUE(K_o,K_O)
          C_EST_ALPHA_NUMERIQUE(K_p,K_P)
          C_EST_ALPHA_NUMERIQUE(K_q,K_Q)
          C_EST_ALPHA_NUMERIQUE(K_r,K_R)
          C_EST_ALPHA_NUMERIQUE(K_s,K_S)
          C_EST_ALPHA_NUMERIQUE(K_t,K_T)
          C_EST_ALPHA_NUMERIQUE(K_u,K_U)
          C_EST_ALPHA_NUMERIQUE(K_v,K_V)
          C_EST_ALPHA_NUMERIQUE(K_w,K_W)
          C_EST_ALPHA_NUMERIQUE(K_x,K_X)
          C_EST_ALPHA_NUMERIQUE(K_y,K_Y)
          C_EST_ALPHA_NUMERIQUE(K_z,K_Z)

          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_AG,K_AG)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_PIPE,K_PIPE)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_AD,K_AD)
          CE_N_EST_PAS_ALPHA_NUMERIQUE(K_TILDA,K_TILDA)

          Defo
               Bblock
                                        /* ATTENTION, jusqu'au 19980420092917, il y avait ici :                                      */
                                        /*                                                                                           */
                                        /*                  PRINT_ERREUR("le caractere demande n'existe pas dans la liste");         */
                                        /*                  CAL1(Prer1("\n son code hexa-decimal est %08X",caractere_a_tester));     */
                                        /*                                                                                           */
                                        /* mais ce code utilise les fonctions de copie (et d'autres choses encore...) qui ne sont    */
                                        /* definies qu'apres. D'ou la disparition de ce code, et la nouvelle valeur par defaut       */
                                        /* de 'c_est_alpha_numerique' a 'FAUX'...                                                    */
               EGAL(est_ce_alpha_numerique_____le_caractere_a_tester_est_dans_la_liste,FAUX);
                                        /* Le caractere 'caractere_a_tester' n'etait pas dans la liste des caracteres reconnus.      */
               Eblock
          EDef
          Eblock
     ECho

     Test(IFEQ(caractere_a_tester,END_OF_CHAIN))
          Bblock
          Test(EST_FAUX(est_ce_alpha_numerique_____END_OF_CHAIN_doit_etre_dans_la_liste))
               Bblock
               EGAL(est_ce_alpha_numerique_____le_caractere_a_tester_est_dans_la_liste,FAUX);
                                        /* Et on inverse donc cet indicateur (introduit le 20040906151114)...                        */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU(c_est_alpha_numerique);
     Eblock

#undef    CE_N_EST_PAS_ALPHA_NUMERIQUE

#undef    C_EST_ALPHA_NUMERIQUE_NUMERIQUE
#undef    C_EST_ALPHA_NUMERIQUE

#undef    EST_CE_ALPHA_NUMERIQUE

EFonctionL

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   M A J U S C U L E - M I N U S C U L E  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES                                                                               \
                    VRAI
#define   NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES                                                                        \
                    NOTL(TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES)
                                        /* Afin de controler les conversions majuscules-minuscules...                                */

BFonctionC

DEFV(Common,DEFV(Logical,SINT(GET_ARGUMENT_____convertir_les_caracteres_majuscules_en_caracteres_minuscules
                             ,NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES
                              )
                 )
     );
                                        /* Doit-on convertir les majuscules en minuscules dans 'MOVE_CARACTERE(...)' si cela est     */
                                        /* autorise pour les procedures du type 'GET_ARGUMENT_?(...)' ?                              */

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,SINT(FPrin_____convertir_les_caracteres_majuscules_en_caracteres_minuscules
                             ,NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES
                              )
                 )
     );
                                        /* Doit-on convertir les majuscules en minuscules dans 'MOVE_CARACTERE(...)' si cela est     */
                                        /* autorise pour les procedures du type 'FPrin?(...)' (introduit le 20011202152754) ?        */
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#define   CONVERSION_MAJUSCULE_EN_MINUSCULE(caractere_majuscule,caractere_minuscule)                                                    \
                    Ca1e(caractere_majuscule)                                                                                           \
                         Bblock                                                                                                         \
                         EGAL(caractere_converti,caractere_minuscule);                                                                  \
                         Eblock                                                                                                         \
                    ECa1

DEFV(Common,DEFV(FonctionC,conversion_d_un_caractere_majuscule_en_un_caractere_minuscule(caractere_a_convertir)))
DEFV(Argument,DEFV(CHAR,caractere_a_convertir));
                                        /* Caractere a convertir en minuscule si c'est un caractere majuscule...                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     DEFV(CHAR,INIT(caractere_converti,caractere_a_convertir));
                                        /* A priori, pas de conversion...                                                            */
     /*..............................................................................................................................*/
     Choi(caractere_a_convertir)
          Bblock

                                        /* Nota : cette facon de faire pour assurer le test des caracteres pourrait etre consideree  */
                                        /* par certains comme extremement lourde et maladroite, mais en fait, il n'en est rien, car  */
                                        /* en effet, le but est ici d'etre completement independant des codes des caracteres...      */

          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_A,K_a)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_B,K_b)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_C,K_c)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_D,K_d)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_E,K_e)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_F,K_f)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_G,K_g)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_H,K_h)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_I,K_i)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_J,K_j)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_K,K_k)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_L,K_l)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_M,K_m)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_N,K_n)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_O,K_o)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_P,K_p)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_Q,K_q)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_R,K_r)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_S,K_s)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_T,K_t)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_U,K_u)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_V,K_v)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_W,K_w)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_X,K_x)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_Y,K_y)
          CONVERSION_MAJUSCULE_EN_MINUSCULE(K_Z,K_z)

          Defo
               Bblock
               Eblock
          EDef
          Eblock
     ECho

     RETU(caractere_converti);
     Eblock

#undef    CONVERSION_MAJUSCULE_EN_MINUSCULE

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   M I N U S C U L E - M A J U S C U L E  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES                                                                               \
                    VRAI
#define   NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES                                                                        \
                    NOTL(TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES)
                                        /* Afin de controler les conversions minuscules-majuscules...                                */

BFonctionC

DEFV(Common,DEFV(Logical,SINT(GET_ARGUMENT_____convertir_les_caracteres_minuscules_en_caracteres_majuscules
                             ,NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES
                              )
                 )
     );
                                        /* Doit-on convertir les minuscules en majuscules dans 'MOVE_CARACTERE(...)' si cela est     */
                                        /* autorise pour les procedures du type 'GET_ARGUMENT_?(...)' ?                              */

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,SINT(FPrin_____convertir_les_caracteres_minuscules_en_caracteres_majuscules
                             ,NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES
                              )
                 )
     );
                                        /* Doit-on convertir les minuscules en majuscules dans 'MOVE_CARACTERE(...)' si cela est     */
                                        /* autorise pour les procedures du type ''FPrin?(...)' (introduit le 20011202152754) ?       */
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#define   CONVERSION_MINUSCULE_EN_MAJUSCULE(caractere_majuscule,caractere_minuscule)                                                    \
                    Ca1e(caractere_minuscule)                                                                                           \
                         Bblock                                                                                                         \
                         EGAL(caractere_converti,caractere_majuscule);                                                                  \
                         Eblock                                                                                                         \
                    ECa1

DEFV(Common,DEFV(FonctionC,conversion_d_un_caractere_minuscule_en_un_caractere_majuscule(caractere_a_convertir)))
DEFV(Argument,DEFV(CHAR,caractere_a_convertir));
                                        /* Caractere a convertir en majuscule si c'est un caractere minuscule...                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     DEFV(CHAR,INIT(caractere_converti,caractere_a_convertir));
                                        /* A priori, pas de conversion...                                                            */
     /*..............................................................................................................................*/
     Choi(caractere_a_convertir)
          Bblock

                                        /* Nota : cette facon de faire pour assurer le test des caracteres pourrait etre consideree  */
                                        /* par certains comme extremement lourde et maladroite, mais en fait, il n'en est rien, car  */
                                        /* en effet, le but est ici d'etre completement independant des codes des caracteres...      */

          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_A,K_a)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_B,K_b)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_C,K_c)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_D,K_d)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_E,K_e)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_F,K_f)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_G,K_g)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_H,K_h)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_I,K_i)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_J,K_j)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_K,K_k)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_L,K_l)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_M,K_m)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_N,K_n)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_O,K_o)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_P,K_p)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_Q,K_q)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_R,K_r)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_S,K_s)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_T,K_t)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_U,K_u)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_V,K_v)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_W,K_w)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_X,K_x)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_Y,K_y)
          CONVERSION_MINUSCULE_EN_MAJUSCULE(K_Z,K_z)

          Defo
               Bblock
               Eblock
          EDef
          Eblock
     ECho

     RETU(caractere_converti);
     Eblock

#undef    CONVERSION_MINUSCULE_EN_MAJUSCULE

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   N U M E R I Q U E   D ' U N E   C H A I N E   D E   C A R A C T E R E S  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Positive,SINT(chain_conversion_numerique_____base,DEUX)));
                                        /* Base de conversion par defaut...                                                          */

DEFV(Common,DEFV(FonctionF,chain_conversion_numerique(chaineA)))
                                        /* Fonction introduite le 20081216103122...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine argument que l'on va convertir en une valeur numerique.                            */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(valeur_numerique_de_la_chaine,FZERO));
                                        /* Valeur numerique de 'chaineA'.                                                            */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          DEFV(Int,INIT(index,PREMIER_CARACTERE));
                                        /* Index de la chaine argument,                                                              */

          Tant(IFNE(ITb0(chaineA,INDX(index,PREMIER_CARACTERE)),END_OF_CHAIN))
               Bblock
               DEFV(CHAR,INIT(caractere_courant,ITb0(chaineA,INDX(NEUT(index),PREMIER_CARACTERE))));
                                        /* Caractere courant de 'chaineA'.                                                           */

               CALS(est_ce_alpha_numerique(caractere_courant));
                                        /* Cet appel est destine juste a evaluer 'est_ce_alpha_numerique_____valeur_numerique'...    */

               Test(IFET(IFNE(est_ce_alpha_numerique_____valeur_numerique,VALEUR_NUMERIQUE_D_UN_CARACTERE_NON_HEXADECIMAL)
                        ,IFLT(est_ce_alpha_numerique_____valeur_numerique,chain_conversion_numerique_____base)
                         )
                    )
                    Bblock
                    EGAL(valeur_numerique_de_la_chaine
                        ,AXPB(valeur_numerique_de_la_chaine
                             ,FLOT(chain_conversion_numerique_____base)
                             ,FLOT(est_ce_alpha_numerique_____valeur_numerique)
                              )
                         );
                    Eblock
               ATes
                    Bblock
                    BASIQUE____Prer0("Un caractere non numerique et/ou non compatible avec la base a ete rencontre.\n"
                                     );
                    BASICNU____Prer2("(il s'agit du caractere '%c' d'index %" ## BFd ## ")\n"
                                    ,caractere_courant
                                    ,index
                                     );
                                        /* ATTENTION, on ne peut utiliser 'PRINT_ERREUR(...)' car cette procedure utilise            */
                                        /* indirectement 'chain_Acopie_avec_conversions_possibles_majuscules_minuscules(...)'.       */
                    Eblock
               ETes

               INCR(index,I);
               Eblock
          ETan
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
          Eblock
     ETes

     RETU(valeur_numerique_de_la_chaine);
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R A G E   D E S   F O R M A T S   D E S   E D I T I O N S   H E X A - D E C I M A L E S  :                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* Le 20190905134645, j'ai voulu introduire ici :                                            */
                                        /*                                                                                           */
                                        /*   DEFV(Common,DEFV(Positive,ZINT(nombre_de_chiffres_des_editions_hexa_decimales,NCHXMO    */
                                        /*                                 ,NCHXMO                                                   */
                                        /*                                  )                                                        */
                                        /*                    )                                                                      */
                                        /*        );                                                                                 */
                                        /*                                                                                           */
                                        /* afin de pouvoir parametrer 'v $xig/fonct$vv$DEF cFORMAT_HEXA_DECIMAL_EDITION_1'. Mais     */
                                        /* malheureusement cela ne peut pas fonctionner car, en effet, les formats (qui referencent  */
                                        /* 'NCHXMO' explicitement) 'format_EGAr____FORMAT_HEXA_DECIMAL_EDITION_1' et                 */
                                        /* 'format_EGAr____FORMAT_HEXA_DECIMAL_EDITION' sont generes automatiquement                 */
                                        /* dans 'v $xig/allocation$vv$FON allocation_memoire_et_generation_des_format_EGAr' qui est  */
                                        /* appele dans 'v $xil/defi_c1$vv$DEF allocation_memoire_et_generation_des_format_EGAr'      */
                                        /* soit dans 'BCommande(...)' et donc avant toute autre chose...                             */
                                        /*                                                                                           */
                                        /* Cette variable 'nombre_de_chiffres_des_editions_hexa_decimales' ne pourrait donc etre     */
                                        /* modifiee nulle part...                                                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R A G E   D E S   F O R M A T S   D E S   E D I T I O N S   F L O T T A N T E S  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(parametrage_des_formats_des_editions_flottantes_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180316141451 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Acopie(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s.      */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(Positive,SINT(nombre_de_chiffres_des_editions_flottantes,NOMBRE_DE_CHIFFRES_DES_EDITIONS_FLOTTANTES)));
                                        /* Afin de permettre de fixer le nombre de chiffres edites. Ceci fut introduit le            */
                                        /* 20060104160857, apres que je me sois rendu compte que 16 chiffres n'etaient pas           */
                                        /* toujours suffisants ; cela s'est vu parce que les images 'v $xiirv/ENTR.H1' et            */
                                        /* 'v $xiirv/ENTR.H1.0' differaient au niveau des entrelacs. Cela venait du fait que le      */
                                        /* rapport de zoom par defaut de 'GetParam $xrs/disque.11$X ZOOM' etait edite sous la        */
                                        /* forme "+1.333333333333333" alors qu'il fallait "+1.33333333333333333" ; cette petite      */
                                        /* difference suffisait pour produire des fichiers '$xTV/COORDONNEES' (via les commandes     */
                                        /* generees par 'v $xiirv/.ENTR.61.1.$U .xTV.COORDONNEES') differents pour les deux images.  */
                                        /*                                                                                           */
                                        /* Le 20060105164504, ce parametre a augmente de deux unites. Cela a alors permis la         */
                                        /* modification 'v $xrv/champs_5.11$I 20060109092901'...                                     */
                                        /*                                                                                           */
                                        /* On notera bien que via 'v $xci/valeurs.03$I nombre_de_decimales' ce parametre possede     */
                                        /* un synonyme 'nombre_de_decimales'. Je note le 20180219100612 que c'est cela qui donne :   */
                                        /*                                                                                           */
                                        /*                  Parametre.2. 0024/0079 : ChiffresFlot=  I   :: +16                       */
                                        /*                                                                                           */
                                        /* ou encore :                                                                               */
                                        /*                                                                                           */
                                        /*                  SETENV_ChiffresFlot=+16 (par defaut).                                    */
                                        /*                                                                                           */
                                        /* (et non pas 16+1+1=18) quand on recherche la valeur par defaut de 'ChiffresFlot' pour     */
                                        /* un programme tel, par exemple, 'v $xcg/ABSO.01$K .include..xci.valeurs.03.I'...           */
                                        /*                                                                                           */
                                        /* On rappelera donc le 20160222153524 que 'nombre_de_chiffres_des_editions_flottantes'      */
                                        /* peut changer de valeur "automatiquement" et que c'est le cas dans les programmes          */
                                        /* qui utilisent 'v $xci/valeurs.03$I nombre_de_chiffres_des_editions_flottantes' qui est    */
                                        /* alors equivalent (via un 'define') a 'nombre_de_decimales' qui est lui-meme defini avec   */
                                        /* 'NOMBRE_DE_DECIMALES' et c'est la valeur de 'nombre_de_chiffres_des_editions_flottantes'  */
                                        /* a partir de ce moment la...                                                               */
DEFV(Local,DEFV(Positive,INIT(nombre_de_chiffres_du_parametrage_courant_des_editions_flottantes,UNDEF)));
                                        /* Introduit le 20120501103019 afin de pouvoir changer a l'interieur d'un programme la       */
                                        /* valeur de 'nombre_de_chiffres_des_editions_flottantes' comme c'est par exemple le cas     */
                                        /* de 'v $xcp/Konstantes$K nombre_de_chiffres_des_editions_flottantes'...                    */

#define   LONGUEUR_DE_LA_SEQUENCE_DE_PARAMETRAGE_DES_FORMATS_DES_EDITIONS_FLOTTANTES                                                    \
                    DEUX                                                                                                                \
                                        /* Trois chaines de parametrage des formats flottants sont possibles :                       */ \
                                        /*                                                                                           */ \
                                        /*                  ^^f                                                                      */ \
                                        /*                  ^^g                                                                      */ \
                                        /*                  ^^^                                                                      */ \
                                        /*                                                                                           */ \
                                        /* la derniere ("^^^") etant la plus souple puisqu'en plus du nombre de chiffres (les deux   */ \
                                        /* premiers "^^"), le format "f" ou "g" est lui-aussi parametrable grace au troisieme "^"... */

DEFV(Common,DEFV(CHAR,SINS(DTb0(parametrage_des_formats_des_editions_flottantes_____caractere_param)
                          ,Ichaine01(K_CIRCONFLEXE)
                           )
                 )
     );
                                        /* Caractere a substituer. Ainsi, si l'on recontre dans un format, par exemple :             */
                                        /*                                                                                           */
                                        /*                  %.^^g                                                                    */
                                        /*                                                                                           */
                                        /* cela sera remplace par :                                                                  */
                                        /*                                                                                           */
                                        /*                  %.16g                                                                    */
                                        /*                                                                                           */
                                        /* ici de facon dynamique. ATTENTION, on notera la presence imperative de deux caracteres    */
                                        /* "^", ni plus, ni moins...                                                                 */
                                        /*                                                                                           */
                                        /* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de         */
                                        /* faciliter le travail de '$xcg/gen.ext$Z'...                                               */
                                        /*                                                                                           */
                                        /* ATTENTION : a compter du 20060113093335 le code 'K_CIRCONFLEXE' est explicitement         */
                                        /* reference par 'v $xcc/cb$D/FormaFlot$vv$sed' afin de gerer les fichiers '$c' de type      */
                                        /* 'STAND-ALONE'...                                                                          */

DEFV(Common,DEFV(CHAR,SINS(DTb0(mode_fg_de_FORMAT_FLOT_EDITION)
                          ,Ichaine01(K_g)
                           )
                 )
     );
                                        /* Le 20091123110429 fut introduit le parametrage de "g" et donc son remplacement possible   */
                                        /* par "f". On notera bien la difference entre les deux :                                    */
                                        /*                                                                                           */
                                        /*                  %Ng     : 'N' donne le nombre de chiffres totaux (partie entiere plus    */
                                        /*                            partie decimale),                                              */
                                        /*                                                                                           */
                                        /*                  %Nf     : 'N' donne le nombre de chiffres de la partie decimale seule.   */
                                        /*                                                                                           */

DEFV(Common,DEFV(Logical,SINT(parametrage_des_formats_des_editions_flottantes_____initialiser_le_parametrage,VRAI)));
                                        /* Afin de pouvoir initialiser le processus...                                               */
DEFV(Local,DEFV(CHAR,INIT(POINTERc(parametrage_des_formats_des_editions_flottantes_____chaine_format),CHAINE_UNDEF)));
DEFV(Local,DEFV(Int,INIT(parametrage_des_formats_des_editions_flottantes_____index_courant,PREMIER_CARACTERE)));
                                        /* Chaine definissant le parametrage...                                                      */

DEFV(Common,DEFV(FonctionC,parametrage_des_formats_des_editions_flottantes(caractere_a_convertir)))
                                        /* Cette fonction a ete introduite le 20060105095826...                                      */
DEFV(Argument,DEFV(CHAR,caractere_a_convertir));
                                        /* Caractere a tester et a convertir si necessaire...                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     DEFV(CHAR,INIT(caractere_converti,caractere_a_convertir));
                                        /* A priori, pas de parametrage...                                                           */
     /*..............................................................................................................................*/
     Test(IFEQ(caractere_a_convertir,PREMIER_CARACTERE_ITb0(parametrage_des_formats_des_editions_flottantes_____caractere_param)))
          Bblock
          Test(IL_NE_FAUT_PAS(parametrage_des_formats_des_editions_flottantes_____initialiser_le_parametrage))
               Bblock
               Test(IFNE(nombre_de_chiffres_des_editions_flottantes
                        ,nombre_de_chiffres_du_parametrage_courant_des_editions_flottantes
                         )
                    )
                    Bblock
                    EGAL(parametrage_des_formats_des_editions_flottantes_____initialiser_le_parametrage,VRAI);
                                        /* Introduit le 20120501103019. Dans le cas ou 'nombre_de_chiffres_des_editions_flottantes'  */
                                        /* a change, il convient de refaire l'initialisation du parametrage...                       */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IL_FAUT(parametrage_des_formats_des_editions_flottantes_____initialiser_le_parametrage))
               Bblock
               ckMalo(parametrage_des_formats_des_editions_flottantes_____chaine_format
                     ,ADD2(LONGUEUR_DE_LA_SEQUENCE_DE_PARAMETRAGE_DES_FORMATS_DES_EDITIONS_FLOTTANTES,chain_taille(C_VIDE))
                     ,parametrage_des_formats_des_editions_flottantes_____compteur_des_kMalo
                      );
                                        /* Allocation de la memoire necessaire a la generation du caractere associe au chiffre.      */

               CALZ(SPrin3(parametrage_des_formats_des_editions_flottantes_____chaine_format
                          ,"%0*" ## BFd ## "%c"
                          ,LONGUEUR_DE_LA_SEQUENCE_DE_PARAMETRAGE_DES_FORMATS_DES_EDITIONS_FLOTTANTES
                          ,MIN2(nombre_de_chiffres_des_editions_flottantes
                               ,PRED(INTE(PUIX(DIX,LONGUEUR_DE_LA_SEQUENCE_DE_PARAMETRAGE_DES_FORMATS_DES_EDITIONS_FLOTTANTES)))
                                )
                          ,PREMIER_CARACTERE_ITb0(mode_fg_de_FORMAT_FLOT_EDITION)
                           )
                    );
                                        /* Conversion du nombre de chiffres en une chaine de caracteres. ATTENTION, on notera que    */
                                        /* l'on n'ecrit pas :                                                                        */
                                        /*                                                                                           */
                                        /*                  NOMBRE_DE_CHIFFRES_DECIMAUX(nombre_de_chiffres_des_editions_flottantes)  */
                                        /*                                                                                           */
                                        /* car en effet, il faudra toujours generer deux chiffres, meme si un seul est necessaire    */
                                        /* puisque le parametrage se fera toujours avec "^^"...                                      */
                                        /*                                                                                           */
                                        /* D'autre part, il est impossible d'utiliser 'chain_numero(...)' qui n'est pas encore       */
                                        /* definie, d'ou le 'SPrin2(...)'.                                                           */
                                        /*                                                                                           */
                                        /* Le 20091123120214, le format "^^" a evolue en "^^^" qui en plus du nombre de chiffres     */
                                        /* inclue maintenant le format "f" ou "g" ("g" etant le format par defaut...).               */

               EGAL(nombre_de_chiffres_du_parametrage_courant_des_editions_flottantes,nombre_de_chiffres_des_editions_flottantes);
                                        /* Introduit le 20120501103019 pour savoir si 'nombre_de_chiffres_des_editions_flottantes'   */
                                        /* changge de valeur par la suite...                                                         */
               EGAL(parametrage_des_formats_des_editions_flottantes_____index_courant,PREMIER_CARACTERE);
                                        /* A priori inutile, mais on ne sait jamais...                                               */
               EGAL(parametrage_des_formats_des_editions_flottantes_____initialiser_le_parametrage,FAUX);
                                        /* L'initialisation est faite...                                                             */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          begin_nouveau_block
               Bblock
               DEFV(CHAR,INIT(caractere_courant_de_la_chaine_format
                             ,ITb0(parametrage_des_formats_des_editions_flottantes_____chaine_format
                                  ,INDX(parametrage_des_formats_des_editions_flottantes_____index_courant,PREMIER_CARACTERE)
                                   )
                              )
                    );
                                        /* Recuperation du caractere courant du format...                                            */

               Test(IFEQ(caractere_courant_de_la_chaine_format,END_OF_CHAIN))
                    Bblock
                    EGAL(parametrage_des_formats_des_editions_flottantes_____index_courant,PREMIER_CARACTERE);
                    EGAL(caractere_courant_de_la_chaine_format
                        ,ITb0(parametrage_des_formats_des_editions_flottantes_____chaine_format
                             ,INDX(parametrage_des_formats_des_editions_flottantes_____index_courant,PREMIER_CARACTERE)
                              )
                         );
                                        /* Dans le cas ou l'on tombe sur la fin de chaine, il faut revenir au debut...               */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(caractere_converti,caractere_courant_de_la_chaine_format);
                                        /* Conversion d'extension du format...                                                       */

               INCR(parametrage_des_formats_des_editions_flottantes_____index_courant,I);
                                        /* Et enfin, progression dans le format...                                                   */
               Eblock
          end_nouveau_block

                                        /* ATTENTION, je note le 20180316142942 qu'il ne faut surtout pas mettre ici de :            */
                                        /*                                                                                           */
                                        /*        CALZ_FreCC(parametrage_des_formats_des_editions_flottantes_____chaine_format);     */
                                        /*                                                                                           */
                                        /* sous peine de :                                                                           */
                                        /*                                                                                           */
                                        /*                  Segmentation fault                                                       */
                                        /*                                                                                           */
                                        /* apres l'entree de l'argument 'v $xig/fonct$vv$DEF GET_ARGUMENT_L..ValidMalo..' ce qui     */
                                        /* doit correspondre a l'argument 'v $xig/fonct$vv$DEF GET_ARGUMENT_F..Float_indefini..'     */
                                        /* a cette date (ne pas oublier 'v $xi/NePasGenerer_PARAMETRE_____.generaux$vv$I')...        */
          Eblock
     ATes
          Bblock
          EGAL(parametrage_des_formats_des_editions_flottantes_____index_courant,PREMIER_CARACTERE);
                                        /* A priori, lorsque l'on n'est pas en presence du caractere de parametrage des formats      */
                                        /* des editions flottantes, l'index est reinitialise ; cela ne peut pas nuire...             */
          Eblock
     ETes

     RETU(caractere_converti);
     Eblock

#undef    LONGUEUR_DE_LA_SEQUENCE_DE_PARAMETRAGE_DES_FORMATS_DES_EDITIONS_FLOTTANTES

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D O N N E E S   U T I L E S   P O U R   A S S O C I E R   A   U N E   A L L O C A T I O N                                  */
/*        U N E   D E S A L L O C A T I O N   M E M O I R E  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(CHAR,INIT(POINTERc(pointeur_provisoire),CHAINE_UNDEF));
                                        /* Introduit le 20180321090919...                                                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   C O P I E   D E   C H A I N E   D E   C A R A C T E R E S  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION, le 19961118183628, les fonctions 'chain_Xcopie(...)', 'chain_copie(...)',      */
                                        /* 'chain_Acopie(...)', 'chain_XNcopie(...)', 'chain_Ncopie(...)' et 'chain_ANcopie(...)'    */
                                        /* ont ete mises en tete afin de permettre leur utilisation dans la procedure                */
                                        /* 'DEBUT_DE_COMPACTAGE_DES_K_LF_DES_Prer(...)' utile a 'PRINT_DEFAUT(...)'.                 */

#define   CARACTERE_COURANT_DE_CHAINE(chaine,index,caractere)                                                                           \
                    Bblock                                                                                                              \
                    EGAL(ITb0(chaine,INDX(NEUT(index),PREMIER_CARACTERE)),caractere);                                                   \
                    Eblock                                                                                                              \
                                        /* Mise en place d'un caractere argument dans une chaine (introduit le 20040310153754)...    */
#define   FIN_DE_CHAINE(chaine,index)                                                                                                   \
                    Bblock                                                                                                              \
                    CARACTERE_COURANT_DE_CHAINE(chaine,index,END_OF_CHAIN);                                                             \
                    Eblock                                                                                                              \
                                        /* Mise en place d'un 'END_OF_CHAIN' a la fin de 'chaine'.                                   */

DEFV(Common,DEFV(Logical,ZINT(MOVE_CARACTERE_____parametrer_les_formats_des_editions_flottantes,FAUX)));
                                        /* Cet indicateur a ete introduit le 20060105095826 afin de permettre de parametrer les      */
                                        /* formats des editions flottantes...                                                        */

DEFV(Common,DEFV(Logical,ZINT(MOVE_CARACTERE_____ne_deplacer_que_les_caracteres_alpha_numeriques,FAUX)));
                                        /* Cet indicateur a ete introduit le 19980420092917 afin de permettre de communiquer les     */
                                        /* parametres des commandes via des variables d'environnement.                               */

DEFV(Common,DEFV(Logical,ZINT(MOVE_CARACTERE_____substituer_K_LF_au_couple_K_ANTI_SLASH__K_n,FAUX)));
                                        /* Cet indicateur a ete introduit le 19991209094947 afin de permettre a la commande          */
                                        /* 'v $xcp/substitue.01$K MOVE_CARACTERE_____substituer_K_LF_au_couple_K_ANTI_SLASH__K_n'    */
                                        /* de travailler correctement sur 'SYSTEME_APC_Linux...'.                                    */
DEFV(Common,DEFV(Logical,ZINT(MOVE_CARACTERE_____substituer_K_TABULATION_au_couple_K_ANTI_SLASH__K_t,FAUX)));
                                        /* Cet indicateur a ete introduit le 20010109103657 afin de permettre a la commande          */
                                        /* 'v $xcp/substitue.01$K CARACTERE_substituer_K_TABULATION_au_couple_K_ANTI_SLASH__K_t'     */
                                        /* de manipuler correctement les tabulations sur 'SYSTEME_APC_Linux...'.                     */

DEFV(Common,DEFV(Logical,ZINT(MOVE_CARACTERE_____mettre_un_K_ANTI_SLASH_devant_chaque_K_POINT,FAUX)));
                                        /* Cet indicateur a ete introduit le 20001227104156 afin de permettre a la commande          */
                                        /* 'v $xcp/substitue.01$K MOVE_CARACTERE_____mettre_un_K_ANTI_SLASH_devant_chaque_K_POINT'   */
                                        /* de ne plus considerer le "." comme representant un caractere quelconque, mais comme       */
                                        /* designant vriment le ".".                                                                 */

DEFV(Common,DEFV(Logical,ZINT(MOVE_CARACTERE_____remplacer_les_SEPARATEUR_DES_PATHS,FAUX)));
DEFV(Common,DEFV(CHAR,ZINT(MOVE_CARACTERE_____substitut_des_SEPARATEUR_DES_PATHS,K_UNDERSCORE)));
                                        /* Le 20170424142123 a ete introduite la possibilite de remplacer les caracteres de          */
                                        /* separation des composantes d'un "path" (en general '/'...).                               */
DEFV(Common,DEFV(Logical,ZINT(MOVE_CARACTERE_____remplacer_les_SEPARATEUR_DES_COMPOSANTES_D_UN_NOM,FAUX)));
DEFV(Common,DEFV(CHAR,ZINT(MOVE_CARACTERE_____substitut_des_SEPARATEUR_DES_COMPOSANTES_D_UN_NOM,K_UNDERSCORE)));
                                        /* Le 20231209100818 a ete introduite la possibilite de remplacer les caracteres de          */
                                        /* separation des composantes d'un "nom" (en general '.'...).                                */


DEFV(Common,DEFV(Logical,ZINT(MOVE_CARACTERE_____supprimer_un_caractere_particulier,FAUX)));
DEFV(Common,DEFV(CHAR,ZINT(MOVE_CARACTERE_____caractere_particulier_a_supprimer,K_UNDEF)));
                                        /* Le 20171231111807 a ete introduite la possibilite de supprimer un caractere donne         */
                                        /* (par exemple un 'K_BLANC')...                                                             */

#define   LONGUEUR_D_UNE_CHAINE_A_ALLOUER(nombre_d_octets)                                                                              \
                    COND(IL_NE_FAUT_PAS(MOVE_CARACTERE_____mettre_un_K_ANTI_SLASH_devant_chaque_K_POINT)                                \
                        ,NEUT(nombre_d_octets)                                                                                          \
                        ,DOUB(nombre_d_octets)                                                                                          \
                         )                                                                                                              \
                                        /* Dans le cas ou les occurences de "." doivent etre remplaces par "\.", on double           */ \
                                        /* brutalement le nombre d'octets utiles (et ce au cas ou la chaine a copier ne serait       */ \
                                        /* faite que de "."...                                                                       */

#define   EXTENSION_CARACTERE(chaine_resultat,index_resultat,chaine_argument,index_argument,substituer,AScaractere,caractere)           \
                    Bblock                                                                                                              \
                    Test(IFET(EST_VRAI(substituer)                                                                                      \
                             ,IFEQ(caractere_argument,K_ANTI_SLASH)                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         Test(EST_FAUX(une_extension_caractere_a_deja_ete_faite))                                                       \
                                        /* Test introduit le 20080128172159...                                                       */ \
                              Bblock                                                                                                    \
                              Test(IFEQ(ITb0(chaine_argument,INDX(SUCC(index_argument),PREMIER_CARACTERE)),AScaractere))                \
                                        /* On notera que ce 'Test(...)' n'est pas regroupe avec le precedent afin de prevenir        */ \
                                        /* des violations memoire lors du 'SUCC(index_argument)' au cas ou 'caractere_argument'      */ \
                                        /* serait le 'END_OF_CHAIN'...                                                               */ \
                                   Bblock                                                                                               \
                                   EGAL(caractere_a_copier,caractere);                                                                  \
                                        /* Substitution du type :                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  {K_ANTI_SLASH,K_n} --> {K_LF}                                            */ \
                                        /*                                                                                           */ \
                                        /* par exemple...                                                                            */ \
                                                                                                                                        \
                                   INCR(index_argument,I);                                                                              \
                                        /* Et on saute un caractere de la chaine Argument.                                           */ \
                                                                                                                                        \
                                   EGAL(une_extension_caractere_a_deja_ete_faite,VRAI);                                                 \
                                        /* Introduit le 20080128172159...                                                            */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Gestion des sous-chaines du type "\n" ou encore "\t"...                                   */

#define   MOVE_CARACTERE(chaine_resultat,index_resultat,chaine_argument,index_argument,tenter_conv_maj_min,tenter_conv_min_maj,loA,loR) \
                    Bblock                                                                                                              \
                    DEFV(CHAR,INIT(caractere_argument,K_UNDEF));                                                                        \
                                        /* Caractere Argument.                                                                       */ \
                                                                                                                                        \
                    Test(IFEXff(index_argument,PREMIER_CARACTERE,LSTX(PREMIER_CARACTERE,loA)))                                          \
                         Bblock                                                                                                         \
                         BASIQUE____Prer2("Lors du traitement de la chaine '%s', l'index Argument (=%" ## BFd ## ")"                    \
                                         ,chaine_argument                                                                               \
                                         ,index_argument                                                                                \
                                          );                                                                                            \
                         BASIQUE____Prer2(" est hors de [%" ## BFd ## ",%" ## BFd ## "].\n"                                             \
                                         ,PREMIER_CARACTERE                                                                             \
                                         ,LSTX(PREMIER_CARACTERE,loA)                                                                   \
                                          );                                                                                            \
                                        /* Ce test a ete introduit le 20051027095127...                                              */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IFEXff(index_resultat,PREMIER_CARACTERE,LSTX(PREMIER_CARACTERE,loR)))                                          \
                         Bblock                                                                                                         \
                         BASIQUE____Prer2("Lors du traitement de la chaine '%s', l'index Resultat (=%" ## BFd ## ")"                    \
                                         ,chaine_argument                                                                               \
                                         ,index_resultat                                                                                \
                                          );                                                                                            \
                         BASIQUE____Prer2(" est hors de [%" ## BFd ## ",%" ## BFd ## "].\n"                                             \
                                         ,PREMIER_CARACTERE                                                                             \
                                         ,LSTX(PREMIER_CARACTERE,loR)                                                                   \
                                          );                                                                                            \
                                        /* Ce test a ete introduit le 20051027095127...                                              */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(caractere_argument,ITb0(chaine_argument,INDX(NEUT(index_argument),PREMIER_CARACTERE)));                        \
                                        /* Caractere Argument.                                                                       */ \
                                                                                                                                        \
                    Test(IL_FAUT(tenter_conv_maj_min))                                                                                  \
                         Bblock                                                                                                         \
                         EGAL(caractere_argument,conversion_d_un_caractere_majuscule_en_un_caractere_minuscule(caractere_argument));    \
                                        /* Conversion majuscule en minuscule si elle est demandee et autorisee...                    */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IL_FAUT(tenter_conv_min_maj))                                                                                  \
                         Bblock                                                                                                         \
                         EGAL(caractere_argument,conversion_d_un_caractere_minuscule_en_un_caractere_majuscule(caractere_argument));    \
                                        /* Conversion minuscule en majuscule si elle est demandee et autorisee...                    */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IL_FAUT(MOVE_CARACTERE_____parametrer_les_formats_des_editions_flottantes))                                    \
                         Bblock                                                                                                         \
                         EGAL(caractere_argument,parametrage_des_formats_des_editions_flottantes(caractere_argument));                  \
                                        /* Parametrage des formats_des_editions_flottantes s'il est demande et autorise. Cela fut    */ \
                                        /* introduit le 20060105095826...                                                            */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IFET(IL_FAUT(MOVE_CARACTERE_____remplacer_les_SEPARATEUR_DES_PATHS)                                            \
                             ,IFEQ(caractere_argument,SEPARATEUR_DES_PATHS)                                                             \
                              )                                                                                                         \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         EGAL(caractere_argument,MOVE_CARACTERE_____substitut_des_SEPARATEUR_DES_PATHS);                                \
                                        /* Possibilite introduite le 20170424142123...                                               */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IFET(IL_FAUT(MOVE_CARACTERE_____remplacer_les_SEPARATEUR_DES_COMPOSANTES_D_UN_NOM)                             \
                             ,IFEQ(caractere_argument,SEPARATEUR_DES_COMPOSANTES_D_UN_NOM)                                              \
                              )                                                                                                         \
                         )                                                                                                              \
                         Bblock                                                                                                         \
                         EGAL(caractere_argument,MOVE_CARACTERE_____substitut_des_SEPARATEUR_DES_COMPOSANTES_D_UN_NOM);                 \
                                        /* Possibilite introduite le 20231209100818...                                               */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IFET(IFOU(EST_FAUX(MOVE_CARACTERE_____ne_deplacer_que_les_caracteres_alpha_numeriques)                         \
                                  ,IFET(EST_VRAI(MOVE_CARACTERE_____ne_deplacer_que_les_caracteres_alpha_numeriques)                    \
                                       ,EST_VRAI(est_ce_alpha_numerique(caractere_argument))                                            \
                                        )                                                                                               \
                                   )                                                                                                    \
                             ,IFOU(EST_FAUX(MOVE_CARACTERE_____supprimer_un_caractere_particulier)                                      \
                                  ,IFET(EST_VRAI(MOVE_CARACTERE_____supprimer_un_caractere_particulier)                                 \
                                       ,IFNE(caractere_argument,MOVE_CARACTERE_____caractere_particulier_a_supprimer)                   \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Test etendu le 20171231111807 avec la suppression possible d'un caractere particulier...  */ \
                         Bblock                                                                                                         \
                         DEFV(CHAR,INIT(caractere_a_copier,caractere_argument));                                                        \
                                        /* Caractere a copier a priori...                                                            */ \
                         DEFV(Logical,INIT(une_extension_caractere_a_deja_ete_faite,FAUX));                                             \
                                        /* Introduit le 20080128172159 afin de ne pas faire successivement une extension de          */ \
                                        /* 'K_n' et une de 'K_t' comme cela s'est vu a cette date dans '$xcp/substitue.01$X'         */ \
                                        /* avec la chaine :                                                                          */ \
                                        /*                                                                                           */ \
                                        /*                  s02="\nt"                                                                */ \
                                        /*                                                                                           */ \
                                        /* qui etait donc remplacee par "\n\t" a cause de cela...                                    */ \
                                                                                                                                        \
                         EXTENSION_CARACTERE(chaine_resultat,index_resultat                                                             \
                                            ,chaine_argument,index_argument                                                             \
                                            ,MOVE_CARACTERE_____substituer_K_LF_au_couple_K_ANTI_SLASH__K_n                             \
                                            ,K_n                                                                                        \
                                            ,K_LF                                                                                       \
                                             );                                                                                         \
                                        /* Gestion eventuelle des "\n".                                                              */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : le caractere '\n' doit etre declare dans 'v $xig/fonct$vv$DEF FORMAT_CHAI'.   */ \
                         EXTENSION_CARACTERE(chaine_resultat,index_resultat                                                             \
                                            ,chaine_argument,index_argument                                                             \
                                            ,MOVE_CARACTERE_____substituer_K_TABULATION_au_couple_K_ANTI_SLASH__K_t                     \
                                            ,K_t                                                                                        \
                                            ,K_TABULATION                                                                               \
                                             );                                                                                         \
                                        /* Gestion eventuelle des "\t".                                                              */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : le caractere '\t' doit etre declare dans 'v $xig/fonct$vv$DEF FORMAT_CHAI'.   */ \
                                                                                                                                        \
                         Test(IFET(EST_VRAI(MOVE_CARACTERE_____mettre_un_K_ANTI_SLASH_devant_chaque_K_POINT)                            \
                                  ,IFEQ(caractere_argument,K_POINT)                                                                     \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              CARACTERE_COURANT_DE_CHAINE(chaine_resultat,index_resultat,K_ANTI_SLASH);                                 \
                                        /* Mise en place d'un "\" devant le "." qui va suivre...                                     */ \
                              INCR(index_resultat,I);                                                                                   \
                                        /* Progression de l'indice Resultat.                                                         */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         CARACTERE_COURANT_DE_CHAINE(chaine_resultat,index_resultat,caractere_a_copier);                                \
                                        /* Deplacement du caractere courant ou d'une substitution...                                 */ \
                         INCR(index_resultat,I);                                                                                        \
                                        /* Progression de l'indice Resultat.                                                         */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    INCR(index_argument,I);                                                                                             \
                                        /* Progression de l'indice Argument.                                                         */ \
                    Eblock                                                                                                              \
                                        /* Deplacement d'un caractere d'une chaine vers une autre...                                 */

DEFV(Common,DEFV(Int,ZINT(chain_copie_____index_du_premier_caractere_d_une_chaineA,PREMIER_CARACTERE)));
                                        /* Index du premier caractere utilise dans une 'chaineA' lors de sa copie. Ceci est utilise  */
                                        /* en particulier dans 'DEBUT_DE_COMPACTAGE_DES_K_LF_DES_Prer(...)'.                         */

DEFV(Common,DEFV(CHAR,ZINT(chain_copie_____caractere_d_arret_secondaire,END_OF_CHAIN)));
                                        /* Caractere secondaire d'arret introduit le 20070221091029. Par defaut, il s'agit           */
                                        /* evidemment du 'END_OF_CHAIN'...                                                           */
DEFV(Common,DEFV(Logical,ZINT(chain_copie_____copier_le_caractere_d_arret_secondaire,VRAI)));
                                        /* Indicateur destine a permettre d'inhiber la copie du caractere secondaire d'arret         */
                                        /* introduit le 20090415075206 pour 'v $xcg/parallele.1N$K copier_le_caractere_d_arret_...'. */
DEFV(Common,DEFV(Int,ZINT(chain_copie_____premier_index_de_test_du_caractere_d_arret_secondaire,SUCC(PREMIER_CARACTERE))));
                                        /* Introduit le pour permettre 'v $xig/fonct$vv$DEF 20070226134221' qui retablit le          */
                                        /* parametre '"=="'. La valeur par defaut est destinee a ne pas tester le premier            */
                                        /* caractere par rapport a 'chain_copie_____caractere_d_arret_secondaire'...                 */

DEFV(Common,DEFV(Logical,ZINT(chain_copie_____la_chaineA_a_ete_copiee_jusqu_au_END_OF_CHAIN,LUNDEF)));
                                        /* Afin de savoir si la copie a ete interrompue par la rencontre du caractere                */
                                        /* 'chain_copie_____caractere_d_arret_secondaire' (introduit le 20070221110724).             */
DEFV(Common,DEFV(Int,INIT(chain_copie_____successeur_de_l_index_du_dernier_caractere_d_une_chaineA,UNDEF)));
                                        /* Successeur de l'index du dernier caractere d'une 'chaineA' apres une copie. Ceci fut      */
                                        /* introduit le 20070221091029...                                                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   C A R A C T E R E S   E X C E P T E   ' E N D _ O F _ C H A I N '              */
/*        E T   S A N S   A L L O C A T I O N   M E M O I R E   P O U R   L E   R E S U L T A T  :                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   CARACTERE_COURANT                                                                                                             \
                    ITb0(chaineA,INDX(indexA,PREMIER_CARACTERE))                                                                        \
                                        /* Introduit le 20090415075206 afin d'alleger la suite...                                    */

BFonctionI

DEFV(Local,DEFV(Logical,INIT(chain_Xcopie_____ajouter_si_necessaire_un_K_LF_en_queue,FAUX)));
                                        /* Cet indicateur a ete introduit le 20040310153754 afin de favoriser les mises en page      */
                                        /* des messages sortis par 'Prer?(...)' et 'Prin?(...)'.                                     */

DEFV(Common,DEFV(FonctionI,chain_Xcopie(chaineR,chaineA,indexR)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineR)));
                                        /* Resultat. ATTENTION : l'allocation memoire a du etre faite au prealable !!!               */
                                        /* De plus, on notera que l'INDEX du premier caractere non genere est                        */
                                        /* renvoye par cette fonction...                                                             */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
DEFV(Argument,DEFV(Int,indexR));
                                        /* Index initial de copie de la chaine, caractere par caractere.                             */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(indexA,chain_copie_____index_du_premier_caractere_d_une_chaineA));
                                        /* Index de recuperation de "chaineA". On notera qu'avant le 20070223164813, la variable     */
                                        /* 'indexA' etait locale au premier 'Test(...)' qui suit. Mais maintenant que la variable    */
                                        /* 'chain_copie_____successeur_de_l_index_du_dernier_caractere_d_une_chaineA' renvoit sa     */
                                        /* derniere valeur, elle doit etre plus "globale"...                                         */
     /*..............................................................................................................................*/
     EGAL(chain_copie_____la_chaineA_a_ete_copiee_jusqu_au_END_OF_CHAIN,VRAI);
                                        /* A priori (introduit le 20070221110724).                                                   */

     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          DEFV(Positive,INIT(taille_de_chaineA,chain_taille(chaineA)));
                                        /* Introduit le 20051027100651 uniquement pour valider les index dans 'MOVE_CARACTERE(...)'. */

          Tant(IFET(IFNE(CARACTERE_COURANT,END_OF_CHAIN)
                   ,IFOU(IFNE(CARACTERE_COURANT,chain_copie_____caractere_d_arret_secondaire)
                        ,IFET(IFEQ(CARACTERE_COURANT,chain_copie_____caractere_d_arret_secondaire)
                             ,IFLT(ADD2(SOUS(indexA,chain_copie_____index_du_premier_caractere_d_une_chaineA),PREMIER_CARACTERE)
                                  ,chain_copie_____premier_index_de_test_du_caractere_d_arret_secondaire
                                   )
                              )
                         )
                    )
               )
                                        /* On notera qu'en general les deux conditions 'IFNE(...)' sont strictement identiques (ceux */
                                        /* relatifs a 'END_OF_CHAIN' et a 'chain_copie_____caractere_d_arret_secondaire'...).        */
                                        /*                                                                                           */
                                        /* Le 20070226134226 'chain_copie_____premier_index_de_test_du_caractere_d_arret_secondaire' */
                                        /* a ete introduit afin de pouvoir tester 'chain_copie_____caractere_d_arret_secondaire'     */
                                        /* qu'a partir d'un certain index (introduit pour 'v $xig/fonct$vv$DEF 20070226134221'),     */
                                        /* par defaut des le deuxieme caractere...                                                   */
               Bblock
               MOVE_CARACTERE(chaineR
                             ,indexR
                             ,chaineA
                             ,indexA
                             ,NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES
                             ,NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES
                             ,taille_de_chaineA
                             ,INFINI
                              );
                                        /* Copie de la chaine et duplication (excepte le 'END_OF_CHAIN').                            */
                                        /*                                                                                           */
                                        /* On notera le 'INFINI' pour la taille de 'chaineR' car, en effet, on ne la connait pas...  */
               Eblock
          ETan

          Test(IFET(IFEQ(CARACTERE_COURANT,chain_copie_____caractere_d_arret_secondaire)
                   ,IFNE(chain_copie_____caractere_d_arret_secondaire,END_OF_CHAIN)
                    )
               )
               Bblock
               Test(IL_FAUT(chain_copie_____copier_le_caractere_d_arret_secondaire))
                                        /* Test introduit le 20090415075206 pour 'v $xcg/parallele.1N$K copier_le_caractere_d_...'.  */
                    Bblock
                    MOVE_CARACTERE(chaineR
                                  ,indexR
                                  ,chaineA
                                  ,indexA
                                  ,NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES
                                  ,NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES
                                  ,taille_de_chaineA
                                  ,INFINI
                                   );
                                        /* Le caractere d'arret secondaire doit etre copie (contrairement au 'END_OF_CHAIN')         */
                                        /* lorsqu'il est different de 'END_OF_CHAIN', evidemment (introduit le 20070221091029...).   */
                    Eblock
               ATes
                    Bblock
                    INCR(indexA,I);
                                        /* Afin de "sauter" le caractere d'arret secondaire qui n'a pas ete copie...                 */
                    Eblock
               ETes

               Test(IFNE(CARACTERE_COURANT,END_OF_CHAIN))
                    Bblock
                    EGAL(chain_copie_____la_chaineA_a_ete_copiee_jusqu_au_END_OF_CHAIN,FAUX);
                                        /* En fait, il reste des caracteres dans 'chaineA'...                                        */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IL_FAUT(chain_Xcopie_____ajouter_si_necessaire_un_K_LF_en_queue))
               Bblock
               Test(IFGT(indexR,PREMIER_CARACTERE))
                    Bblock
                    Test(IFNE(ITb0(chaineR,INDX(PRED(indexR),PREMIER_CARACTERE)),K_LF))
                         Bblock
                         CARACTERE_COURANT_DE_CHAINE(chaineR,indexR,K_LF);
                         INCR(indexR,I);
                                        /* Possibilite introduite le 20040310153754 dans le cas ou le dernier caractere, s'il        */
                                        /* existe, n'est pas un 'K_LF', auquel cas on en ajoute un a sa suite...                     */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     EGAL(chain_copie_____successeur_de_l_index_du_dernier_caractere_d_une_chaineA,indexA);
                                        /* Introduit le 20070221091029...                                                            */

     RETU(indexR);
                                        /* Et renvoi de 'indexR', afin au retour de pouvoir inserer, si                              */
                                        /* cela est utile le 'END_OF_CHAIN'.                                                         */
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                            */
/*        S A N S   A L L O C A T I O N   M E M O I R E   P O U R   L E   R E S U L T A T  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,chain_copie(chaineR,chaineA)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineR)));
                                        /* Resultat. ATTENTION : l'allocation memoire a du etre faite au prealable !!!               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          DEFV(Int,INIT(indexR,PREMIER_CARACTERE));
                                        /* Index de copie de la chaine, caractere par caractere.                                     */

          EGAL(indexR,chain_Xcopie(chaineR,chaineA,indexR));
                                        /* Copie de la chaine, a l'exception de 'END_OF_CHAIN', et recuperation                      */
                                        /* de l'index de fin...                                                                      */
          FIN_DE_CHAINE(chaineR,indexR);
                                        /* Mise en place de l'indicateur de fin de chaine...                                         */
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                            */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(chain_Acopie_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180316112952 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Acopie(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s       */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Acopie(chaineA))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(taille_de_chaineR,UNDEF));
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     CALS(allocation_memoire_et_generation_des_format_EGAr());
                                        /* Ceci a ete introduit le 20180401123053 afin de permettre aux '$X' non encore              */
                                        /* recompiles de pouvoir s'executer normalement. Ceci est evidemment du a la procedure       */
                                        /* 'v $xil/defi_c1$vv$DEF BCommande' qui est chargee de ces initialisations. Mais ATTENTION  */
                                        /* pour les '$X's qui n'auraient pas ete recompiles avec la version du 20180330120506 de     */
                                        /* 'BCommande' (qui reference 'allocation_memoire_et_generation_des_format_EGAr(...)'),      */
                                        /* une astuce a ete trouvee : en effet, il y a tout au debut de 'BCommande' :                */
                                        /*                                                                                           */
                                        /*                  EGAp(nom_de_la_commande_courante,chain_Acopie(NOM_DE_LA_COMMANDE));      */
                                        /*                                                                                           */
                                        /* Ce 'chain_Acopie(...)' reference 'NOM_DE_LA_COMMANDE' qui ne pose pas de probleme         */
                                        /* de 'kMalo(...)'. C'est pourquoi a ete introduit ce 'CALS(...)' afin qu'il fasse les       */
                                        /* allocations qui manqueraient alors...                                                     */

     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          EGAL(taille_de_chaineR,LONGUEUR_D_UNE_CHAINE_A_ALLOUER(chain_taille(chaineA)));
          ckMalo(chaineR,taille_de_chaineR,chain_Acopie_____compteur_des_kMalo);
                                        /* Allocation de la memoire necessaire a la copie.                                           */
                                        /*                                                                                           */
                                        /* Le comptage a ete introduit le 20180316112952...                                          */

          CALS(chain_copie(chaineR,chaineA));
                                        /* Copie de la chaine argument.                                                              */

          VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(chaineR),taille_de_chaineR)
                                                              ,BLOC(Bblock
                                                                    BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                                    ,C_VERITABLE_QUOTE
                                                                                    ,chaineR
                                                                                    ,C_VERITABLE_QUOTE
                                                                                     );
                                                                    Eblock
                                                                    )
                                                               );
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                            */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T                    */
/*        E T   C O N V E R S I O N S   P O S S I B L E S   M A J U S C U L E S - M I N U S C U L E S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(chain_Acopie_avec_conversions_possibles_majuscules_minuscules_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180316112952 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Acopie_avec_conversions_possibles_majuscules_minuscules(...)' et ainsi disposer    */
                                        /* d'un majorant du nombre de 'CALZ_FreCC(...)'s.                                            */

DEFV(Common,DEFV(CHAR,SINT(GET_ARGUMENT_____carret_chain_Acopie_avec_conversions_possibles_majuscules_minuscules,K_EGAL)));
                                        /* Caractere a partir duquel doit etre interrompue la conversion majuscules-minuscules       */
                                        /* dans les procedures du type 'GET_ARGUMENT_?(...)'. La valeur choisie ('K_EGAL') par       */
                                        /* defaut correspond au caractere d'introduction des valeurs des parametres des commandes... */

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(CHAR,SINT(FPrin_____carret_chain_Acopie_avec_conversions_possibles_majuscules_minuscules,K_POUR_CENT)));
                                        /* Caractere a partir duquel doit etre interrompue la conversion majuscules-minuscules       */
                                        /* dans les procedures du type 'FPrin?(...)'. La valeur choisie ('K_POUR_CENT') par          */
                                        /* defaut correspond a l'introduction des specifications d'edition des variables ; or il     */
                                        /* apparait que d'y changer alors les minuscules en majuscules peut provoquer des :          */
                                        /*                                                                                           */
                                        /*                  Segmentation fault                                                       */
                                        /*                                                                                           */
                                        /* Cela s'est vu avec :                                                                      */
                                        /*                                                                                           */
                                        /*                  $xcg/dure01011970$X courante=VRAI secondes=VRAI Pminuscules=VRAI         */
                                        /*                                                                                           */
                                        /* Cela a ete introduit le 20011202152754.                                                   */
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Acopie_avec_conversions_possibles_majuscules_minuscules(chaineA,maj_min,min_maj,carret))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Cette fonction a ete introduite le 20010621133035.                                        */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
DEFV(Argument,DEFV(Logical,maj_min));
                                        /* Indique s'il la conversion majuscules --> minuscules est autorisee.                       */
DEFV(Argument,DEFV(Logical,min_maj));
                                        /* Indique s'il la conversion minuscules --> majuscules est autorisee.                       */
DEFV(Argument,DEFV(CHAR,carret));
                                        /* Caractere a partir duquel doit etre interrompue la conversion majuscules-minuscules.      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          DEFV(Positive,INIT(taille_de_chaineA,chain_taille(chaineA)));
          DEFV(Positive,INIT(taille_de_chaineR,UNDEF));

          DEFV(Int,INIT(indexA,chain_copie_____index_du_premier_caractere_d_une_chaineA));
                                        /* Index de recuperation de "chaineA".                                                       */
          DEFV(Int,INIT(indexR,PREMIER_CARACTERE));
                                        /* Index de copie de la chaine, caractere par caractere.                                     */
          DEFV(Logical,INIT(le_caractere_d_arret_a_ete_rencontre,FAUX));
                                        /* Afin de gerer le caractere d'arret des conversions...                                     */
          Test(IFET(IL_FAUT(maj_min),IL_FAUT(min_maj)))
                                        /* Ce test a ete introduit le 20030208112159...                                              */
               Bblock
               BASIQUE____Prer0("Il est impossible de convertir simultanement les majuscules en minuscules et inversement.\n"
                                );
                                        /* ATTENTION, on ne peut utiliser 'PRINT_ERREUR(...)' car cette procedure utilise            */
                                        /* indirectement 'chain_Acopie_avec_conversions_possibles_majuscules_minuscules(...)'.       */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          EGAL(taille_de_chaineR,LONGUEUR_D_UNE_CHAINE_A_ALLOUER(taille_de_chaineA));
          ckMalo(chaineR,taille_de_chaineR,chain_Acopie_avec_conversions_possibles_majuscules_minuscules_____compteur_des_kMalo);
                                        /* Allocation de la memoire necessaire a la copie.                                           */
                                        /*                                                                                           */
                                        /* Le comptage a ete introduit le 20180316112952...                                          */

          Tant(IFNE(ITb0(chaineA,INDX(indexA,PREMIER_CARACTERE)),END_OF_CHAIN))
               Bblock
               Test(IFEQ(ITb0(chaineA,INDX(indexA,PREMIER_CARACTERE)),carret)
                    )
                    Bblock
                    EGAL(le_caractere_d_arret_a_ete_rencontre,VRAI);
                                        /* A partir de maintenant, les conversions ne sont plus autorisees...                        */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               MOVE_CARACTERE(chaineR
                             ,indexR
                             ,chaineA
                             ,indexA
                             ,IFET(maj_min
                                  ,EST_FAUX(le_caractere_d_arret_a_ete_rencontre)
                                   )
                             ,IFET(min_maj
                                  ,EST_FAUX(le_caractere_d_arret_a_ete_rencontre)
                                   )
                             ,taille_de_chaineA
                             ,taille_de_chaineR
                              );
                                        /* Copie de la chaine et duplication (excepte le 'END_OF_CHAIN'), avec conversion des        */
                                        /* majuscules en minuscules (et inversement), tant que cela est autorise...                  */
               Eblock
          ETan

          FIN_DE_CHAINE(chaineR,indexR);
                                        /* Mise en place de l'indicateur de fin de chaine...                                         */

          VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(chaineR),taille_de_chaineR)
                                                              ,BLOC(Bblock
                                                                    BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                                    ,C_VERITABLE_QUOTE
                                                                                    ,chaineR
                                                                                    ,C_VERITABLE_QUOTE
                                                                                     );
                                                                    Eblock
                                                                    )
                                                               );
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P T M I S A T I O N   D E   L A   C O P I E   D ' U N   T I T R E   A T T E N D U  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Acopie_avec_conversions_possibles_majuscules_minuscules_pour_un_titre_attendu(chaineA))))
                                        /* Cette fonction a ete introduite le 20221030171351.                                        */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     EGAp(chaineR
         ,chain_Acopie_avec_conversions_possibles_majuscules_minuscules
              (chaineA
              ,GET_ARGUMENT_____convertir_les_caracteres_majuscules_en_caracteres_minuscules
              ,GET_ARGUMENT_____convertir_les_caracteres_minuscules_en_caracteres_majuscules
              ,GET_ARGUMENT_____carret_chain_Acopie_avec_conversions_possibles_majuscules_minuscules
               )
          );

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                            */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T                    */
/*        E T   S U P P R E S S I O N   D ' U N   E V E N T U E L   " N E W - L I N E "   E N   T E T E  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Local,DEFV(Logical,INIT(chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete_____deplacer_eventuel_K_LF_de_tete_vers_queue
                            ,FAUX
                             )
                )
     );
                                        /* Indicateur de controle a priori inutile (dans le sens ou il n'est pas accessible en tant  */
                                        /* que parametres des programmes et que personne n'en change la valeur) introduit le         */
                                        /* 20040317095318 pour prevoir des evolutions futures. Simultanement, et apres les grandes   */
                                        /* modifications des 'Prer?(...)', 'Prin?(...)' et 'Prme?(...)' effectuees quelques heures   */
                                        /* auparavant (les '\n's ayant ete deplaces explicitement de la tete vers la queue des       */
                                        /* messages), sa valeur est passee de 'VRAI' a 'FAUX' car, en effet, il ne servait qu'a      */
                                        /* simuler ces deplacements des '\n's...                                                     */
DEFV(Common,DEFV(Logical,SINT(chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete_____la_suppression_est_utile,VRAI)));
                                        /* Indicateur introduit le 20150504175719 lorsque je me suis rendu compte d'un probleme      */
                                        /* lors d'un :                                                                               */
                                        /*                                                                                           */
                                        /*                  execRVB   $xci/extrema$X (...)                                           */
                                        /*                                                                                           */
                                        /* car les sorties de programme sony du type :                                               */
                                        /*                                                                                           */
                                        /*   0 0.9993589743589744 0.9991304347826087 214 0.4538461538461538 0.3095652173913043       */
                                        /*                                                                                           */
                                        /* sans 'K_LF' intermediaires. Alors les sorties de 'v $xil/defi_c1$vv$DEF gPRINT_DEFAUT'    */
                                        /* se retrouvent melangees avec les nombres ci-dessus, ce qui est tout a fait illisible.     */
                                        /* D'ou cet indicateur qui permet d'inhiber la suppression des K_LF' en tete qui est         */
                                        /* utilise a cette date dans 'v $Falias_exec123 suppression__K_LF_en_tete'...                */

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete(chaineA,la_suppression_est_utile))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
DEFV(Argument,DEFV(Logical,la_suppression_est_utile));
                                        /* Indique s'il est necessaire de tester la suppression...                                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          Test(I4ET(EST_VRAI(chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete_____la_suppression_est_utile)
                   ,EST_VRAI(la_suppression_est_utile)
                   ,IFNE_chaine(chaineA,C_VIDE)
                   ,IFEQ(PREMIER_CARACTERE_ITb0(chaineA),K_LF)
                    )
               )
                                        /* On notera le 20150504180558 la presence d'un indicateur "la_suppression_est_utile"        */
                                        /* "local" et un global in troduit a cette adet...                                           */
               Bblock
               BSaveModifyVariable(Int
                                  ,chain_copie_____index_du_premier_caractere_d_une_chaineA
                                  ,SUCC(PREMIER_CARACTERE)
                                   );

#define   chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete_____deplacer_eventuel_K_LF_tete_queue                                \
                    chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete_____deplacer_eventuel_K_LF_de_tete_vers_queue              \
                                        /* Pour raccourcir la longueur d'une ligne a suivre (introduit le 20091123113403)...         */

               BSaveModifyVariable(Logical
                                  ,chain_Xcopie_____ajouter_si_necessaire_un_K_LF_en_queue
                                  ,chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete_____deplacer_eventuel_K_LF_tete_queue
                                   );
                                        /* Sauvegarde des parametres "caches" de 'chain_Acopie(...)' via 'MOVE_CARACTERE(...)'       */
                                        /* et 'chain_Xcopie(...)'.                                                                   */
                                        /*                                                                                           */
                                        /* Les 'BSaveModifyVariable(...)'s ont ete introduits le 20091123113403...                   */

#undef    chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete_____deplacer_eventuel_K_LF_tete_queue

               EGAp(chaineR,chain_Acopie(chaineA));
                                        /* Cas ou on supprime un 'K_LF' situe au debut de la chaine Argument en la decalant d'un     */
                                        /* caractere.                                                                                */

               ESaveModifyVariable(Logical
                                  ,chain_Xcopie_____ajouter_si_necessaire_un_K_LF_en_queue
                                   );
               ESaveModifyVariable(Int
                                  ,chain_copie_____index_du_premier_caractere_d_une_chaineA
                                   );
                                        /* Restauration des parametres "caches" de 'chain_Acopie(...)' via 'MOVE_CARACTERE(...)'     */
                                        /* et 'chain_Xcopie(...)'.                                                                   */
               Eblock
          ATes
               Bblock
               EGAp(chaineR,chain_Acopie(chaineA));
                                        /* Copie de la chaine Argument sans modification...                                          */
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                            */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T                    */
/*        E T   S U P P R E S S I O N   D E S   E S P A C E S  :                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(CHAR,ZINT(chain_Acopie_avec_suppression_des_espaces_____caractere_remplacant_eventuellement_l_espace,K_BLANC)));
                                        /* Introduit le 20171231113315...                                                            */

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Acopie_avec_suppression_des_espaces(chaineA))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          BSaveModifyVariable(Logical
                             ,MOVE_CARACTERE_____supprimer_un_caractere_particulier
                             ,VRAI
                              );
          BSaveModifyVariable(CHAR
                             ,MOVE_CARACTERE_____caractere_particulier_a_supprimer
                             ,chain_Acopie_avec_suppression_des_espaces_____caractere_remplacant_eventuellement_l_espace
                              );
                                        /* Sauvegarde des parametres "caches" de 'chain_Acopie(...)' via 'MOVE_CARACTERE(...)'       */
                                        /* et 'chain_Xcopie(...)'.                                                                   */

          EGAp(chaineR,chain_Acopie(chaineA));

          ESaveModifyVariable(CHAR
                             ,MOVE_CARACTERE_____caractere_particulier_a_supprimer
                              );
          ESaveModifyVariable(Logical
                             ,MOVE_CARACTERE_____supprimer_un_caractere_particulier
                              );
                                        /* Restauration des parametres "caches" de 'chain_Acopie(...)' via 'MOVE_CARACTERE(...)'     */
                                        /* et 'chain_Xcopie(...)'.                                                                   */
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
          Eblock
     ETes

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   A U T O M A T I Q U E   D E S   F O R M A T S   D ' I M P R E S S I O N   E N T I E R E  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(chain_Acopie_avec_gestion_des_formats_des_editions_entieres_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180316112952 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Acopie_avec_gestion_des_formats_des_editions_entieres(...)' et ainsi disposer      */
                                        /* d'un majorant du nombre de 'CALZ_FreCC(...)'s.                                            */

DEFV(Common,DEFV(Logical,SINT(chain_Acopie_avec_gestion_des_formats_des_editions_entieres_____editer_carac_non_reconnus,FAUX)));
                                        /* Option introduite le 20120118122750. Il semble qu'elle soit tres dangereuse a activer,    */
                                        /* en particulier lors de compilations car, en effet, cela peut engendrer des "torrents"     */
                                        /* de messages d'erreur en cascade comme cela s'est vu a cette date sur '$CMAP28'...         */

#define   EXTENSION_DES_FORMATS_DES_EDITIONS_ENTIERES(longueur)                                                                         \
                    GRO4(longueur)                                                                                                      \
                                        /* Extension arbitraire de securite...                                                       */

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Acopie_avec_gestion_des_formats_des_editions_entieres(chaineA))))
                                        /* Fonction introduite le 20100322120925...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(taille_de_chaineR,UNDEF));
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/

#if       (PRECISION_DU_Int==SIMPLE_PRECISION)
     EGAp(chaineR,chain_Acopie(chaineA));
                                        /* Dans ce cas, il n'y a rien a faire...                                                     */
#Aif      (PRECISION_DU_Int==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Int==SIMPLE_PRECISION)

#if       (PRECISION_DU_Int==DOUBLE_PRECISION)
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          DEFV(Int,INIT(indexA,PREMIER_CARACTERE));
                                        /* Index de recuperation de "chaineA".                                                       */
          DEFV(Int,INIT(indexR,PREMIER_CARACTERE));
                                        /* Index de generation de "chaineR".                                                         */

          DEFV(Logical,INIT(peut_etre_un_POUR_CENT_D_en_cours,FAUX));
                                        /* Afin de savoir si l'on est peut-etre dans une sous-chaine :                               */
                                        /*                                                                                           */
                                        /*                  %[-+.*0123456789]*[dOoXxefgcs]                                           */
                                        /*                                                                                           */

          EGAL(taille_de_chaineR
              ,EXTENSION_DES_FORMATS_DES_EDITIONS_ENTIERES(LONGUEUR_D_UNE_CHAINE_A_ALLOUER(chain_taille(chaineA)))
               );
          ckMalo(chaineR,taille_de_chaineR,chain_Acopie_avec_gestion_des_formats_des_editions_entieres_____compteur_des_kMalo);
                                        /* Allocation de la memoire necessaire a la copie.                                           */
                                        /*                                                                                           */
                                        /* Le comptage a ete introduit le 20180316112952...                                          */

          Tant(IFNE(CARACTERE_COURANT,END_OF_CHAIN))
               Bblock
               Choi(CARACTERE_COURANT)
                    Bblock
                    Ca1e(K_POUR_CENT)
                         Bblock
                         EGAL(peut_etre_un_POUR_CENT_D_en_cours,NOTL(peut_etre_un_POUR_CENT_D_en_cours));
                                        /* Ce 'NOTL(...)' est destine a prendre en compte les ecritures "%%"...                      */
                         Eblock
                    ECa1

                    Ca1e(K_LF)
                                        /* Dans le cas d'un changement de ligne, il faut evidemment "fermer" un eventuel "%" en      */
                                        /* cours (introduit le 20120118125042...).                                                   */
                         Bblock
                         EGAL(peut_etre_un_POUR_CENT_D_en_cours,FAUX);
                         Eblock
                    ECa1

                    CaEe(K_MOINS,K_PLUS,K_POINT,K_ETOILE,K_0,K_1,K_2,K_3,K_4,K_5,K_6,K_7,K_8,K_9)
                                        /* Cas des parametres d'un "%" qui n'ont pas a etre testes ci-apres.                         */
                                        /*                                                                                           */
                                        /* Le 20120118120031 fut introduit 'K_POINT' qui manquait...                                 */
                         Bblock
                         Eblock
                    ECaE

                    Ca5e(K_d,K_O,K_o,K_X,K_x)
                                        /* Cas des formats decimaux "%d" (extension "%ld"), des formats hexa-decimaux "%X"           */
                                        /* en majuscules (extension "%lx") et des formats hexa-decimaux "%X" en minuscules           */
                                        /* (extension "%lX").                                                                        */
                                        /*                                                                                           */
                                        /* Les formats {K_O,K_o} ont ete introduits le 20120117084332...                             */
                         Bblock
                         Test(EST_VRAI(peut_etre_un_POUR_CENT_D_en_cours))
                              Bblock
                              CARACTERE_COURANT_DE_CHAINE(chaineR,indexR,K_l);
                              INCR(indexR,I);
                                        /* Dans le cas ou l'on a recontre une sous chaine "%[-+*0123456789]*d", celle-ci est donc    */
                                        /* transformee en ""%[-+*0123456789]*ld". Les formats "%x" et '%X" ont ete introduits le     */
                                        /* 20100322140340.                                                                           */
                                        /*                                                                                           */
                                        /* On notera que ('v $xtc/PrintLongInt.01$c') faire cette extension sans savoir si le        */
                                        /* nombre entier qui va etre edite est un entier court ou long n'a aucune importance car les */
                                        /* formats {"%ld","%lX","%lx"} marchent aussi bien avec les 'long int's qu'aves les 'int's.  */
                              EGAL(peut_etre_un_POUR_CENT_D_en_cours,FAUX);
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ECa5

                    Ca5e(K_e,K_f,K_g,K_c,K_s)
                                        /* Cas des formats "flottants" et "caracteres" qui doivent rester inchanger. Ils ont ete     */
                                        /* introduits le 20120117084332 car, en effet, ils manquaient...                             */
                         Bblock
                         Test(EST_VRAI(peut_etre_un_POUR_CENT_D_en_cours))
                              Bblock
                              EGAL(peut_etre_un_POUR_CENT_D_en_cours,FAUX);
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ECa5

                    Defo
                         Bblock
                         Test(EST_VRAI(peut_etre_un_POUR_CENT_D_en_cours))
                                        /* Test introduit le 20120118120754...                                                       */
                              Bblock
                              Test(IL_FAUT(chain_Acopie_avec_gestion_des_formats_des_editions_entieres_____editer_carac_non_reconnus))
                                        /* Test introduit le 20120118122750...                                                       */
                                   Bblock
                                   BASIQUE____Prer1("Caractere non reconnu ('%c') rencontre"
                                                   ,CARACTERE_COURANT
                                                    );
                                   BASIQUE____Prer2(" a l'index %" ## BFd ## " dans le format '%s'.\n"
                                                   ,indexA
                                                   ,chaineA
                                                    );
                                        /* Message introduit le 20120117181753...                                                    */
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              EGAL(peut_etre_un_POUR_CENT_D_en_cours,FAUX);
                                        /* En fait on ne peut sortir de 'peut_etre_un_POUR_CENT_D_en_cours' qu'apres avoir           */
                                        /* rencontre au choix {K_d,K_O,K_o,K_X,K_x,K_e,K_f,K_g,K_c,K_s}, mais il est peut-etre       */
                                        /* plus prudent malgre tout d'en sortir : on ne sait jamais...                               */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    EDef
                    Eblock
               ECho

               CARACTERE_COURANT_DE_CHAINE(chaineR,indexR,CARACTERE_COURANT);
               INCR(indexR,I);
                                        /* Le caractere courant est systematiquement reecrit tel quel...                             */

               INCR(indexA,I);
               Eblock
          ETan

          Test(EST_VRAI(peut_etre_un_POUR_CENT_D_en_cours))
               Bblock
               BASIQUE____Prer0("Un '%%' dans un format ne se 'referme' pas.\n");
                                        /* Message introduit le 20120117084332...                                                    */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          FIN_DE_CHAINE(chaineR,indexR);
                                        /* Mise en place de l'indicateur de fin de chaine...                                         */

          VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(chaineR),taille_de_chaineR)
                                                              ,BLOC(Bblock
                                                                    BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                                    ,C_VERITABLE_QUOTE
                                                                                    ,chaineR
                                                                                    ,C_VERITABLE_QUOTE
                                                                                     );
                                                                    Eblock
                                                                    )
                                                               );
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
          Eblock
     ETes
#Aif      (PRECISION_DU_Int==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Int==DOUBLE_PRECISION)

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

#undef    EXTENSION_DES_FORMATS_DES_EDITIONS_ENTIERES

EFonctionC

#undef    CARACTERE_COURANT

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                            */
/*        P A R A M E T R A G E   D E S   F O R M A T S   D E S   E D I T I O N S   F L O T T A N T E S  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Acopie_avec_parametrage_des_formats_des_editions_flottantes(chaineA
                                                                                                     ,le_parametrage_est_utile
                                                                                                      )
                                    )
                 )
     )
                                        /* Cette fonction a ete introduite le 20060105095826...                                      */
                                        /*                                                                                           */
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
DEFV(Argument,DEFV(Logical,le_parametrage_est_utile));
                                        /* Indique s'il est necessaire de tester la suppression...                                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          Test(IFET(EST_VRAI(le_parametrage_est_utile)
                   ,IFNE_chaine(chaineA,C_VIDE)
                    )
               )
               Bblock
               BSaveModifyVariable(Logical
                                  ,MOVE_CARACTERE_____parametrer_les_formats_des_editions_flottantes
                                  ,VRAI
                                   );
                                        /* Sauvegarde des parametres "caches" de 'chain_Acopie(...)' via 'MOVE_CARACTERE(...)'       */
                                        /* et 'chain_Xcopie(...)'.                                                                   */
                                        /*                                                                                           */
                                        /* Le 'BSaveModifyVariable(...)' a ete introduit le 20091123113403...                        */

               EGAp(chaineR,chain_Acopie(chaineA));
                                        /* Cas ou on parametre les formats des editions flottantes...                                */

               ESaveModifyVariable(Logical
                                  ,MOVE_CARACTERE_____parametrer_les_formats_des_editions_flottantes
                                   );
                                        /* Restauration des parametres "caches" de 'chain_Acopie(...)' via 'MOVE_CARACTERE(...)'     */
                                        /* et 'chain_Xcopie(...)'.                                                                   */
               Eblock
          ATes
               Bblock
               EGAp(chaineR,chain_Acopie(chaineA));
                                        /* Copie de la chaine Argument sans modification...                                          */
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
          Eblock
     ETes

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   ' N '   C A R A C T E R E S                                                    */
/*        S A N S   A L L O C A T I O N   M E M O I R E   P O U R   L E   R E S U L T A T  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,chain_XNcopie(chaineR,chaineA,indexR,nombre_de_caracteres)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineR)));
                                        /* Resultat. ATTENTION : l'allocation memoire a du etre faite au prealable !!!               */
                                        /* de plus, on notera que l'INDEX du premier caractere non genere est                        */
                                        /* renvoye par cette fonction...                                                             */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
DEFV(Argument,DEFV(Int,indexR));
                                        /* Index initial de copie de la chaine, caractere par caractere.                             */
DEFV(Argument,DEFV(Positive,nombre_de_caracteres));
                                        /* Nombre de caracteres a copier (on ne se soucie donc pas d'un eventuel                     */
                                        /* 'END_OF_CHAIN' au bout de 'chaineA').                                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          DEFV(Int,INIT(indexA,chain_copie_____index_du_premier_caractere_d_une_chaineA));
                                        /* Index de recuperation de "chaineA",                                                       */
          DEFV(Positive,INIT(taille_de_chaineA,chain_taille(chaineA)));
                                        /* Introduit le 20051027100651 uniquement pour valider les index dans 'MOVE_CARACTERE(...)'. */

          Repe(nombre_de_caracteres)
               Bblock
               MOVE_CARACTERE(chaineR
                             ,indexR
                             ,chaineA
                             ,indexA
                             ,NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES
                             ,NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES
                             ,taille_de_chaineA
                             ,INFINI
                              );
                                        /* Copie de la chaine et duplication (excepte le 'END_OF_CHAIN').                            */
                                        /*                                                                                           */
                                        /* On notera le 'INFINI' pour la taille de 'chaineR' car, en effet, on la connait pas...     */
               Eblock
          ERep
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU(indexR);
                                        /* Et renvoi de 'indexR', afin au retour de pouvoir inserer, si                              */
                                        /* cela est utile le 'END_OF_CHAIN'.                                                         */
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   ' N '   C A R A C T E R E S                                                    */
/*        A V E C   I N S E R T I O N   D ' U N   ' E N D _ O F _ C H A I N '   E T                                                  */
/*        S A N S   A L L O C A T I O N   M E M O I R E   P O U R   L E   R E S U L T A T  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,chain_Ncopie(chaineR,chaineA,nombre_de_caracteres)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineR)));
                                        /* Resultat. ATTENTION : l'allocation memoire a du etre faite au prealable !!!               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
DEFV(Argument,DEFV(Positive,nombre_de_caracteres));
                                        /* Nombre de caracteres a copier (on ne se soucie donc pas d'un eventuel                     */
                                        /* 'END_OF_CHAIN' au bout de 'chaineA').                                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          DEFV(Int,INIT(indexR,PREMIER_CARACTERE));
                                        /* Index de copie de la chaine, caractere par caractere.                                     */

          EGAL(indexR,chain_XNcopie(chaineR,chaineA,indexR,nombre_de_caracteres));
                                        /* Copie de la chaine, a l'exception de 'END_OF_CHAIN', et recuperation                      */
                                        /* de l'index de fin...                                                                      */
          FIN_DE_CHAINE(chaineR,indexR);
                                        /* Mise en place de l'indicateur de fin de chaine...                                         */
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O P I E   D ' U N E   C H A I N E   D E   ' N '   C A R A C T E R E S                                                    */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(chain_ANcopie_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180316122349 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionC,POINTERc(chain_ANcopie(chaineA,nombre_de_caracteres))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument.                                                                                 */
DEFV(Argument,DEFV(Positive,nombre_de_caracteres));
                                        /* Nombre de caracteres a copier (on ne se soucie donc pas d'un eventuel                     */
                                        /* 'END_OF_CHAIN' au bout de 'chaineA').                                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(taille_de_chaineR,UNDEF));
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     Test(IFET(IFNE(IDENTITE(chaineA),ADRESSE_NON_DEFINIE),IFNE(IDENTITE(chaineA),ADRESSE_NON_ENCORE_DEFINIE)))
          Bblock
          EGAL(taille_de_chaineR,ADD2(LONGUEUR_D_UNE_CHAINE_A_ALLOUER(nombre_de_caracteres),chain_taille(C_VIDE)));
          ckMalo(chaineR,taille_de_chaineR,chain_ANcopie_____compteur_des_kMalo);
                                        /* Allocation de la memoire necessaire a la copie.                                           */
                                        /*                                                                                           */
                                        /* Le comptage a ete introduit le 20180316122349...                                          */

          CALS(chain_Ncopie(chaineR,chaineA,nombre_de_caracteres));
                                        /* Copie de la chaine argument.                                                              */

          VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(chaineR),taille_de_chaineR)
                                                              ,BLOC(Bblock
                                                                    BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                                    ,C_VERITABLE_QUOTE
                                                                                    ,chaineR
                                                                                    ,C_VERITABLE_QUOTE
                                                                                     );
                                                                    Eblock
                                                                    )
                                                               );
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */
          Eblock
     ATes
          Bblock
          ERREUR_CHAINE_NON_DEFINIE;
                                        /* Introduit le 20051024134730 (pour 'v $xig/fonct$vv$FON 20051019113924', peut-etre, car,   */
                                        /* en effet, cela peut conduire, apres le 'RETU(...)', a un 'FreCC(CHAINE_UNDEF)'...).       */
          Eblock
     ETes

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

                                        /* Le 20050127114831, la 'undef' de 'MOVE_CARACTERE' a ete deplacee plus loin suite a la     */
                                        /* modification du 20050127100516...                                                         */

                                        /* Le 20050128222237, les 'undef's de 'TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES'      */
                                        /* et de 'NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES' ont ete deplacees plus     */
                                        /* loin en meme temps que la modification du 20050127100516...                               */

                                        /* Le 20050127114028, les 'undef's de 'TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES'      */
                                        /* et de 'NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES' ont ete deplacees plus     */
                                        /* loin suite a la modification du 20050127100516...                                         */

                                        /* Le 20050127115113, la 'undef' de 'EXTENSION_CARACTERE' a ete deplacee plus loin suite     */
                                        /* a la modification du 20050127100516...                                                    */

                                        /* Le 20050127114451, la 'undef' de 'LONGUEUR_D_UNE_CHAINE_A_ALLOUER' a ete deplacee         */
                                        /* plus loin suite a la modification du 20050127100516...                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A I T E M E N T   D E S   F O R M A T S   D E   S O R T I E   ( F I N )  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#undef    ERREUR_CHAINE_NON_DEFINIE

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#    undef     Ftraitement_des_formats_de_sortie
                                        /* Tout ceci est destine a permettre l'utilisation de 'FPrin?(...)' tant que la "veritable"  */
                                        /* fonction 'Ftraitement_des_formats_de_sortie(...)' n'a pas ete definie. On notera que      */
                                        /* celle-ci attend la definition des fonctions de gestion des chaines de caracteres pour     */
                                        /* etre elle-meme veritablement definie...                                                   */

                                        /* ATTENTION, la fonction 'Ftraitement_des_formats_de_sortie(...)' doit etre definie apres   */
                                        /* 'chain_Acopie(...)' mais, si possible (voir le commentaire qui precede), avant toute      */
                                        /* utilisation de 'PRINT_DEFAUT(...)' qui l'utilise...                                       */

BFonctionC

DEFV(Common,DEFV(Positive,INIT(Ftraitement_des_formats_de_sortie_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180316125408 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Acopie(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s       */
                                        /* qui manquent...                                                                           */


#    define    SUPPRIMER_DES_BLANCS_REDONDANTS(sup_K_BLANCs_autour_K_caractere,K_caractere,formatTA,indexTA,formatTR,indexTR,loTA,loTR) \
                         Bblock                                                                                                         \
                         EGAL(indexTA,PREMIER_CARACTERE);                                                                               \
                                        /* Positionnement en debut de 'formatTA'...                                                  */ \
                                                                                                                                        \
                         Tant(IFNE(EGAL(caractere_courant,ITb0(formatTA,INDX(NEUT(indexTA),PREMIER_CARACTERE))),END_OF_CHAIN))          \
                              Bblock                                                                                                    \
                              DEFV(Int,INIT(SUCC_indexTA,SUCC(indexTA)));                                                               \
                                        /* On notera qu'un 'SUCC(...)' n'est pas dangereux (ne risque pas de faire sortir de la      */ \
                                        /* chaine) car, en effet, on fait ci dessus un 'Tant(IFNE(...,END_OF_CHAIN))' ; cela         */ \
                                        /* signifie donc qu'il y a toujours au moins un caractere de la chaine (eventuellement       */ \
                                        /* le 'END_OF_CHAIN)') derriere le 'caractere_courant'...                                    */ \
                              DEFV(Int,INIT(PRED_indexTA,COND(IFGT(indexTA,PREMIER_CARACTERE),PRED(indexTA),indexTA)));                 \
                                        /* Le 'COND(IFGT(indexTA,PREMIER_CARACTERE),...,...)' est destine a ne pas sortir de la      */ \
                                        /* chaine dans le cas du premier caractere de 'formatTA'. Dans ce cas, le fait de prendre    */ \
                                        /* 'indexTA' et non pas 'PRED(indexTA)' n'est pas genant etant donne la logique du test      */ \
                                        /* 'IFET(IFNE(...,K_caractere),IFEQ(...,K_BLANC))' car les deux caracteres testes sont       */ \
                                        /* en fait les memes (car indexes tous les deux par 'indexTA')...                            */ \
                                                                                                                                        \
                              Test(IFOU(IL_NE_FAUT_PAS(sup_K_BLANCs_autour_K_caractere)                                                 \
                                       ,IFET(IL_FAUT(sup_K_BLANCs_autour_K_caractere)                                                   \
                                            ,IFOU(IFNE(caractere_courant,K_BLANC)                                                       \
                                                 ,IFET(IFEQ(caractere_courant,K_BLANC)                                                  \
                                                      ,IFET(IFNE(ITb0(formatTA,INDX(SUCC_indexTA,PREMIER_CARACTERE)),K_caractere)       \
                                                           ,IFNE(ITb0(formatTA,INDX(PRED_indexTA,PREMIER_CARACTERE)),K_caractere)       \
                                                            )                                                                           \
                                                       )                                                                                \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                   )                                                                                                    \
                                   Bblock                                                                                               \
                                   MOVE_CARACTERE(formatTR                                                                              \
                                                 ,indexTR                                                                               \
                                                 ,formatTA                                                                              \
                                                 ,indexTA                                                                               \
                                                 ,NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES                                \
                                                 ,NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES                                \
                                                 ,loTA                                                                                  \
                                                 ,loTR                                                                                  \
                                                  );                                                                                    \
                                        /* Copie de la chaine et duplication (excepte le 'END_OF_CHAIN') et en supprimant les        */ \
                                        /* blancs qui seraient de part et d'autre d'un signe "="...                                  */ \
                                        /*                                                                                           */ \
                                        /* Jusqu'au 20060105095826, 'NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES' etait   */ \
                                        /* remplace par 'NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES' par erreur...       */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   INCR(indexTA,I);                                                                                     \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETan                                                                                                           \
                                                                                                                                        \
                         FIN_DE_CHAINE(formatTR,indexTR);                                                                               \
                                        /* Mise en place de l'indicateur de fin de chaine...                                         */ \
                                                                                                                                        \
                         VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(formatTR),taille_de_formatT)            \
                                                                             ,BLOC(Bblock                                               \
                                                                                   BASIQUE____Prer6("Chaine type %s%c%s=%s%s%s.\n"      \
                                                                                                   ,C_VERITABLE_QUOTE                   \
                                                                                                   ,K_caractere                         \
                                                                                                   ,C_VERITABLE_QUOTE                   \
                                                                                                   ,C_VERITABLE_QUOTE                   \
                                                                                                   ,formatTR                            \
                                                                                                   ,C_VERITABLE_QUOTE                   \
                                                                                                    );                                  \
                                                                                   Eblock                                               \
                                                                                   )                                                    \
                                                                              );                                                        \
                                        /* A cause du probleme 'v $xig/fonct$vv$FON 20041020113351'.                                 */ \
                         Eblock

DEFV(Common,DEFV(Logical,SINT(FPrin_____supprimer_les_K_BLANCs_autour_des_K_DEUX_POINTS,FAUX)));
                                        /* Option introduite le 20050128112507 identique a celle de 'K_EGAL' mais relative a         */
                                        /* 'K_DEUX_POINTS'...                                                                        */
                                        /*                                                                                           */
                                        /* A cause de 'v $xig/fonct$vv$DEF FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Numero_Parametre'  */
                                        /* et de 'v $xig/fonct$vv$DEF FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_SCALAIRES', lors de     */
                                        /* l'edition des "Parametre"s, les 'K_BLANC's autour des 'K_DEUX_POINTS's sont conserves     */
                                        /* par defaut...                                                                             */
                                        /*                                                                                           */
                                        /* Le 20050131085502 on notera que dans les cas ou le respect des 'K_BLANC's autour de       */
                                        /* 'K_DEUX_POINTS' serait imperatif dans toutes les circonstances (quel que soit la valeur   */
                                        /* de cet indicateur de controle), la solution consisterait a decouper le format de sortie   */
                                        /* en plusieurs morceaux, puis a faire donc plusieurs appels successifs aux fonctions        */
                                        /* de sortie 'CAL?(Pr???(...))'. ATTENTION : evidemment la solution consistant a faire le    */
                                        /* decoupage, puis a faire appel a une fonction 'chain_Aconcaten?(...)' et a une sortie      */
                                        /* unique ne fonctionne pas car, en effet, 'chain_Aconcaten?(...)' redonne un format         */
                                        /* unique qui sera donc traite ici et subira donc les operations de suppression si cela      */
                                        /* est demande...                                                                            */
DEFV(Common,DEFV(Logical,SINT(FPrin_____supprimer_les_K_BLANCs_autour_des_K_EGAL,VRAI)));
                                        /* Option introduite le 20050127100516. Elle est destinee a resoudre un probleme source      */
                                        /* potentielle de graves anomalies : a differents endroits, des valeurs sont editees sous    */
                                        /* la forme :                                                                                */
                                        /*                                                                                           */
                                        /*                  NOM = VALEUR                                                             */
                                        /*                                                                                           */
                                        /* Malheureusement, je n'ai pas respecte de regles strictes, et on trouvera aussi bien :     */
                                        /*                                                                                           */
                                        /*                  NOM=VALEUR                                                               */
                                        /*                  NOM      = VALEUR                                                        */
                                        /*                  (...)                                                                    */
                                        /*                                                                                           */
                                        /* Or de nombreux '$Z's et '$U's recuperent ces valeurs via des '$GRE's et des '$SE's. De    */
                                        /* plus, le fichier '$xccp/compacte.1$sed' ('v $xcc/cpp$Z .xccp.compacte.1.sed'), lorsqu'il  */
                                        /* est utilise supprime ces 'K_BLANC's autour de 'K_EGAL' ; mais son utilisation n'est pas   */
                                        /* systematique : elle est conditionnee d'une part par la variable '$compacte_SED' et        */
                                        /* d'autre part par la taille du fichier (qui doit etre inferieure a '$Lcompacte_SED'...).   */
                                        /* Le risque est donc grand que d'une part on ne sache pas a l'avance quel sera la veritable */
                                        /* presentation et d'autre part celle-ci puisse changer au cours du temps, par exemple, si   */
                                        /* la taille du fichier correspondant augmente ou si le compactage est bloque...             */
                                        /*                                                                                           */
                                        /* La solution semble donc, pour que l'on ait systematiquement la presentation :             */
                                        /*                                                                                           */
                                        /*                  NOM=VALEUR                                                               */
                                        /*                                                                                           */
                                        /* de centraliser ici cette modification et de la rendre conditionnelle afin d'etre          */
                                        /* capable de montrer les formats d'origine. Enfin, le fichier 'v $xccp/compacte.1$sed'      */
                                        /* doit etre modifie pour ne plus gerer cela...                                              */
                                        /*                                                                                           */
                                        /* Le 20050131085502 on notera que dans les cas ou le respect des 'K_BLANC's autour de       */
                                        /* 'K_EGAL' serait imperatif dans toutes les circonstances (quel que soit la valeur          */
                                        /* de cet indicateur de controle), la solution consisterait a decouper le format de sortie   */
                                        /* en plusieurs morceaux, puis a faire donc plusieurs appels successifs aux fonctions        */
                                        /* de sortie 'CAL?(Pr???(...))'. ATTENTION : evidemment la solution consistant a faire le    */
                                        /* decoupage, puis a faire appel a une fonction 'chain_Aconcaten?(...)' et a une sortie      */
                                        /* unique ne fonctionne pas car, en effet, 'chain_Aconcaten?(...)' redonne un format         */
                                        /* unique qui sera donc traite ici et subira donc les operations de suppression si cela      */
                                        /* est demande...                                                                            */
                                        /*                                                                                           */
                                        /* ATTENTION, a compter du 20050131115702 la valeur par defaut est mise a jour par           */
                                        /* 'v $xig/fonct$vv$DEF 20050131105740' en fonction de la nature reelle de STANDARD_OUT'...  */
DEFV(Common,DEFV(Logical,SINT(FPrin_____supprimer_les_K_BLANCs_redondants,VRAI)));
                                        /* Option introduite le 20150310154131 lors de la mise au point de                           */
                                        /* 'v $xci/valeurs_Persistance$K FPrin_____supprimer_les_K_BLANCs_redondants'...             */

DEFV(Common,DEFV(FonctionC,POINTERc(Ftraitement_des_formats_de_sortie(formatA))))

                                        /* ATTENTION : je note le 20230314101548 que 'Ftraitement_des_formats_de_sortie' est         */
                                        /* reference explicitement dans 'v $xcc/cpp$Z ChAiNe1..Ftraitement_des_formats_de_sortie.'.  */

                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,POINTERc(formatA)));
                                        /* Argument.                                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(traiter_au_moins_un_K_DEUX_POINTS_qui_a_ete_trouve,FAUX));
     DEFV(Logical,INIT(traiter_au_moins_un_K_EGAL_qui_a_ete_trouve,FAUX));
                                        /* Afin de savoir s'il y a des 'K_DEUX_POINTS' et/ou des 'K_EGAL's. Ainsi, grace a ces       */
                                        /* indicateurs introduits le 20050202080258 la "compactage" des chaines de 'K_BLANC's        */
                                        /* redondants ne sera fait que si des 'K_DEUX_POINTS' et/ou des 'K_EGAL's ont ete            */
                                        /* rencontres (et si evidemment il faut supprimer les 'K_BLANC's les encadrant...).          */
     DEFV(CHAR,INIT(POINTERc(formatT1),CHAINE_UNDEF));
     DEFV(CHAR,INIT(POINTERc(formatT2),CHAINE_UNDEF));
     DEFV(CHAR,INIT(POINTERc(formatT3),CHAINE_UNDEF));
     DEFV(CHAR,INIT(POINTERc(formatT4),CHAINE_UNDEF));
     DEFV(CHAR,INIT(POINTERc(formatT5),CHAINE_UNDEF));
                                        /* Chaines intermediaires eventuellement necessaires aux operations relatives aux 'K_BLANC's */
                                        /* et aux 'K_DEUX_POINTS's et/ou aux 'K_EGAL's. La chaine 'formatT4' a ete introduite le     */
                                        /* 20060105121709...                                                                         */
     DEFV(CHAR,INIT(POINTERc(formatR),CHAINE_UNDEF));
                                        /* Destine a renvoyer le format traite...                                                    */
     /*..............................................................................................................................*/
     Test(I3OU(IL_FAUT(FPrin_____supprimer_les_K_BLANCs_autour_des_K_DEUX_POINTS)
              ,IL_FAUT(FPrin_____supprimer_les_K_BLANCs_autour_des_K_EGAL)
              ,IL_FAUT(FPrin_____supprimer_les_K_BLANCs_redondants)
               )
          )
          Bblock
                                        /* La sequence suivante a ete introduite le 20050202080258 afin de ne faire les operations   */
                                        /* relatives aux 'K_BLANC's que s'il y a des 'K_DEUX_POINTS's et/ou des 'K_EGAL's...         */
          DEFV(Int,INIT(indexA,PREMIER_CARACTERE));
          DEFV(CHAR,INIT(caractere_courant,K_UNDEF));
                                        /* Caractere courant de "formatA" et son index...                                            */
          Tant(IFNE(EGAL(caractere_courant,ITb0(formatA,INDX(NEUT(indexA),PREMIER_CARACTERE))),END_OF_CHAIN))
               Bblock
               Test(IFET(IL_FAUT(FPrin_____supprimer_les_K_BLANCs_autour_des_K_DEUX_POINTS),IFEQ(caractere_courant,K_DEUX_POINTS)))
                    Bblock
                    EGAL(traiter_au_moins_un_K_DEUX_POINTS_qui_a_ete_trouve,VRAI);
                                        /* Au moins un 'K_DEUX_POINTS' a ete trouve (introduit le 20050202080258)...                 */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFET(IL_FAUT(FPrin_____supprimer_les_K_BLANCs_autour_des_K_EGAL),IFEQ(caractere_courant,K_EGAL)))
                    Bblock
                    EGAL(traiter_au_moins_un_K_EGAL_qui_a_ete_trouve,VRAI);
                                        /* Au moins un 'K_EGAL' a ete trouve (introduit le 20050202080258)...                        */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               INCR(indexA,I);
               Eblock
          ETan

          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(I3OU(IL_FAUT(traiter_au_moins_un_K_DEUX_POINTS_qui_a_ete_trouve)
              ,IL_FAUT(traiter_au_moins_un_K_EGAL_qui_a_ete_trouve)
              ,IL_FAUT(FPrin_____supprimer_les_K_BLANCs_redondants)
               )
          )
          Bblock
          DEFV(CHAR,INIT(caractere_courant,K_UNDEF));
                                        /* Caractere courant de "formatA".                                                           */
          DEFV(Int,INIT(indexA,PREMIER_CARACTERE));
          DEFV(Int,INIT(indexT1,PREMIER_CARACTERE));
          DEFV(Int,INIT(indexT2,PREMIER_CARACTERE));
          DEFV(Int,INIT(indexT3,PREMIER_CARACTERE));
                                        /* Index de copie de la chaine, caractere par caractere.                                     */
          DEFV(Positive,INIT(taille_de_formatA,chain_taille(formatA)));
          DEFV(Positive,INIT(taille_de_formatT,UNDEF));
          EGAL(taille_de_formatT,LONGUEUR_D_UNE_CHAINE_A_ALLOUER(taille_de_formatA));
                                        /* Longueur des chaines intermediaires necessaires aux operations relatives aux              */
                                        /* 'K_BLANC's et aux 'K_DEUX_POINTS's et/ou aux 'K_EGAL's...                                 */

          ckMalo(formatT1,taille_de_formatT,Ftraitement_des_formats_de_sortie_____compteur_des_kMalo);
          ckMalo(formatT2,taille_de_formatT,Ftraitement_des_formats_de_sortie_____compteur_des_kMalo);
          ckMalo(formatT3,taille_de_formatT,Ftraitement_des_formats_de_sortie_____compteur_des_kMalo);
                                        /* Allocation de la memoire necessaire a la copie.                                           */
                                        /*                                                                                           */
                                        /* Le comptage a ete introduit le 20180316125408...                                          */

          Tant(IFNE(EGAL(caractere_courant,ITb0(formatA,INDX(NEUT(indexA),PREMIER_CARACTERE))),END_OF_CHAIN))
               Bblock
               DEFV(Int,INIT(SUCC_indexA,SUCC(indexA)));
                                        /* On notera qu'un 'SUCC(...)' n'est pas dangereux (ne risque pas de faire sortir de la      */
                                        /* chaine) car, en effet, on fait ci dessus un 'Tant(IFNE(...,END_OF_CHAIN))' ; cela         */
                                        /* signifie donc qu'il y a toujours au moins un caractere de la chaine (eventuellement       */
                                        /* le 'END_OF_CHAIN)') derriere le 'caractere_courant'...                                    */

               Test(IFOU(IL_NE_FAUT_PAS(FPrin_____supprimer_les_K_BLANCs_redondants)
                        ,IFET(IL_FAUT(FPrin_____supprimer_les_K_BLANCs_redondants)
                             ,IFOU(IFNE(caractere_courant,K_BLANC)
                                  ,IFET(IFEQ(caractere_courant,K_BLANC),IFNE(ITb0(formatA,INDX(SUCC_indexA,PREMIER_CARACTERE)),K_BLANC))
                                   )
                              )
                         )
                    )
                                        /* Test complete par 'FPrin_____supprimer_les_K_BLANCs_redondants' le 20150310154857...      */
                    Bblock
                    MOVE_CARACTERE(formatT1
                                  ,indexT1
                                  ,formatA
                                  ,indexA
                                  ,NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES
                                  ,NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES
                                  ,taille_de_formatA
                                  ,taille_de_formatT
                                   );
                                        /* Copie de la chaine (excepte le 'END_OF_CHAIN') avec remplacacement de toute chaine de     */
                                        /* blancs multiples par un blanc unique...                                                   */
                                        /*                                                                                           */
                                        /* Jusqu'au 20060105095826, 'NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES' etait   */
                                        /* remplace par 'NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES' par erreur...       */
                    Eblock
               ATes
                    Bblock
                    INCR(indexA,I);
                    Eblock
               ETes
               Eblock
          ETan

          FIN_DE_CHAINE(formatT1,indexT1);
                                        /* Mise en place de l'indicateur de fin de chaine...                                         */

          VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(formatT1),taille_de_formatT)
                                                              ,BLOC(Bblock
                                                                    BASIQUE____Prer3("La chaine Temporaire 1 est %s%s%s.\n"
                                                                                    ,C_VERITABLE_QUOTE
                                                                                    ,formatT1
                                                                                    ,C_VERITABLE_QUOTE
                                                                                     );
                                                                    Eblock
                                                                    )
                                                               );
                                        /* A cause du probleme 'v $xig/fonct$vv$FON 20041020113351'.                                 */

          SUPPRIMER_DES_BLANCS_REDONDANTS(traiter_au_moins_un_K_DEUX_POINTS_qui_a_ete_trouve
                                         ,K_DEUX_POINTS
                                         ,formatT1,indexT1
                                         ,formatT2,indexT2
                                         ,taille_de_formatA
                                         ,taille_de_formatT
                                          );
                                        /* Traitement des "K_DEUX_POINTS"...                                                         */
          SUPPRIMER_DES_BLANCS_REDONDANTS(traiter_au_moins_un_K_EGAL_qui_a_ete_trouve
                                         ,K_EGAL
                                         ,formatT2,indexT2
                                         ,formatT3,indexT3
                                         ,taille_de_formatA
                                         ,taille_de_formatT
                                          );
                                        /* Traitement des "K_EGAL"...                                                                */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     EGAp(formatT4
         ,chain_Acopie_avec_conversions_possibles_majuscules_minuscules
              (COND(I3OU(IL_FAUT(traiter_au_moins_un_K_DEUX_POINTS_qui_a_ete_trouve)
                        ,IL_FAUT(traiter_au_moins_un_K_EGAL_qui_a_ete_trouve)
                        ,IL_FAUT(FPrin_____supprimer_les_K_BLANCs_redondants)
                         )
                   ,formatT3
                   ,formatA
                    )
              ,FPrin_____convertir_les_caracteres_majuscules_en_caracteres_minuscules
              ,FPrin_____convertir_les_caracteres_minuscules_en_caracteres_majuscules
              ,FPrin_____carret_chain_Acopie_avec_conversions_possibles_majuscules_minuscules
               )
          );
                                        /* Jusqu'a la date du 20011202104125, le traitement etait "neutre", soit :                   */
                                        /*                                                                                           */
                                        /*                  EGAL(formatR,chain_Acopie(formatA));                                     */
                                        /*                                                                                           */
                                        /* Le 20011202152754, a ete introduit la conversion possible des majuscules en minuscules    */
                                        /* et reciproquement. ATTENTION, on notera l'aspect non universel et limite de ce            */
                                        /* dispositif car, en effet, cela marcherait bien si toutes les sorties etaient du type :    */
                                        /*                                                                                           */
                                        /*                  CAL2(Prin1("variable=%d",valeur));                                       */
                                        /*                                                                                           */
                                        /* auquel cas il est facile de convertir 'variable=' en majuscules (en s'arretant sur '%').  */
                                        /* Malheureusement, beaucoup (la plupart ?) des sorties sont faites de la facon suivante     */
                                        /* ('v $xcg/fichier_etat$K EDITER_UNE_VALEUR') :                                             */
                                        /*                                                                                           */
                                        /*                  CAL2(Prin1("%s","variable="));                                           */
                                        /*                  CAL2(Prin1("%d",valeur));                                                */
                                        /*                                                                                           */
                                        /* de facon a rendre optionnelle la sortie du message "variable=" ; ce message n'est donc    */
                                        /* pas dans un format et ne peut etre modifie par 'Ftraitement_des_formats_de_sortie(...)'.  */
                                        /*                                                                                           */
                                        /* En fait, l'idee serait de permettre, par exemple, de supprimer automatiquement toutes     */
                                        /* les en-tetes des messages, c'est-a-dire, remplacer une sortie du type :                   */
                                        /*                                                                                           */
                                        /*                  Debut x=1 y=2 z=3 Fin                                                    */
                                        /*                                                                                           */
                                        /* par :                                                                                     */
                                        /*                                                                                           */
                                        /*                  1 2 3                                                                    */
                                        /*                                                                                           */
                                        /* Cela correspond a une transformation du type :                                            */
                                        /*                                                                                           */
                                        /*                  $xcp/substitue.01.x                                                   \  */
                                        /*                                      c01="\(%\)"         s01="\n\1"                    \  */
                                        /*                                      c02='[] ,;}].*$'    s02=''                        \  */
                                        /*                                      c03='^[^%][^%]*$'   s03=''                        \  */
                                        /*                                      c04="\n\n*"         s04=" "                       \  */
                                        /*                                      c05="^  *"          s05=""                           */
                                        /*                                                                                           */
                                        /* mais que faire de cela ?                                                                  */

     EGAp(formatT5
         ,chain_Acopie_avec_gestion_des_formats_des_editions_entieres(formatT4)
          );
                                        /* Introduit le 20100322120925 a cause de 'v $xil/defi_K1$vv$DEF 20100317125446'...          */

     EGAp(formatR
         ,chain_Acopie_avec_parametrage_des_formats_des_editions_flottantes(formatT5
                                                                           ,PARAMETRER_LES_FORMATS_DES_EDITIONS_FLOTTANTES
                                                                            )
          );
                                        /* Traitement introduit le 20060105121709...                                                 */

     CALZ_FreCC(formatT5);

     Test(I3OU(IL_FAUT(traiter_au_moins_un_K_DEUX_POINTS_qui_a_ete_trouve)
              ,IL_FAUT(traiter_au_moins_un_K_EGAL_qui_a_ete_trouve)
              ,IL_FAUT(FPrin_____supprimer_les_K_BLANCs_redondants)
               )
          )
          Bblock
          CALZ_FreCC(formatT3);
          CALZ_FreCC(formatT2);
          CALZ_FreCC(formatT1);
                                        /* Liberation de l'espace temporaire...                                                      */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     CALZ_FreCC(formatT4);
                                        /* Liberation de l'espace temporaire...                                                      */

     RETU(formatR);
                                        /* Renvoi d'un pointeur sur le format traite...                                              */
     Eblock

#undef    SUPPRIMER_DES_BLANCS_REDONDANTS

EFonctionC

#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

BFonctionC

DEFV(Common,DEFV(Logical,SINT(FPrin_____convertir_les_caracteres_majuscules_en_caracteres_minuscules,LUNDEF)));
DEFV(Common,DEFV(Logical,SINT(FPrin_____convertir_les_caracteres_minuscules_en_caracteres_majuscules,LUNDEF)));
DEFV(Common,DEFV(CHAR,INIT(FPrin_____carret_chain_Acopie_avec_conversions_possibles_majuscules_minuscules,K_UNDEF)));
DEFV(Common,DEFV(Logical,SINT(FPrin_____supprimer_les_K_BLANCs_autour_des_K_DEUX_POINTS,LUNDEF)));
DEFV(Common,DEFV(Logical,SINT(FPrin_____supprimer_les_K_BLANCs_autour_des_K_EGAL,LUNDEF)));
DEFV(Common,DEFV(Logical,SINT(FPrin_____supprimer_les_K_BLANCs_redondants,LUNDEF)));
                                        /* ATTENTION : ces definitions sont a priori inutiles, mais justifiees par un commentaire    */
                                        /* similaire a celui de la fonction 'Ftraitement_des_formats_de_sortie(...)' qui suit...     */
                                        /* Ces definitions sont donc destinees aux '$X' non recompiles apres le 20020417101447       */
                                        /* via 'v $xig/fonct$vv$DEF GET_ARGUMENTS_DE_CONTROLE_DE_TRAITEMENT_DES_FORMATS_DE_SORTIE'.  */
                                        /* On notera que les valeurs donnees a ces variables importent peu puisque la definition     */
                                        /* active de 'Ftraitement_des_formats_de_sortie(...)' dans cette VERSION ne les utilise      */
                                        /* pas...                                                                                    */
DEFV(Common,DEFV(FonctionC,POINTERc(Ftraitement_des_formats_de_sortie(formatA))))
                                        /* ATTENTION : cette fonction bien qu'inutile est introduite afin d'eviter des problemes     */
                                        /* avec les librairies '$SO' qui avant 'Ftraitement_des_formats_de_sortie_VERSION_02'        */
                                        /* utilisaient partout cette fonction via les sorties diverses et variees ; ainsi, il est    */
                                        /* possible de continuer a travailler sans tout recompiler ('v $xcc/RecompileAll$Z') sur     */
                                        /* toutes les MACHINEs, meme pour les '$X' non recompiles apres le 20020417101447.           */
DEFV(Argument,DEFV(CHAR,POINTERc(formatA)));
                                        /* Argument.                                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(formatA);
     Eblock

EFonctionC

#Aifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   Ftraitement_des_formats_de_sortie_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#undef    MOVE_CARACTERE
                                        /* Le 20050127114831, la 'undef' de 'MOVE_CARACTERE' a ete deplacee ici suite a la           */
                                        /* modification du 20050127100516...                                                         */

                                        /* Le 20050128222237, les 'undef's de 'TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES'      */
                                        /* et de 'NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES' ont ete deplacees ici      */
                                        /* en meme temps que la modification du 20050128220037...                                    */

                                        /* Le 20050127114028, les 'undef's de 'TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES'      */
                                        /* et de 'NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES' ont ete deplacees ici      */
                                        /* suite a la modification du 20050127100516...                                              */

#undef    EXTENSION_CARACTERE
                                        /* Le 20050127115113, la 'undef' de 'EXTENSION_CARACTERE' a ete deplacee ici suite a la      */
                                        /* modification du 20050127100516...                                                         */

#undef    LONGUEUR_D_UNE_CHAINE_A_ALLOUER
                                        /* Le 20050127114451, la 'undef' de 'LONGUEUR_D_UNE_CHAINE_A_ALLOUER' a ete deplacee         */
                                        /* ici suite a la modification du 20050127100516...                                          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   G E N E R A L E   D E S   M E S S A G E S   D ' E R R E U R  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* ATTENTION, avant l'introduction de 'gPRINT_DEFAUT_VERSION_02' le 19961021171609, la       */
                                        /* fonction 'print_defaut(...)' etait ici. Malheureusement, la nouvelle version utilise      */
                                        /* 'chain_numero(...)' et 'chain_Aconcaten6(...)'. Pour eviter des problemes des type, il    */
                                        /* est imperatif que 'print_defaut(...)' soit situe apres ces deux fonction...               */
                                        /* Bien que 'print_defaut(...)' soit reference via 'PRINT_...(...)' avant d'etre definie,    */
                                        /* cela n'est pas trop grave car, en effet, elle est de type 'FonctionI' transforme          */
                                        /* en 'FonctionIB' le 20100317143338 pour permettre justement ces "references en avant"      */
                                        /* qui ne peuvent se faire qu'avec 'vrai_Int_de_base'...                                     */

                                        /* ATTENTION, le 19980420092917, 'PRINT_DEFAUT_____vient_d_apparaitre' a du etre place       */
                                        /* devant la fonction 'est_ce_alpha_numerique(...)' car il y est des plus utiles...          */

                                        /* Suite a l'introduction de 'VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(...)'     */
                                        /* il a fallu eloigner les 'undef's de {BASIQUE____Prer0,...,BASIQUE____Prer4}...            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N I T I A L I S A T I O N   D ' U N E   C O N S T A N T E   " C H A I N E   D E   C A R A C T E R E S "  :               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* ATTENTION, il est imperatif que 'GENERE__FonctionC_INIC(...)' soit definie dans           */
                                        /* 'v $xig/fonct$vv$DEF' et non pas dans 'v $xig/fonct$vv$FON' car, en effet, l'existence    */
                                        /* de ce symbole est teste dans 'v $xig/fonct$vv$ARG GENERE__FonctionC_INIC' ainsi que       */
                                        /* dans 'v $xig/fonct$vv$EXT GENERE__FonctionC_INIC'. Le transfert de '$xig/fonct$vv$FON'    */
                                        /* vers $xig/fonct$vv$DEF' a ete effectue le 19990303155346 ; il avait ete visiblement       */
                                        /* ouble il y a bien longtemps...                                                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N I T I A L I S A T I O N   D ' U N E   C O N S T A N T E   " C H A I N E   D E   C A R A C T E R E S "  :               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*             *     * * * * * *   * * * * * *   * * * * * *   *         *   * * * * * *   *   * * * * * *   *         *             */
/*                        *             *        *             **        *        *        *   *         *   **        *             */
/*            * *         *             *        *             * *       *        *        *   *         *   * *       *             */
/*                        *             *        *             *  *      *        *        *   *         *   *  *      *             */
/*           *   *        *             *        *             *   *     *        *        *   *         *   *   *     *             */
/*                        *             *        * * *         *    *    *        *        *   *         *   *    *    *             */
/*          * * * *       *             *        *             *     *   *        *        *   *         *   *     *   *             */
/*                        *             *        *             *      *  *        *        *   *         *   *      *  *             */
/*         *       *      *             *        *             *       * *        *        *   *         *   *       * *             */
/*                        *             *        *             *        **        *        *   *         *   *        **             */
/*        *         *     *             *        * * * * * *   *         *        *        *   * * * * * *   *         *             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        ATTENTION :                                                                                                                */
/*                                                                                                                                   */
/*                    La fonction 'Finitialisation_d_une_constante_chaine_de_caracteres(...)'                                        */
/*                  n'a de sens que sur certains SYSTEMEs ; elle n'est donc definie                                                  */
/*                  que sur ces derniers. Cela signifie qu'elle ne peut etre utilisee                                                */
/*                  directement et qu'elle ne peut etre accedee que via 'ccCHAR(...)'.                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION : ce qui suit ne peut utiliser (provisoirement...) la fonction 'defined(...)'   */
                                        /* a cause des commandes '$xcg/gen.arg$Z' et '$xcg/gen.ext$Z' qui ne savent pas la traiter   */
                                        /* correctement...                                                                           */

#ifdef    GENERE__FonctionC_INIC                                                /* Common,DEFV(Fonction,) : initialisation chaines.  */

BFonctionC

DEFV(Common,GENERE__FonctionC_INIC(Finitialisation_d_une_constante_chaine_de_caracteres(chaineA)))  /* Common,DEFV(Fonction,) :      */

EFonctionC

#Aifdef   GENERE__FonctionC_INIC                                                /* Common,DEFV(Fonction,) : initialisation chaines.  */

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(Finitialisation_d_une_constante_chaine_de_caracteres(chaineA))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,POINTERc(chaineA)));
                                        /* Argument.                                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     BASIQUE____Prer0("La fonction 'Finitialisation_d_une_constante_chaine_de_caracteres(...)' n'est utilisable que via ccCHAR(...)'");
                                        /* Jusqu'au 20111123110551 on utilisait ici 'PRINT_ERREUR(...)'. Mais avec l'arrivee de      */
                                        /* '$LACT19' et les references en avant a 'print_defaut(...)' et donc les confusions         */
                                        /* possibles entre 'Int' et 'vrai_Int_de_base', il est preferable d'utiliser a la place      */
                                        /* 'BASIQUE____Prer0(...)'.                                                                  */

     RETU(chaineA);
                                        /* Renvoi d'un pointeur sur la chaine Argument.                                              */
     Eblock

EFonctionC

#Eifdef   GENERE__FonctionC_INIC                                                /* Common,DEFV(Fonction,) : initialisation chaines.  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N   C H I F F R E   D E C I M A L   E N   C A R A C T E R E  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(conversion_d_un_chiffre_decimal_en_caractere_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionC,conversion_d_un_chiffre_decimal_en_caractere(chiffre_decimal)))
DEFV(Argument,DEFV(Int,chiffre_decimal));
                                        /* Chiffre decimal a convertir.                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(caractere_associe_au_chiffre_decimal,K_UNDEF));
                                        /* Caractere associe au chiffre decimal.                                                     */
     /*..............................................................................................................................*/
     Test(IFINff(chiffre_decimal,ZERO,NEUF))
          Bblock
          DEFV(Positive,INIT(longueur_utile_a_priori,NOMBRE_DE_CHIFFRES_DECIMAUX(SOUS(BASE10,UN))));
                                        /* Longueur a priori necessaire pour la conversion du chiffre en caractere.                  */
                                        /*                                                                                           */
                                        /* Avant le 20060104162550, la valeur precedente etait :                                     */
                                        /*                                                                                           */
                                        /*                  POSI(LO1X(BASE10))                                                       */
                                        /*                                                                                           */
          DEFV(Positive,INIT(taille_de_buffer_du_caractere_associe_au_chiffre_decimal,UNDEF));
          DEFV(CHAR,INIT(POINTERc(buffer_du_caractere_associe_au_chiffre_decimal),CHAINE_UNDEF));
                                        /* Zone de memoire necessaire a la generation du caractere associe au chiffre.               */
          DEFV(vrai_Int_de_base,INIT(longueur_du_resultat,UNDEF));
                                        /* Longueur du resultat de la conversion du chiffre en caractere.                            */

          EGAL(taille_de_buffer_du_caractere_associe_au_chiffre_decimal,ADD2(longueur_utile_a_priori,chain_taille(C_VIDE)));
          ckMalo(buffer_du_caractere_associe_au_chiffre_decimal
                ,taille_de_buffer_du_caractere_associe_au_chiffre_decimal
                ,conversion_d_un_chiffre_decimal_en_caractere_____compteur_des_kMalo
                 );
                                        /* Allocation de la memoire necessaire a la generation du caractere associe au chiffre.      */
          EGAL(ITb0(buffer_du_caractere_associe_au_chiffre_decimal,INDX(PREMIER_CARACTERE,PREMIER_CARACTERE))
              ,caractere_associe_au_chiffre_decimal
               );
                                        /* Initialisation a priori...                                                                */

          EGAL(longueur_du_resultat,SPrint(Cara(buffer_du_caractere_associe_au_chiffre_decimal)
                                          ,INTRODUCTION_FORMAT ## BFd ## "",chiffre_decimal
                                           )
               );
                                        /* Conversion du chiffre decimal en un caractere. ATTENTION, on notera qu'il n'est pas       */
                                        /* possible d'utiliser ici 'SPrin1(...)' a cause de la presence du 'EGAL(...)'...            */

#define   buffer_caractere_associe_chiffre_decimal                                                                                      \
                    buffer_du_caractere_associe_au_chiffre_decimal                                                                      \
                                        /* Afin de reduire la longueur de l'une des lignes suivantes...                              */

          VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(buffer_du_caractere_associe_au_chiffre_decimal)
                                                                   ,taille_de_buffer_du_caractere_associe_au_chiffre_decimal
                                                                    )
                                                              ,BLOC(Bblock
                                                                    BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                                    ,C_VERITABLE_QUOTE
                                                                                    ,buffer_caractere_associe_chiffre_decimal
                                                                                    ,C_VERITABLE_QUOTE
                                                                                     );
                                        /* Le 20041024095621 je note qu'il est essentiel d'utiliser ici 'BASIQUE____Prer3(...)'      */
                                        /* alors qu'ici 'Prer3(...)' serait utilisable car, en effet, l'utilisation de cette         */
                                        /* derniere pourrait conduire a une suite infinie d'appels correspondant a un defaut         */
                                        /* dans l'allocation memoire via 'chain_Aconcaten2(...)' par exemple...                      */
                                                                    Eblock
                                                                    )
                                                               );
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */

#undef    buffer_caractere_associe_chiffre_decimal

          Test(IFEQ(longueur_du_resultat,longueur_utile_a_priori))
               Bblock
               EGAL(caractere_associe_au_chiffre_decimal
                   ,ITb0(buffer_du_caractere_associe_au_chiffre_decimal,INDX(PREMIER_CARACTERE,PREMIER_CARACTERE))
                    );
                                        /* Et recuperation de la conversion...                                                       */
               Eblock
          ATes
               Bblock
               BASIQUE____Prer0("Le buffer de conversion d'un chiffre decimal est insuffisant");
                                        /* Jusqu'au 20111123110551 on utilisait ici 'PRINT_ATTENTION(...)'. Mais avec l'arrivee de   */
                                        /* '$LACT19' et les references en avant a 'print_defaut(...)' et donc les confusions         */
                                        /* possibles entre 'Int' et 'vrai_Int_de_base', il est preferable d'utiliser a la place      */
                                        /* 'BASIQUE____Prer0(...)'.                                                                  */
               BASICNU____Prer1("il demande %d octets\n",longueur_du_resultat);
               BASICNU____Prer1("alors que %" ## BFd ## " sont a priori suffisants\n",longueur_utile_a_priori);
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          BASIQUE____Prer0("La valeur a convertir n'est pas un nombre dans [0,9]");
                                        /* Jusqu'au 20111123110551 on utilisait ici 'PRINT_ATTENTION(...)'. Mais avec l'arrivee de   */
                                        /* '$LACT19' et les references en avant a 'print_defaut(...)' et donc les confusions         */
                                        /* possibles entre 'Int' et 'vrai_Int_de_base', il est preferable d'utiliser a la place      */
                                        /* 'BASIQUE____Prer0(...)'.                                                                  */
          BASICNU____Prer1("elle vaut %" ## BFd ## "\n",chiffre_decimal);
          Eblock
     ETes

     RETU(caractere_associe_au_chiffre_decimal);
                                        /* Renvoi du caractere associe au chiffre decimal.                                           */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E S T   D ' U N   C A R A C T E R E   ( E S T - C E   A L P H A - N U M E R I Q U E ? )  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* ATTENTION, le 19980420092917, la fonction 'est_ce_alpha_numerique(...)' a ete implantee   */
                                        /* avant les fonctions de copies car, en effet, 'MOVE_CARACTERE(...)' l'utilise...           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H A I N E S   V I D E S    E T   F I N   D E   C H A I N E  :                                                            */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   CHAINE_VIDE(chaine)                                                                                                           \
                    Bblock                                                                                                              \
                    FIN_DE_CHAINE(chaine,PREMIER_CARACTERE)                                                                             \
                    Eblock                                                                                                              \
                                        /* Definition de 'chaine' en tant que chaine vide.                                           */
#define   CHAINE_VIDE_SUPERFLUE                                                                                                         \
                    chaine_vide_superflue                                                                                               \
                                        /* Definition d'une chaine vide (voir le commentaire suivant)...                             */

DEFV(Local,DEFV(CHAR,INIS(DTb0(chaine_vide_superflue),C_VIDE)));
                                        /* Cette chaine vide implementee physiquement ici est destinee aux operateurs 'COND()'       */
                                        /* referencant une chaine vide. En fait seuls                                                */
                                        /*                                                                                           */
                                        /*                  'SYSTEME_FX2800_CONCENTRIX_FXC',                                         */
                                        /*                  'SYSTEME_FX2800_CONCENTRIX_PCC',                                         */
                                        /*                  'SYSTEME_FX2800_CONCENTRIX_SCC',                                         */
                                        /*                  'SYSTEME_FX40_CONCENTRIX_CC',                                            */
                                        /*                  'SYSTEME_FX40_CONCENTRIX_FXC',                                           */
                                        /*                  'SYSTEME_SUN3_SUNOS_CC',                                                 */
                                        /*                  'SYSTEME_SUN4_SUNOS_CC',                                                 */
                                        /*                  'SYSTEME_VAX8600_ULTRIX_CC',                                             */
                                        /*                  'SYSTEME_VAX9000_ULTRIX_CC'                                              */
                                        /*                                                                                           */
                                        /* le demandent. Mais, '$xig/fonct$vv$FON' faisant partie des modules "bootstrapables", il   */
                                        /* est necessaire que sa version pre-processee '$c' passe partout, d'ou l'absence de         */
                                        /* compilation conditionnelle par '#ifdef...'. Sur les autres SYSTEMEs, la version suivante  */
                                        /* etait suffisante :                                                                        */
                                        /*                                                                                           */
                                        /*                  #define   CHAINE_VIDE_SUPERFLUE                                       \  */
                                        /*                                      C_VIDE                                               */
                                        /*                                                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C U P E R A T I O N   D ' U N   C A R A C T E R E   D E   R A N G   D O N N E   D A N S   U N E   C H A I N E  :       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,chain_recherche_d_un_caractere(chaineA,index_du_caractere_demande)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine argument, dans laquelle on va rechercher le caractere demande.                     */
DEFV(Argument,DEFV(Int,index_du_caractere_demande));
                                        /* Index du premier caractere ou commencer la recherche...                                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     Test(IFEXff(index_du_caractere_demande
                ,PREMIER_CARACTERE
                ,LSTX(PREMIER_CARACTERE,chain_taille(chaineA))
                 )
          )
          Bblock
          BASIQUE____Prer0("Le caractere demande est hors de la chaine Argument");
                                        /* Jusqu'au 20111123110551 on utilisait ici 'PRINT_ATTENTION(...)'. Mais avec l'arrivee de   */
                                        /* '$LACT19' et les references en avant a 'print_defaut(...)' et donc les confusions         */
                                        /* possibles entre 'Int' et 'vrai_Int_de_base', il est preferable d'utiliser a la place      */
                                        /* 'BASIQUE____Prer0(...)'.                                                                  */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU(ITb0(chaineA,INDX(index_du_caractere_demande,PREMIER_CARACTERE)));
                                        /* Renvoi du caractere recherche. On notera que cette fonction est cree afin de permettre    */
                                        /* des structures du type :                                                                  */
                                        /*                                                                                           */
                                        /*                  DEFV(CHAR,INIC(POINTERc(chaine),"CHAINE"));                              */
                                        /*                                                                                           */
                                        /*  puis :                                                                                   */
                                        /*                                                                                           */
                                        /*                  ...chain_recherche_d_un_caractere(chaine,index)...                       */
                                        /*                                                                                           */
                                        /* ce qui ne serait pas possible directement sur 'chaine'...                                 */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D ' U N E   S O U S - C H A I N E   D A N S                                                            */
/*        U N E   C H A I N E   D E   C A R A C T E R E S  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_recherche(chaineA,sous_chaineA))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Argument 1 (chaine entiere),                                                              */
DEFV(Argument,DEFV(CHAR,DTb0(sous_chaineA)));
                                        /* Argument 2 (sous-chaine que l'on recherche dans 'chaineA').                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(index_chaineA,PREMIER_CARACTERE));
                                        /* Index sur la chaine de caracteres,                                                        */
     DEFV(Int,INIT(index_debut_chaineA,PREMIER_CARACTERE));
                                        /* Index sur le debut presume d'une occurence de la                                          */
                                        /* sous-chaine que l'on recherche.                                                           */
     DEFV(Int,INIT(index_sous_chaineA,PREMIER_CARACTERE));
                                        /* Index sur la sous-chaine que l'on recherche.                                              */
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* A priori, la 'sous-chaineA' n'est pas presente dans 'chaineA' ; au                        */
                                        /* retour, on recupere donc un pointeur vers la premiere occurence de                        */
                                        /* la sous-chaine ou 'CHAINE_UNDEF' si il n'y a pas de coincidence.                          */
     /*..............................................................................................................................*/
     Tant(IFET(IFNE(ITb0(chaineA,INDX(index_chaineA,PREMIER_CARACTERE)),END_OF_CHAIN)
              ,IFNE(ITb0(sous_chaineA,INDX(index_sous_chaineA,PREMIER_CARACTERE)),END_OF_CHAIN)
               )
          )
          Bblock
          Test(IFEQ(ITb0(chaineA,INDX(index_chaineA,PREMIER_CARACTERE))
                   ,ITb0(sous_chaineA,INDX(index_sous_chaineA,PREMIER_CARACTERE))
                    )
               )
               Bblock
               INCR(index_sous_chaineA,I);
               INCR(index_chaineA,I);
                                        /* Tant qu'il y a un soupcon d'occurence, les deux indexes progressent                       */
                                        /* simultanement.                                                                            */
               Eblock
          ATes
               Bblock
               EGAL(index_sous_chaineA,PREMIER_CARACTERE);
               EGAL(index_chaineA,INCR(index_debut_chaineA,I));
                                        /* Des qu'il y a une discordance, on revient au debut de l'occurence courante                */
                                        /* en la faisant progresser d'un cran.                                                       */
               Eblock
          ETes
          Eblock
     ETan

     Test(IFEQ(ITb0(sous_chaineA,INDX(index_sous_chaineA,PREMIER_CARACTERE)),END_OF_CHAIN))
          Bblock
          EGAL(IDENTITE(chaineR)
              ,IDENTITE(ADD2(chaineA
                            ,SOUS(index_debut_chaineA,PREMIER_CARACTERE)
                             )
                        )
               );
                                        /* Lorsqu'on a reussi a atteindre le bout de la sous-chaine, c'est                           */
                                        /* que l'on a trouve sa premiere occurence dans la chaine principale ; on                    */
                                        /* calcule un pointeur vers elle (sinon, c'est 'CHAINE_UNDEF').                              */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU(chaineR);
                                        /* Renvoi d'un eventuel pointeur sur l'occurence de la sous-chaine                           */
                                        /* 'sous-chaineA' dans la chaine 'chaineA'.                                                  */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   D E U X   C H A I N E S   D E   C A R A C T E R E S                                      */
/*        S A N S   A L L O C A T I O N   M E M O I R E   P O U R   L E   R E S U L T A T  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,chain_concatene(chaineR,chaineA1,chaineA2)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineR)));
                                        /* Resultat. ATTENTION : l'allocation memoire a du etre faite au prealable !!!               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA1)));
                                        /* Argument 1,                                                                               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA2)));
                                        /* Argument 2.                                                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(Int,INIT(indexR,PREMIER_CARACTERE));
                                        /* Index de concatenation des deux chaines, caractere par caractere.                         */
     /*..............................................................................................................................*/
     EGAL(indexR,chain_Xcopie(chaineR,chaineA1,indexR));
                                        /* Copie de la premiere chaine, a l'exception de 'END_OF_CHAIN', et recuperation             */
                                        /* de l'index de fin...                                                                      */
     EGAL(indexR,chain_Xcopie(chaineR,chaineA2,indexR));
                                        /* Copie de la deuxieme chaine, a l'exception de 'END_OF_CHAIN', et recuperation             */
                                        /* de l'index de fin...                                                                      */
     FIN_DE_CHAINE(chaineR,indexR);
                                        /* Mise en place de l'indicateur de fin de chaine...                                         */
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                            */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION : cette fonction a ete introduite le 20010101114210, pour des raisons de        */
                                        /* symetrie dans 'v $xcp/Loperators_G$K chain_Aconcaten1'.                                   */

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten1(chaineA1))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA1)));
                                        /* Argument 1,                                                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     EGAp(chaineR,chain_Acopie(chaineA1));
                                        /* Concatenation de la chaine argument.                                                      */

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   D E U X   C H A I N E S   D E   C A R A C T E R E S                                      */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(chain_Aconcaten2_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180314110705 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten2(chaineA1,chaineA2))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA1)));
                                        /* Argument 1,                                                                               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA2)));
                                        /* Argument 2.                                                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(taille_de_chaineR,UNDEF));
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     EGAL(taille_de_chaineR
         ,ADD2(ADD2(chain_Xtaille(chaineA1)
                   ,chain_Xtaille(chaineA2)
                    )
              ,chain_taille(C_VIDE)
               )
          );
     ckMalo(chaineR,taille_de_chaineR,chain_Aconcaten2_____compteur_des_kMalo);
                                        /* Allocation de la memoire necessaire a la concatenation, en n'oubliant pas                 */
                                        /* le marqueur de fin de chaine.                                                             */
                                        /*                                                                                           */
                                        /* Le 20180314105238, je rappelle que bien souvent l'espace ici alloue pour 'chaineR' ne     */
                                        /* fait pas l'objet d'un 'CALZ_FreCC(...)', par exemple, lorsque ce 'chain_Aconcaten2(...)'  */
                                        /* est imbrique dans autre chose ('v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_EDITION_VECTEUR'   */
                                        /* par exemple...). Une solution pourrait etre d'empiler systematiquement la valeur du       */
                                        /* pointeur 'chaineR', pour faire ensuite des 'CALZ_FreCC(...)'s de tous ces pointeurs       */
                                        /* empiles. Oui, mais ou et quand faire cela ?                                               */
                                        /*                                                                                           */
                                        /* Cet solution d'empilement poserait un probleme : celui des pointeurs (qui seraient donc   */
                                        /* dans cette pile...) qui auraient fait l'objet d'un 'CALZ_FreCC(...)' explicite anterieur. */
                                        /*                                                                                           */
                                        /* Le comptage a ete introduit le 20180314110705...                                          */

     CALS(chain_concatene(chaineR,chaineA1,chaineA2));
                                        /* Concatenation des deux chaines argument.                                                  */

                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */
     VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(chaineR),taille_de_chaineR)
                                                         ,BLOC(Bblock
                                                               BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                               ,C_VERITABLE_QUOTE
                                                                               ,chaineR
                                                                               ,C_VERITABLE_QUOTE
                                                                                );
                                        /* Le 20041024095621 je note qu'il est essentiel d'utiliser ici 'BASIQUE____Prer3(...)'      */
                                        /* alors qu'ici 'Prer3(...)' serait utilisable car, en effet, l'utilisation de cette         */
                                        /* derniere pourrait conduire a une suite infinie d'appels correspondant a un defaut         */
                                        /* dans l'allocation memoire via 'chain_Aconcaten2(...)' par exemple...                      */
                                                               Eblock
                                                               )
                                                          );
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   P L U S I E U R S   C H A I N E S   D E   C A R A C T E R E S                            */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   DEFINITION_DES_CHAINES_DE_chain_Aconcaten(concatenations_intermediaires)                                                      \
                    DEFV(CHAR,INIT(POINTERc(chaine_intermediaire),concatenations_intermediaires));                                      \
                                        /* Chaine intermediaire destinee a la concatenation intermediaire.                           */ \
                    DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));                                                                    \
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */

#define   ALLOCATION_MEMOIRE_DE_chain_Aconcaten                                                                                         \
                    EGAp(chaineR,chain_Aconcaten2(c01,chaine_intermediaire));                                                           \
                                        /* Concatenation des quatre chaines argument.                                                */ \
                    CALZ_FreCC(chaine_intermediaire);                                                                                   \
                                        /* Liberation de l'espace contenant la chaine intermediaire...                               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   T R O I S   C H A I N E S   D E   C A R A C T E R E S                                    */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten3(c01,c02,c03))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten2(c02,c03));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante. On notera que tout ceci est equivalent a : */
                                        /*                                                                                           */
                                        /*                  chain_Aconcaten2(chain_Aconcaten2(c01,c02),c03)                          */
                                        /*                                                                                           */
                                        /* (suivant un modele de type 'ADD3(...)') mais a ete introduit car, en effet, en son        */
                                        /* absence, le 'chain_Aconcaten2(...)' interne fait de l'allocation memoire jamais rendue.   */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   Q U A T R E   C H A I N E S   D E   C A R A C T E R E S                                  */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten4(c01,c02,c03,c04))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten3(c02,c03,c04));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   C I N Q   C H A I N E S   D E   C A R A C T E R E S                                      */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten5(c01,c02,c03,c04,c05))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten4(c02,c03,c04,c05));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   S I X   C H A I N E S   D E   C A R A C T E R E S                                        */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten6(c01,c02,c03,c04,c05,c06))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten5(c02,c03,c04,c05,c06));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   S E P T   C H A I N E S   D E   C A R A C T E R E S                                      */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten7(c01,c02,c03,c04,c05,c06,c07))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten6(c02,c03,c04,c05,c06,c07));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   H U I T   C H A I N E S   D E   C A R A C T E R E S                                      */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten8(c01,c02,c03,c04,c05,c06,c07,c08))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten7(c02,c03,c04,c05,c06,c07,c08));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   N E U F   C H A I N E S   D E   C A R A C T E R E S                                      */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten9(c01,c02,c03,c04,c05,c06,c07,c08,c09))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten8(c02,c03,c04,c05,c06,c07,c08,c09));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   D I X   C H A I N E S   D E   C A R A C T E R E S                                        */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten10(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten9(c02,c03,c04,c05,c06,c07,c08,c09,c10));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   O N Z E   C H A I N E S   D E   C A R A C T E R E S                                      */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten11(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10,c11))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten10(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   D O U Z E   C H A I N E S   D E   C A R A C T E R E S                                    */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten12(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten(chain_Aconcaten11(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   T R E I Z E   C H A I N E S   D E   C A R A C T E R E S                                  */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten13(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180320150330...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten12(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   Q U A T O R Z E   C H A I N E S   D E   C A R A C T E R E S                              */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten14(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180320150330...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
DEFV(Argument,DEFV(CHAR,DTb0(c14)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten13(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   Q U I N Z E   C H A I N E S   D E   C A R A C T E R E S                                  */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten15(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180320150330...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
DEFV(Argument,DEFV(CHAR,DTb0(c14)));
DEFV(Argument,DEFV(CHAR,DTb0(c15)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten14(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   S E I Z E   C H A I N E S   D E   C A R A C T E R E S                                    */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten16(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180320150330...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
DEFV(Argument,DEFV(CHAR,DTb0(c14)));
DEFV(Argument,DEFV(CHAR,DTb0(c15)));
DEFV(Argument,DEFV(CHAR,DTb0(c16)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten15(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   D I X - S E P T   C H A I N E S   D E   C A R A C T E R E S                              */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten17(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16,c17))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180321094115...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
DEFV(Argument,DEFV(CHAR,DTb0(c14)));
DEFV(Argument,DEFV(CHAR,DTb0(c15)));
DEFV(Argument,DEFV(CHAR,DTb0(c16)));
DEFV(Argument,DEFV(CHAR,DTb0(c17)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten16(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16,c17));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   D I X - H U I T   C H A I N E S   D E   C A R A C T E R E S                              */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten18(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16,c17,c18))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180321110910...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
DEFV(Argument,DEFV(CHAR,DTb0(c14)));
DEFV(Argument,DEFV(CHAR,DTb0(c15)));
DEFV(Argument,DEFV(CHAR,DTb0(c16)));
DEFV(Argument,DEFV(CHAR,DTb0(c17)));
DEFV(Argument,DEFV(CHAR,DTb0(c18)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten17(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16,c17,c18));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   D I X - N E U F   C H A I N E S   D E   C A R A C T E R E S                              */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten19(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180321110910...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
DEFV(Argument,DEFV(CHAR,DTb0(c14)));
DEFV(Argument,DEFV(CHAR,DTb0(c15)));
DEFV(Argument,DEFV(CHAR,DTb0(c16)));
DEFV(Argument,DEFV(CHAR,DTb0(c17)));
DEFV(Argument,DEFV(CHAR,DTb0(c18)));
DEFV(Argument,DEFV(CHAR,DTb0(c19)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten18(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   V I N G T   C H A I N E S   D E   C A R A C T E R E S                                    */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten20(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10
                                                     ,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20
                                                      )
                                    )
                 )
     )
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180321111804...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
DEFV(Argument,DEFV(CHAR,DTb0(c14)));
DEFV(Argument,DEFV(CHAR,DTb0(c15)));
DEFV(Argument,DEFV(CHAR,DTb0(c16)));
DEFV(Argument,DEFV(CHAR,DTb0(c17)));
DEFV(Argument,DEFV(CHAR,DTb0(c18)));
DEFV(Argument,DEFV(CHAR,DTb0(c19)));
DEFV(Argument,DEFV(CHAR,DTb0(c20)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten19(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   V I N G T   E T   U N   C H A I N E S   D E   C A R A C T E R E S                        */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten21(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10
                                                     ,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20
                                                     ,c21
                                                      )
                                    )
                 )
     )
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180321111804...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
DEFV(Argument,DEFV(CHAR,DTb0(c14)));
DEFV(Argument,DEFV(CHAR,DTb0(c15)));
DEFV(Argument,DEFV(CHAR,DTb0(c16)));
DEFV(Argument,DEFV(CHAR,DTb0(c17)));
DEFV(Argument,DEFV(CHAR,DTb0(c18)));
DEFV(Argument,DEFV(CHAR,DTb0(c19)));
DEFV(Argument,DEFV(CHAR,DTb0(c20)));
DEFV(Argument,DEFV(CHAR,DTb0(c21)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten20(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   V I N G T - D E U X   C H A I N E S   D E   C A R A C T E R E S                          */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten22(c01,c02,c03,c04,c05,c06,c07,c08,c09,c10
                                                     ,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20
                                                     ,c21,c22
                                                      )
                                    )
                 )
     )
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Fonction introduite le 20180321111804...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(c01)));
DEFV(Argument,DEFV(CHAR,DTb0(c02)));
DEFV(Argument,DEFV(CHAR,DTb0(c03)));
DEFV(Argument,DEFV(CHAR,DTb0(c04)));
DEFV(Argument,DEFV(CHAR,DTb0(c05)));
DEFV(Argument,DEFV(CHAR,DTb0(c06)));
DEFV(Argument,DEFV(CHAR,DTb0(c07)));
DEFV(Argument,DEFV(CHAR,DTb0(c08)));
DEFV(Argument,DEFV(CHAR,DTb0(c09)));
DEFV(Argument,DEFV(CHAR,DTb0(c10)));
DEFV(Argument,DEFV(CHAR,DTb0(c11)));
DEFV(Argument,DEFV(CHAR,DTb0(c12)));
DEFV(Argument,DEFV(CHAR,DTb0(c13)));
DEFV(Argument,DEFV(CHAR,DTb0(c14)));
DEFV(Argument,DEFV(CHAR,DTb0(c15)));
DEFV(Argument,DEFV(CHAR,DTb0(c16)));
DEFV(Argument,DEFV(CHAR,DTb0(c17)));
DEFV(Argument,DEFV(CHAR,DTb0(c18)));
DEFV(Argument,DEFV(CHAR,DTb0(c19)));
DEFV(Argument,DEFV(CHAR,DTb0(c20)));
DEFV(Argument,DEFV(CHAR,DTb0(c21)));
DEFV(Argument,DEFV(CHAR,DTb0(c22)));
                                        /* Chaines Arguments.                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFINITION_DES_CHAINES_DE_chain_Aconcaten
         (chain_Aconcaten21(c02,c03,c04,c05,c06,c07,c08,c09,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21,c22));
     /*..............................................................................................................................*/
     ALLOCATION_MEMOIRE_DE_chain_Aconcaten;

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   P L U S I E U R S   C H A I N E S   D E   C A R A C T E R E S                            */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#undef    ALLOCATION_MEMOIRE_DE_chain_Aconcaten
#undef    DEFINITION_DES_CHAINES_DE_chain_Aconcaten

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   D E U X   C H A I N E S   D E   C A R A C T E R E S                                      */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T                    */
/*        S A U F   S I   L A   P R E M I E R E   C H A I N E   E S T   ' N O M _ P I P E '  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten2_sauf_nom_pipe(chaineA1,chaineA2))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA1)));
                                        /* Argument 1,                                                                               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA2)));
                                        /* Argument 2 ; mais attention, celle-ci peut etre remplacee par 'C_VIDE'                    */
                                        /* lorsque l'argument 1 est 'NOM_PIPE'.                                                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(chain_Aconcaten2(chaineA1
                          ,COND(IFNE_chaine(chaineA1,NOM_PIPE)
                               ,chaineA2
                               ,CHAINE_VIDE_SUPERFLUE
                                )
                           )
          );
                                        /* Renvoi d'un pointeur sur la chaine resultante ; on notera que dans le cas                 */
                                        /* ou argument 1 = NOM_PIPE, on ne renvoie par directement 'argument 1', en effet,           */
                                        /* il est necessaire que cette fonction se comporte exactement comme 'chain_Aconcatene',     */
                                        /* en particulier au niveau de l'allocation memoire...                                       */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   T R O I S   C H A I N E S   D E   C A R A C T E R E S                                    */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T                    */
/*        S A U F   S I   L A   P R E M I E R E   C H A I N E   E S T   ' N O M _ P I P E '  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten3_sauf_nom_pipe(chaineA1,chaineA2,chaineA3))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA1)));
                                        /* Argument 1,                                                                               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA2)));
                                        /* Argument 2,                                                                               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA3)));
                                        /* Argument 3.                                                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaine_intermediaire),chain_Aconcaten2(chaineA2,chaineA3)));
                                        /* Chaine intermediaire destinee a la concatenation intermediaire.                           */
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     EGAp(chaineR,chain_Aconcaten2_sauf_nom_pipe(chaineA1,chaine_intermediaire));
                                        /* Concatenation des trois chaines argument.                                                 */
     CALZ_FreCC(chaine_intermediaire);
                                        /* Liberation de l'espace contenant la chaine intermediaire...                               */

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante. On notera que l'orde des operations est    */
                                        /* different de celui de 'chain_Aconcaten3(...)' afin de pouvoir tester correctement le      */
                                        /* contenu de 'chaineA1'...                                                                  */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N C A T E N A T I O N   D E   Q U A T R E   C H A I N E S   D E   C A R A C T E R E S                                  */
/*        A V E C   A L L O C A T I O N   M E M O I R E   A U T O M A T I Q U E   P O U R   L E   R E S U L T A T                    */
/*        S A U F   S I   L A   P R E M I E R E   C H A I N E   E S T   ' N O M _ P I P E '  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aconcaten4_sauf_nom_pipe(chaineA1,chaineA2,chaineA3,chaineA4))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA1)));
                                        /* Argument 1,                                                                               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA2)));
                                        /* Argument 2,                                                                               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA3)));
                                        /* Argument 3,                                                                               */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA4)));
                                        /* Argument 4.                                                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaine_intermediaire),chain_Aconcaten3(chaineA2,chaineA3,chaineA4)));
                                        /* Chaine intermediaire destinee a la concatenation intermediaire.                           */
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     EGAp(chaineR,chain_Aconcaten2_sauf_nom_pipe(chaineA1,chaine_intermediaire));
                                        /* Concatenation des quatre chaines argument.                                                */
     CALZ_FreCC(chaine_intermediaire);
                                        /* Liberation de l'espace contenant la chaine intermediaire...                               */

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante. On notera que l'orde des operations est    */
                                        /* different de celui de 'chain_Aconcaten3(...)' afin de pouvoir tester correctement le      */
                                        /* contenu de 'chaineA1'...                                                                  */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H O I X   D E   L A   F A C O N   D E   G E N E R E R   U N E   C H A I N E                                              */
/*        D E   C A R A C T E R E S   C O N T E N A N T   U N   N U M E R O  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#nodefine GENERATION_D_UN_NUMERO_VERSION_01                                                                                             \
                                        /* Dans cette version, on ne genere que le nombre de chiffres correspondant a la             */ \
                                        /* capacite d'un mot machine (en binaire).                                                   */

#define   GENERATION_D_UN_NUMERO_VERSION_02                                                                                             \
                                        /* Dans cette version, on genere exactement le nombre de chiffres demandes (en mettant)      */ \
                                        /* eventuellement des '0' devant (ceci est rendu necessaire par la gestion des donnees       */ \
                                        /* numeriques sur le disque 'PAL-Beta'.                                                      */

#ifdef    GENERATION_D_UN_NUMERO_VERSION_01                                     /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____GENERATION_D_UN_NUMERO_VERSION_01));
#Aifdef   GENERATION_D_UN_NUMERO_VERSION_01                                     /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   GENERATION_D_UN_NUMERO_VERSION_01                                     /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    GENERATION_D_UN_NUMERO_VERSION_02                                     /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____GENERATION_D_UN_NUMERO_VERSION_02));
#Aifdef   GENERATION_D_UN_NUMERO_VERSION_02                                     /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   GENERATION_D_UN_NUMERO_VERSION_02                                     /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                  */
/*        C O N T E N A N T   U N   N U M E R O                                                                                      */
/*        A V E C   A L L O C A T I O N   D E   L A   M E M O I R E   N E C E S S A I R E  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(_chain_numero_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180316122349 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(Positive,INIT(_chain_numero_____base_de_numeration,BASE10)));
                                        /* Introduit le 20190306150557 dans l'idee de generer un nombre de Champernowne dans une     */
                                        /* base differente de 10 ('v $xiirv/.CHAM.31.2.$U .xci.nombres.X').                          */

#define   PLUS_GRAND_NOMBRE_DE_CHIFFRES_POSSIBLE_DANS__chain_numero                                                                     \
                    DIX                                                                                                                 \
                                        /* Parametre introduit le 20061226114318 et passe de 'NEUF' a 'DIX' le 20231213170455 pour   */ \
                                        /* 'v $xig/fonct$vv$FON NOMBRE_CHIFFRES_NUMERO_DE_LA_MACHINE_HOTE_DU_NOM_RELATIF_TEMPO...'.  */
DEFV(Common,DEFV(Positive,SINT(ChaineNumero_____nombre_maximal_de_chiffres
                              ,PLUS_GRAND_NOMBRE_DE_CHIFFRES_POSSIBLE_DANS__chain_numero
                               )
                 )
     );
                                        /* Introduit le 20080602111626 afin de permettre l'introduction de 'ChaineNumero(...)'       */
                                        /* qui va permettre de parametrer facilement le nombre de chiffres generes par la fonction   */
                                        /* '_chain_numero(...)' sans avoir a proceder a des modifications complexes des '$K' (voir   */
                                        /* par exemple 'v $xrk/lyapunov.01$K ChaineNumero'), en notant au passage que les deux       */
                                        /* procedures 'ChaineNumero(...)' et 'chain_numero(...)' ont des noms de meme longueur       */
                                        /* ce qui laisse inchangees les tabulations...                                               */

#ifdef    GENERATION_D_UN_NUMERO_VERSION_02
#    define    C_REMPLISSAGE_DEVANT_UN_NUMERO                                                                                           \
                         C_BLANC                                                                                                        \
                                        /* Que mettre devant un numero trop grand pour la capacite machine...                        */
#Aifdef   GENERATION_D_UN_NUMERO_VERSION_02
#Eifdef   GENERATION_D_UN_NUMERO_VERSION_02

DEFV(Common,DEFV(CHAR,SINS(DTb0(_chain_numero_____caractere_zero_devant_un_numero)
                          ,Ichaine01(K_0)
                           )
                 )
     );
                                        /* Caractere '0' a mettre devant un numero pour assurer une longueur constante. Je n'ai,     */
                                        /* malheureusement, pas trouve de solution plus simple pour convertir 'K_0' en une chaine    */
                                        /* de caracteres tout en permettant son entree en parametre de la commande                   */
                                        /* 'v $xci/nombres$K _chain_numero_____caractere_zero_devant_un_numero'...                   */

#define   GENERE_NUMERO(chiffre,caractere)                                                                                              \
                    Ca1e(chiffre)                                                                                                       \
                         Bblock                                                                                                         \
                         CALS(chain_concatene(chaineR,chaineR,ccCHAR(caractere)));                                                      \
                                        /* Concatenation de la chaine courante et du numero.                                         */ \
                                                                                                                                        \
                         Test(IZNE(chiffre))                                                                                            \
                              Bblock                                                                                                    \
                              EGAL(on_a_rencontre_que_des_0_avant_le_chiffre_courant,FAUX);                                             \
                                        /* Ainsi, on sait que l'on a rencontre au moins un chiffre qui n'est pas '0' en partant des  */ \
                                        /* poids forts du nombre...                                                                  */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ECa1

DEFV(Common,DEFV(FonctionC,POINTERc(_chain_numero(argument_numero,nombre_de_chiffres))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(Positive,argument_numero));
                                        /* Numero (en binaire) que l'on souhaite convertir en une chaine,                            */
                                        /*                                                                                           */
                                        /* Le 20221204112724, 'numero' est devenu 'argument_numero', 'numero' etant maintenant       */
                                        /* defini un peu plus loin de facon locale. Ceci est en prevision d'operations a faire       */
                                        /* sur lui (par exemple un 'MODU(...)') dont les parametres seraient des 'DEFV(Common,...'.  */
DEFV(Argument,DEFV(Positive,nombre_de_chiffres));
                                        /* Suivant un certain nombre de caracteres (ou chiffres).                                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(numero,argument_numero));
                                        /* Introduit le 20221204112724 afin de permettre ulterieurement des operations a faire       */
                                        /* sur lui (par exemple un 'MODU(...)') dont les parametres seraient des 'DEFV(Common,...'.  */
                                        /* Cette idee est venue apres avoir observe que la sequence '$xirr/NUAG.1.*' etait definie   */
                                        /* dans [0,128] et non pas, par exemple, dans [0,512] et comme elle est periodique, elle     */
                                        /* pourrait etre utilisee dans [0,512] avec un 'MODU(...)'...                                */

     DEFV(Positive,INIT(taille_de_chaineR,UNDEF));
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */

     DEFV(Positive,INIT(nombre_de_chiffres_generes
                       ,MIN2(nombre_de_chiffres,PLUS_GRAND_NOMBRE_DE_CHIFFRES_POSSIBLE_DANS__chain_numero)
                        )
          );
                                        /* Nombre reel de chiffres que l'on va generer, mais attention a la difference entre         */
                                        /* 'GENERATION_D_UN_NUMERO_VERSION_01' et 'GENERATION_D_UN_NUMERO_VERSION_02'... On ne       */
                                        /* prend que ce que le mot 'extracteur' peut contenir...                                     */
                                        /*                                                                                           */
                                        /* Le 'TRPU(...)' qui manquait a ete introduit le 20041020090948, puis le 20060104162550     */
                                        /* 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)' a pris la releve...                                    */

     DEFV(Logical,INIT(on_a_rencontre_que_des_0_avant_le_chiffre_courant,VRAI));
                                        /* Afin d'identifier les '0' de tete (c'est-a-dire en partant des poids forts du nombre).    */
     /*..............................................................................................................................*/

#ifdef    GENERATION_D_UN_NUMERO_VERSION_01
     EGAL(taille_de_chaineR,ADD2(nombre_de_chiffres_generes,chain_taille(C_VIDE)));
#Aifdef   GENERATION_D_UN_NUMERO_VERSION_01
#Eifdef   GENERATION_D_UN_NUMERO_VERSION_01

#ifdef    GENERATION_D_UN_NUMERO_VERSION_02
     EGAL(taille_de_chaineR,ADD2(nombre_de_chiffres,chain_taille(C_VIDE)));
#Aifdef   GENERATION_D_UN_NUMERO_VERSION_02
#Eifdef   GENERATION_D_UN_NUMERO_VERSION_02

     ckMalo(chaineR,taille_de_chaineR,_chain_numero_____compteur_des_kMalo);
                                        /* Allocation de la memoire necessaire a la generation ; on incremente                       */
                                        /* d'une unite a cause du 'END_OF_CHAIN').                                                   */
                                        /*                                                                                           */
                                        /* Le comptage a ete introduit le 20180316122349...                                          */

     CHAINE_VIDE(chaineR);
                                        /* Initialisation de la chaine Resultat ; si le nombre de chiffres a generer                 */
                                        /* est nul, la chaine Resultat est donc la chaine vide...                                    */

#ifdef    GENERATION_D_UN_NUMERO_VERSION_02
     Test(IFGT(nombre_de_chiffres,nombre_de_chiffres_generes))
          Bblock
          Repe(SOUS(nombre_de_chiffres,nombre_de_chiffres_generes))
               Bblock
               Choi(ZERO)
                    Bblock
                    GENERE_NUMERO(ZERO,C_REMPLISSAGE_DEVANT_UN_NUMERO)
                                        /* Generation, si necessaire, de '0' ou de 'BLANC's devant la chaine de resultat.            */
                    Defo
                         Bblock
                         BASIQUE____Prer0("Dans 'chain_numero', on sort du segment [0,0]");
                                        /* Jusqu'au 20111123110551 on utilisait ici 'PRINT_ERREUR(...)'. Mais avec l'arrivee de      */
                                        /* '$LACT19' et les references en avant a 'print_defaut(...)' et donc les confusions         */
                                        /* possibles entre 'Int' et 'vrai_Int_de_base', il est preferable d'utiliser a la place      */
                                        /* 'BASIQUE____Prer0(...)'.                                                                  */
                         Eblock
                    EDef
                    Eblock
               ECho
               Eblock
          ERep
          Eblock
     ATes
          Bblock
          Eblock
     ETes
#Aifdef   GENERATION_D_UN_NUMERO_VERSION_02
#Eifdef   GENERATION_D_UN_NUMERO_VERSION_02

     Test(IZGT(nombre_de_chiffres_generes))
          Bblock
          DEFV(Positive,INIT(numero_residuel,numero));
                                        /* Afin de memoriser ce qui reste a generer.                                                 */
          DEFV(Positive,INIT(extracteur,UN));
                                        /* Pour extraire le chiffre le plus significatif courant du numero.                          */

          EGAL(on_a_rencontre_que_des_0_avant_le_chiffre_courant,VRAI);
                                        /* Au cas ou il aurait ete modifie dans les appels a 'GENERE_NUMERO(...)' ci-dessus...       */

          Repe(nombre_de_chiffres_generes)
               Bblock
               EGAL(extracteur,MUL2(extracteur,_chain_numero_____base_de_numeration));
               Eblock
          ERep

          EGAL(numero_residuel,REST(numero_residuel,extracteur));
                                        /* Suppression des chiffres de tete, lorsque le 'numero' en comporte                         */
                                        /* plus qu'en demande 'nombre_de_chiffres_generes'.                                          */
          Repe(nombre_de_chiffres_generes)
               Bblock
               EGAL(extracteur,MAX2(UNITE,DIVI(extracteur,_chain_numero_____base_de_numeration)));
                                        /* Reduction progressive de l'extracteur.                                                    */
               Choi(QUOD(numero_residuel,extracteur))
                                        /* Extraction du chifre le plus significatif.                                                */
                    Bblock
                    GENERE_NUMERO(ZERO
                                 ,COND(IFET(EST_VRAI(on_a_rencontre_que_des_0_avant_le_chiffre_courant)
                                           ,IFLT(compteur_des_repetitions_du_Repe,nombre_de_chiffres_generes)
                                            )
                                      ,_chain_numero_____caractere_zero_devant_un_numero
                                      ,ccCHAR(C_0)
                                       )
                                  )
                                        /* On notera le 'ccCHAR(...)' du a la compilation sur '$LACT29' qui proteste au sujet des    */
                                        /* types incompatibles de '_chain_numero_____caractere_zero_devant_un_numero' et 'C_0'.      */
                    GENERE_NUMERO(UN,C_1)
                    GENERE_NUMERO(DEUX,C_2)
                    GENERE_NUMERO(TROIS,C_3)
                    GENERE_NUMERO(QUATRE,C_4)
                    GENERE_NUMERO(CINQ,C_5)
                    GENERE_NUMERO(SIX,C_6)
                    GENERE_NUMERO(SEPT,C_7)
                    GENERE_NUMERO(HUIT,C_8)
                    GENERE_NUMERO(NEUF,C_9)
                    Defo
                         Bblock
                         BASIQUE____Prer0("Dans 'chain_numero', on sort du segment [0,9]");
                                        /* Jusqu'au 20111123110551 on utilisait ici 'PRINT_ERREUR(...)'. Mais avec l'arrivee de      */
                                        /* '$LACT19' et les references en avant a 'print_defaut(...)' et donc les confusions         */
                                        /* possibles entre 'Int' et 'vrai_Int_de_base', il est preferable d'utiliser a la place      */
                                        /* 'BASIQUE____Prer0(...)'.                                                                  */
                         BASICNU____Prer1("(le numero de %" ## BFd ## " chiffres"
                                         ,nombre_de_chiffres_generes
                                          );
                         BASICNU____Prer2(" vaut %" ## BFd ## " et la valeur residuelle %" ## BFd ## "\n"
                                         ,numero
                                         ,QUOD(numero_residuel,extracteur)
                                          );
                         Eblock
                    EDef
                    Eblock
               ECho
               EGAL(numero_residuel,REST(numero_residuel,extracteur));
                                        /* Et on passe a la tranche suivante...                                                      */
               Eblock
          ERep
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(chaineR),taille_de_chaineR)
                                                         ,BLOC(Bblock
                                                               BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                               ,C_VERITABLE_QUOTE
                                                                               ,chaineR
                                                                               ,C_VERITABLE_QUOTE
                                                                                );
                                        /* Le 20041024095621 je note qu'il est essentiel d'utiliser ici 'BASIQUE____Prer3(...)'      */
                                        /* alors qu'ici 'Prer3(...)' serait utilisable car, en effet, l'utilisation de cette         */
                                        /* derniere pourrait conduire a une suite infinie d'appels correspondant a un defaut         */
                                        /* dans l'allocation memoire via 'chain_Aconcaten2(...)' par exemple...                      */
                                                               Eblock
                                                               )
                                                          );
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

#undef    GENERE_NUMERO

#ifdef    GENERATION_D_UN_NUMERO_VERSION_02
#    undef     C_REMPLISSAGE_DEVANT_UN_NUMERO
#Aifdef   GENERATION_D_UN_NUMERO_VERSION_02
#Eifdef   GENERATION_D_UN_NUMERO_VERSION_02

#undef    GENERATION_D_UN_NUMERO_VERSION_02

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                  */
/*        C O N T E N A N T   U N   N U M E R O   E V E N T U E L L E M E N T   M O D U L O                                          */
/*        A V E C   A L L O C A T I O N   D E   L A   M E M O I R E   N E C E S S A I R E  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Logical,INIT(chain_numero_modulo_____effectif,FAUX)));
                                        /* Le calcul du numero doit-il etre modulo ? On notera que la valeur par defaut garantit     */
                                        /* la compatibilite anterieure...                                                            */
DEFV(Common,DEFV(Int,INIT(chain_numero_modulo_____origine,ZERO)));
DEFV(Common,DEFV(Int,INIT(chain_numero_modulo_____extremite,UN)));
                                        /* Parametres destines au calcul modulo du numero...                                         */

DEFV(Common,DEFV(FonctionC,POINTERc(chain_numero_modulo(argument_numero,nombre_de_chiffres))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme est un pointeur vers la chaine   */
                                        /* resultante, d'ou le type 'FonctionC'. Le resultat pourra donc etre place dans une         */
                                        /* variable POINTERc...                                                                      */
                                        /*                                                                                           */
                                        /* Cette fonction a ete introduite le 20221212111057, principalement pour les '$K's          */
                                        /* suivants :                                                                                */
                                        /*                                                                                           */
                                        /*                  $xci/accumule.01$K                                                       */
                                        /*                  $xci/accumule.02$K                                                       */
                                        /*                  $xci/accumule.03$K                                                       */
                                        /*                  $xci/accumule.04$K                                                       */
                                        /*                  $xci/accumule.11$K                                                       */
                                        /*                  $xci/accumule.12$K                                                       */
                                        /*                  $xci/accumule.22$K                                                       */
                                        /*                  $xci/accumule.31$K                                                       */
                                        /*                  $xci/integre.01$K                                                        */
                                        /*                  $xci/integre.02$K                                                        */
                                        /*                  $xci/integre.03$K                                                        */
                                        /*                  $xci/montagne.03$K                                                       */
                                        /*                  $xci/multiplex.01$K                                                      */
                                        /*                  $xci/normalise.02$K                                                      */
                                        /*                  $xci/sequence$K                                                          */
                                        /*                  $xci/sequence_RVB$K                                                      */
                                        /*                  $xci/vraies_C.01$K                                                       */
                                        /*                                                                                           */
                                        /*                  $xrv/champs_5.10.K                                                       */
                                        /*                  $xrv/champs_5.30.K                                                       */
                                        /*                  $xrv/champs_5.20.K                                                       */
                                        /*                                                                                           */
                                        /* pour lesquels on utilise 'chain_numero_modulo(...)' pour des images Arguments. Par        */
                                        /* contre il est evident que cela ne peut etre utilise pour des images Resultats...          */
DEFV(Argument,DEFV(Positive,argument_numero));
                                        /* Numero que l'on souhaite convertir en une chaine,                                         */
DEFV(Argument,DEFV(Positive,nombre_de_chiffres));
                                        /* Suivant un certain nombre de caracteres (ou chiffres).                                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(numero
                       ,COND(IL_FAUT(chain_numero_modulo_____effectif)
                            ,MODU(argument_numero,chain_numero_modulo_____origine,chain_numero_modulo_____extremite)
                            ,argument_numero
                             )
                        )
          );
     /*..............................................................................................................................*/
     RETU(_chain_numero(numero,nombre_de_chiffres));
                                        /* Renvoi de la chaine de caracteres "numero"....                                            */
     Eblock

EFonctionC

#undef    CHAINE_VIDE_SUPERFLUE
#undef    CHAINE_VIDE
#undef    FIN_DE_CHAINE
#undef    CARACTERE_COURANT_DE_CHAINE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                  */
/*        C O N T E N A N T   U N   E N T I E R  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(chain_Aentier_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180316122349 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionC,POINTERc(chain_Aentier(nombre_entier))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(Int,nombre_entier));
                                        /* Nombre entier a convertir.                                                                */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(taille_de_chaineR,UNDEF));
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     DEFV(Positive,INIT(nombre_de_caracteres,UNDEF));
                                        /* Nombre de caracteres necessaires a la conversion de 'nombre_entier'.                      */
     /*..............................................................................................................................*/
     Test(IZEQ(nombre_entier))
          Bblock
          EGAL(nombre_de_caracteres,UN);
                                        /* Si le nombre a convertir est nul, il lui faut un caractere (n'oublions pas que l'on ne    */
                                        /* peut alors utiliser 'LO1X(...)' a cause de 'log(0)')...                                   */
          Eblock
     ATes
          Bblock
          EGAL(nombre_de_caracteres,NOMBRE_DE_CHIFFRES_DECIMAUX(ABSO(nombre_entier)));
                                        /* Nombre de caracteres necessaires a la conversion de la valeur absolue de 'nombre_entier'. */
                                        /*                                                                                           */
                                        /* La procedure 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)' fut introduite le 20051210182216...       */

          Test(IZLT(nombre_entier))
               Bblock
               INCR(nombre_de_caracteres,SOUS(chain_taille(C_MOINS),chain_taille(C_VIDE)));
                                        /* Et on ajoute le signe "-" lorsque cela est necessaire...                                  */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETes

     INCR(nombre_de_caracteres,chain_taille(C_VIDE));
                                        /* Prise en compte du 'END_OF_CHAIN'...                                                      */

     EGAL(taille_de_chaineR,nombre_de_caracteres);
     ckMalo(chaineR,taille_de_chaineR,chain_Aentier_____compteur_des_kMalo);
                                        /* Allocation de la memoire necessaire a la conversion.                                      */
                                        /*                                                                                           */
                                        /* Le comptage a ete introduit le 20180316122349...                                          */

     CALZ(SPrin1(chaineR,INTRODUCTION_FORMAT ## BFd ## "",nombre_entier));
                                        /* Et enfin, conversion entiere...                                                           */

     VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(chaineR),taille_de_chaineR)
                                                         ,BLOC(Bblock
                                                               BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                               ,C_VERITABLE_QUOTE
                                                                               ,chaineR
                                                                               ,C_VERITABLE_QUOTE
                                                                                );
                                        /* Le 20041024095621 je note qu'il est essentiel d'utiliser ici 'BASIQUE____Prer3(...)'      */
                                        /* alors qu'ici 'Prer3(...)' serait utilisable car, en effet, l'utilisation de cette         */
                                        /* derniere pourrait conduire a une suite infinie d'appels correspondant a un defaut         */
                                        /* dans l'allocation memoire via 'chain_Aconcaten2(...)' par exemple...                      */
                                                               Eblock
                                                               )
                                                          );
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E   L A   L I S T E   D E S   C O D E S   D ' E R R E U R  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,gestion_de_la_liste_des_CODE_ERREUR_rencontres(code_d_erreur)))
                                        /* Fonction introduite le 20110224150729...                                                  */
DEFV(Argument,DEFV(Int,code_d_erreur));
                                        /* Code d'erreur a "empiler"...                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(format_EGAq____gestion_de_la_liste_des_CODE_ERREUR_rencontres)
                   ,chain_Aentier(code_d_erreur)
                    )
          );
     /*..............................................................................................................................*/
     EGAp(liste_des_CODE_ERREUR_rencontres
         ,chain_Aconcaten3(liste_des_CODE_ERREUR_rencontres
                          ,COND(IFEQ_chaine(liste_des_CODE_ERREUR_rencontres,C_VIDE)
                               ,C_VIDE
                               ,C_BLANC
                                )
                          ,format_EGAq____gestion_de_la_liste_des_CODE_ERREUR_rencontres
                           )
          );
                                        /* Empilement du code d'erreur...                                                            */

     CALZ_FreCC(format_EGAq____gestion_de_la_liste_des_CODE_ERREUR_rencontres);

     RETU(code_d_erreur);
                                        /* Et on renvoie le code d'erreur comme s'il ne s'etait rien passe. Cette fonction semble    */
                                        /* donc etre une fonction neutre (utilisable donc dans 'CODE_ERROR(...)').                   */
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D E   L A   D A T E   A U   F O R M A T   " AAAAMMJJhhmmss "  :                                            */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss())))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(date_AAAAMMJJhhmmss),CHAINE_UNDEF));
     /*..............................................................................................................................*/
     MISE_DE_LA_DATE_COURANTE_AU_FORMAT_____AAAAMMJJhhmmss(date_AAAAMMJJhhmmss);

     RETU(date_AAAAMMJJhhmmss);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   G E N E R A L E   D E S   M E S S A G E S   D ' E R R E U R  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionIB

                                        /* ATTENTION, avant l'introduction de 'gPRINT_DEFAUT_VERSION_02' le 19961021171609, la       */
                                        /* fonction 'print_defaut(...)' etait ici. Malheureusement, la nouvelle version utilise      */
                                        /* 'chain_numero(...)' et 'chain_Aconcaten6(...)'. Pour eviter des problemes des type, il    */
                                        /* est imperatif que 'print_defaut(...)' soit situe apres ces deux fonction...               */
                                        /* Bien que 'print_defaut(...)' soit reference via 'PRINT_...(...)' avant d'etre definie,    */
                                        /* cela n'est pas trop grave car, en effet, elle est de type 'FonctionI'...                  */

DEFV(Common,DEFV(Positive,INIT(print_defaut_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317072435 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(Logical,SINT(gPRINT_DEFAUT_____n_editer_que_le_message_principal,FAUX)));
                                        /* Cet indicateur a ete introduit le 20030912140009 afin de pouvoir alleger les sorties      */
                                        /* des messages de type {ATTENTION,ERREUR,...} si besoin est. La valeur par defaut ('FAUX')  */
                                        /* assure la compatibilite avec les versions anterieures. On notera que cette definition     */
                                        /* n'est pas conditionnelle (par rapport a 'gPRINT_DEFAUT_VERSION_04' afin de simplifier     */
                                        /* la programmation de 'v $xig/fonct$vv$DEF Alleger='.                                       */

DEFV(Common,DEFV(FonctionIB,print_defaut(en_tete
                                        ,message1
                                        ,message2
                                        ,commande_courante
                                        ,fichier_courant
                                        ,fonction_courante
                                        ,ligne_courante
                                        ,editer_message
                                         )
                 )
     )
                                        /* Le 20100317143338 le type 'FonctionI' est devenu 'FonctionIB' a cause des inevitables     */
                                        /* "references en avant" de 'print_defaut(...)' qui impliquent necessairement l'usage de     */
                                        /* 'vrai_Int_de_base'...                                                                     */
                                        /*                                                                                           */
                                        /* ATTENTION : le 20111121155246, j'ai voulu rajouter un nouvel argument de type 'Logical'   */
                                        /* permettant de differencier 'PRINT_DEFAUT(...)' et 'PRINT_EN_TETE_Prin_Prer_Prme(...)'.    */
                                        /* Malheureusement cette fonction est aussi appelee ci-dessus avant sa definition. Il y a    */
                                        /* alors confusion entre le type a l'appel ('vrai_Int_de_base') tant que 'print_defaut(...)' */
                                        /* n'est pas definie et le type effectif 'Logical' de cet argument ('unsigned long int').    */
                                        /* Lorsque cet argument vaut 'VRAI' (soit '1'), la valeur recuperee dans cette fonction est  */
                                        /* alors mauvaise. Ainsi donc :                                                              */
                                        /*                                                                                           */
                                        /*                  print_defaut(...,...,...,...,...,...,...,...,VRAI)                       */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* donnait a ce dernier argument 'Logical' la valeur 47997678627917 a la place de 1. Au      */
                                        /* passage, il semble que cela fonctionne correctement si ce nouvel argument est seul. Par   */
                                        /* contre apres les autres arguments de type 'CHAR' et 'Int', en dernier, il y a probleme... */
DEFV(Argument,DEFV(CHAR,DTb0(en_tete)));
DEFV(Argument,DEFV(CHAR,DTb0(message1)));
DEFV(Argument,DEFV(CHAR,DTb0(message2)));
                                        /* Definition des trois messages a editer.                                                   */
DEFV(Argument,DEFV(CHAR,DTb0(commande_courante)));
                                        /* Definition du nom de la commande courante.                                                */
DEFV(Argument,DEFV(CHAR,DTb0(fichier_courant)));
                                        /* Definition du nom du fichier courant.                                                     */
DEFV(Argument,DEFV(CHAR,DTb0(fonction_courante)));
                                        /* Definition du nom de la fonction courante (introduit le 20051124085935).                  */
DEFV(Argument,DEFV(Int,ligne_courante));
                                        /* Definition du numero de la ligne courante dans le fichier courant.                        */
DEFV(Argument,DEFV(Logical,editer_message));
                                        /* Afin de pouvoir inhiber l'edition...                                                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IL_FAUT(editer_message))
          Bblock
          gPRINT_DEFAUT(en_tete,message1,message2
                       ,commande_courante
                       ,fichier_courant
                       ,fonction_courante
                       ,ligne_courante
                        );
                                        /* Edition du message courant avec toute sa "decoration"...                                  */
          EGAL(PRINT_DEFAUT_____vient_d_apparaitre,VRAI);
                                        /* Memorisation de ceci afin de minimiser les changements de lignes au cas ou une            */
                                        /* fonction 'Prer?(...)' suivrait...                                                         */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionIB

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D ' U N   M E S S A G E   S A N S   A R G U M E N T S  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionV

DEFV(Common,DEFV(FonctionV,FPrme0(message)))
                                        /* Fonction introduite le 20221121103100 afin d'economiser de la place aussi bien au         */
                                        /* niveau des '$c's que des '$X's...                                                         */
DEFV(Argument,DEFV(CHAR,DTb0(message)));
                                        /* Message a editer...                                                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     CAL3(Prme1("%s",message));

     RETU_VIDE;
     Eblock

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D ' U N   M E S S A G E   D ' E R R E U R   A V E C   D E U X   A R G U M E N T S   E N T I E R S  :       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionV

DEFV(Common,DEFV(FonctionV,FPrer2II(format_d_edition,argument_entier_1,argument_entier_2)))
                                        /* Fonction introduite le 20221124115723 afin d'economiser de la place aussi bien au         */
                                        /* niveau des '$c's que des '$X's...                                                         */
                                        /*                                                                                           */
                                        /* Le 20221125112719, le nom 'FPrer2' a ete change en 'FPrer2II' afin de rappeler le         */
                                        /* type des deux arguments {argument_entier_1,argument_entier_2}...                          */
DEFV(Argument,DEFV(CHAR,DTb0(format_d_edition)));
                                        /* Format d'edition...                                                                       */
DEFV(Argument,DEFV(Int,argument_entier_1));
DEFV(Argument,DEFV(Int,argument_entier_2));
                                        /* Les deux arguments entiers...                                                             */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     CAL1(Prer2(format_d_edition,argument_entier_1,argument_entier_2));

     RETU_VIDE;
     Eblock

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S A U T S   D E   L I G N E S  :                                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionV

DEFV(Common,DEFV(FonctionV,Fsauts_de_lignes(nombre_de_sauts_de_lignes)))
                                        /* Fonction introduite le 20221114105137 afin d'economiser de la place aussi bien au         */
                                        /* niveau des '$c's que des '$X's...                                                         */
DEFV(Argument,DEFV(Positive,nombre_de_sauts_de_lignes));
                                        /* Nombre de sauts de lignes a effectuer...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     Repe(nombre_de_sauts_de_lignes)
          Bblock
          CALS(FPrme0("\n"));
          Eblock
     ERep

     RETU_VIDE;
     Eblock

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   D E S   " B U G S "   P R E S E N T S  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    BUG_SYSTEME_SGIND5_Sync_time_out                                      /* Common,DEFV(Fonction,) : bug...                   */
DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_SGIND5_Sync_time_out));
#Aifdef   BUG_SYSTEME_SGIND5_Sync_time_out                                      /* Common,DEFV(Fonction,) : bug...                   */
#Eifdef   BUG_SYSTEME_SGIND5_Sync_time_out                                      /* Common,DEFV(Fonction,) : bug...                   */

#ifdef    BUG_SYSTEME_Linux_Sync_tres_lent                                      /* Common,DEFV(Fonction,) : bug...                   */
DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_Linux_Sync_tres_lent));
                                        /* Introduit le 20121024135652...                                                            */
#Aifdef   BUG_SYSTEME_Linux_Sync_tres_lent                                      /* Common,DEFV(Fonction,) : bug...                   */
#Eifdef   BUG_SYSTEME_Linux_Sync_tres_lent                                      /* Common,DEFV(Fonction,) : bug...                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D ' U N   I N D I C A T E U R   V I S U E L   D U   T R A V A I L                                          */
/*        R E S T A N T   A   F A I R E   L O R S   D ' U N   P A R C O U R S   V I A   { 'begin_*','end_*' }  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

#define   ENCOMBREMENT_DE__DATE_AAAAMMJJhhmmss                                                                                          \
                    VINGT_CINQ                                                                                                          \
                                        /* Introduit le 20191018142847 a cause de 'v $xil/defi_c1$vv$DEF 20191018140516'...          */

#define   NOMBRE_TOTAL_DE_CARACTERES_A_MARQUER                                                                                          \
                    DIVZ(dimension_de_la_coordonnee,pas_du_test_sur_la_coordonnee)                                                      \
                                        /* Definition introduite le 20170529135714...                                                */

#define   TEST_DU_MODE_DE_PROGRESSION(caractere_si_mode_direct,caractere_si_mode_back__)                                                \
                    COND(IL_NE_FAUT_PAS(utiliser_le_mode_back_effectif)                                                                 \
                        ,caractere_si_mode_direct                                                                                       \
                        ,COND(IL_FAUT(utiliser_le_mode_back_effectif)                                                                   \
                             ,caractere_si_mode_back__                                                                                  \
                             ,K_INTERROGATION                                                                                           \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Procedure introduite le 20170403112325...                                                 */
#define   CARACTERE_MARQUANT_CE_QUI_RESTE_A_FAIRE                                                                                       \
                    COND(DIVISIBLE(COND(IL_FAUT(utiliser_le_mode_back_effectif)                                                         \
                                       ,compteur_des_repetitions_du_Repe                                                                \
                                       ,SOUS(nombre_de_repetitions_du_Repe,compteur_des_repetitions_du_Repe)                            \
                                        )                                                                                               \
                                  ,begin_end_____periodicite_du_marquage                                                                \
                                   )                                                                                                    \
                        ,K_PLUS                                                                                                         \
                        ,K_MOINS                                                                                                        \
                         )                                                                                                              \
                                        /* Marqueur introduit le 20210401144342...                                                   */ \
                                        /*                                                                                           */ \
                                        /* Le '(...)' introduit le 20210402115639 est destine a faire que les lignes de progression  */ \
                                        /* commencent par :                                                                          */ \
                                        /*                                                                                           */ \
                                        /*                  ---------+                                                               */ \
                                        /*                                                                                           */ \
                                        /* en mode 'IL_NE_FAUT_PAS(utiliser_le_mode_back_effectif)'...                               */

DEFV(Common,DEFV(Logical,SINT(begin_end_____editer_la_progression,FAUX)));
DEFV(Common,DEFV(Int,SINT(begin_end_____periodicite_du_marquage,DIX)));
DEFV(Common,DEFV(Int,SINT(begin_end_____pas_d_edition_de_la_progression,GRO2(GRO16(PAS_COORDONNEE)))));
                                        /* Indicateur reference via les procedures {'begin_*','end_*' pour indiquer s'il faut        */
                                        /* ('VRAI') ou pas ('FAUX') editer un indicateur visuel permettant de savoir l'etat          */
                                        /* d'avancement d'un parcours d'image. On trouve aussi le pas de test des coordonnees...     */
                                        /* On notera que 'begin_end_____pas_d_edition_de_la_progression' est exprime en nombre       */
                                        /* de points et non pas dans [0,1[ car, en effet, on ne sait pas a priori a quelle           */
                                        /* coordonnee ('X', 'Y' ou 'Z') il va s'appliquer ; on est donc incapable de faire           */
                                        /* un '______NORMALISE_??(...)'.                                                             */

DEFV(Common,DEFV(Int,INIT(begin_end_____compteur_d_imbrications,ZERO)));
                                        /* Ceci a ete introduit le 20170405114345 a cause de 'v $xiii/di_album$FON begin_album_back' */
                                        /* car, en effet, a l'interieur de {begin_album_back,end_album_back} il y a un appel aux     */
                                        /* fonctions 'Iinit_Z_Buffer(...)' et 'Iinit_Z_Buffer_accumule(...)' qui elles-memes         */
                                        /* contiennent des sequences {begin_image,end_image}...                                      */
DEFV(Local,DEFV(Int,INIT(begin_end_____nombre_partiel_de_caracteres_edites_au_passage_precedent,UNDEF)));
                                        /* Ceci a ete introduit le 20170529135714 afin d'eviter que soit la premiere ligne, soit la  */
                                        /* derniere sorte deux fois...                                                               */

DEFV(Common,DEFV(FonctionI,Fprogression_des_begin_end(coordonnee
                                                     ,coordonnee_minimale
                                                     ,dimension_de_la_coordonnee
                                                     ,pas_du_test_sur_la_coordonnee
                                                     ,utiliser_le_mode_back
                                                     ,nom_sHOTE
                                                     ,nom_HOST
                                                     ,identifiant_de_branches_paralleles
                                                     ,nom_commande_courante
                                                     ,fichier_courant_relatif
                                                     ,nom_fonction_courante
                                                     ,ligne_courante
                                                     ,type
                                                      )
                 )
     )
DEFV(Argument,DEFV(Int,coordonnee));
                                        /* Coordonnee a tester.                                                                      */
DEFV(Argument,DEFV(Int,coordonnee_minimale));
                                        /* Valeur minimale de la coordonnee a tester.                                                */
DEFV(Argument,DEFV(Int,dimension_de_la_coordonnee));
                                        /* Dimension de la coordonnee a tester.                                                      */
DEFV(Argument,DEFV(Int,pas_du_test_sur_la_coordonnee));
                                        /* Pas du test sur la coordonnee a tester.                                                   */
DEFV(Argument,DEFV(Logical,utiliser_le_mode_back));
                                        /* Mode (direct ou "back") introduit le 20170402102941...                                    */
DEFV(Argument,DEFV(CHAR,DTb0(nom_sHOTE)));
DEFV(Argument,DEFV(CHAR,DTb0(nom_HOST)));
DEFV(Argument,DEFV(CHAR,DTb0(identifiant_de_branches_paralleles)));
DEFV(Argument,DEFV(CHAR,DTb0(nom_commande_courante)));
DEFV(Argument,DEFV(CHAR,DTb0(fichier_courant_relatif)));
DEFV(Argument,DEFV(CHAR,DTb0(nom_fonction_courante)));
DEFV(Argument,DEFV(Int,ligne_courante));
                                        /* Identifications de l'appelant (introduites le 20170405152035)...                          */
DEFV(Argument,DEFV(CHAR,DTb0(type)));
                                        /* Type de {begin,End} : "image" ou "album" (introduit le 20170519154214)...                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(Int,INIT(coordonnee_maximale,XYZmax(coordonnee_minimale,dimension_de_la_coordonnee)));
                                        /* Calcul de la coordonnee maximale...                                                       */
     DEFV(Logical,INIT(utiliser_le_mode_back_effectif,SE13(utiliser_le_mode_back,VRAI,FAUX)));
                                        /* Introduit le 20210401171801 afin de pouvoir facilement inverser le mode lors de tests     */
                                        /* et ce en forcant 'VRAI' ou 'FAUX' a la place de 'utiliser_le_mode_back' ci-dessus...      */
     /*..............................................................................................................................*/
     Test(IFGE(dimension_de_la_coordonnee,pas_du_test_sur_la_coordonnee))
          Bblock
          Test(IFOU(IFET(IL_NE_FAUT_PAS(utiliser_le_mode_back_effectif),IFEQ(coordonnee,coordonnee_minimale))
                   ,IFET(IL_FAUT(utiliser_le_mode_back_effectif),IFEQ(coordonnee,coordonnee_maximale))
                    )
               )
                                        /* Le 20170403110611 le mode 'utiliser_le_mode_back' a ete implante dans ce 'Test(...)'.     */
               Bblock
               BASIQUE____Prme0("\n");
                                        /* Par prudence...                                                                           */
               BASIQUE____Prme9("[%s][%s=%s][%s]['%s']['%s']['%s(...)'#%d] Progression begin-end (%s) :\n"
                               ,mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss()
                               ,nom_sHOTE
                               ,nom_HOST
                               ,identifiant_de_branches_paralleles
                               ,nom_commande_courante
                               ,fichier_courant_relatif
                               ,nom_fonction_courante
                               ,ligne_courante
                               ,type
                                );
                                        /* Le 20170405131649, je note que l'on pourrait introduire ici quelque chose ressemblant a : */
                                        /*                                                                                           */
                                        /*                  BASIQUE____Prer0("...");                                                 */
                                        /*                                                                                           */
                                        /* afin d'afficher de tres nombreuses informations utiles (fonction appelante, numero de     */
                                        /* ligne), mais il faudrait que cela soit du type 'Prme'. En fait, il faudrait :             */
                                        /*                                                                                           */
                                        /*                  BASIQUE____Prme1("%s\n",chaine_argument);                                */
                                        /*                                                                                           */
                                        /* ou 'chaine_argument' serait un nouvel argument de 'Fprogression_des_begin_end(...)'       */
                                        /* et qui aurait ete genere au prealable via 'SPrin7(chaine,format,x1,x2,x3,x4,x5,x6,x7)'    */
                                        /* avec donc 7 arguments {x1,x2,x3,x4,x5,x6,x7} (voir la definition de 'BASIQUE____Prer'),   */
                                        /* mais malheureusement il faudrait allouer pour 'chaine' suffisamment d'octets (mais        */
                                        /* combien ?).                                                                               */
                                        /*                                                                                           */
                                        /* Ces identifications de l'appelant ont pu etre introduites le 20170405152035)...           */
                                        /*                                                                                           */
                                        /* L'edition de la date a ete introduite le 20170520052528...                                */

               EGAL(begin_end_____nombre_partiel_de_caracteres_edites_au_passage_precedent,NEGA(UN));
                                        /* La premiere fois, une valeur impossible (negative) lui est donnee afin de forcer une      */
                                        /* premiere execution...                                                                     */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(I3OU(IZEQ(REST(COOR(coordonnee,coordonnee_minimale),pas_du_test_sur_la_coordonnee))
                   ,IFEQ(coordonnee,coordonnee_minimale)
                   ,IFEQ(coordonnee,coordonnee_maximale)
                    )
               )
                                        /* Le test :                                                                                 */
                                        /*                                                                                           */
                                        /*                  IFEQ(coordonnee,coordonnee_maximale)                                     */
                                        /*                                                                                           */
                                        /* bien qu'incompatible logiquement avec la gestion "modulo" de la coordonnee (je veux dire  */
                                        /* par la qu'en general 'coordonnee_maximale' n'est pas atteint a partir de la coordonnee    */
                                        /* 'coordonnee_minimale' avec le pas 'pas_du_test_sur_la_coordonnee') a ete ajoute le        */
                                        /* 19961002164744 afin de terminer sur une ligne complete d'etoiles... Du coup, j'ai aussi   */
                                        /* ajoute le test :                                                                          */
                                        /*                                                                                           */
                                        /*                  IFEQ(coordonnee,coordonnee_minimale)                                     */
                                        /*                                                                                           */
                                        /* on ne sait jamais...                                                                      */
               Bblock
               DEFV(Int,INIT(nombre_de_caracteres,ZERO));
                                        /* Afin de compter le nombre de caracteres marques, et ainsi faire sans erreur le retour     */
                                        /* en debut de ligne...                                                                      */
               DEFV(Int,INIT(nombre_partiel_de_caracteres_a_marquer
                            ,COND(IFNE(coordonnee,coordonnee_maximale)
                                 ,DIVZ(COOR(coordonnee,coordonnee_minimale),pas_du_test_sur_la_coordonnee)
                                 ,NOMBRE_TOTAL_DE_CARACTERES_A_MARQUER
                                  )
                             )
                    );

               Test(IFNE(nombre_partiel_de_caracteres_a_marquer
                        ,begin_end_____nombre_partiel_de_caracteres_edites_au_passage_precedent
                         )
                    )
                                        /* Ce test a ete introduit le 20170529135714 pour eviter une double edition de la premiere   */
                                        /* ligne (en mode "back=FAUX") ou de la derniere (en mode "back=VRAI") lorsque la dimension  */
                                        /* de la coordonnee n'est pas divisible par le pas ('pas_du_test_sur_la_coordonnee').        */
                    Bblock
                    Test(EST_VRAI(LE_MODE_EST_INTERACTIF))
                                        /* Test introduit le 20170529142417...                                                       */
                         Bblock
                         Eblock
                    ATes
                         Bblock
                         BASIQUE____Prme2("%-*s"
                                         ,ENCOMBREMENT_DE__DATE_AAAAMMJJhhmmss
                                         ,mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss()
                                          );
                                        /* Le 20170525093332 la date au format 'AAAAMMJJhhmmss' a ete introduit en bout de ligne.    */
                                        /* Ceci est destine a voir les "non linearites" dans les temps de calcul : c'est par         */
                                        /* exemple le cas dans 'v $xci/ombrage.11$K' et 'v $xci/accumule.42$K' pour lesquels         */
                                        /* il est evident que deux "couches" differentes demanderont en general des temps de         */
                                        /* calcul differents, voire tres differents, ces temps etant evidemment tres lies a la       */
                                        /* structure du champ tridimensionnel a visualiser...                                        */
                                        /*                                                                                           */
                                        /* Le 20170529142417, cette edition a ete mise en debut de ligne afin de garantir une        */
                                        /* tabulation identique dans tous les cas...                                                 */
                         Eblock
                    ETes

                    Repe(nombre_partiel_de_caracteres_a_marquer)
                         Bblock
                         BASIQUE____Prme1(FORMAT_CHAR,TEST_DU_MODE_DE_PROGRESSION(K_ETOILE,CARACTERE_MARQUANT_CE_QUI_RESTE_A_FAIRE));
                                        /* Au debut de chaque ligne, on edite une suite d'etoiles montrant le travail deja           */
                                        /* effectue et dont le nombre est proportionnel a la coordonnee deja parcourue.              */
                         INCR(nombre_de_caracteres,I);
                                        /* Comptage des caracteres marques.                                                          */
                         Eblock
                    ERep

                    Repe(SOUS(NOMBRE_TOTAL_DE_CARACTERES_A_MARQUER,nombre_partiel_de_caracteres_a_marquer))
                         Bblock
                         BASIQUE____Prme1(FORMAT_CHAR,TEST_DU_MODE_DE_PROGRESSION(CARACTERE_MARQUANT_CE_QUI_RESTE_A_FAIRE,K_ETOILE));
                                        /* Au bout de chaque ligne, on edite une suite de points montrant le travail encore a        */
                                        /* effectuer, et dont le nombre est proportionnel a la coordonnee restant a parcourir.       */
                                        /*                                                                                           */
                                        /* Le 20170403110611, 'K_MOINS' a remplace 'K_POINT' car, en effet, 'K_POINT' n'est pas      */
                                        /* centre verticalement contrairement a 'K_MOINS'. Alors 'K_ETOILE' et 'K_MOINS' se          */
                                        /* superposent (verticalement en particulier) parfaitement...                                */
                                        /*                                                                                           */
                                        /* Le 20210401144342, 'CARACTERE_MARQUANT_CE_QUI_RESTE_A_FAIRE' a remplace 'K_MOINS'         */
                                        /* afin de faciliter l'evaluation du temps de calcul residuel...                             */
                         INCR(nombre_de_caracteres,I);
                                        /* Comptage des caracteres marques.                                                          */
                         Eblock
                    ERep

                    Test(EST_VRAI(LE_MODE_EST_INTERACTIF))
                                        /* Test introduit le 20170519142200...                                                       */
                         Bblock
                         Repe(nombre_de_caracteres)
                              Bblock
                              BASIQUE____Prme1(FORMAT_CHAR,K_BACKSPACE);
                                        /* Et enfin, on revient au debut de la ligne lorsqu'on est en mode interactif...             */
                              Eblock
                         ERep
                         Eblock
                    ATes
                         Bblock
                         BASIQUE____Prme1(FORMAT_CHAR,K_LF);
                                        /* Et enfin, on revient au debut de la ligne lorsqu'on n'est pas en mode interactif (cas     */
                                        /* de l'execution dans un '$Z' avec ou sans sortie dans un fichier...).                      */
                         Eblock
                    ETes

                    EGAL(begin_end_____nombre_partiel_de_caracteres_edites_au_passage_precedent
                        ,nombre_partiel_de_caracteres_a_marquer
                         );
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFOU(IFET(IL_NE_FAUT_PAS(utiliser_le_mode_back_effectif),IFEQ(coordonnee,coordonnee_maximale))
                   ,IFET(IL_FAUT(utiliser_le_mode_back_effectif),IFEQ(coordonnee,coordonnee_minimale))
                    )
               )
                                        /* Le 20170403110611 le mode 'utiliser_le_mode_back' a ete implante dans ce 'Test(...)'.     */
               Bblock
               BASIQUE____Prme0("\n");
                                        /* Par prudence...                                                                           */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

#undef    TEST_DU_MODE_DE_PROGRESSION
#undef    CARACTERE_MARQUANT_CE_QUI_RESTE_A_FAIRE
#undef    NOMBRE_TOTAL_DE_CARACTERES_A_MARQUER
#undef    ENCOMBREMENT_DE__DATE_AAAAMMJJhhmmss

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N    N E U T R E  :                                                                                          */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,Fneutre(argument)))
DEFV(Argument,DEFV(Int,argument));
                                        /* Argument que l'on renvoie tel quel...                                                     */
                                        /* NOTA : cette fonction sera par exemple utilisee pour les valeurs                          */
                                        /* taggee afin de bloquer la conversion systematique en flottant                             */
                                        /* effectuee par le compilateur C.                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(argument);
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T E U R S   D E S   F O N C T I O N S   C O R R E S P O N D A N T   A U X                                      */
/*        P R O C E D U R E S   D E   B A S E   D E   T Y P E   ' Int '   A   A R G U M E N T S   D E   T Y P E   ' Int '  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   GENERE__FonctionI_PROC_01(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Int,argument1));                                                                                                     \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1));                                                                                                        \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Int' a un seul argument 'Int'.                                        */

#define   GENERE__FonctionI_PROC_02(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Int,argument1));                                                                                                     \
DEFV(Argument,DEFV(Int,argument2));                                                                                                     \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1,argument2));                                                                                              \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Int' a deux arguments 'Int'.                                          */

#define   GENERE__FonctionI_PROC_03(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Int,argument1));                                                                                                     \
DEFV(Argument,DEFV(Int,argument2));                                                                                                     \
DEFV(Argument,DEFV(Int,argument3));                                                                                                     \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1,argument2,argument3));                                                                                    \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Int' a trois arguments 'Int'.                                         */

#define   GENERE__FonctionI_PROC_04(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Int,argument1));                                                                                                     \
DEFV(Argument,DEFV(Int,argument2));                                                                                                     \
DEFV(Argument,DEFV(Int,argument3));                                                                                                     \
DEFV(Argument,DEFV(Int,argument4));                                                                                                     \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1,argument2,argument3,argument4));                                                                          \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Int' a quatre arguments 'Int'.                                        */

#define   GENERE__FonctionI_PROC_05(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Int,arg1));                                                                                                          \
DEFV(Argument,DEFV(Int,arg2));                                                                                                          \
DEFV(Argument,DEFV(Int,arg3));                                                                                                          \
DEFV(Argument,DEFV(Int,arg4));                                                                                                          \
DEFV(Argument,DEFV(Int,arg5));                                                                                                          \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(arg1,arg2,arg3,arg4,arg5));                                                                                         \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Int' a cinq arguments 'Int'.                                          */

#define   GENERE__FonctionI_PROC_06(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Int,arg1));                                                                                                          \
DEFV(Argument,DEFV(Int,arg2));                                                                                                          \
DEFV(Argument,DEFV(Int,arg3));                                                                                                          \
DEFV(Argument,DEFV(Int,arg4));                                                                                                          \
DEFV(Argument,DEFV(Int,arg5));                                                                                                          \
DEFV(Argument,DEFV(Int,arg6));                                                                                                          \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(arg1,arg2,arg3,arg4,arg5,arg6));                                                                                    \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Int' a six arguments 'Int'.                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T E U R S   D E S   F O N C T I O N S   C O R R E S P O N D A N T   A U X                                      */
/*        P R O C E D U R E S   D E   B A S E   D E   T Y P E   ' Float '   A   A R G U M E N T S   D E   T Y P E   ' Float '  :     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   GENERE__FonctionF_PROC_01(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionF,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,argument1));                                                                                                   \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1));                                                                                                        \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Float' a un seul argument 'Float'.                                    */

#define   GENERE__FonctionF_PROC_02(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionF,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,argument1));                                                                                                   \
DEFV(Argument,DEFV(Float,argument2));                                                                                                   \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1,argument2));                                                                                              \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Float' a deux arguments 'Float'.                                      */

#define   GENERE__FonctionF_PROC_02x(nom_et_arguments_de_la_fonction,procedure,procedure_etendue)                                       \
DEFV(FonctionF,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,argument1));                                                                                                   \
DEFV(Argument,DEFV(Float,argument2));                                                                                                   \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(COND(IL_NE_FAUT_PAS(si_le_GooF_est_activable_utiliser_l_arithmetique_etendue_au_lieu_de_l_arithmetique_de_base)               \
              ,procedure(argument1,argument2)                                                                                           \
              ,procedure_etendue(argument1,argument2)                                                                                   \
               )                                                                                                                        \
          );                                                                                                                            \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Float' a deux arguments 'Float' avec possibilite d'eXtension (ceci    */
                                        /* fut introduit le 20061018104520).                                                         */

#define   GENERE__FonctionF_PROC_03(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionF,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,argument1));                                                                                                   \
DEFV(Argument,DEFV(Float,argument2));                                                                                                   \
DEFV(Argument,DEFV(Float,argument3));                                                                                                   \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1,argument2,argument3));                                                                                    \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Float' a trois arguments 'Float'.                                     */

#define   GENERE__FonctionF_PROC_04(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionF,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,argument1));                                                                                                   \
DEFV(Argument,DEFV(Float,argument2));                                                                                                   \
DEFV(Argument,DEFV(Float,argument3));                                                                                                   \
DEFV(Argument,DEFV(Float,argument4));                                                                                                   \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1,argument2,argument3,argument4));                                                                          \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Float' a quatre arguments 'Float'.                                    */

#define   GENERE__FonctionF_PROC_05(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,arg1));                                                                                                        \
DEFV(Argument,DEFV(Float,arg2));                                                                                                        \
DEFV(Argument,DEFV(Float,arg3));                                                                                                        \
DEFV(Argument,DEFV(Float,arg4));                                                                                                        \
DEFV(Argument,DEFV(Float,arg5));                                                                                                        \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(arg1,arg2,arg3,arg4,arg5));                                                                                         \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Float' a cinq arguments 'Float'.                                      */

#define   GENERE__FonctionF_PROC_06(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,arg1));                                                                                                        \
DEFV(Argument,DEFV(Float,arg2));                                                                                                        \
DEFV(Argument,DEFV(Float,arg3));                                                                                                        \
DEFV(Argument,DEFV(Float,arg4));                                                                                                        \
DEFV(Argument,DEFV(Float,arg5));                                                                                                        \
DEFV(Argument,DEFV(Float,arg6));                                                                                                        \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(arg1,arg2,arg3,arg4,arg5,arg6));                                                                                    \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Float' a six arguments 'Float'.                                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T E U R S   D E S   F O N C T I O N S   C O R R E S P O N D A N T   A U X                                      */
/*        P R O C E D U R E S   D E   B A S E   D E   T Y P E   ' Logical '   A   A R G U M E N T S   D E   T Y P E   ' Float '  :   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   GENERE__FonctionL_PROC_01(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionL,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,argument1));                                                                                                   \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1));                                                                                                        \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Logical' a un seul argument 'Float'.                                  */

#define   GENERE__FonctionL_PROC_02(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionL,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,argument1));                                                                                                   \
DEFV(Argument,DEFV(Float,argument2));                                                                                                   \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1,argument2));                                                                                              \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Logical' a deux arguments 'Float'.                                    */

#define   GENERE__FonctionL_PROC_03(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionL,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,argument1));                                                                                                   \
DEFV(Argument,DEFV(Float,argument2));                                                                                                   \
DEFV(Argument,DEFV(Float,argument3));                                                                                                   \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1,argument2,argument3));                                                                                    \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Logical' a trois arguments 'Float'.                                   */

#define   GENERE__FonctionL_PROC_04(nom_et_arguments_de_la_fonction,procedure)                                                          \
DEFV(FonctionL,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(Float,argument1));                                                                                                   \
DEFV(Argument,DEFV(Float,argument2));                                                                                                   \
DEFV(Argument,DEFV(Float,argument3));                                                                                                   \
DEFV(Argument,DEFV(Float,argument4));                                                                                                   \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     /*..............................................................................................................................*/ \
     RETU(procedure(argument1,argument2,argument3,argument4));                                                                          \
     Eblock                                                                                                                             \
                                        /* Cas des procedures 'Logical' a quatre arguments 'Float'.                                  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D E   L A   V A L E U R   A B S O L U E   D ' U N   N O M B R E  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_01(FiABSO(argument1),ABSO))                                           /* Common,DEFV(Fonction,) : */
                                        /* Fonction introduite le 20111230171233 par "symetrie" avec 'FfABSO(...)'...                */

EFonctionI


BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_01(FfABSO(argument1),ABSO))                                           /* Common,DEFV(Fonction,) : */
                                        /* Fonction introduite le 20111230171233 pour 'v $ximcf/conformes$FON FfABSO' afin d'en      */
                                        /* alleger la compilation...                                                                 */

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E S T S   D I V E R S   D E   N O M B R E S   F L O T T A N T S  :                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota important :                                                                                                           */
/*                                                                                                                                   */
/*                    Ceci a ete introduit le 20040303111309 dans le                                                                 */
/*                  but de lutter efficacement, s'il existe, contre                                                                  */
/*                  'BUG_SYSTEME_APC_GCC_ExcessPrecisionProblem_01'                                                                  */
/*                  le passage par la pile (et donc la mise systematique                                                             */
/*                  en 64 bits des nombres) permettant seul de garantir                                                              */
/*                  les tests des nombres 'Float'. Ainsi, si l'on veut                                                               */
/*                  etre vraiment sur que 'a > b', on utilisera non pas :                                                            */
/*                                                                                                                                   */
/*                                      IFGT(a,b)                                                                                    */
/*                                                                                                                                   */
/*                  mais :                                                                                                           */
/*                                                                                                                                   */
/*                                      FfIFGT(a,b)                                                                                  */
/*                                                                                                                                   */
/*                  dans les situations delicates. Cela a ete introduit                                                              */
/*                  dans 'v $xiii/tri_image$FON sfIFGT'. De plus, dans la                                                            */
/*                  mesure ou ces fonctions peuvent avoir leur utilite                                                               */
/*                  ailleurs, leur definition n'est pas conditionnelle                                                               */
/*                  (via 'BUG_SYSTEME_APC_GCC_ExcessPrecisionProblem_01')...                                                         */
/*                  Cela fut aussi utilise dans 'v $xiii/aleat.2$vv$FON FfIFGT'                                                      */
/*                  pour resoudre un probleme du 20080924174528...                                                                   */
/*                                                                                                                                   */
/*                    Le 20040308095054, j'ai decide d'etendre cela aux                                                              */
/*                  operations arithmetiques en plus des tests...                                                                    */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_01(FfIZLE(argument1),IZLE))                                           /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_01(FfIZLT(argument1),IZLT))                                           /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_01(FfIZEQ(argument1),IZEQ))                                           /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_01(FfIZNE(argument1),IZNE))                                           /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_01(FfIZGE(argument1),IZGE))                                           /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_01(FfIZGT(argument1),IZGT))                                           /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_02(FfIFLE(argument1,argument2),IFLE))                                 /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_02(FfIFLT(argument1,argument2),IFLT))                                 /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_02(FfIFEQ(argument1,argument2),IFEQ))                                 /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_02(FfIFNE(argument1,argument2),IFNE))                                 /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_02(FfIFGE(argument1,argument2),IFGE))                                 /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_02(FfIFGT(argument1,argument2),IFGT))                                 /* Common,DEFV(Fonction,) : */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_02(FfIFOU(argument1,argument2),IFOU))                                 /* Common,DEFV(Fonction,) : */
                                        /* Introduit le 20130627104220 pour 'v $xcg/CompteBits$vv$K FfIFOU'...                       */

EFonctionL


BFonctionL

DEFV(Common,GENERE__FonctionL_PROC_02(FfIFET(argument1,argument2),IFET))                                 /* Common,DEFV(Fonction,) : */
                                        /* Introduit le 20130627104220 par symetrie avec 'FfIFOU(...)'.                              */

EFonctionL

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D U   P R O D U I T   G E N E R A L I S E   " A   L A   H O R N E R "                                        */
/*        D E   D E U X   N O M B R E S   F L O T T A N T S  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_44,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_43,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_42,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_41,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_40,FZERO)));
                                        /* Definition du premier polynome en 'X' (puissance la plus elevee de 'Y').                  */
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_34,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_33,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_32,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_31,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_30,FZERO)));
                                        /* Definition du second polynome en 'X'.                                                     */
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_24,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_23,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_22,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_21,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_20,FZERO)));
                                        /* Definition du troisieme polynome en 'X'.                                                  */
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_14,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_13,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_12,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_11,FU)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_10,FZERO)));
                                        /* Definition du quatrieme polynome en 'X'.                                                  */
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_04,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_03,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_02,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_01,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfHORNER_2_04_____coefficient_00,FZERO)));
                                        /* Definition du dernier polynome en 'X' (puissance la plus faible de 'Y').                  */

DEFV(Common,DEFV(FonctionF,FfHORNER_2_04(argument1,argument2)))
                                        /* Fonction introduite le 20181123095157...                                                  */
DEFV(Argument,DEFV(Float,argument1));
DEFV(Argument,DEFV(Float,argument2));
                                        /* Arguments flottants du produit generalise "a la Horner"...                                */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(HORNER_2_04(argument1,argument2

                     ,FfHORNER_2_04_____coefficient_44
                     ,FfHORNER_2_04_____coefficient_43
                     ,FfHORNER_2_04_____coefficient_42
                     ,FfHORNER_2_04_____coefficient_41
                     ,FfHORNER_2_04_____coefficient_40

                     ,FfHORNER_2_04_____coefficient_34
                     ,FfHORNER_2_04_____coefficient_33
                     ,FfHORNER_2_04_____coefficient_32
                     ,FfHORNER_2_04_____coefficient_31
                     ,FfHORNER_2_04_____coefficient_30

                     ,FfHORNER_2_04_____coefficient_24
                     ,FfHORNER_2_04_____coefficient_23
                     ,FfHORNER_2_04_____coefficient_22
                     ,FfHORNER_2_04_____coefficient_21
                     ,FfHORNER_2_04_____coefficient_20

                     ,FfHORNER_2_04_____coefficient_14
                     ,FfHORNER_2_04_____coefficient_13
                     ,FfHORNER_2_04_____coefficient_12
                     ,FfHORNER_2_04_____coefficient_11
                     ,FfHORNER_2_04_____coefficient_10

                     ,FfHORNER_2_04_____coefficient_04
                     ,FfHORNER_2_04_____coefficient_03
                     ,FfHORNER_2_04_____coefficient_02
                     ,FfHORNER_2_04_____coefficient_01
                     ,FfHORNER_2_04_____coefficient_00
                      )
          );
                                        /* Ce produit est defini par ('v $xiii/tri_image$FON 20181119120731') :                      */
                                        /*                                                                                           */
                                        /*        HORNER_2_04(x,y,...) = (((((((P4[x]*y)+P3[x])*y)+P2[x])*y)+P1[x])*y)+P0[x]         */
                                        /*                                                                                           */
                                        /* avec :                                                                                    */
                                        /*                                                                                           */
                                        /*                  P4[x] = (((((((a44*x+a43)*x)+a42)*x)+a41)*x)+a40)                        */
                                        /*                  P3[x] = (((((((a34*x+a33)*x)+a32)*x)+a31)*x)+a30)                        */
                                        /*                  P2[x] = (((((((a24*x+a23)*x)+a22)*x)+a21)*x)+a20)                        */
                                        /*                  P1[x] = (((((((a14*x+a13)*x)+a12)*x)+a11)*x)+a10)                        */
                                        /*                  P0[x] = (((((((a04*x+a03)*x)+a02)*x)+a01)*x)+a00)                        */
                                        /*                                                                                           */
                                        /* Il est initialise ici par defaut sur le produit "x*y" de base...                          */
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P E R A T I O N S   A R I T H M E T I Q U E S   E T E N D U E S   E N T R E   N O M B R E S   F L O T T A N T S  :       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(remplacer_l_arithmetique__ADD2_MUL2__par_l_arithmetique__MIN2_ADD2,FAUX)));
DEFV(Common,DEFV(Logical,ZINT(remplacer_l_arithmetique__ADD2_MUL2__par_l_arithmetique__MAX2_ADD2,FAUX)));
                                        /* Introduit le 20180818111212, ces deux arithmetiques ayant de l'interet (voir par exemple  */
                                        /* 'v $xil/defi_K2$vv$DEF 20061102164207' a ce sujet...).                                    */

DEFV(Common,DEFV(Logical,ZINT(forcer_la_reinitialisation_des_fonctions_d_arithmetique_etendue,FAUX)));
                                        /* Pour forcer la reinitialisation des fonctions d'arithmetique etendue (voir a ce propos    */
                                        /* 'v $xil/defi_c1$vv$DEF RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES').   */
                                        /* Ceci fut introduit le 20080107091017.                                                     */
                                        /*                                                                                           */
                                        /* ATTENTION : cette definition ne peut etre faite a l'aide de 'SINT(...)' car, en effet,    */
                                        /* sinon, cet indicateur serait remis a 'FAUX' a chaque reinitialisation qui ne pourrait     */
                                        /* donc pas se poursuivre normalement...                                                     */

DEFV(Common,DEFV(Logical,ZINT(utiliser_evidemment_la_precision_Float_avec_l_arithmetique_etendue,VRAI)));
                                        /* Introduit le 20090331084235 afin de pouvoir modifier la precision des fonctions du type   */
                                        /* 'FfxADD2(...)' globalement (en rapelant que cela est faisable individuellement, fonction  */
                                        /* par fonction...).                                                                         */

DEFV(Common,DEFV(Logical,ZINT(faire_des_calculs_entiers_brutaux_modulo_avec_l_arithmetique_etendue,FAUX)));
DEFV(Common,DEFV(Int,ZINT(raison_des_calculs_entiers_brutaux_modulo_avec_l_arithmetique_etendue
                         ,RAISON_DES_CALCULS_ENTIERS_BRUTAUX_MODULO_AVEC_L_ARITHMETIQUE_ETENDUE
                          )
                 )
     );
                                        /* Introduit le 20111003104313 afin de pouvoir faire "brutalement" (ce qui signifie que      */
                                        /* l'on passe temporairement en 'Int') des calculs modulo avec une certaine raison...        */

                                        /* Le 20101111094153 {_FZERO,_FU,__FZERO,__FU,___FZERO,___FU} furent deplaces dans           */
                                        /* 'v $xig/fonct$vv$DEF 20101111094153' afin de pouvoir etre utilisees partout...            */

BFonctionF

DEFV(Common,DEFV(Logical,SINT(FfxADD2_____utiliser_evidemment_la_precision_Float,VRAI)));

DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_ADD2,___FU)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_SOUS,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_SOUSnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MUL2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_DIVZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_DIVZnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MIN2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MAX2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MINMAX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MAXMIN,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_IMINMAX,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_IMAXMIN,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MOYE,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MOYZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MOYZSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MOYQ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MOYQSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MOYH,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_SPUIX,__FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_SPUIXnc,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_SE12,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_SE22,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_ATAN,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_ATANnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxADD2_____ponderation_de_MULH24,_FZERO)));

DEFV(Common,DEFV(Positive,INIT(FfxADD2_____compteur_de_reference,ZERO)));

DEFV(Common,GENERE__FonctionF_UNI2_02(FfxADD2(argument1,argument2),FfxADD2_____))                        /* Common,DEFV(Fonction,) : */
                                        /* La fonction 'ADD2(...)' etendue ("eXtended") a ete introduite le 20050303115324 et        */
                                        /* le 20061024103437 sous cette forme...                                                     */
                                        /*                                                                                           */
                                        /* Par defaut :                                                                              */
                                        /*                                                                                           */
                                        /*                  FfxADD2(a,b) = UNI2(a,b,1,0,0,0,0,0,0,0,0,0,0,0,0) = ADD2(a,b)           */
                                        /*                                                                                           */
                                        /* Le 20061023100636 furent introduites 'FfxADD2_____ponderation_de_MINMAX' et               */
                                        /* 'FfxADD2_____ponderation_de_MAXMIN'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20061025133958 furent introduites 'FfxADD2_____ponderation_de_MOYZSI' et               */
                                        /* 'FfxADD2_____ponderation_de_MOYQSI'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20080102131914 furent introduites 'FfxADD2_____ponderation_de_IMINMAX' et              */
                                        /* 'FfxADD2_____ponderation_de_IMAXMIN'...                                                   */
                                        /*                                                                                           */
                                        /* Le 20080104154645 fut introduite 'FfxADD2_____ponderation_de_SPUIX'...                    */
                                        /*                                                                                           */
                                        /* Le 20090330113720 fut introduit 'FfxADD2_____utiliser_evidemment_la_precision_Float'...   */
                                        /*                                                                                           */
                                        /* Le 20130514121229 fut introduit 'FfxADD2_____compteur_de_reference'...                    */
                                        /*                                                                                           */
                                        /* Le 20180821094620 furent introduites 'FfxADD2_____ponderation_de_SE12' et                 */
                                        /* 'FfxADD2_____ponderation_de_SE22'...                                                      */
                                        /*                                                                                           */
                                        /* Le 20180823094838 fut introduite 'FfxADD2_____ponderation_de_MOYH'...                     */
                                        /*                                                                                           */
                                        /* Le 20181009170359 fut introduite 'FfxADD2_____ponderation_de_ATAN'...                     */
                                        /*                                                                                           */
                                        /* Le 20181203160941 fut introduite 'FfxADD2_____ponderation_de_MULH24'...                   */
                                        /*                                                                                           */
                                        /* Le 20201004113034 furent introduites les ponderations "Non Commutatives"s...              */

EFonctionF


BFonctionF

DEFV(Common,DEFV(Logical,SINT(FfxSOUS_____utiliser_evidemment_la_precision_Float,VRAI)));

DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_ADD2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_SOUS,___FU)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_SOUSnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MUL2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_DIVZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_DIVZnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MIN2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MAX2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MINMAX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MAXMIN,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_IMINMAX,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_IMAXMIN,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MOYE,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MOYZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MOYZSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MOYQ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MOYQSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MOYH,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_SPUIX,__FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_SPUIXnc,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_SE12,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_SE22,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_ATAN,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_ATANnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxSOUS_____ponderation_de_MULH24,_FZERO)));

DEFV(Common,DEFV(Positive,INIT(FfxSOUS_____compteur_de_reference,ZERO)));

DEFV(Common,GENERE__FonctionF_UNI2_02(FfxSOUS(argument1,argument2),FfxSOUS_____))                        /* Common,DEFV(Fonction,) : */
                                        /* La fonction 'SOUS(...)' etendue ("eXtended") a ete introduite le 20050303115324 et        */
                                        /* le 20061024103437 sous cette forme...                                                     */
                                        /*                                                                                           */
                                        /* Par defaut :                                                                              */
                                        /*                                                                                           */
                                        /*                  FfxSOUS(a,b) = UNI2(a,b,0,1,0,0,0,0,0,0,0,0,0,0,0) = SOUS(a,b)           */
                                        /*                                                                                           */
                                        /* Le 20061023100636 furent introduites 'FfxSOUS_____ponderation_de_MINMAX' et               */
                                        /* 'FfxSOUS_____ponderation_de_MAXMIN'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20061025133958 furent introduites 'FfxSOUS_____ponderation_de_MOYZSI' et               */
                                        /* 'FfxSOUS_____ponderation_de_MOYQSI'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20080102131914 furent introduites 'FfxSOUS_____ponderation_de_IMINMAX' et              */
                                        /* 'FfxSOUS_____ponderation_de_IMAXMIN'...                                                   */
                                        /*                                                                                           */
                                        /* Le 20080104154645 fut introduite 'FfxSOUS_____ponderation_de_SPUIX'...                    */
                                        /*                                                                                           */
                                        /* Le 20090330113720 fut introduit 'FfxSOUS_____utiliser_evidemment_la_precision_Float'...   */
                                        /*                                                                                           */
                                        /* Le 20130514121229 fut introduit 'FfxSOUS_____compteur_de_reference'...                    */
                                        /* Le 20180821094620 furent introduites 'FfxSOUS_____ponderation_de_SE12' et                 */
                                        /* 'FfxSOUS_____ponderation_de_SE22'...                                                      */
                                        /*                                                                                           */
                                        /* Le 20180823094838 fut introduite 'FfxSOUS_____ponderation_de_MOYH'...                     */
                                        /*                                                                                           */
                                        /* Le 20181009170359 fut introduite 'FfxSOUS_____ponderation_de_ATAN'...                     */
                                        /*                                                                                           */
                                        /* Le 20181203160941 fut introduite 'FfxSOUS_____ponderation_de_MULH24'...                   */
                                        /*                                                                                           */
                                        /* Le 20201004113034 furent introduites les ponderations "Non Commutatives"s...              */

EFonctionF


BFonctionF

DEFV(Common,DEFV(Logical,SINT(FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS,FAUX)));
                                        /* Cette option fut introduite le 20061030152833...                                          */

DEFV(Common,DEFV(FonctionF,FfxxSOUS(argument1,argument2)))
                                        /* Fonction introduite le 20061030152833 qui renvoie au choix :                              */
                                        /*                                                                                           */
                                        /*                  a - b                                                                    */
                                        /*                                                                                           */
                                        /* ou :                                                                                      */
                                        /*                                                                                           */
                                        /*                  a + (-b)                                                                 */
                                        /*                                                                                           */
                                        /* ce dernier cas permettant de controler la soustraction etendue via l'addition etendue.    */
DEFV(Argument,DEFV(Float,argument1));
DEFV(Argument,DEFV(Float,argument2));
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(COND(IL_NE_FAUT_PAS(FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS)
              ,FfxSOUS(argument1,NEUT(argument2))
              ,FfxADD2(argument1,NEGA(argument2))
               )
          );
     Eblock

EFonctionF


BFonctionF

DEFV(Common,DEFV(Logical,SINT(FfxMUL2_____utiliser_evidemment_la_precision_Float,VRAI)));

DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_ADD2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_SOUS,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_SOUSnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MUL2,___FU)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_DIVZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_DIVZnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MIN2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MAX2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MINMAX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MAXMIN,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_IMINMAX,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_IMAXMIN,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MOYE,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MOYZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MOYZSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MOYQ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MOYQSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MOYH,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_SPUIX,__FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_SPUIXnc,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_SE12,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_SE22,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_ATAN,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_ATANnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMUL2_____ponderation_de_MULH24,_FZERO)));

DEFV(Common,DEFV(Positive,INIT(FfxMUL2_____compteur_de_reference,ZERO)));

DEFV(Common,GENERE__FonctionF_UNI2_02(FfxMUL2(argument1,argument2),FfxMUL2_____))                        /* Common,DEFV(Fonction,) : */
                                        /* La fonction 'MUL2(...)' etendue ("eXtended") a ete introduite le 20050303115324 et        */
                                        /* le 20061024103437 sous cette forme...                                                     */
                                        /*                                                                                           */
                                        /* Par defaut :                                                                              */
                                        /*                                                                                           */
                                        /*                  FfxMUL2(a,b) = UNI2(a,b,0,0,1,0,0,0,0,0,0,0,0,0,0) = MUL2(a,b)           */
                                        /*                                                                                           */
                                        /* Le 20061023100636 furent introduites 'FfxMUL2_____ponderation_de_MINMAX' et               */
                                        /* 'FfxMUL2_____ponderation_de_MAXMIN'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20061025133958 furent introduites 'FfxMUL2_____ponderation_de_MOYZSI' et               */
                                        /* 'FfxMUL2_____ponderation_de_MOYQSI'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20080102131914 furent introduites 'FfxMUL2_____ponderation_de_IMINMAX' et              */
                                        /* 'FfxMUL2_____ponderation_de_IMAXMIN'...                                                   */
                                        /*                                                                                           */
                                        /* Le 20080104154645 fut introduite 'FfxMUL2_____ponderation_de_SPUIX'...                    */
                                        /*                                                                                           */
                                        /* Le 20090330113720 fut introduit 'FfxMUL2_____utiliser_evidemment_la_precision_Float'...   */
                                        /*                                                                                           */
                                        /* Le 20130514121229 fut introduit 'FfxMUL2_____compteur_de_reference'...                    */
                                        /* Le 20180821094620 furent introduites 'FfxMUL2_____ponderation_de_SE12' et                 */
                                        /* 'FfxMUL2_____ponderation_de_SE22'...                                                      */
                                        /*                                                                                           */
                                        /* Le 20180823094838 fut introduite 'FfxMUL2_____ponderation_de_MOYH'...                     */
                                        /*                                                                                           */
                                        /* Le 20181009170359 fut introduite 'FfxMUL2_____ponderation_de_ATAN'...                     */
                                        /*                                                                                           */
                                        /* Le 20181203160941 fut introduite 'FfxMUL2_____ponderation_de_MULH24'...                   */
                                        /*                                                                                           */
                                        /* Le 20201004113034 furent introduites les ponderations "Non Commutatives"s...              */

EFonctionF


BFonctionF

DEFV(Common,DEFV(Logical,SINT(FfxDIVZ_____utiliser_evidemment_la_precision_Float,VRAI)));

DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_ADD2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_SOUS,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_SOUSnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MUL2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_DIVZ,___FU)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_DIVZnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MIN2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MAX2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MINMAX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MAXMIN,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_IMINMAX,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_IMAXMIN,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MOYE,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MOYZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MOYZSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MOYQ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MOYQSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MOYH,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_SPUIX,__FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_SPUIXnc,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_SE12,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_SE22,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_ATAN,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_ATANnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxDIVZ_____ponderation_de_MULH24,_FZERO)));

DEFV(Common,DEFV(Positive,INIT(FfxDIVZ_____compteur_de_reference,ZERO)));

DEFV(Common,GENERE__FonctionF_UNI2_02(FfxDIVZ(argument1,argument2),FfxDIVZ_____))                        /* Common,DEFV(Fonction,) : */
                                        /* La fonction 'DIVZ(...)' etendue ("eXtended") a ete introduite le 20050303115324 et        */
                                        /* le 20061024103437 sous cette forme...                                                     */
                                        /*                                                                                           */
                                        /* Par defaut :                                                                              */
                                        /*                                                                                           */
                                        /*                  FfxDIVZ(a,b) = UNI2(a,b,0,0,0,1,0,0,0,0,0,0,0,0,0) = DIVZ(a,b)           */
                                        /*                                                                                           */
                                        /* Le 20061023100636 furent introduites 'FfxDIVZ_____ponderation_de_MINMAX' et               */
                                        /* 'FfxDIVZ_____ponderation_de_MAXMIN'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20061025133958 furent introduites 'FfxDIVZ_____ponderation_de_MOYZSI' et               */
                                        /* 'FfxDIVZ_____ponderation_de_MOYQSI'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20080102131914 furent introduites 'FfxDIVZ_____ponderation_de_IMINMAX' et              */
                                        /* 'FfxDIVZ_____ponderation_de_IMAXMIN'...                                                   */
                                        /*                                                                                           */
                                        /* Le 20080104154645 fut introduite 'FfxDIVZ_____ponderation_de_SPUIX'...                    */
                                        /*                                                                                           */
                                        /* Le 20090330113720 fut introduit 'FfxDIVZ_____utiliser_evidemment_la_precision_Float'...   */
                                        /*                                                                                           */
                                        /* Le 20130514121229 fut introduit 'FfxDIVZ_____compteur_de_reference'...                    */
                                        /* Le 20180821094620 furent introduites 'FfxDIVZ_____ponderation_de_SE12' et                 */
                                        /* 'FfxDIVZ_____ponderation_de_SE22'...                                                      */
                                        /*                                                                                           */
                                        /* Le 20180823094838 fut introduite 'FfxDIVZ_____ponderation_de_MOYH'...                     */
                                        /*                                                                                           */
                                        /* Le 20181009170359 fut introduite 'FfxDIVZ_____ponderation_de_ATAN'...                     */
                                        /*                                                                                           */
                                        /* Le 20181203160941 fut introduite 'FfxDIVZ_____ponderation_de_MULH24'...                   */
                                        /*                                                                                           */
                                        /* Le 20201004113034 furent introduites les ponderations "Non Commutatives"s...              */

EFonctionF


BFonctionF

DEFV(Common,DEFV(Logical,SINT(FfxxDIVZ_____utiliser_FfxMUL2_a_la_place_de_FfxDIVZ,FAUX)));
                                        /* Cette option fut introduite le 20061030152833...                                          */

DEFV(Common,DEFV(FonctionF,FfxxDIVZ(argument1,argument2)))
                                        /* Fonction introduite le 20061030152833 qui renvoie au choix :                              */
                                        /*                                                                                           */
                                        /*                  a / b                                                                    */
                                        /*                                                                                           */
                                        /* ou :                                                                                      */
                                        /*                                                                                           */
                                        /*                  a * (1/b)                                                                */
                                        /*                                                                                           */
                                        /* ce dernier cas permettant de controler la division etendue via la multiplication etendue. */
DEFV(Argument,DEFV(Float,argument1));
DEFV(Argument,DEFV(Float,argument2));
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(COND(IL_NE_FAUT_PAS(FfxxDIVZ_____utiliser_FfxMUL2_a_la_place_de_FfxDIVZ)
              ,FfxDIVZ(argument1,NEUT(argument2))
              ,FfxMUL2(argument1,INVZ(argument2))
               )
          );
     Eblock

EFonctionF


BFonctionF

DEFV(Common,DEFV(Logical,SINT(FfxMIN2_____utiliser_evidemment_la_precision_Float,VRAI)));

DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_ADD2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_SOUS,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_SOUSnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MUL2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_DIVZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_DIVZnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MIN2,___FU)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MAX2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MINMAX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MAXMIN,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_IMINMAX,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_IMAXMIN,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MOYE,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MOYZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MOYZSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MOYQ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MOYQSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MOYH,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_SPUIX,__FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_SPUIXnc,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_SE12,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_SE22,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_ATAN,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_ATANnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMIN2_____ponderation_de_MULH24,_FZERO)));

DEFV(Common,DEFV(Positive,INIT(FfxMIN2_____compteur_de_reference,ZERO)));

DEFV(Common,GENERE__FonctionF_UNI2_02(FfxMIN2(argument1,argument2),FfxMIN2_____))                        /* Common,DEFV(Fonction,) : */
                                        /* La fonction 'MIN2(...)' etendue ("eXtended") a ete introduite le 20050303115324 et        */
                                        /* le 20061024103437 sous cette forme...                                                     */
                                        /*                                                                                           */
                                        /* Par defaut :                                                                              */
                                        /*                                                                                           */
                                        /*                  FfxMIN2(a,b) = UNI2(a,b,0,0,0,0,1,0,0,0,0,0,0,0,0) = MIN2(a,b)           */
                                        /*                                                                                           */
                                        /* Le 20061023100636 furent introduites 'FfxMIN2_____ponderation_de_MINMAX' et               */
                                        /* 'FfxMIN2_____ponderation_de_MAXMIN'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20061025133958 furent introduites 'FfxMIN2_____ponderation_de_MOYZSI' et               */
                                        /* 'FfxMIN2_____ponderation_de_MOYQSI'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20080102131914 furent introduites 'FfxMIN2_____ponderation_de_IMINMAX' et              */
                                        /* 'FfxMIN2_____ponderation_de_IMAXMIN'...                                                   */
                                        /*                                                                                           */
                                        /* Le 20080104154645 fut introduite 'FfxMIN2_____ponderation_de_SPUIX'...                    */
                                        /*                                                                                           */
                                        /* Le 20090330113720 fut introduit 'FfxMIN2_____utiliser_evidemment_la_precision_Float'...   */
                                        /*                                                                                           */
                                        /* Le 20130514121229 fut introduit 'FfxMIN2_____compteur_de_reference'...                    */
                                        /* Le 20180821094620 furent introduites 'FfxMIN2_____ponderation_de_SE12' et                 */
                                        /* 'FfxMIN2_____ponderation_de_SE22'...                                                      */
                                        /*                                                                                           */
                                        /* Le 20180823094838 fut introduite 'FfxMIN2_____ponderation_de_MOYH'...                     */
                                        /*                                                                                           */
                                        /* Le 20181009170359 fut introduite 'FfxMIN2_____ponderation_de_ATAN'...                     */
                                        /*                                                                                           */
                                        /* Le 20181203160941 fut introduite 'FfxMIN2_____ponderation_de_MULH24'...                   */
                                        /*                                                                                           */
                                        /* Le 20201004113034 furent introduites les ponderations "Non Commutatives"s...              */

EFonctionF


BFonctionF

DEFV(Common,DEFV(Logical,SINT(FfxMAX2_____utiliser_evidemment_la_precision_Float,VRAI)));

DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_ADD2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_SOUS,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_SOUSnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MUL2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_DIVZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_DIVZnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MIN2,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MAX2,___FU)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MINMAX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MAXMIN,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_IMINMAX,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_IMAXMIN,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MOYE,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MOYZ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MOYZSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MOYQ,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MOYQSI,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MOYH,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_SPUIX,__FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_SPUIXnc,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_SE12,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_SE22,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_ATAN,___FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_ATANnc,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfxMAX2_____ponderation_de_MULH24,_FZERO)));

DEFV(Common,DEFV(Positive,INIT(FfxMAX2_____compteur_de_reference,ZERO)));

DEFV(Common,GENERE__FonctionF_UNI2_02(FfxMAX2(argument1,argument2),FfxMAX2_____))                        /* Common,DEFV(Fonction,) : */
                                        /* La fonction 'MAX2(...)' etendue ("eXtended") a ete introduite le 20050303115324 et        */
                                        /* le 20061024103437 sous cette forme...                                                     */
                                        /*                                                                                           */
                                        /* Par defaut :                                                                              */
                                        /*                                                                                           */
                                        /*                  FfxMAX2(a,b) = UNI2(a,b,0,0,0,0,0,1,0,0,0,0,0,0,0) = MAX2(a,b)           */
                                        /*                                                                                           */
                                        /* Le 20061023100636 furent introduites 'FfxMAX2_____ponderation_de_MINMAX' et               */
                                        /* 'FfxMAX2_____ponderation_de_MAXMIN'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20061025133958 furent introduites 'FfxMAX2_____ponderation_de_MOYZSI' et               */
                                        /* 'FfxMAX2_____ponderation_de_MOYQSI'...                                                    */
                                        /*                                                                                           */
                                        /* Le 20080102131914 furent introduites 'FfxMAX2_____ponderation_de_IMINMAX' et              */
                                        /* 'FfxMAX2_____ponderation_de_IMAXMIN'...                                                   */
                                        /*                                                                                           */
                                        /* Le 20080104154645 fut introduite 'FfxMAX2_____ponderation_de_SPUIX'...                    */
                                        /*                                                                                           */
                                        /* Le 20090330113720 fut introduit 'FfxMAX2_____utiliser_evidemment_la_precision_Float'...   */
                                        /*                                                                                           */
                                        /* Le 20130514121229 fut introduit 'FfxMAX2_____compteur_de_reference'...                    */
                                        /* Le 20180821094620 furent introduites 'FfxMAX2_____ponderation_de_SE12' et                 */
                                        /* 'FfxMAX2_____ponderation_de_SE22'...                                                      */
                                        /*                                                                                           */
                                        /* Le 20180823094838 fut introduite 'FfxMAX2_____ponderation_de_MOYH'...                     */
                                        /*                                                                                           */
                                        /* Le 20181009170359 fut introduite 'FfxMAX2_____ponderation_de_ATAN'...                     */
                                        /*                                                                                           */
                                        /* Le 20181203160941 fut introduite 'FfxMAX2_____ponderation_de_MULH24'...                   */
                                        /*                                                                                           */
                                        /* Le 20201004113034 furent introduites les ponderations "Non Commutatives"s...              */

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P E R A T I O N S   A R I T H M E T I Q U E S   D E   B A S E   E N T R E   N O M B R E S   F L O T T A N T S  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* Le 20061018104520, la definition de l'arithmetique de base est passee apres la            */
                                        /* definition de l'arithmetique etendue car, en effet, a cette date, cette derniere          */
                                        /* est referencee dans la premiere...                                                        */

DEFV(Common,DEFV(Logical,ZINT(si_le_GooF_est_activable_utiliser_l_arithmetique_etendue_au_lieu_de_l_arithmetique_de_base,FAUX)));
                                        /* Introduit le 20061018104520 afin de permettre lors de l'activation du 'GooF' de faire     */
                                        /* de l'arithmetique etendue...                                                              */
                                        /*                                                                                           */
                                        /* ATTENTION : evidemment elle ne sert dans un programme que si le 'GooF' est activable      */
                                        /* dans son propre code ou dans les librairies qu'il utilise.                                */

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_02x(FfADD2(argument1,argument2),bADD,FfxADD2))                        /* Common,DEFV(Fonction,) : */

EFonctionF


BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_02x(FfSOUS(argument1,argument2),bSOU,FfxxSOUS))                       /* Common,DEFV(Fonction,) : */

EFonctionF


BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_02x(FfMUL2(argument1,argument2),bMUL,FfxMUL2))                        /* Common,DEFV(Fonction,) : */

EFonctionF


BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_02x(FfDIVI(argument1,argument2),bDIV,FfxxDIVZ))                       /* Common,DEFV(Fonction,) : */

EFonctionF


BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_02x(FfDIVZ(argument1,argument2),DIVZ,FfxxDIVZ))                       /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* Le passage de '????' a 'b???' a ete introduit le 20040410160336 en vue de permettre un    */
                                        /* mode dans lequel l'ordre des operations serait impose en faisant appel a des fonctions,   */
                                        /* mais ATTENTION, les arguments et les resultats sont alors types en 'Float' (voir          */
                                        /* 'v $xil/defi_c1$vv$DEF GARANTIR_L_ORDRE_DES_OPERATIONS_AVEC_TYPAGE_Float_SIMULTANE')...   */
                                        /*                                                                                           */
                                        /* ATTENTION : on ne peut definir :                                                          */
                                        /*                                                                                           */
                                        /*        DEFV(Common,GENERE__FonctionF_PROC_02(FfREST(argument1,argument2),bRES))           */
                                        /*                                                                                           */
                                        /* car, en effet, la procedure 'REST(...)' ne connait que des arguments entiers...           */
                                        /*                                                                                           */
                                        /* Le 20061030162437 les fonctions 'FfxSOUS(...)' et 'FfxDIVZ(...)' furent remplacees        */
                                        /* respectivement par 'FfxxSOUS(...)' et 'FfxxDIVZ(...)' afin de permettre de controler,     */
                                        /* en option, la soustraction via l'addition et la division via la multiplication (etendues) */
                                        /* respectivement...                                                                         */

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_03(FfADD3(argument1,argument2,argument3),ADD3))                       /* Common,DEFV(Fonction,) : */

EFonctionF


BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_03(FfMUL3(argument1,argument2,argument3),MUL3))                       /* Common,DEFV(Fonction,) : */

EFonctionF


BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_04(FfADD4(argument1,argument2,argument3,argument4),ADD4))             /* Common,DEFV(Fonction,) : */

EFonctionF


BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_04(FfMUL4(argument1,argument2,argument3,argument4),MUL4))             /* Common,DEFV(Fonction,) : */

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R A N S F O R M A T I O N S   " U N I V E R S E L L E S "   D E S   N O M B R E S   F L O T T A N T S  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BFonctionF

DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_NEUT,_FU)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_COSX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_SINX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_TANX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_ATAN,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____arg_x_ATAN,FU)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_COHX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_SIHX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_TAHX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_CSHX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_SSHX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_CTHX,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_ATAH,_FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_SLOGX,FZERO)));
DEFV(Common,DEFV(Float,SINT(FfTransformUniverselle1_____ponderation_de_EXPX,_FZERO)));

DEFV(Common,DEFV(Positive,INIT(FfTransformUniverselle1_____compteur_de_reference,ZERO)));

DEFV(Common,GENERE__FonctionF_UNI1_01(FfTransformUniverselle1(argument),FfTransformUniverselle1_____))   /* Common,DEFV(Fonction,) : */
                                        /* Fonction introduite le 20220116121056...                                                  */

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S E L E C T I O N   D ' U N   N O M B R E   E N T I E R   P A R M I   D E U X                                              */
/*        S U I V A N T   U N E   C O N D I T I O N   L O G I Q U E  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiCOND(condition_logique,argument1,argument2)))
                                        /* ATTENTION : on notera la difference entre :                                               */
                                        /*                                                                                           */
                                        /*                  FiCOND(condition_logique,argument1,argument2)                            */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  COND(condition_logique,argument1,argument2)                              */
                                        /*                                                                                           */
                                        /* en effet, avec 'FiCOND(...)' 'argument1' et 'argument2' sont evalues tous les deux        */
                                        /* avant l'appel de 'FiCOND(...)', alors qu'avec 'COND(...)', seul l'argument qui est        */
                                        /* utile ('argument1' ou 'argument2') est evalue...                                          */
DEFV(Argument,DEFV(Logical,condition_logique));
DEFV(Argument,DEFV(Int,argument1));
DEFV(Argument,DEFV(Int,argument2));
                                        /* Arguments entiers dont on va selectionner l'un d'eux suivant 'condition_logique'.         */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(COND(condition_logique,argument1,argument2));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S E L E C T I O N   D ' U N   N O M B R E   F L O T T A N T   P A R M I   D E U X                                          */
/*        S U I V A N T   U N E   C O N D I T I O N   L O G I Q U E  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfCOND(condition_logique,argument1,argument2)))
                                        /* ATTENTION : on notera la difference entre :                                               */
                                        /*                                                                                           */
                                        /*                  FfCOND(condition_logique,argument1,argument2)                            */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  COND(condition_logique,argument1,argument2)                              */
                                        /*                                                                                           */
                                        /* en effet, avec 'FfCOND(...)' 'argument1' et 'argument2' sont evalues tous les deux        */
                                        /* avant l'appel de 'FfCOND(...)', alors qu'avec 'COND(...)', seul l'argument qui est        */
                                        /* utile ('argument1' ou 'argument2') est evalue...                                          */
DEFV(Argument,DEFV(Logical,condition_logique));
DEFV(Argument,DEFV(Float,argument1));
DEFV(Argument,DEFV(Float,argument2));
                                        /* Arguments flottants dont on va selectionner l'un d'eux suivant 'condition_logique'.       */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes. On verra de plus pour       */
                                        /* cette fonction 'FfCOND(...)' les bugs 'BUG_SYSTEME_C_complexite_02' introduit dans le     */
                                        /* fichier 'v $xiii/montagnes$DEF' et qui s'est manifeste aussi en particulier dans les      */
                                        /* programmes 'v $xrq/nucleon.L0$K' et 'v $xrq/nucleon.LX$I'...                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(COND(condition_logique,argument1,argument2));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   D E U X   N O M B R E S   E N T I E R S  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_02(FiMAX2(argument1,argument2),MAX2))                                 /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   D E U X   N O M B R E S   F L O T T A N T S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_02(FfMAX2(argument1,argument2),MAX2))                                 /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes. On verra de plus pour       */
                                        /* cette fonction 'FfMAX2(...)' les bugs 'BUG_SYSTEME_C_complexite_02' introduit dans le     */
                                        /* fichier 'v $xiii/montagnes$DEF'.                                                          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   T R O I S   N O M B R E S   E N T I E R S  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_03(FiMAX3(argument1,argument2,argument3),MAX3))                       /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   T R O I S   N O M B R E S   F L O T T A N T S  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_03(FfMAX3(argument1,argument2,argument3),MAX3))                       /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   Q U A T R E   N O M B R E S   E N T I E R S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_04(FiMAX4(argument1,argument2,argument3,argument4),MAX4))             /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   Q U A T R E   N O M B R E S   F L O T T A N T S  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_04(FfMAX4(argument1,argument2,argument3,argument4),MAX4))             /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   C I N Q   N O M B R E S   E N T I E R S  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_05(FiMAX5(arg1,arg2,arg3,arg4,arg5),MAX5))                            /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes, le 20111118181441...        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   C I N Q   N O M B R E S   F L O T T A N T S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_05(FfMAX5(arg1,arg2,arg3,arg4,arg5),MAX5))                            /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes, le 20111118181441...        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   S I X   N O M B R E S   E N T I E R S  :                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_06(FiMAX6(arg1,arg2,arg3,arg4,arg5,arg6),MAX6))                       /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes, le 20111118181441...        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M A X I M U M   D E   S I X   N O M B R E S   F L O T T A N T S  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_06(FfMAX6(arg1,arg2,arg3,arg4,arg5,arg6),MAX6))                       /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes, le 20111118181441...        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   D E U X   N O M B R E S   E N T I E R S  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_02(FiMIN2(argument1,argument2),MIN2))                                 /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   D E U X   N O M B R E S   F L O T T A N T S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_02(FfMIN2(argument1,argument2),MIN2))                                 /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   T R O I S   N O M B R E S   E N T I E R S  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_03(FiMIN3(argument1,argument2,argument3),MIN3))                       /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   T R O I S   N O M B R E S   F L O T T A N T S  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_03(FfMIN3(argument1,argument2,argument3),MIN3))                       /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   Q U A T R E   N O M B R E S   E N T I E R S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_04(FiMIN4(argument1,argument2,argument3,argument4),MIN4))             /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   Q U A T R E   N O M B R E S   F L O T T A N T S  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_04(FfMIN4(argument1,argument2,argument3,argument4),MIN4))             /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   C I N Q   N O M B R E S   E N T I E R S  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_05(FiMIN5(arg1,arg2,arg3,arg4,arg5),MIN5))                            /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes, le 20111118181441...        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   C I N Q   N O M B R E S   F L O T T A N T S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_05(FfMIN5(arg1,arg2,arg3,arg4,arg5),MIN5))                            /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes, le 20111118181441...        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   S I X   N O M B R E S   E N T I E R S  :                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,GENERE__FonctionI_PROC_06(FiMIN6(arg1,arg2,arg3,arg4,arg5,arg6),MIN6))                       /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes, le 20111118181441...        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C H E R C H E   D U   M I N I M U M   D E   S I X   N O M B R E S   F L O T T A N T S  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,GENERE__FonctionF_PROC_06(FfMIN6(arg1,arg2,arg3,arg4,arg5,arg6),MIN6))                       /* Common,DEFV(Fonction,) : */

EFonctionF

                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes, le 20111118181441...        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I V I S I O N   D E   D E U X   N O M B R E S   E N T I E R S                                                            */
/*        A V E C   T E S T   D E   N O N   N U L L I T E   D U   D I V I S E U R  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiDIVZ(dividende,diviseur)))
DEFV(Argument,DEFV(Int,dividende));
DEFV(Argument,DEFV(Int,diviseur));
                                        /* Arguments entiers de la division avec test du diviseur.                                   */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(DIVZ(dividende,diviseur));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I V I S I O N   D E   D E U X   N O M B R E S   F L O T T A N T S                                                        */
/*        A V E C   T E S T   D E   N O N   N U L L I T E   D U   D I V I S E U R  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FffDIVZ(dividende,diviseur)))
DEFV(Argument,DEFV(Float,dividende));
DEFV(Argument,DEFV(Float,diviseur));
                                        /* Arguments flottants de la division avec test du diviseur.                                 */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(fDIVZ(dividende,diviseur));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I V I S I O N   D E   D E U X   N O M B R E S   F L O T T A N T S                                                        */
/*        A V E C   T E S T   D E   N O N   N U L L I T E   D U   D I V I S E U R   A   " E P S I L O N   P R E S "  :               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Float,SINT(FffDIVZ_a_peu_pres_____epsilon,GRO10(GRAND_EPSILON))));
                                        /* Epsilon a priori pour 'fDIVZ_a_peu_pres(...)'. On notera que :                            */
                                        /*                                                                                           */
                                        /*                  FffDIVZ_a_peu_pres(dividende,diviseur) = FffDIVZ(dividende,diviseur)     */
                                        /*                                                                                           */
                                        /* lorsque 'FffDIVZ_a_peu_pres_____epsilon' vaut 0...                                        */

DEFV(Common,DEFV(FonctionF,FffDIVZ_a_peu_pres(dividende,diviseur)))
DEFV(Argument,DEFV(Float,dividende));
DEFV(Argument,DEFV(Float,diviseur));
                                        /* Arguments flottants de la division avec test du diviseur a "epsilon pres".                */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(fDIVZ_a_peu_pres(dividende,diviseur,FffDIVZ_a_peu_pres_____epsilon));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   " M O D U L O "   G E N E R A L   D ' U N   N O M B R E   E N T I E R  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiMODU(argument,origine,extremite)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,origine));
DEFV(Argument,DEFV(Int,extremite));
                                        /* Arguments entiers de calcul du "modulo".                                                  */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(MODU(argument,origine,extremite));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   " M O D U L O "   G E N E R A L   D ' U N   N O M B R E   F L O T T A N T  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfMODU(argument,origine,extremite)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,origine));
DEFV(Argument,DEFV(Float,extremite));
                                        /* Arguments flottants de calcul du "modulo".                                                */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(MODU(argument,origine,extremite));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   " M O D U L O "   S I M P L I F I E   D ' U N   N O M B R E   E N T I E R  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiMODS(argument,origine,extremite)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,origine));
DEFV(Argument,DEFV(Int,extremite));
                                        /* Arguments entiers de calcul du "modulo".                                                  */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(MODS(argument,origine,extremite));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   " M O D U L O "   S I M P L I F I E   D ' U N   N O M B R E   F L O T T A N T  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfMODF(argument,origine,extremite)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,origine));
DEFV(Argument,DEFV(Float,extremite));
                                        /* Arguments flottants de calcul du "modulo".                                                */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(MODF(argument,origine,extremite));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   " M O D U L O "   S I M P L I F I E   D ' U N   N O M B R E   F L O T T A N T                                */
/*        E N   C O N S E R V A N T   L E   S I G N E  :                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfMODFcs(argument,origine,extremite)))
                                        /* Introduit le 20071204115414 pour "alleger" la fonction 'v $xrs/surfaces.12$I MODFcs'...   */
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,origine));
DEFV(Argument,DEFV(Float,extremite));
                                        /* Arguments flottants de calcul du "modulo".                                                */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(MODFcs(argument,origine,extremite));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E X T E N S I O N   D E   L A   N O T I O N   D E   R E S T E   E N T I E R                                                */
/*        L O R S   D E   L A   D I V I S I O N   D E   D E U X   N O M B R E S   F L O T T A N T S  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

#define   FACTEUR_MULTIPLICATIF_FffREST                                                                                                 \
                    FDEUX                                                                                                               \
                                        /* Definition d'un facteur multiplicatif destine a faire deux fois les memes calculs sur     */
                                        /* des nombres multiples l'un de l'autre.                                                    */

DEFV(Common,DEFV(FonctionF,FffREST(dividende,diviseur)))
DEFV(Argument,DEFV(Float,dividende));
DEFV(Argument,DEFV(Float,diviseur));
                                        /* Arguments flottants de calcul d'un multiple proche par defaut d'un nombre.                */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(valeur_absolue_du_dividende,ABSO(dividende)));
     DEFV(Float,INIT(valeur_absolue_du_diviseur,ABSO(diviseur)));
                                        /* Valeurs absolues deux Arguments.                                                          */
     DEFV(Float,INIT(premier_reste,FLOT__UNDEF));
     DEFV(Float,INIT(premier_reste_multiplie,FLOT__UNDEF));
     DEFV(Float,INIT(deuxieme_reste,FLOT__UNDEF));
                                        /* Valeurs des deux restes que l'on va comparer...                                           */
     DEFV(Float,INIT(reste_cherche,FLOT__UNDEF));
                                        /* Valeur du reste cherche...                                                                */
     /*..............................................................................................................................*/
     EGAL(premier_reste,fREST(NEUT(valeur_absolue_du_dividende),valeur_absolue_du_diviseur));
     EGAL(premier_reste_multiplie,MUL2(FACTEUR_MULTIPLICATIF_FffREST,premier_reste));
     EGAL(deuxieme_reste,fREST(MUL2(FACTEUR_MULTIPLICATIF_FffREST,valeur_absolue_du_dividende),valeur_absolue_du_diviseur));
                                        /* Calcul de deux restes dont on connait une relation les reliant...                         */

     Test(IFEQ(premier_reste_multiplie,deuxieme_reste))
          Bblock
          EGAL(reste_cherche,premier_reste);
                                        /* En general, le premier reste multiplie par le facteur multiplicatif doit etre egal        */
                                        /* au deuxieme reste qui correspond au meme diviseur que la premiere division, mais pour     */
                                        /* un dividende lui-meme multiplie par ce facteur multiplicatif...                           */
          Eblock
     ATes
          Bblock
          EGAL(reste_cherche,SOUS(valeur_absolue_du_diviseur,premier_reste));
                                        /* Dans le cas contraire, on corrige (voir le programme 'v $xtc/multiple.01$c').             */
          Eblock
     ETes

     RETU(COND(IZGE(dividende),NEUT(reste_cherche),NEGA(reste_cherche)));
                                        /* Cet eventuel changement de signe est destine a la compatabilite avec 'fREST(...)'.        */
     Eblock

#undef    FACTEUR_MULTIPLICATIF_FffREST

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D ' U N   M U L T I P L E   P R O C H E   P A R   D E F A U T   D ' U N   N O M B R E   E N T I E R  :       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiMULD(argument,base)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,base));
                                        /* Arguments entiers de calcul d'un multiple proche par defaut d'un nombre.                  */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(MULD(argument,base));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D ' U N   M U L T I P L E   P R O C H E   P A R   D E F A U T   D ' U N   N O M B R E   F L O T T A N T  :   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FffMULD(argument,base)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,base));
                                        /* Arguments flottants de calcul d'un multiple proche par defaut d'un nombre.                */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(valeur_absolue_de_l_argument,ABSO(argument)));
     DEFV(Float,INIT(valeur_absolue_de_la_base,ABSO(base)));
                                        /* Valeurs absolues des deux Arguments.                                                      */
     DEFV(Float,INIT(reste_de_la_division_en_valeur_absolue,FLOT__UNDEF));
                                        /* Reste de la division des valeurs absolues.                                                */
     DEFV(Float,INIT(valeur_par_defaut,FLOT__UNDEF));
                                        /* Valeur par defaut recherchee. Ce passage par une valeur intermediaire est destine a       */
                                        /* permettre facilement une validation de la valeur par defaut calculee...                   */
     /*..............................................................................................................................*/
     EGAL(reste_de_la_division_en_valeur_absolue,ffREST(valeur_absolue_de_l_argument,valeur_absolue_de_la_base));
                                        /* Calcul du reste de la division des valeurs absolues.                                      */
     EGAL(valeur_par_defaut
         ,COND(IZGE(argument)
              ,ADD2(argument,reste_de_la_division_en_valeur_absolue)
              ,SOUS(argument,reste_de_la_division_en_valeur_absolue)
               )
          );
                                        /* Et enfin, calcul du multiple cherche (voir le programme 'v $xtc/multiple.01$c').          */

     Test(IFGT(valeur_par_defaut,argument))
          Bblock
          EGAL(valeur_par_defaut,SOUS(valeur_par_defaut,valeur_absolue_de_la_base));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU(valeur_par_defaut);
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D ' U N   M U L T I P L E   P R O C H E   P A R   E X C E S   D ' U N   N O M B R E   E N T I E R  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiMULE(argument,base)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,base));
                                        /* Arguments entiers de calcul d'un multiple proche par exces d'un nombre.                   */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(MULE(argument,base));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D ' U N   M U L T I P L E   P R O C H E   P A R   E X C E S   D ' U N   N O M B R E   F L O T T A N T  :     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FffMULE(argument,base)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,base));
                                        /* Arguments flottants de calcul d'un multiple proche par exces d'un nombre.                 */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(valeur_par_exces,fMULE(argument,base)));
                                        /* Valeur par exces recherchee. Ce passage par une valeur intermediaire est destine a        */
                                        /* permettre facilement une validation de la valeur par exces calculee...                    */
     /*..............................................................................................................................*/
     Test(IFLT(valeur_par_exces,argument))
          Bblock
          PRINT_ERREUR("la valeur par exces obtenue est plus petite que l'argument");
          CAL1(Prer2("%.17f --> %.17f\n",argument,valeur_par_exces));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU(valeur_par_exces);
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   L ' A R R O N D I   G E N E R A L I S E   D ' U N   N O M B R E   F L O T T A N T  :                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FffARRI(argument,epsilon)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,epsilon));
                                        /* Arguments flottants de calcul de l'arrondi generalise d'un nombre flottant.               */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(fARRI(argument,epsilon));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        " R E G L E   D E   T R O I S "   A V E C   D E S   N O M B R E S   E N T I E R S  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiSCAL(argument,ancien_intervalle,nouvel_intervalle)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,ancien_intervalle));
DEFV(Argument,DEFV(Int,nouvel_intervalle));
                                        /* Arguments entiers de calcul de la "regle de trois".                                       */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(SCAL(argument,ancien_intervalle,nouvel_intervalle));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        " R E G L E   D E   T R O I S "   A V E C   D E S   N O M B R E S   F L O T T A N T S  :                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfSCAL(argument,ancien_intervalle,nouvel_intervalle)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,ancien_intervalle));
DEFV(Argument,DEFV(Float,nouvel_intervalle));
                                        /* Arguments flottants de calcul de la "regle de trois".                                     */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(SCAL(argument,ancien_intervalle,nouvel_intervalle));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A S S A G E   D ' U N   I N T E R V A L L E   A   U N   A U T R E                                                        */
/*        A V E C   D E S   N O M B R E S   E N T I E R S  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiHOMO(argument,origine1,extremite1,origine2,extremite2)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,origine1));
DEFV(Argument,DEFV(Int,extremite1));
DEFV(Argument,DEFV(Int,origine2));
DEFV(Argument,DEFV(Int,extremite2));
                                        /* Arguments entiers de passage d'un intervalle a un autre.                                  */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(HOMO(argument,origine1,extremite1,origine2,extremite2));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A S S A G E   D ' U N   I N T E R V A L L E   A   U N   A U T R E                                                        */
/*        A V E C   D E S   N O M B R E S   F L O T T A N T S  :                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfHOMO(argument,origine1,extremite1,origine2,extremite2)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,origine1));
DEFV(Argument,DEFV(Float,extremite1));
DEFV(Argument,DEFV(Float,origine2));
DEFV(Argument,DEFV(Float,extremite2));
                                        /* Arguments flottants de passage d'un intervalle a un autre.                                */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(HOMO(argument,origine1,extremite1,origine2,extremite2));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A S S A G E   D ' U N   I N T E R V A L L E   A   U N   A U T R E                                                        */
/*        A V E C   D E S   N O M B R E S   E N T I E R S  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiHOMZ(argument,origine1,extremite1,origine2,extremite2,exception)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,origine1));
DEFV(Argument,DEFV(Int,extremite1));
DEFV(Argument,DEFV(Int,origine2));
DEFV(Argument,DEFV(Int,extremite2));
DEFV(Argument,DEFV(Int,exception));
                                        /* Arguments entiers de passage d'un intervalle a un autre.                                  */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(HOMZ(argument,origine1,extremite1,origine2,extremite2,exception));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A S S A G E   D ' U N   I N T E R V A L L E   A   U N   A U T R E                                                        */
/*        A V E C   D E S   N O M B R E S   F L O T T A N T S  :                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfHOMZ(argument,origine1,extremite1,origine2,extremite2,exception)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,origine1));
DEFV(Argument,DEFV(Float,extremite1));
DEFV(Argument,DEFV(Float,origine2));
DEFV(Argument,DEFV(Float,extremite2));
DEFV(Argument,DEFV(Float,exception));
                                        /* Arguments flottants de passage d'un intervalle a un autre.                                */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(HOMZ(argument,origine1,extremite1,origine2,extremite2,exception));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O R M A L I S A T I O N   D ' U N   N O M B R E   E N T I E R  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiNORM(argument,origine,extremite)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,origine));
DEFV(Argument,DEFV(Int,extremite));
                                        /* Arguments entiers de normalisation.                                                       */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(NORM(argument,origine,extremite));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O R M A L I S A T I O N   D ' U N   N O M B R E   F L O T T A N T  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfNORM(argument,origine,extremite)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,origine));
DEFV(Argument,DEFV(Float,extremite));
                                        /* Arguments flottants de normalisation.                                                     */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(NORM(argument,origine,extremite));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O R M A L I S A T I O N   D ' U N   N O M B R E   E N T I E R  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiNORZ(argument,origine,extremite,exception)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,origine));
DEFV(Argument,DEFV(Int,extremite));
DEFV(Argument,DEFV(Int,exception));
                                        /* Arguments entiers de normalisation.                                                       */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(NORZ(argument,origine,extremite,exception));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O R M A L I S A T I O N   D ' U N   N O M B R E   F L O T T A N T  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfNORZ(argument,origine,extremite,exception)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,origine));
DEFV(Argument,DEFV(Float,extremite));
DEFV(Argument,DEFV(Float,exception));
                                        /* Arguments flottants de normalisation.                                                     */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(NORZ(argument,origine,extremite,exception));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R O N C A T I O N   D ' U N   N O M B R E   E N T I E R  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiTRON(argument,origine,extremite)))
DEFV(Argument,DEFV(Int,argument));
DEFV(Argument,DEFV(Int,origine));
DEFV(Argument,DEFV(Int,extremite));
                                        /* Arguments entiers de troncation.                                                          */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(TRON(argument,origine,extremite));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T R O N C A T I O N   D ' U N   N O M B R E   F L O T T A N T  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfTRON(argument,origine,extremite)))
DEFV(Argument,DEFV(Float,argument));
DEFV(Argument,DEFV(Float,origine));
DEFV(Argument,DEFV(Float,extremite));
                                        /* Arguments flottants de troncation.                                                        */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(TRON(argument,origine,extremite));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R P O L A T I O N   D E   D E U X   N O M B R E S   E N T I E R S  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiBARY(origine,extremite,lambda)))
DEFV(Argument,DEFV(Int,origine));
DEFV(Argument,DEFV(Int,extremite));
DEFV(Argument,DEFV(Float,lambda));
                                        /* Arguments entiers d'interpolation.                                                        */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(BARY(origine,extremite,lambda));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R P O L A T I O N   D E   D E U X   N O M B R E S   F L O T T A N T S  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfBARY(origine,extremite,lambda)))
DEFV(Argument,DEFV(Float,origine));
DEFV(Argument,DEFV(Float,extremite));
DEFV(Argument,DEFV(Float,lambda));
                                        /* Arguments flottants d'interpolation.                                                      */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(BARY(origine,extremite,lambda));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R P O L A T I O N   D E   D E U X   N O M B R E S   E N T I E R S   A V E C   V A L I D A T I O N  :               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FivBARY(origine,extremite,lambda)))
DEFV(Argument,DEFV(Int,origine));
DEFV(Argument,DEFV(Int,extremite));
DEFV(Argument,DEFV(Float,lambda));
                                        /* Arguments entiers d'interpolation.                                                        */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(vBARY(origine,extremite,lambda));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R P O L A T I O N   D E   D E U X   N O M B R E S   F L O T T A N T S   A V E C   V A L I D A T I O N  :           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FfvBARY(origine,extremite,lambda)))
DEFV(Argument,DEFV(Float,origine));
DEFV(Argument,DEFV(Float,extremite));
DEFV(Argument,DEFV(Float,lambda));
                                        /* Arguments flottants d'interpolation.                                                      */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(vBARY(origine,extremite,lambda));
     Eblock

EFonctionF

                                        /* Le 20080327134646, la fonction 'FfLIO17(...)' a ete mise dans un fichier specifique       */
                                        /* ('v $xig/GooF_fo$vv$FON FfLIO17' car, en effet, ici cela impliquait une duree de          */
                                        /* compilation importante...                                                                 */

#undef    GENERE__FonctionL_PROC_04
#undef    GENERE__FonctionL_PROC_03
#undef    GENERE__FonctionL_PROC_02
#undef    GENERE__FonctionL_PROC_01

#undef    GENERE__FonctionF_PROC_06
#undef    GENERE__FonctionF_PROC_05
#undef    GENERE__FonctionF_PROC_04
#undef    GENERE__FonctionF_PROC_03
#undef    GENERE__FonctionF_PROC_02x
#undef    GENERE__FonctionF_PROC_02
#undef    GENERE__FonctionF_PROC_01

#undef    GENERE__FonctionI_PROC_06
#undef    GENERE__FonctionI_PROC_05
#undef    GENERE__FonctionI_PROC_04
#undef    GENERE__FonctionI_PROC_03
#undef    GENERE__FonctionI_PROC_02
#undef    GENERE__FonctionI_PROC_01

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O O R D O N N E S   E N T I E R E S   S U R   U N E   S P I R A L E  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FiSPIRALE_X(index,saut)))
DEFV(Argument,DEFV(Int,index));
DEFV(Argument,DEFV(Int,saut));
                                        /* Arguments entiers de cette "de-spiralisation" des coordonnees.                            */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(SPIRALE_X(index,saut));
     Eblock

EFonctionI

BFonctionI

DEFV(Common,DEFV(FonctionI,FiSPIRALE_Y(index,saut)))
DEFV(Argument,DEFV(Int,index));
DEFV(Argument,DEFV(Int,saut));
                                        /* Arguments entiers de cette "de-spiralisation" des coordonnees.                            */
                                        /*                                                                                           */
                                        /* NOTA : cette fonction est introduite pour des raisons de performance a la compilation     */
                                        /* lorsque les arguments sont en fait des expressions complexes...                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(SPIRALE_Y(index,saut));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M I S E   A   J O U R   D U   S Y S T E M E   D E   G E S T I O N   D E   F I C H I E R S  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   FAIRE_LA_MISE_A_JOUR_DU_SYSTEME_DE_GESTION_DE_FICHIERS                                                                        \
                    VRAI
#define   NE_PAS_FAIRE_LA_MISE_A_JOUR_DU_SYSTEME_DE_GESTION_DE_FICHIERS                                                                 \
                    NOTL(FAIRE_LA_MISE_A_JOUR_DU_SYSTEME_DE_GESTION_DE_FICHIERS)
                                        /* Valeurs possibles de l'argument 'faire_la_mise_a_jour' ci-apres...                        */

BFonctionI

DEFV(Common,DEFV(Logical,SINT(Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025,FAUX)));
                                        /* Indicateur permettant d'assurer la compatibilite anterieure, si besoin est. Cela fut      */
                                        /* introduit le 20121025182244 et donc a compter de cette date, on ne fait plus de mises     */
                                        /* jour du systeme de gestion de fichiers et ce quel que soit la MACHINE...                  */

DEFV(Local,DEFV(FonctionI,Fmise_a_jour_du_systeme_de_gestion_de_fichiers(faire_la_mise_a_jour)))
DEFV(Argument,DEFV(Logical,faire_la_mise_a_jour));
                                        /* Indicateur logique demandant demandant de faire la mise a jour ('VRAI') ou pas ('FAUX').  */
                                        /* En fait, cet argument peu utile a ete ajoute le 19970108121648 a cause d'un probleme      */
                                        /* ('v $Dbugs/SGIND524$D/IRIX$D/$Fnota fr61199') que l'on peut faire disparaitre en ajoutant */
                                        /* un argument a une fonction de type 'Local' qui auparavant n'en avait aucun...             */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IL_FAUT(faire_la_mise_a_jour))
          Bblock
          Test(IL_FAUT(Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025))
                                        /* Test introduit le 20121025182244...                                                       */
               Bblock

#if       (         (! defined(BUG_SYSTEME_SGIND5_Sync_time_out))                                                                       \
          &&        (! defined(BUG_SYSTEME_Linux_Sync_tres_lent))                                                                       \
           )
               CALZ(Sync());
                                        /* Et soyons tres tres prudent en forcant la mise a jour des disques...                      */
#Aif      (         (! defined(BUG_SYSTEME_SGIND5_Sync_time_out))                                                                       \
          &&        (! defined(BUG_SYSTEME_Linux_Sync_tres_lent))                                                                       \
           )
#Eif      (         (! defined(BUG_SYSTEME_SGIND5_Sync_time_out))                                                                       \
          &&        (! defined(BUG_SYSTEME_Linux_Sync_tres_lent))                                                                       \
           )

               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E N T A T I V E   D E   C O M P A C T A G E   " S I M P L I S T E "   D ' U N   F I C H I E R  :                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*             *     * * * * * *   * * * * * *   * * * * * *   *         *   * * * * * *   *   * * * * * *   *         *             */
/*                        *             *        *             **        *        *        *   *         *   **        *             */
/*            * *         *             *        *             * *       *        *        *   *         *   * *       *             */
/*                        *             *        *             *  *      *        *        *   *         *   *  *      *             */
/*           *   *        *             *        *             *   *     *        *        *   *         *   *   *     *             */
/*                        *             *        * * *         *    *    *        *        *   *         *   *    *    *             */
/*          * * * *       *             *        *             *     *   *        *        *   *         *   *     *   *             */
/*                        *             *        *             *      *  *        *        *   *         *   *      *  *             */
/*         *       *      *             *        *             *       * *        *        *   *         *   *       * *             */
/*                        *             *        *             *        **        *        *   *         *   *        **             */
/*        *         *     *             *        * * * * * *   *         *        *        *   * * * * * *   *         *             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        ATTENTION :                                                                                                                */
/*                                                                                                                                   */
/*                    Ce dispositif n'est actuellement (le 1996050200) que                                                           */
/*                  peu utile pour les images car, en ce qui les concerne,                                                           */
/*                  la taille des fichiers correspondant est tres utilisee                                                           */
/*                  pour en deduire le '$formatI' associe ('v $Falias_v') ;                                                          */
/*                  si elles sont compressees, cette taille n'est alors plus                                                         */
/*                  significative...                                                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   ORDRE_DE_MULTIPLICITE_D_UN_FICHIER_COMPACTE_1                                                                                 \
                    DEUX                                                                                                                \
                                        /* Les fichiers compactes de facon "simpliste" doivent avoir une longueur multiple de 2. En  */ \
                                        /* effet chaque "entree" du fichier compacte est fait de deux octets :                       */ \
                                        /*                                                                                           */ \
                                        /* 1-un octet "compteur de repetition" (de 1 a 255),                                         */ \
                                        /* 2-un octet "octet a dupliquer" (suivant le "compteur de repetition" qui precede).         */ \
                                        /*                                                                                           */ \
                                        /* Comme on peut le voir, tout ceci n'est pas tres optimise mais, dans de tres nombreux      */ \
                                        /* cas, cela marche bien (et par exemple les images avec un grand fond 'NOIR')...            */

#define   ENTRELACAGE_INDEX_COMPACTAGE_DECOMPACTAGE(index,minimum_de_l_index,size,unite)                                                \
                    ADD3(minimum_de_l_index                                                                                             \
                        ,REST(MUL2(SOUS(index,minimum_de_l_index),unite),size)                                                          \
                        ,QUOD(MUL2(SOUS(index,minimum_de_l_index),unite),size)                                                          \
                         )                                                                                                              \
                                        /* Procedure permettant de proceder a un "entrelacage" des index de comptactage et de        */ \
                                        /* decompactage, ce qui permet de mettre les uns a la suite des autres des octets ayant      */ \
                                        /* la meme "fonction" dans un fichier. Par exemple, pour un fichier contenant des 'Float',   */ \
                                        /* tous les octets '0' des nombres 'Float' seront les uns a la suite des autres, puis tous   */ \
                                        /* les octets '1',...                                                                        */

BFonctionI

#define   RANGEMENT_DU_CODE_DE_COMPACTAGE(caractere)                                                                                    \
                    Bblock                                                                                                              \
                    Test(IFLE(index_de_compactage,LSTX(PREMIER_CARACTERE,size_fichierR)))                                               \
                         Bblock                                                                                                         \
                                        /* Cas ou il y a encore de la place dans 'fichierR' :                                        */ \
                         EGAL(ITb0(fichierR,INDX(index_de_compactage,PREMIER_CARACTERE)),caractere);                                    \
                         INCR(index_de_compactage,I);                                                                                   \
                                        /* Rangement du caractere courant, et progression de l'index.                                */ \
                         INCR(taille_reelle_du_fichier_compacte,I);                                                                     \
                                        /* Mise a jour de la taille reelle du fichier compacte.                                      */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                                        /* Cas ou il n'y a plus de place dans 'fichierR' : on ne fait rien...                        */ \
                         EGAL(taille_reelle_du_fichier_compacte,size_fichierA);                                                         \
                                        /* On va indiquer ainsi que le compactage n'a pu se terminer correctement...                 */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Rangement d'un octet du code de compactage.                                               */

DEFV(Common,DEFV(FonctionI,Ftentative_de_compactage_1(fichierR,size_fichierR,fichierA,size_fichierA,unite_fichierA)))
DEFV(Argument,DEFV(CHAR,DTb0(fichierR)));
                                        /* Fichier Resultat du compactage (a condition que size_fichierR<size_fichierA),             */
DEFV(Argument,DEFV(Int,size_fichierR));
                                        /* Et taille en octets. ATTENTION : cet argument est un 'Int' afin d'etre homogene avec      */
                                        /* 'Fsize_fichier(...)'.                                                                     */
DEFV(Argument,DEFV(CHAR,DTb0(fichierA)));
                                        /* Fichier Argument a compacter,                                                             */
DEFV(Argument,DEFV(Int,size_fichierA));
                                        /* Et taille en octets. ATTENTION : cet argument est un 'Int' afin d'etre homogene avec      */
                                        /* 'Fsize_fichier(...)'.                                                                     */
DEFV(Argument,DEFV(Int,unite_fichierA));
                                        /* Nombre d'octets contenus dans l'unite de 'fichierA'.                                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(taille_reelle_du_fichier_compacte,size_fichierA));
                                        /* A priori, on suppose que le compactage n'a pu avoir lieu. Cette valeur est utilisee       */
                                        /* pour indiquer au retour que le compactage n'a pu etre fait ou n'a pu s'achever...         */
     /*..............................................................................................................................*/
     Test(NON_DIVISIBLE(size_fichierA,unite_fichierA))
          Bblock
          PRINT_ATTENTION("la taille du fichier n'est pas divisible par l'unite, mais le compactage est tente malgre tout");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IFET(IZGT(size_fichierA)
                   ,IFET(IZGT(size_fichierR),DIVISIBLE(size_fichierR,ORDRE_DE_MULTIPLICITE_D_UN_FICHIER_COMPACTE_1))
                    )
              ,IFLT(size_fichierR,size_fichierA)
               )
          )
                                        /* Un fichier compacte doit avoir une longueur paire afin de contenir des couples de codes   */
                                        /* de repetition et de caracteres repetes...                                                 */
          Bblock
          DEFV(Int,INIT(index_non_compacte,UNDEF));
                                        /* Index d'extraction dans 'fichierA'.                                                       */
          DEFV(Int,INIT(index_de_compactage,PREMIER_CARACTERE));
                                        /* Index de rangement dans 'fichierR'.                                                       */
          DEFV(Int,INIT(compteur_de_repetition,UN));
                                        /* Compteur de repetition lorsque plusieurs octets identiques se suivent.                    */
          DEFV(CHAR,INIT(caractere_precedent,K_UNDEF));
                                        /* Caractere precedent (sauf pour le premier caractere...).                                  */

          CLIR(taille_reelle_du_fichier_compacte);
                                        /* Afin de calculer la taille reelle du fichier compacte.                                    */

          DoIn(index_non_compacte,PREMIER_CARACTERE,LSTX(PREMIER_CARACTERE,size_fichierA),I)
               Bblock
               DEFV(Int,INIT(index_entrelace
                            ,ENTRELACAGE_INDEX_COMPACTAGE_DECOMPACTAGE(index_non_compacte
                                                                      ,PREMIER_CARACTERE
                                                                      ,size_fichierA
                                                                      ,unite_fichierA
                                                                       )
                             )
                    );
                                        /* Index "entrelace".                                                                        */

               Test(IFEQ(index_non_compacte,PREMIER_CARACTERE))
                    Bblock
                    EGAL(caractere_precedent,ITb0(fichierA,INDX(index_entrelace,PREMIER_CARACTERE)));
                                        /* Le premier caractere est traite a part.                                                   */
                    Eblock
               ATes
                    Bblock
                    Test(IFET(IFEQ(ITb0(fichierA,INDX(index_entrelace,PREMIER_CARACTERE)),caractere_precedent)
                             ,IFLT(compteur_de_repetition,MOCD)
                              )
                         )
                                        /* Cas ou il y a repetition et ou le compteur de repetitions ne deborde pas :                */
                         Bblock
                         INCK(compteur_de_repetition);
                                        /* Comptage de la repetition de 'caractere_precedent'.                                       */
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou il n'y a pas repetition ou lorsque le compteur de repetitions deborde :            */
                         RANGEMENT_DU_CODE_DE_COMPACTAGE(compteur_de_repetition);
                         RANGEMENT_DU_CODE_DE_COMPACTAGE(caractere_precedent);
                                        /* Rangement des informations courantes de compactage.                                       */
                         EGAL(caractere_precedent,ITb0(fichierA,INDX(index_entrelace,PREMIER_CARACTERE)));
                         EGAL(compteur_de_repetition,UN);
                                        /* Et reinitialisation du processus.                                                         */
                         Eblock
                    ETes
                    Eblock
               ETes
               Eblock
          EDoI

          RANGEMENT_DU_CODE_DE_COMPACTAGE(compteur_de_repetition);
          RANGEMENT_DU_CODE_DE_COMPACTAGE(caractere_precedent);
                                        /* Rangement des informations courantes de compactage encore en attente...                   */
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("le taux de compactage demande est superieur ou egal a 1");
          CAL1(Prer1("taille Argument=%" ## BFd ## "\n",size_fichierA));
          CAL1(Prer1("taille Resultat=%" ## BFd ## "\n",size_fichierR));
          Eblock
     ETes

     RETU(taille_reelle_du_fichier_compacte);
                                        /* Ainsi, le compactage n'a eu lieu que si :                                                 */
                                        /*                                                                                           */
                                        /*                  IFNE(taille_reelle_du_fichier_compacte,size_fichierA)                    */
                                        /*                                                                                           */
     Eblock

#undef    RANGEMENT_DU_CODE_DE_COMPACTAGE

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E N T A T I V E   D E   D E C O M P A C T A G E   " S I M P L I S T E "   D ' U N   F I C H I E R  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

#define   RANGEMENT_D_UN_CARACTERE_DECOMPACTE(caractere)                                                                                \
                    Bblock                                                                                                              \
                    Test(IFLE(index_de_decompactage,LSTX(PREMIER_CARACTERE,size_fichierR)))                                             \
                         Bblock                                                                                                         \
                                        /* Cas ou il y a encore de la place dans 'fichierR' :                                        */ \
                         DEFV(Int,INIT(index_entrelace                                                                                  \
                                      ,ENTRELACAGE_INDEX_COMPACTAGE_DECOMPACTAGE(index_de_decompactage                                  \
                                                                                ,PREMIER_CARACTERE                                      \
                                                                                ,size_fichierR                                          \
                                                                                ,unite_fichierR                                         \
                                                                                 )                                                      \
                                       )                                                                                                \
                              );                                                                                                        \
                                        /* Index "entrelace".                                                                        */ \
                                                                                                                                        \
                         EGAL(ITb0(fichierR,INDX(index_entrelace,PREMIER_CARACTERE)),caractere);                                        \
                         INCR(index_de_decompactage,I);                                                                                 \
                                        /* Rangement du caractere courant, et progression de l'index.                                */ \
                         INCR(taille_reelle_du_fichier_decompacte,I);                                                                   \
                                        /* Mise a jour de la taille reelle du fichier compacte.                                      */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                                        /* Cas ou il n'y a plus de place dans 'fichierR' : on ne fait rien...                        */ \
                         EGAL(taille_reelle_du_fichier_decompacte,size_fichierA);                                                       \
                                        /* On va indiquer ainsi que le decompactage n'a pu se terminer correctement...               */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Rangement d'un octet decompacte.                                                          */

DEFV(Common,DEFV(FonctionI,Ftentative_de_decompactage_1(fichierR,size_fichierR,unite_fichierR,fichierA,size_fichierA)))
DEFV(Argument,DEFV(CHAR,DTb0(fichierR)));
                                        /* Fichier Resultat du decompactage,                                                         */
DEFV(Argument,DEFV(Int,size_fichierR));
                                        /* Et taille en octets. ATTENTION : cet argument est un 'Int' afin d'etre homogene avec      */
                                        /* 'Fsize_fichier(...)'.                                                                     */
DEFV(Argument,DEFV(Int,unite_fichierR));
                                        /* Nombre d'octets contenus dans l'unite de 'fichierR'.                                      */
DEFV(Argument,DEFV(CHAR,DTb0(fichierA)));
                                        /* Fichier Argument a decompacter,                                                           */
DEFV(Argument,DEFV(Int,size_fichierA));
                                        /* Et taille en octets. ATTENTION : cet argument est un 'Int' afin d'etre homogene avec      */
                                        /* 'Fsize_fichier(...)'.                                                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(taille_reelle_du_fichier_decompacte,size_fichierA));
                                        /* A priori, on suppose que le decompactage n'a pu avoir lieu. Cette valeur est utilisee     */
                                        /* pour indiquer au retour que le decompactage n'a pu etre fait ou n'a pu s'achever...       */
     /*..............................................................................................................................*/
     Test(NON_DIVISIBLE(size_fichierR,unite_fichierR))
          Bblock
          PRINT_ATTENTION("la taille du fichier n'est pas divisible par l'unite, mais le decompactage est tente malgre tout");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IFET(IZGT(size_fichierR)
                   ,IFET(IZGT(size_fichierA),DIVISIBLE(size_fichierA,ORDRE_DE_MULTIPLICITE_D_UN_FICHIER_COMPACTE_1))
                    )
              ,IFLT(size_fichierA,size_fichierR)
               )
          )
                                        /* Un fichier compacte doit avoir une longueur paire afin de contenir des couples de codes   */
                                        /* de repetition et de caracteres repetes...                                                 */
          Bblock
          DEFV(Logical,INIT(recuperer_le_compteur_de_repetition,VRAI));
                                        /* Cet indicateur logique en bascule permet de savoir si l'on attend le compteur de          */
                                        /* repetition ('VRAI') ou le caractere a repeter ('FAUX').                                   */
          DEFV(Int,INIT(index_compacte,UNDEF));
                                        /* Index d'extraction dans 'fichierA'.                                                       */
          DEFV(Int,INIT(index_de_decompactage,PREMIER_CARACTERE));
                                        /* Index de rangement dans 'fichierR'.                                                       */
          DEFV(Int,INIT(compteur_de_repetition,UNDEF));
                                        /* Compteur de repetition de l'octet courant.                                                */

          CLIR(taille_reelle_du_fichier_decompacte);
                                        /* Afin de calculer la taille reelle du fichier decompacte.                                  */

          DoIn(index_compacte,PREMIER_CARACTERE,LSTX(PREMIER_CARACTERE,size_fichierA),I)
               Bblock
               Test(IL_FAUT(recuperer_le_compteur_de_repetition))
                    Bblock
                    EGAL(compteur_de_repetition,ITb0(fichierA,INDX(index_compacte,PREMIER_CARACTERE)));
                                        /* Recuperation du compteur de repetition.                                                   */
                    Eblock
               ATes
                    Bblock
                    Repe(compteur_de_repetition)
                         Bblock
                         RANGEMENT_D_UN_CARACTERE_DECOMPACTE(ITb0(fichierA,INDX(index_compacte,PREMIER_CARACTERE)));
                                        /* Et rangement autant de fois que necessaire du caractere courant...                        */
                         Eblock
                    ERep
                    Eblock
               ETes

               EGAL(recuperer_le_compteur_de_repetition,NOTL(recuperer_le_compteur_de_repetition));
                                        /* Et bascule...                                                                             */
               Eblock
          EDoI
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("le taux de decompactage demande est inferieur ou egal a 1");
          CAL1(Prer1("taille Argument=%" ## BFd ## "\n",size_fichierR));
          CAL1(Prer1("taille Resultat=%" ## BFd ## "\n",size_fichierA));
          Eblock
     ETes

     RETU(taille_reelle_du_fichier_decompacte);
                                        /* Ainsi, le decompactage n'a eu lieu que si :                                               */
                                        /*                                                                                           */
                                        /*                  IFNE(taille_reelle_du_fichier_decompacte,size_fichierA)                  */
                                        /*                                                                                           */
     Eblock

#undef    RANGEMENT_D_UN_CARACTERE_DECOMPACTE

EFonctionI

#undef    ENTRELACAGE_INDEX_COMPACTAGE_DECOMPACTAGE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D E S   M E S S A G E S   D ' E R R E U R   D E   G E S T I O N   D E   F I C H I E R  :                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(bloquer_tous_les_messages_d_erreur_des_fichiers
                             ,NE_PAS_BLOQUER_TOUS_LES_MESSAGES_D_ERREUR_DES_FICHIERS
                              )
                 )
     );
                                        /* Cet indicateur indique si les messages d'erreur de gestion de fichiers doivent etre tous  */
                                        /* bloques ('VRAI') ou pas ('FAUX').                                                         */

                                        /* La procedure 'MESSAGES_DES_FICHIERS(...)' est dans 'v $xig/fonct$vv$DEF 20080916144600'   */
                                        /* a compter du 20080916144658 pour 'v $xiii/files$FON MESSAGES_DES_FICHIERS'...             */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V A L I D A T I O N   D E S   N O M S   D E   F I C H I E R S  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(valider_la_longueur_des_noms_absolus_de_fichiers
                             ,VALIDER_LA_LONGUEUR_DES_NOMS_ABSOLUS_DE_FICHIERS
                              )
                 )
     );
                                        /* Cet indicateur indique si la validation de la longueur des noms absolus des fichiers      */
                                        /* doit avoir lieu ou pas...                                                                 */
DEFV(Common,DEFV(Logical,ZINT(forcer_la_validation_de_la_longueur_des_noms_absolus_de_fichiers,FAUX)));
                                        /* Cet indicateur fut introduit le 20070619172216 afin de pouvoir forcer ce type de          */
                                        /* message, meme si 'IL_NE_FAUT_PAS(editer_les_messages_d_erreur)'...                        */

#define   VALIDATION_DES_NOMS_ABSOLUS_DE_FICHIERS(nom_absolu,editer_les_messages_d_erreur)                                              \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(valider_la_longueur_des_noms_absolus_de_fichiers))                                                     \
                         Bblock                                                                                                         \
                         Test(IFGT(chain_Xtaille(nom_absolu),LONGUEUR_MAXIMALE_D_UN_NOM_ABSOLU_DE_FICHIER))                             \
                              Bblock                                                                                                    \
                              DEFV(Logical,INIT(editer_les_messages_relatifs_a_la_longueur_absolue                                      \
                                               ,IFOU(IL_FAUT(editer_les_messages_d_erreur)                                              \
                                                    ,IL_FAUT(forcer_la_validation_de_la_longueur_des_noms_absolus_de_fichiers)          \
                                                     )                                                                                  \
                                                )                                                                                       \
                                   );                                                                                                   \
                                        /* Indicateur local introduit le 20070619172216...                                           */ \
                                                                                                                                        \
                              Test(IL_FAUT(editer_les_messages_relatifs_a_la_longueur_absolue))                                         \
                                        /* Test (manquant depuis une eternite) introduit le 20070618144154...                        */ \
                                   Bblock                                                                                               \
                                   PRINT_ATTENTION("nom absolu de fichier trop long");                                                  \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              MESSAGES_DES_FICHIERS                                                                                     \
                                  (Prer3("le nom '%s' risque d'etre tronque en '%.*s' sur certains SYSTEMEs archaiques -1-.\n"          \
                                        ,nom_absolu                                                                                     \
                                        ,LONGUEUR_MAXIMALE_D_UN_NOM_ABSOLU_DE_FICHIER                                                   \
                                        ,nom_absolu                                                                                     \
                                         )                                                                                              \
                                        /* Le mot "archaiques" a ete introduit le 20060427121350...                                  */ \
                                  ,editer_les_messages_relatifs_a_la_longueur_absolue                                                   \
                                   );                                                                                                   \
                                        /* La procedure 'MESSAGES_DES_FICHIERS(...)' a ete introduite le 20070619101453...           */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Procedure de validation de la longueur des noms absolus de fichiers ; on notera que       */ \
                                        /* cette procedure ne passe par :                                                            */ \
                                        /*                                                                                           */ \
                                        /*        MESSAGES_DES_FICHIERS(fonction_d_impression,editer_les_messages_d_erreur)          */ \
                                        /*                                                                                           */ \
                                        /* afin d'editer systematiquement et imperativement ce message primordial...                 */ \
                                        /*                                                                                           */ \
                                        /* Ce qui precede fut remis en cause le 20070619101453...                                    */

DEFV(Common,DEFV(Logical,ZINT(valider_la_longueur_des_noms_relatifs_de_fichiers
                             ,VALIDER_LA_LONGUEUR_DES_NOMS_RELATIFS_DE_FICHIERS
                              )
                 )
     );
                                        /* Cet indicateur indique si la validation de la longueur des noms relatifs des fichiers     */
                                        /* doit avoir lieu ou pas. Ceci a ete introduit le 19991203143047 lors de l'activation       */
                                        /* de '$xcg/fichier_etat$K' dans 'v $Falias_TOUCH fichier_etat'.                             */
DEFV(Common,DEFV(Logical,ZINT(forcer_la_validation_de_la_longueur_des_noms_relatifs_de_fichiers,FAUX)));
                                        /* Cet indicateur fut introduit le 20070619172216 afin de pouvoir forcer ce type de          */
                                        /* message, meme si 'IL_NE_FAUT_PAS(editer_les_messages_d_erreur)'...                        */

#if       (         (defined(SYSTEME_DPX2000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_DPX5000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_SPS9_ROS_CC))                                                                                      \
          ||        (defined(SYSTEME_SPS9_ROS_RC))                                                                                      \
           )
#    define    VALIDATION_DES_NOMS_RELATIFS_DE_FICHIERS(nom_absolu,editer_les_messages_d_erreur)                                        \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(valider_la_longueur_des_noms_relatifs_de_fichiers))                                               \
                              Bblock                                                                                                    \
                              DEFV(Int,INIT(index_du_nom_relatif                                                                        \
                                           ,chain_recherche_dernier_caractere(nom_absolu,SEPARATEUR_DES_PATHS)                          \
                                            )                                                                                           \
                                   );                                                                                                   \
                                        /* Index de la composante relatif du 'nom absolu'.                                           */ \
                              Test(IFGT(chain_Xtaille(ADD2(nom_absolu,SUCC(index_du_nom_relatif)))                                      \
                                       ,LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER                                                   \
                                        )                                                                                               \
                                   )                                                                                                    \
                                   Bblock                                                                                               \
                                   DEFV(Logical,INIT(editer_les_messages_relatifs_a_la_longueur_relative                                \
                                                    ,IFOU(IL_FAUT(editer_les_messages_d_erreur)                                         \
                                                         ,IL_FAUT(forcer_la_validation_de_la_longueur_des_noms_relatifs_de_fichiers)    \
                                                          )                                                                             \
                                                     )                                                                                  \
                                        );                                                                                              \
                                        /* Indicateur local introduit le 20070619172216...                                           */ \
                                                                                                                                        \
                                   Test(IL_FAUT(editer_les_messages_relatifs_a_la_longueur_relative))                                   \
                                        /* Test (manquant depuis une eternite) introduit le 20070618144154...                        */ \
                                        Bblock                                                                                          \
                                        PRINT_ATTENTION("nom relatif de fichier trop long");                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   MESSAGES_DES_FICHIERS                                                                                \
                                       (Prer3("le nom '%s' risque d'etre tronque en '%.*s' sur certains SYSTEMEs archaiques -2-.\n"     \
                                             ,ADD2(nom_absolu,SUCC(index_du_nom_relatif))                                               \
                                             ,LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER                                             \
                                             ,ADD2(nom_absolu,SUCC(index_du_nom_relatif))                                               \
                                              )                                                                                         \
                                        /* Le mot "archaiques" a ete introduit le 20060427121350...                                  */ \
                                       ,editer_les_messages_relatifs_a_la_longueur_relative                                             \
                                        );                                                                                              \
                                        /* La procedure 'MESSAGES_DES_FICHIERS(...)' a ete introduite le 20070619101453...           */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                                        /* Procedure de validation de la longueur des noms relatifs de fichiers ; on notera que      */ \
                                        /* cette procedure ne passe par :                                                            */ \
                                        /*                                                                                           */ \
                                        /*        MESSAGES_DES_FICHIERS(fonction_d_impression,editer_les_messages_d_erreur)          */ \
                                        /*                                                                                           */ \
                                        /* afin d'editer systematiquement et imperativement ce message primordial...                 */ \
                                        /*                                                                                           */ \
                                        /* Ce qui precede fut remis en cause le 20070619101453...                                    */
#Aif      (         (defined(SYSTEME_DPX2000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_DPX5000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_SPS9_ROS_CC))                                                                                      \
          ||        (defined(SYSTEME_SPS9_ROS_RC))                                                                                      \
           )
#    define    VALIDATION_DES_NOMS_RELATIFS_DE_FICHIERS(nom_absolu,editer_les_messages_d_erreur)                                        \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(valider_la_longueur_des_noms_relatifs_de_fichiers))                                               \
                              Bblock                                                                                                    \
                              DEFV(Int,INIT(index_du_nom_relatif                                                                        \
                                           ,chain_recherche_dernier_caractere(nom_absolu,SEPARATEUR_DES_PATHS)                          \
                                            )                                                                                           \
                                   );                                                                                                   \
                                        /* Index de la composante relatif du 'nom absolu'.                                           */ \
                              Test(IFGT(chain_Xtaille(ADD2(nom_absolu,SUCC(index_du_nom_relatif)))                                      \
                                       ,LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER                                                   \
                                        )                                                                                               \
                                   )                                                                                                    \
                                   Bblock                                                                                               \
                                   DEFV(Logical,INIT(editer_les_messages_relatifs_a_la_longueur_relative                                \
                                                    ,IFOU(IL_FAUT(editer_les_messages_d_erreur)                                         \
                                                         ,IL_FAUT(forcer_la_validation_de_la_longueur_des_noms_relatifs_de_fichiers)    \
                                                          )                                                                             \
                                                     )                                                                                  \
                                        );                                                                                              \
                                        /* Indicateur local introduit le 20070619172216...                                           */ \
                                                                                                                                        \
                                   Test(IL_FAUT(editer_les_messages_relatifs_a_la_longueur_relative))                                   \
                                        /* Test (manquant depuis une eternite) introduit le 20070618144154...                        */ \
                                        Bblock                                                                                          \
                                        PRINT_ATTENTION("nom relatif de fichier trop long pour la portabilite");                        \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   MESSAGES_DES_FICHIERS                                                                                \
                                       (Prer3("Le nom '%s' risque d'etre tronque en '%.*s' sur certains SYSTEMEs archaiques -3-.\n"     \
                                             ,ADD2(nom_absolu,SUCC(index_du_nom_relatif))                                               \
                                             ,LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER                                             \
                                             ,ADD2(nom_absolu,SUCC(index_du_nom_relatif))                                               \
                                              )                                                                                         \
                                       ,editer_les_messages_relatifs_a_la_longueur_relative                                             \
                                        );                                                                                              \
                                        /* On notera que pour faire disparaitre ces messages (par exemple, lorsqu'ils sortent en     */ \
                                        /* grande quantite), il suffit de faire :                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  setenv    LONGUEUR_NOMS       <une grande valeur>                        */ \
                                        /*                                                                                           */ \
                                        /* ou '<une grande valeur>' symbolise une valeur superieure a la valeur implicite de         */ \
                                        /* '$LONGUEUR_NOMS' (par exemple 100...).                                                    */ \
                                        /*                                                                                           */ \
                                        /* Le mot "archaiques" a ete introduit le 20060427121350...                                  */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                                        /* Procedure de validation de la longueur des noms relatifs de fichiers.                     */
#Eif      (         (defined(SYSTEME_DPX2000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_DPX5000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_SPS9_ROS_CC))                                                                                      \
          ||        (defined(SYSTEME_SPS9_ROS_RC))                                                                                      \
           )

DEFV(Common,DEFV(CHAR,INIT(POINTERc(VALIDATION_DES_NOMS_DE_FICHIERS_____nom_du_fichier_courant),ADRESSE_NON_ENCORE_DEFINIE)));
                                        /* Introduit le 20180103103029 pour 'v $xiii/files$DEF Test__CODE_ERREUR__ERREUR07'...       */

#define   VALIDATION_DES_NOMS_DE_FICHIERS(nom_absolu,editer_les_messages_d_erreur)                                                      \
                    Bblock                                                                                                              \
                    EGAL(VALIDATION_DES_NOMS_DE_FICHIERS_____nom_du_fichier_courant,chain_Acopie(nom_absolu));                          \
                                        /* Introduit le 20180103103029 pour 'v $xiii/files$DEF Test__CODE_ERREUR__ERREUR07'...       */ \
                                        /*                                                                                           */ \
                                        /* On notera que la liberation de l'espace alloue au nom du fichier n'a lieu que dans        */ \
                                        /* 'v $xiii/files$DEF CALZ.FreCC.VALIDATION_DES_NOMS_DE_FICHIERS_____nom_du_fichier_courant' */ \
                                        /* et en fait, a condition que ce soit dans 'Test__CODE_ERREUR__ERREUR07' que ce nom soit    */ \
                                        /* utilise (mais c'est pour cela qu'il a ete cree...).                                       */ \
                                                                                                                                        \
                    VALIDATION_DES_NOMS_ABSOLUS_DE_FICHIERS(nom_absolu,editer_les_messages_d_erreur);                                   \
                    VALIDATION_DES_NOMS_RELATIFS_DE_FICHIERS(nom_absolu,editer_les_messages_d_erreur);                                  \
                    Eblock                                                                                                              \
                                        /* Procedure de validation de la longueur des noms de fichiers.                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V A L I D A T I O N   D E S   T A I L L E S   D E   F I C H I E R S  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NE_PAS_SEUILLER_LA_TAILLE_DES_FICHIERS                                                                                        \
                    INFINI                                                                                                              \
                                        /* Definition introduite le 20150127180549...                                                */

#define   VALIDATION_DES_TAILLES_DE_FICHIERS(nom_du_fichier,taille_du_fichier)                                                          \
                    Bblock                                                                                                              \
                    Test(IZLE(taille_du_fichier))                                                                                       \
                         Bblock                                                                                                         \
                         PRINT_ATTENTION("la taille du fichier est negative ou nulle");                                                 \
                         CAL1(Prer1("son nom est '%s'\n",nom_du_fichier));                                                              \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Procedure de validation de la taille des fichiers. On notera que l'on ne considere        */ \
                                        /* pas les tailles de fichiers comme des 'Positive's, mais comme des 'Int's (d'ou ce         */ \
                                        /* test) ; en effet, cela me parait difficile de faire actuellement cette operation...       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C E S   A   U N   F I C H I E R   N O N   F O R M A T T E  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* La fonction 'Fload_fichier_non_formatte(...)' a ete implantee ici le 20100317145025,      */
                                        /* alors qu'avant elle etait plus loin. Tout cela vient de l'introduction du nouveau         */
                                        /* type 'v $xil/defi_K2$vv$DEF FonctionIB'...                                                */

DEFV(Common,DEFV(Logical,ZINT(attendre_un_fichier_inexistant_ou_non_conforme
                             ,NE_PAS_ATTENDRE_UN_FICHIER_INEXISTANT_OU_NON_CONFORME
                              )
                 )
     );
                                        /* Cet indicateur indique s'il faut attendre ('VRAI') lorsqu'un fichier n'existe pas ou      */
                                        /* n'est pas conforme a ce que l'on attend (en taille par exemple), ou bien sortir en        */
                                        /* erreur immediatement ('FAUX'). On aura interet a utiliser alors :                         */
                                        /*                                                                                           */
                                        /*                  CAL1=FAUX                                                                */
                                        /*                                                                                           */
                                        /* afin de supprimer tous les messages d'erreur...                                           */
                                        /*                                                                                           */
                                        /* On notera le 20191008115536 que 'attendre_un_fichier_inexistant_ou_non_conforme' ne       */
                                        /* s'appelle pas :                                                                           */
                                        /*                                                                                           */
                                        /*        Fload_fichier_non_formatte_____attendre_un_fichier_inexistant_ou_non_conforme      */
                                        /*                                                                                           */
                                        /* a cause de l'usage 'v $xiii/files$FON attendre_un_fichier_inexistant_ou_non_conforme'     */
                                        /* tres certainement, d'ou sa mise hors {BFonctionI,EFonctionI} a cette date...              */

BFonctionI

DEFV(Common,DEFV(Positive,INIT(Fload_fichier_non_formatte_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

#define   SIZE_FICHIER                                                                                                                  \
                    MIN2(size_fichier,Fload_fichier_non_formatte_____seuil_size_fichier)
DEFV(Common,DEFV(Int,SINT(Fload_fichier_non_formatte_____seuil_size_fichier,NE_PAS_SEUILLER_LA_TAILLE_DES_FICHIERS)));
                                        /* Introduit le 20140623100350 afin de permettre, par exemple, de lire partiellement         */
                                        /* une image. On notera que la valeur par defaut fait que, sauf modification de cette        */
                                        /* valeur, c'est 'size_fichier' qui est utilise...                                           */

DEFV(Common,DEFV(Logical,SINT(Fload_fichier_non_formatte_____decompacter_1,FAUX)));
                                        /* A priori, on ne tente pas de faire un decompactage "simpliste"...                         */

#define   TEMPORISATION_MINIMALE_D_ITERATION_DE_LECTURE_D_UN_FICHIER                                                                    \
                    UN
#define   TEMPORISATION_MAXIMALE_D_ITERATION_DE_LECTURE_D_UN_FICHIER                                                                    \
                    SECONDES_PAR_MINUTE
#define   INCREMENT_DE_TEMPORISATION_D_ITERATION_DE_LECTURE_D_UN_FICHIER                                                                \
                    UN
                                        /* Lorsqu'il y a un probleme de lecture d'un fichier, on peut attendre un certain temps      */
                                        /* avant de renouveler l'operation. La duree de cette attente croit au cours du temps d'un   */
                                        /* minimum (1 seconde) a un maximum (60 secondes). Ce dispositif a ete mis en place le       */
                                        /* 1995042800.                                                                               */

DEFV(Common,DEFV(FonctionI,Fload_fichier_non_formatte(nom_du_fichier
                                                     ,fichier
                                                     ,size_fichier
                                                     ,unite_fichier
                                                     ,editer_les_messages_d_erreur
                                                     ,editer_les_messages_d_erreur_de_VALIDATION_DES_NOMS_DE_FICHIERS
                                                      )
                 )
     )
DEFV(Argument,DEFV(CHAR,DTb0(nom_du_fichier)));
                                        /* Nom du fichier a lire,                                                                    */
DEFV(Argument,DEFV(CHAR,DTb0(fichier)));
                                        /* Ou le mettre en memoire,                                                                  */
DEFV(Argument,DEFV(Int,size_fichier));
                                        /* Et taille en octets.                                                                      */
DEFV(Argument,DEFV(Int,unite_fichier));
                                        /* Nombre d'octets dans l'unite du fichier.                                                  */
DEFV(Argument,DEFV(Logical,editer_les_messages_d_erreur));
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */
                                        /* eventuels...                                                                              */
DEFV(Argument,DEFV(Logical,editer_les_messages_d_erreur_de_VALIDATION_DES_NOMS_DE_FICHIERS));
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */
                                        /* eventuels relatifs a 'VALIDATION_DES_NOMS_DE_FICHIERS(...)'. Ceci a ete introduit a       */
                                        /* cause de 'v $xiii/files$FON EXECUTE_PLUSIEURS_FONCTIONS.Fload_fichier_non_formatte.' le   */
                                        /* 20020626101948. En effet, dans le cas ou le premier 'Fload_fichier_non_formatte(...)'     */
                                        /* etait le "bon" et ou 'IL_NE_FAUT_PAS(attendre_un_fichier_inexistant_ou_non_conforme)',    */
                                        /* alors on etait dans le cas 'NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS'. Alors,     */
                                        /* les messages relatifs a 'VALIDATION_DES_NOMS_DE_FICHIERS(...)' n'apparaissaient pas...    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(vrai_Int_de_base,INIT(file_Rdescriptor,CANNOT_OPEN));
                                        /* Descripteur du fichier.                                                                   */
     DEFV(vrai_Int_de_base,INIT(etat_fichier,UNDEF));
                                        /* Etat du fichier.                                                                          */
     DEFV(FileStatus,file_status);
                                        /* Pour ranger les informations concernant le fichier.                                       */
     DEFV(Logical,INIT(tenter_l_ouverture,VRAI));
                                        /* Afin de tenter l'ouverture au moins une fois, et de l'iterer eventuellement...            */
     DEFV(Int,INIT(temporisation_d_iteration_de_lecture_d_un_fichier,TEMPORISATION_MINIMALE_D_ITERATION_DE_LECTURE_D_UN_FICHIER));
                                        /* Lorsqu'il y a un probleme de lecture d'un fichier, on peut attendre un certain temps      */
                                        /* avant de renouveler l'operation. La duree de cette attente croit au cours du temps d'un   */
                                        /* minimum (1 seconde) a un maximum (60 secondes). Ce dispositif a ete mis en place le       */
                                        /* 1995042800.                                                                               */
     /*..............................................................................................................................*/
     VALIDATION_DES_NOMS_DE_FICHIERS(nom_du_fichier,editer_les_messages_d_erreur_de_VALIDATION_DES_NOMS_DE_FICHIERS);

     Tant(IL_FAUT(tenter_l_ouverture))
          Bblock
          EGAL(file_Rdescriptor,Open(nom_du_fichier,OPEN_READ));
                                        /* Tentative d'ouverture du fichier en lecture.                                              */
          Test(IFEQ(file_Rdescriptor,CANNOT_OPEN))
               Bblock
               MESSAGES_DES_FICHIERS(Prer1("Impossible d'ouvrir le fichier de nom '%s'.\n",nom_du_fichier)
                                    ,editer_les_messages_d_erreur
                                     );
                                        /* Et on abandonne...                                                                        */
               CODE_ERROR(ERREUR01);
               Eblock
          ATes
               Bblock
               EGAL(etat_fichier,Fsta(file_Rdescriptor,file_status));
               Test(IFNE(etat_fichier,OK))
                    Bblock
                    MESSAGES_DES_FICHIERS(Prer1("BIZARRE : on a pu ouvrir le fichier '%s', mais pas son etat.\n",nom_du_fichier)
                                         ,editer_les_messages_d_erreur
                                          );
                    CODE_ERROR(ERREUR02);
                    Eblock
               ATes
                    Bblock
                    DEFV(Logical,INIT(il_y_a_decompactage_1,Fload_fichier_non_formatte_____decompacter_1));
                                        /* Indicateur precisant s'il y a eu effectivement decompactage lorsqu'il a ete demande...    */
                    DEFV(Float,INIT(size_fichier_a_lire,FLOT(ASD1(file_status,st_size))));
                                        /* Taille maximale souhaitee pour la version a decompacter.                                  */
                                        /*                                                                                           */
                                        /* Le passage de 'Int' a 'Float' a eu lieu le 20060523092942 a cause (eventuellement...)     */
                                        /* de 'v $xil/defi_c1$vv$DEF 20060520121632'.                                                */
                    DEFV(Logical,INIT(de_la_memoire_a_ete_allouee_pour_le_fichier_a_decompacter,FAUX));
                    DEFV(CHAR,INIT(POINTERc(fichier_a_decompacter),CHAINE_UNDEF));
                                        /* Zone de manoeuvre ou mettre le fichier a decompacter, l'indicateur d'allocation           */
                                        /* effective ayant ete introduit le 20120206075618 (bien tardivement...).                    */

                    Test(IFNE(size_fichier_a_lire,fINTE(size_fichier_a_lire)))
                                        /* Test introduit le 20060523092942 a cause de 'v $xil/defi_c1$vv$DEF 20060520121632'...     */
                         Bblock
                         PRINT_ERREUR("la taille d'un fichier est trop grande lors d'un acces");
                         CAL1(Prer2("son nom est '%s' et sa taille est %.0f"
                                   ,nom_du_fichier
                                   ,size_fichier_a_lire
                                    )
                              );
                         CAL1(Prer1(" alors qu'elle est limitee actuellement a %" ## BFd ## ".\n"
                                   ,fINTE(size_fichier_a_lire)
                                    )
                              );
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IL_FAUT(Fload_fichier_non_formatte_____decompacter_1))
                         Bblock
                         Test(IFEQ(size_fichier_a_lire,FLOT(SIZE_FICHIER)))
                              Bblock
                              EGAL(il_y_a_decompactage_1,FAUX);
                                        /* Dans ces conditions, lorsque la taille du fichier lu est egale a la taille attendue, on   */
                                        /* admet qu'il n'y a pas a decompacter...                                                    */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(EST_VRAI(il_y_a_decompactage_1))
                         Bblock
                         DEFV(Int,INIT(size_fichier_decompacte,UNDEF));
                                        /* Taille reelle occupee par la version decompactee.                                         */

                         ckMalo(fichier_a_decompacter,INTE(size_fichier_a_lire),Fload_fichier_non_formatte_____compteur_des_kMalo);
                         EGAL(de_la_memoire_a_ete_allouee_pour_le_fichier_a_decompacter,VRAI);
                                        /* Allocation de la memoire temporaire necessaire.                                           */

                         CALZ(Read(file_Rdescriptor,fichier_a_decompacter,INTE(size_fichier_a_lire)));
                                        /* Tentative de lecture d'un fichier a decompacter.                                          */

                         EGAL(size_fichier_decompacte
                             ,Ftentative_de_decompactage_1(fichier,SIZE_FICHIER,unite_fichier
                                                          ,fichier_a_decompacter,INTE(size_fichier_a_lire)
                                                           )
                              );
                                        /* Tentative de decompactage...                                                              */

                         Test(IFET(IFNE(FLOT(size_fichier_decompacte),size_fichier_a_lire)
                                  ,IFEQ(size_fichier_decompacte,SIZE_FICHIER)
                                   )
                              )
                              Bblock
                                        /* Cas ou le decompactage a reussi : rien d'autre a faire...                                 */
                              Eblock
                         ATes
                              Bblock
                                        /* Cas ou le decompactage a echoue :                                                         */
                              EGAL(il_y_a_decompactage_1,FAUX);
                                        /* Dans ces conditions on va relire le fichier comme s'il etait non compacte...              */

                              CALZ(Clos(file_Rdescriptor));
                              EGAL(file_Rdescriptor,Open(nom_du_fichier,OPEN_READ));
                                        /* On est donc oblige de le refermer et de le reouvrir immediatement en lecture...           */
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(EST_FAUX(il_y_a_decompactage_1))
                         Bblock
                         Test(IFET(IFNE(size_fichier_a_lire,FLOT(SIZE_FICHIER))
                                  ,IFEQ(Fload_fichier_non_formatte_____seuil_size_fichier,NE_PAS_SEUILLER_LA_TAILLE_DES_FICHIERS)
                                   )
                              )
                                        /* Cas ou la taille du fichier lu semble incorrecte et ou il apparait que de plus            */
                                        /* 'Fload_fichier_non_formatte_____seuil_size_fichier' n'a pas ete modifie (test             */
                                        /* complementaire introduit le 20150127180549 car il manquait dramatiquement...).            */
                                        /* On ne peut donc pas valider 'size_fichier_a_lire'...                                      */
                              Bblock
                              MESSAGES_DES_FICHIERS(Prer3("La taille du fichier '%s' (%.0f) devrait etre %" ## BFd ## " en fait.\n"
                                                         ,nom_du_fichier
                                                         ,size_fichier_a_lire
                                                         ,SIZE_FICHIER
                                                          )
                                                   ,editer_les_messages_d_erreur
                                                    );
                              CODE_ERROR(ERREUR03);
                              Eblock
                         ATes
                              Bblock
                                        /* Si 'Fload_fichier_non_formatte_____seuil_size_fichier' a ete modifie, on est alors        */
                                        /* dans l'incapacite de valider 'size_fichier_a_lire'...                                     */
                              Test(IFLT(SIZE_FICHIER,size_fichier))
                                   Bblock
                                   DEFV(Int,INIT(index_de_nettoyage,UNDEF));
                                        /* Index de nettoyage de 'fichier'.                                                          */

                                   DoIn(index_de_nettoyage,PREMIER_CARACTERE,LSTX(PREMIER_CARACTERE,size_fichier),I)
                                        Bblock
                                        EGAL(ITb0(fichier,INDX(index_de_nettoyage,PREMIER_CARACTERE)),K_NULL);
                                        /* Nettoyage introduit le 20141006103657, c'est plus prudent. On notera que ce nettoyage     */
                                        /* n'est pas optimise : en effet, on pourrait ne nettoyer que la parte non chargee (qui      */
                                        /* correspond a 'size_fichier-SIZE_FICHIER'), mais simplifions les choses...                 */
                                        Eblock
                                   EDoI
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

                              CALZ(Read(file_Rdescriptor,fichier,SIZE_FICHIER));
                                        /* Quand il n'y a pas de decompactage demande, ou alors lorsque celui-ci a echoue, on lit    */
                                        /* le fichier comme s'il etait non compacte...                                               */
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(EST_VRAI(de_la_memoire_a_ete_allouee_pour_le_fichier_a_decompacter))
                         Bblock
                         CALZ_FreFF(fichier_a_decompacter);
                                        /* Lorsqu'un decompactage a ete demande, et meme s'il a echoue, il faut rendre la memoire    */
                                        /* temporaire allouee.                                                                       */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ETes

               CALZ(Clos(file_Rdescriptor));
                                        /* Et on ferme le fichier.                                                                   */
               Eblock
          ETes

          Test(IFOU(PAS_D_ERREUR(CODE_ERREUR),IL_NE_FAUT_PAS(attendre_un_fichier_inexistant_ou_non_conforme)))
               Bblock
               EGAL(tenter_l_ouverture,FAUX);
                                        /* On arrete de tenter des ouvertures lorsque le fichier a pu etre ouvert, ou bien s'il      */
                                        /* a eu erreur, et qu'il n'est pas demande de boucler sur ce type d'erreur...                */
               Eblock
          ATes
               Bblock
               EGAL(CODE_ERREUR,OK);
                                        /* On efface l'erreur...                                                                     */
               DODO(temporisation_d_iteration_de_lecture_d_un_fichier);
                                        /* On attend un peu avant de renouveler l'operation...                                       */
               EGAL(temporisation_d_iteration_de_lecture_d_un_fichier
                   ,MIN2(ADD2(temporisation_d_iteration_de_lecture_d_un_fichier
                             ,INCREMENT_DE_TEMPORISATION_D_ITERATION_DE_LECTURE_D_UN_FICHIER
                              )
                        ,TEMPORISATION_MAXIMALE_D_ITERATION_DE_LECTURE_D_UN_FICHIER
                         )
                    );
                                        /* Lorsqu'il y a un probleme de lecture d'un fichier, on peut attendre un certain temps      */
                                        /* avant de renouveler l'operation. La duree de cette attente croit au cours du temps d'un   */
                                        /* minimum (1 seconde) a un maximum (60 secondes). Ce dispositif a ete mis en place le       */
                                        /* 1995042800.                                                                               */
               Eblock
          ETes
          Eblock
     ETan

     RETU_ERROR;
     Eblock

#undef    INCREMENT_DE_TEMPORISATION_D_ITERATION_DE_LECTURE_D_UN_FICHIER
#undef    TEMPORISATION_MAXIMALE_D_ITERATION_DE_LECTURE_D_UN_FICHIER
#undef    TEMPORISATION_MINIMALE_D_ITERATION_DE_LECTURE_D_UN_FICHIER

#undef    SIZE_FICHIER

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E S T   D E   L ' E X I S T E N C E   D ' U N   F I C H I E R  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(Logical,SINT(Ftest_fichier_____accepter_un_fichier_inexistant,FAUX)));
                                        /* Indicateur introduit le 20250102083203 pour renvoyer certaines valeurs compatibles avec   */
                                        /* ce cas...                                                                                 */

DEFV(Common,DEFV(Logical,SINT(Ftest_fichier_____ouvrir_le_fichier,VRAI)));
                                        /* Indicateur introduit le 20060520092111 pour resoudre le probleme rencontre dans ces       */
                                        /* moments la et decrits dans 'v $xcg/fichier_etat$K 20060519191756'...                      */

DEFV(Common,DEFV(Logical,SINT(Ftest_fichier_____informations_utiles,LUNDEF)));
                                        /* Afin de savoir si ce qui suit est valide ('VALIDE') ou pas ('INVALIDE').                  */

DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____numero_d_Inode,UNDEF)));

DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____mode,UNDEF)));

DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____identificateur_d_utilisateur,UNDEF)));
DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____identificateur_de_groupe,UNDEF)));

DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____date_du_dernier_acces,UNDEF)));
DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____date_de_la_derniere_modification,UNDEF)));
DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____date_du_dernier_changement_d_etat,UNDEF)));

DEFV(Common,DEFV(Float,INIT(Ftest_fichier_____longueur_du_fichier,FLOT__UNDEF)));
                                        /* Quelques valeurs utiles apres un 'Fsta(...)' reussi. On notera que les "dates" sont       */
                                        /* exprimees en secondes ecoulees depuis le 01/01/1970 00:00:00 UTC.                         */
                                        /*                                                                                           */
                                        /* Le 20060520122032, il y a eu passage de 'Positive' a 'Float' a cause du probleme          */
                                        /* 'v $xcg/fichier_etat$K 20060519191756'. Cela permet d'etendre considerablement les        */
                                        /* tailles possibles des fichiers (en franchissant en particulier la barriere d'une          */
                                        /* representation entiere sur 31 bits...).                                                   */

DEFV(Common,DEFV(Logical,SINT(Ftest_fichier_____modifier_date_du_dernier_acces_et_date_de_la_derniere_modification,FAUX)));
DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____nouvelle_date_du_dernier_acces,UNDEF)));
DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____nouvelle_date_de_la_derniere_modification,UNDEF)));
                                        /* Afin de pouvoir modifier si necessaire les dates de dernier acces et de derniere          */
                                        /* modification (introduit le 19991104095138).                                               */

DEFV(Common,DEFV(Logical,SINT(Ftest_fichier_____modifier_mode,FAUX)));
DEFV(Common,DEFV(Positive,INIT(Ftest_fichier_____nouveau_mode,UNDEF)));
                                        /* Afin de pouvoir modifier si necessaire le mode (introduit le 19991104095138).             */

#nodefine Ftest_fichier_____clef_du_fichier_VERSION_01                                                                                  \
                                        /* Fait un 'OUEX(...)' de tous les octets du fichier.                                        */
#nodefine Ftest_fichier_____clef_du_fichier_VERSION_02                                                                                  \
                                        /* Fait un 'OUEX(...)' de tous les octets du fichier ponderes par leur rang dans le fichier. */
#nodefine Ftest_fichier_____clef_du_fichier_VERSION_03                                                                                  \
                                        /* Fait un 'OUEX(...)' de tous les octets du fichier incrementes d'une unite (afin de n'etre */ \
                                        /* jamais nuls...) puis ponderes par leur rang dans le fichier.                              */
#nodefine Ftest_fichier_____clef_du_fichier_VERSION_04                                                                                  \
                                        /* Fait un 'ADD2(...)' de tous les octets du fichier incrementes d'une unite (afin de n'etre */ \
                                        /* jamais nuls...) puis ponderes par leur rang dans le fichier.                              */
#nodefine Ftest_fichier_____clef_du_fichier_VERSION_05                                                                                  \
                                        /* Fait un 'ADD2(...)' de tous les octets du fichier incrementes d'une unite (afin de n'etre */ \
                                        /* jamais nuls...) puis ponderes par leur rang "modulo" (afin d'eviter des debordements et   */ \
                                        /* donc des problemes de portabilite...) dans le fichier.                                    */
#define   Ftest_fichier_____clef_du_fichier_VERSION_06                                                                                  \
                                        /* Fait un 'OUEX(...)' (afin de ne pas rencontrer de problemes de debordement comme cela est */ \
                                        /* le cas avec 'ADD2(...)') de tous les octets du fichier incrementes d'une unite (afin de   */ \
                                        /* n'etre jamais nuls...) puis ponderes par leur rang "modulo" (afin d'eviter des            */ \
                                        /* debordements et donc des problemes de portabilite...) dans le fichier.                    */

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____Ftest_fichier_____clef_du_fichier_VERSION_01));
                                        /* Introduit le 20030805111250.                                                              */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_01                          /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____Ftest_fichier_____clef_du_fichier_VERSION_02));
                                        /* Introduit le 20030805114738.                                                              */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_02                          /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_03                          /* Common,DEFV(Fonction,) : avec 'VERSION_03'.       */
DEFV(Common,DEFV(Logical,_____Ftest_fichier_____clef_du_fichier_VERSION_03));
                                        /* Introduit le 20030805175647.                                                              */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_03                          /* Common,DEFV(Fonction,) : avec 'VERSION_03'.       */
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_03                          /* Common,DEFV(Fonction,) : avec 'VERSION_03'.       */

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_04                          /* Common,DEFV(Fonction,) : avec 'VERSION_04'.       */
DEFV(Common,DEFV(Logical,_____Ftest_fichier_____clef_du_fichier_VERSION_04));
                                        /* Introduit le 20030805175647.                                                              */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_04                          /* Common,DEFV(Fonction,) : avec 'VERSION_04'.       */
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_04                          /* Common,DEFV(Fonction,) : avec 'VERSION_04'.       */

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_05                          /* Common,DEFV(Fonction,) : avec 'VERSION_05'.       */
DEFV(Common,DEFV(Logical,_____Ftest_fichier_____clef_du_fichier_VERSION_05));
                                        /* Introduit le 20030805183253.                                                              */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_05                          /* Common,DEFV(Fonction,) : avec 'VERSION_05'.       */
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_05                          /* Common,DEFV(Fonction,) : avec 'VERSION_05'.       */

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_06                          /* Common,DEFV(Fonction,) : avec 'VERSION_06'.       */
DEFV(Common,DEFV(Logical,_____Ftest_fichier_____clef_du_fichier_VERSION_06));
                                        /* Introduit le 20030808104628.                                                              */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_06                          /* Common,DEFV(Fonction,) : avec 'VERSION_06'.       */
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_06                          /* Common,DEFV(Fonction,) : avec 'VERSION_06'.       */

#define   CLEF_DU_FICHIER_PAR_DEFAUT                                                                                                    \
                    UNDEF                                                                                                               \
                                        /* Definition introduite le 20060522152543...                                                */

DEFV(Common,DEFV(Logical,SINT(Ftest_fichier_____generer_une_clef_du_fichier,FAUX)));
DEFV(Common,DEFV(Positive,SINT(Ftest_fichier_____longueur_maximale_du_fichier_pour_generer_une_clef_du_fichier,INFINI)));
DEFV(Common,DEFV(Positive,SINT(Ftest_fichier_____clef_du_fichier,CLEF_DU_FICHIER_PAR_DEFAUT)));
                                        /* Afin de pouvoir generer si besoin une clef caracteristique (introduit le 20030805111250). */
                                        /* On notera que si 'IL_NE_FAUT_PAS(Ftest_fichier_____ouvrir_le_fichier)' c'est la valeur    */
                                        /* par defaut ('UNDEF') qui sera renvoyee si                                                 */
                                        /* 'IL_FAUT(Ftest_fichier_____generer_une_clef_du_fichier' puisqu'alors le calcul n'est      */
                                        /* pas effectue...                                                                           */

DEFV(Common,DEFV(FonctionI,Ftest_fichier(nom_du_fichier,editer_les_messages_d_erreur)))
DEFV(Argument,DEFV(CHAR,DTb0(nom_du_fichier)));
                                        /* Nom du fichier a tester.                                                                  */
DEFV(Argument,DEFV(Logical,editer_les_messages_d_erreur));
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */
                                        /* eventuels...                                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(vrai_Int_de_base,INIT(file_Rdescriptor,CANNOT_OPEN));
                                        /* Descripteur du fichier.                                                                   */
     DEFV(vrai_Int_de_base,INIT(etat_fichier,UNDEF));
                                        /* Etat du fichier.                                                                          */
     DEFV(FileStatus,file_status);
                                        /* Pour ranger les informations concernant le fichier.                                       */
     /*..............................................................................................................................*/
     EGAL(Ftest_fichier_____informations_utiles,INVALIDE);
                                        /* A priori, les informations de type 'Ftest_fichier_???' ne sont pas valides...             */

     VALIDATION_DES_NOMS_DE_FICHIERS(nom_du_fichier,editer_les_messages_d_erreur);

     Test(IL_FAUT(Ftest_fichier_____ouvrir_le_fichier))
                                        /* Test introduit le 20060520092111...                                                       */
          Bblock
          EGAL(file_Rdescriptor,Open(nom_du_fichier,OPEN_READ));
                                        /* Tentative d'ouverture du fichier en lecture.                                              */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(IFET(IL_FAUT(Ftest_fichier_____ouvrir_le_fichier),IFEQ(file_Rdescriptor,CANNOT_OPEN)))
          Bblock
          Test(IL_FAUT(Ftest_fichier_____accepter_un_fichier_inexistant))
                                        /* Test introduit le 20250102083203...                                                       */
               Bblock
               EGAL(Ftest_fichier_____date_du_dernier_acces,ZERO);
               EGAL(Ftest_fichier_____date_de_la_derniere_modification,ZERO);
               EGAL(Ftest_fichier_____date_du_dernier_changement_d_etat,ZERO);

               EGAL(Ftest_fichier_____longueur_du_fichier,FZERO);

               EGAL(Ftest_fichier_____informations_utiles,VALIDE);
                                        /* Et on fait comme si ces informations etaient valides...                                   */

               CODE_ERROR(OK);
                                        /* On renvoie ainsi des valeurs compatibles avec l'inexistence du fichier...                 */
               Eblock
          ATes
               Bblock
               CODE_ERROR(ERREUR08);
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          EGAL(etat_fichier
              ,COND(IL_FAUT(Ftest_fichier_____ouvrir_le_fichier)
                   ,Fsta(file_Rdescriptor,file_status)
                   ,Feta(nom_du_fichier,file_status)
                    )
               );

          Test(IFNE(etat_fichier,OK))
               Bblock
               CODE_ERROR(ERREUR09);
               Eblock
          ATes
               Bblock
               EGAL(Ftest_fichier_____informations_utiles,VALIDE);

               EGAL(Ftest_fichier_____numero_d_Inode,POSI(ASD1(file_status,st_ino)));

               EGAL(Ftest_fichier_____mode,POSI(ASD1(file_status,st_mode)));
                                        /* ATTENTION, la signification des differents bits est dans 'v /usr/include/sys/stat.h MODE' */
                                        /* et qu'en ce qui concerne le mode, au sens 'chmod', les valeurs donnees dans ce fichier    */
                                        /* sont on octal et non en hexa-decimal. Ainsi, par exemple, un fichier en mode 'ro/EXEC'    */
                                        /* (ce qui donne par 'll' le mode '-r-x------'), donnera ici la valeur '0x8140', ce qui      */
                                        /* correspond aux bits :                                                                     */
                                        /*                                                                                           */
                                        /*                  S_IFREG             0x8000                                               */
                                        /*                  S_IREAD             0x0400                                               */
                                        /*                  S_IEXEC             0x0100                                               */
                                        /*                                                                                           */
                                        /* surprenant...                                                                             */

               EGAL(Ftest_fichier_____identificateur_d_utilisateur,POSI(ASD1(file_status,st_uid)));
               EGAL(Ftest_fichier_____identificateur_de_groupe,POSI(ASD1(file_status,st_gid)));

@define   FS_Atime  ASD2(file_status,st_atim,tv_sec)
@define   FS_Ctime  ASD2(file_status,st_ctim,tv_sec)
@define   FS_Mtime  ASD2(file_status,st_mtim,tv_sec)

@if       (         (defined(SYSTEME_APC_LinuxDebian_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxMandrake_GCC))                                                                            \
          ||        (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
          ||        (defined(SYSTEME_HP705_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP710_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP720_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP750_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP755_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP819_HPUX_CC))                                                                                    \
           )
@    undef     FS_Atime
@    undef     FS_Ctime
@    undef     FS_Mtime

@    define    FS_Atime  ASD1(file_status,st_atime)
@    define    FS_Ctime  ASD1(file_status,st_ctime)
@    define    FS_Mtime  ASD1(file_status,st_mtime)
@Aif      (         (defined(SYSTEME_APC_LinuxDebian_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxMandrake_GCC))                                                                            \
          ||        (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
          ||        (defined(SYSTEME_HP705_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP710_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP720_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP750_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP755_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP819_HPUX_CC))                                                                                    \
           )
@Eif      (         (defined(SYSTEME_APC_LinuxDebian_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxMandrake_GCC))                                                                            \
          ||        (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
          ||        (defined(SYSTEME_HP705_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP710_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP720_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP750_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP755_HPUX_CC))                                                                                    \
          ||        (defined(SYSTEME_HP819_HPUX_CC))                                                                                    \
           )

               EGAL(Ftest_fichier_____date_du_dernier_acces,POSI(FS_Atime));
               EGAL(Ftest_fichier_____date_du_dernier_changement_d_etat,POSI(FS_Ctime));
               EGAL(Ftest_fichier_____date_de_la_derniere_modification,POSI(FS_Mtime));

@undef    FS_Atime
@undef    FS_Ctime
@undef    FS_Mtime

               EGAL(Ftest_fichier_____longueur_du_fichier,FLOT(ASD1(file_status,st_size)));
                                        /* Le 20060520122032, il y a eu passage de 'POSI' a 'FLOT' a cause du probleme               */
                                        /* 'v $xcg/fichier_etat$K 20060519191756'. Cela permet d'etendre considerablement les        */
                                        /* tailles possibles des fichiers (en franchissant en particulier la barriere d'une          */
                                        /* representation entiere sur 31 bits...).                                                   */

                                        /* Quelques valeurs utiles apres un 'Fsta(...)' reussi...                                    */
               Eblock
          ETes

          Test(IL_FAUT(Ftest_fichier_____modifier_date_du_dernier_acces_et_date_de_la_derniere_modification))
               Bblock
               Test(IL_FAUT(Ftest_fichier_____ouvrir_le_fichier))
                                        /* Test introduit le 20060520092111...                                                       */
                    Bblock
                    DEFV(STRU(utimbuf),date_du_dernier_acces_et_date_de_la_derniere_modification);
                                        /* Pour ranger les dates de dernier acces et de derniere modification.                       */

                    EGAL(ASD1(date_du_dernier_acces_et_date_de_la_derniere_modification,actime)
                        ,Ftest_fichier_____nouvelle_date_du_dernier_acces
                         );
                    EGAL(ASD1(date_du_dernier_acces_et_date_de_la_derniere_modification,modtime)
                        ,Ftest_fichier_____nouvelle_date_de_la_derniere_modification
                         );

                    CALZ(Fchmod(file_Rdescriptor,OUIN(S_IRUSR,S_IWUSR)));
                    CALZ(Utime(nom_du_fichier,date_du_dernier_acces_et_date_de_la_derniere_modification));
                    CALZ(Fchmod(file_Rdescriptor,Ftest_fichier_____mode));
                                        /* Changement des dates de dernier acces et de derniere modification, avec pour cela         */
                                        /* un changement temporaire du mode du fichier (les modes 'S_IRUSR' et 'S_IWUSR' sont        */
                                        /* definis dans 'v /usr/include/sys/stat$h S_IRUSR').                                        */

                    EGAL(Ftest_fichier_____modifier_date_du_dernier_acces_et_date_de_la_derniere_modification,FAUX);
                                        /* Afin de plus pouvoir modifier les dates de dernier acces et de derniere modification      */
                                        /* (introduit le 19991104095138).                                                            */
                    Eblock
               ATes
                    Bblock
                    PRINT_ERREUR("les differentes dates d'un fichier ne peuvent etre modifiees lorsque celui-ci n'a pas ete ouvert");
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IL_FAUT(Ftest_fichier_____modifier_mode))
               Bblock
               Test(IL_FAUT(Ftest_fichier_____ouvrir_le_fichier))
                                        /* Test introduit le 20060520092111...                                                       */
                    Bblock
                    CALZ(Fchmod(file_Rdescriptor,Ftest_fichier_____nouveau_mode));
                                        /* Changement du mode du fichier.                                                            */

                    EGAL(Ftest_fichier_____modifier_mode,FAUX);
                                        /* Afin de ne plus pouvoir modifier le mode (introduit le 19991104095138).                   */
                    Eblock
               ATes
                    Bblock
                    PRINT_ERREUR("le mode d'un fichier ne peut etre modifie lorsque celui-ci n'a pas ete ouvert");
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IL_FAUT(Ftest_fichier_____ouvrir_le_fichier))
                                        /* Test introduit le 20060520092111...                                                       */
               Bblock
               CALZ(Clos(file_Rdescriptor));
                                        /* Et on ferme le fichier.                                                                   */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          EGAL(Ftest_fichier_____clef_du_fichier,Ftest_fichier_____CLEF_NON_DEFINIE);
                                        /* A priori, la clef n'est pas connue...                                                     */

          Test(IFEQ(etat_fichier,OK))
               Bblock
               Test(IL_FAUT(Ftest_fichier_____generer_une_clef_du_fichier))
                    Bblock
                                        /* Ce dispositif de generation d'une clef a ete introduit le 20030805111250.                 */
                    Test(IL_FAUT(Ftest_fichier_____ouvrir_le_fichier))
                                        /* Test introduit le 20060520092111...                                                       */
                         Bblock
                         Test(IFNE(Ftest_fichier_____longueur_du_fichier,fINTE(Ftest_fichier_____longueur_du_fichier)))
                                        /* Test introduit le 20060522150151 a cause de la modification du 20060520122032 qui a fait  */
                                        /* passer le type de 'Ftest_fichier_____longueur_du_fichier' de 'Positive' a 'Float', alors  */
                                        /* que l'argument correspondant de 'Fload_fichier_non_formatte(...)' ci-apres est reste de   */
                                        /* type 'Int' ; il faut donc verifier (si 'IL_FAUT(Ftest_fichier_____ouvrir_le_fichier)')    */
                                        /* que la valeur de 'Ftest_fichier_____longueur_du_fichier' peut tenir (dans ce cas          */
                                        /* particulier donc) dans un 'Int'...                                                        */
                              Bblock
                              PRINT_ERREUR("la taille d'un fichier est trop grande lors d'une demande de generation de clef");
                              CAL1(Prer3("son nom est '%s' et sa taille est %.0f alors qu'elle est limitee a %" ## BFd ## ".\n"
                                        ,nom_du_fichier
                                        ,Ftest_fichier_____longueur_du_fichier
                                        ,fINTE(Ftest_fichier_____longueur_du_fichier)
                                         )
                                   );
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes

                         Test(IFET(IFLE(Ftest_fichier_____longueur_du_fichier
                                       ,FLOT(Ftest_fichier_____longueur_maximale_du_fichier_pour_generer_une_clef_du_fichier)
                                        )
                                  ,IZGT(Ftest_fichier_____longueur_du_fichier)
                                   )
                              )
                                        /* Le cas des fichiers vides a ete introduit le 20030829102338 car cela manquait, or il      */
                                        /* en existe (par exemple : 'v $Falias_SEvide'...).                                          */
                              Bblock
                                        /* La generation d'une clef etant une operation "lourde", elle n'est effectuee que si        */
                                        /* le fichier est suffisamment petit (introduit le 20030805175647).                          */
                              DEFV(CHAR,INIT(POINTERc(caracteres_du_fichier),CHAINE_UNDEF));
                                        /* Zone dynamique contenant le fichier,                                                      */
                              DEFV(Int,INIT(index_du_fichier,UNDEF));
                                        /* Index de balayage du fichier...                                                           */

                              ckMalo(caracteres_du_fichier
                                    ,INTE(Ftest_fichier_____longueur_du_fichier)
                                    ,Ftest_fichier_____compteur_des_kMalo
                                     );
                                        /* Demande d'allocation memoire pour le fichier.                                             */
                              CALS(Fload_fichier_non_formatte(nom_du_fichier
                                                             ,caracteres_du_fichier
                                                             ,INTE(Ftest_fichier_____longueur_du_fichier)
                                                             ,size_char
                                                             ,editer_les_messages_d_erreur
                                                             ,editer_les_messages_d_erreur
                                                              )
                                   );
                                        /* Chargement du fichier...                                                                  */
                                        /*                                                                                           */
                                        /* Le 20060520122032, il y a eu introduction de 'INTE(...)' ci-dessus a cause du probleme    */
                                        /* 'v $xcg/fichier_etat$K 20060519191756'...                                                 */

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_01
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_01
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_01

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_02
#    define    CLEF_NON_NULLE(valeur)                                                                                                   \
                         SUCC(valeur)
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_02
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_02

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_03
#    define    CLEF_NON_NULLE(valeur)                                                                                                   \
                         SUCC(valeur)
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_03
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_03

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_04
#    define    CLEF_NON_NULLE(valeur)                                                                                                   \
                         SUCC(valeur)
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_04
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_04

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_05
#    define    POUR_LIMITER_LA_CLEF_Ftest_fichier_____clef_du_fichier                                                                   \
                         MILLE
#    define    CLEF_NON_NULLE(valeur)                                                                                                   \
                         SUCC(valeur)
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_05
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_05

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_06
#    define    POUR_LIMITER_LA_CLEF_Ftest_fichier_____clef_du_fichier                                                                   \
                         MILLION
#    define    CLEF_NON_NULLE(valeur)                                                                                                   \
                         SUCC(valeur)
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_06
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_06

#if       (         (defined(Ftest_fichier_____clef_du_fichier_VERSION_05))                                                             \
          ||        (defined(Ftest_fichier_____clef_du_fichier_VERSION_06))                                                             \
           )
                              begin_nouveau_block
                                   Bblock
                                   DEFV(Positive,INIT(maximum__1
                                                     ,CLEF_NON_NULLE(POUR_LIMITER_LA_CLEF_Ftest_fichier_____clef_du_fichier)
                                                      )
                                        );
                                   DEFV(Positive,INIT(maximum__2,CLEF_NON_NULLE(MOCD)));
                                   DEFV(Positive,INIT(maximum_12,UNDEF));
                                   DEFV(Positive,INIT(maximum__3,UNDEF));
                                   EGAL(maximum_12,MUL2(maximum__1,maximum__2));
                                   EGAL(maximum__3,DIVI(maximum_12,maximum__2));
                                        /* Ceci a ete introduit le 20030814104045 dans l'espoir de garantir la bonne execution       */
                                        /* du test qui suit. En effet, rien ne garantit que le compilateur a qui l'on fait calculer  */
                                        /* une expression du type '(L*M)/M' ne la simplifie pas logiquement en 'L'...                */

                                   Test(IFNE(maximum__3,maximum__1))
                                        Bblock
                                        PRINT_ATTENTION("risque de problemes de portabilite du debordement de la clef)");
                                        Eblock
                                   ATes
                                        Bblock
                                        Eblock
                                   ETes
                                   Eblock
                              end_nouveau_block
#Aif      (         (defined(Ftest_fichier_____clef_du_fichier_VERSION_05))                                                             \
          ||        (defined(Ftest_fichier_____clef_du_fichier_VERSION_06))                                                             \
           )
#Eif      (         (defined(Ftest_fichier_____clef_du_fichier_VERSION_05))                                                             \
          ||        (defined(Ftest_fichier_____clef_du_fichier_VERSION_06))                                                             \
           )

                              EGAL(Ftest_fichier_____clef_du_fichier,ZERO);
                                        /* Initialisation de la clef...                                                              */

                              DoIn(index_du_fichier
                                  ,PREMIER_CARACTERE
                                  ,LSTX(PREMIER_CARACTERE,INTE(Ftest_fichier_____longueur_du_fichier))
                                  ,I
                                   )
                                   Bblock
                                   DEFV(Int,INIT(rang_de_l_octet_courant_dans_le_fichier,INDX(index_du_fichier,PREMIER_CARACTERE)));
                                   DEFV(CHAR,INIT(octet_courant_dans_le_fichier,K_UNDEF));
                                   EGAL(octet_courant_dans_le_fichier
                                       ,ITb0(caracteres_du_fichier,rang_de_l_octet_courant_dans_le_fichier)
                                        );
                                        /* Index de balayage du fichier...                                                           */

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_01
                                   EGAL(Ftest_fichier_____clef_du_fichier
                                       ,OUEX(Ftest_fichier_____clef_du_fichier
                                            ,octet_courant_dans_le_fichier
                                             )
                                        );
                                        /* Generation iterative de la clef (version du 20030805111250).                              */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_01
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_01

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_02
                                   EGAL(Ftest_fichier_____clef_du_fichier
                                       ,OUEX(Ftest_fichier_____clef_du_fichier
                                            ,MUL2(CLEF_NON_NULLE(rang_de_l_octet_courant_dans_le_fichier)
                                                 ,octet_courant_dans_le_fichier
                                                  )
                                             )
                                        );
                                        /* Generation iterative de la clef (version du 20030805114738).                              */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_02
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_02

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_03
                                   EGAL(Ftest_fichier_____clef_du_fichier
                                       ,OUEX(Ftest_fichier_____clef_du_fichier
                                            ,MUL2(CLEF_NON_NULLE(rang_de_l_octet_courant_dans_le_fichier)
                                                 ,CLEF_NON_NULLE(octet_courant_dans_le_fichier)
                                                  )
                                             )
                                        );
                                        /* Generation iterative de la clef (version du 20030805175647).                              */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_03
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_03

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_04
                                   EGAL(Ftest_fichier_____clef_du_fichier
                                       ,ADD2(Ftest_fichier_____clef_du_fichier
                                            ,MUL2(CLEF_NON_NULLE(rang_de_l_octet_courant_dans_le_fichier)
                                                 ,CLEF_NON_NULLE(octet_courant_dans_le_fichier)
                                                  )
                                             )
                                        );
                                        /* Generation iterative de la clef (version du 20030805181742).                              */
                                        /*                                                                                           */
                                        /* On notera que cet 'EGAL(...,ADD2(...))' est equivalent a un 'INCR(...)', mais la          */
                                        /* premiere ecriture est preferee a la seconde par symetrie avec les 'EGAL(...,OUEX(...))'.  */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_04
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_04

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_05
                                   EGAL(Ftest_fichier_____clef_du_fichier
                                       ,ADD2(Ftest_fichier_____clef_du_fichier
                                            ,MUL2(CLEF_NON_NULLE(MODS(rang_de_l_octet_courant_dans_le_fichier
                                                                     ,ZERO
                                                                     ,POUR_LIMITER_LA_CLEF_Ftest_fichier_____clef_du_fichier
                                                                      )
                                                                 )
                                                 ,CLEF_NON_NULLE(octet_courant_dans_le_fichier)
                                                  )
                                             )
                                        );
                                        /* Generation iterative de la clef (version du 20030805183253). Jusqu'au 20030806110828,     */
                                        /* j'ai utilise ici 'PETIT_INFINI' ; mais la portabilite (et donc l'universalite de cette    */
                                        /* constante) n'est pas garantie ; je la remplace donc par 'MILLION'. En fait, je me suis    */
                                        /* rendu compte le 20030806113738 qu'il fallait prendre une constante plus petite ('MILLE'), */
                                        /* ce que l'on voit, par exemple, avec l'image 'v $xiio/NOIR' pour laquelle, finalement, la  */
                                        /* clef se ramene a la somme des indexes, qui est donc du type N(N+1)/2 et qui donc pour     */
                                        /* des grandes valeurs de 'N' devient plus grande que 'INFINI'...                            */
                                        /*                                                                                           */
                                        /* On notera que cet 'EGAL(...,ADD2(...))' est equivalent a un 'INCR(...)', mais la          */
                                        /* premiere ecriture est preferee a la seconde par symetrie avec les 'EGAL(...,OUEX(...))'.  */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_05
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_05

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_06
                                   EGAL(Ftest_fichier_____clef_du_fichier
                                       ,OUEX(MUL2(Ftest_fichier_____clef_du_fichier,MAGIK)
                                            ,MUL2(CLEF_NON_NULLE(MODS(rang_de_l_octet_courant_dans_le_fichier
                                                                     ,ZERO
                                                                     ,POUR_LIMITER_LA_CLEF_Ftest_fichier_____clef_du_fichier
                                                                      )
                                                                 )
                                                 ,CLEF_NON_NULLE(octet_courant_dans_le_fichier)
                                                  )
                                             )
                                        );
                                        /* Generation iterative de la clef (version du 20030808104628 supprimant a priori tous       */
                                        /* les problemes de debordement). La multiplication par 'MAGIK' a ete introduite a cause     */
                                        /* des fichiers ne contenant que des octets identiques ('v $xiio/NOIR') et qui sans cette    */
                                        /* operation ont une clef egale a leur taille ('$taille_Std' dans ce cas...).                */
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_06
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_06

                                   Eblock
                              EDoI

                              Test(IFEQ(Ftest_fichier_____clef_du_fichier,Ftest_fichier_____CLEF_NON_DEFINIE))
                                   Bblock
                                   INCR(Ftest_fichier_____clef_du_fichier,I);
                                        /* Afin de pouvoir distinguer au retour une clef reellement non definie (ceci a ete          */
                                        /* introduit le 20030808132526).                                                             */
                                   Eblock
                              ATes
                                   Bblock
                                   Eblock
                              ETes

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_01
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_01
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_01

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_02
#    undef     CLEF_NON_NULLE
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_02
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_02

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_03
#    undef     CLEF_NON_NULLE
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_03
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_03

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_04
#    undef     CLEF_NON_NULLE
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_04
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_04

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_05
#    undef     CLEF_NON_NULLE
#    undef     POUR_LIMITER_LA_CLEF_Ftest_fichier_____clef_du_fichier
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_05
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_05

#ifdef    Ftest_fichier_____clef_du_fichier_VERSION_06
#    undef     CLEF_NON_NULLE
#    undef     POUR_LIMITER_LA_CLEF_Ftest_fichier_____clef_du_fichier
#Aifdef   Ftest_fichier_____clef_du_fichier_VERSION_06
#Eifdef   Ftest_fichier_____clef_du_fichier_VERSION_06

#undef    Ftest_fichier_____clef_du_fichier_VERSION_06

                              CALZ_FreFF(caracteres_du_fichier);
                                        /* Liberation de l'espace du fichier...                                                      */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         PRINT_ERREUR("la clef d'un fichier ne peut etre generee lorsque celui-ci n'a pas ete ouvert");

                         EGAL(Ftest_fichier_____clef_du_fichier,CLEF_DU_FICHIER_PAR_DEFAUT);
                                        /* A priori, au cas ou 'Ftest_fichier_____clef_du_fichier' aurait ete modifie par un appel   */
                                        /* anterieur a 'Ftest_fichier(...)' (introduit le 20060522152543...).                        */
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETes

     RETU_ERROR;
     Eblock

#undef    CLEF_DU_FICHIER_PAR_DEFAUT

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C E S   A   L A   T A I L L E   D ' U N   F I C H I E R  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(Positive,INIT(Fsize_fichier_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(Logical,SINT(Fsize_fichier_____compter_les_lignes,NE_PAS_COMPTER_LES_LIGNES_DANS_Fsize_fichier)));
                                        /* Permet de demander a 'Fsize_fichier(...)' de compter en plus le nombre de lignes dans     */
                                        /* le fichier si cette notion a un sens (introduit le 19991217121738).                       */
DEFV(Common,DEFV(CHAR,SINT(Fsize_fichier_____caractere_a_compter,K_LF)));
                                        /* Caractere a compter dans le fichier (en general 'K_LF' afin de compter des lignes dans    */
                                        /* fichier de type "texte").                                                                 */
DEFV(Common,DEFV(Int,SINT(Fsize_fichier_____nombre_de_lignes,TAILLE_EN_NOMBRE_DE_LIGNES_D_UN_FICHIER_INEXISTANT)));
                                        /* Nombre de lignes dans le fichier si 'IL_FAUT(Fsize_fichier_____compter_les_lignes)'.      */
                                        /*                                                                                           */
                                        /* Le 20061122181848, passage a 'TAILLE_EN_NOMBRE_DE_LIGNES_D_UN_FICHIER_INEXISTANT'         */
                                        /* (a la place de 'UNDEF') qui presente l'avantage d'etre negatif et donc d'etre une         */
                                        /* taille impossible...                                                                      */
DEFV(Common,DEFV(Float,SINT(Fsize_fichier_____nombre_de_caracteres,FLOT(TAILLE_EN_NOMBRE_DE_CARACTERES_D_UN_FICHIER_INEXISTANT))));
                                        /* Nombre de caracteres du fichier (renvoye en plus de 'size_fichier').                      */
                                        /*                                                                                           */
                                        /* Le passage de 'Int' a 'Float' a eu lieu le 20060523092942 a cause (eventuellement...)     */
                                        /* de 'v $xil/defi_c1$vv$DEF 20060520121632'.                                                */
                                        /*                                                                                           */
                                        /* Le 20061122181848, passage a 'TAILLE_EN_NOMBRE_DE_CARACTERES_D_UN_FICHIER_INEXISTANT'     */
                                        /* (a la place de 'UNDEF') qui presente l'avantage d'etre negatif et donc d'etre une         */
                                        /* taille impossible...                                                                      */

DEFV(Common,DEFV(FonctionI,Fsize_fichier(nom_du_fichier,ARGUMENT_POINTEUR(size_fichier),editer_les_messages_d_erreur)))
DEFV(Argument,DEFV(CHAR,DTb0(nom_du_fichier)));
                                        /* Nom du fichier a lire,                                                                    */
DEFV(Argument,DEFV(Int,POINTEUR(size_fichier)));
                                        /* Et pointeur ('ADRESSE') sur la taille en octets.                                          */
DEFV(Argument,DEFV(Logical,editer_les_messages_d_erreur));
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */
                                        /* eventuels...                                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(vrai_Int_de_base,INIT(file_Rdescriptor,CANNOT_OPEN));
                                        /* Descripteur du fichier.                                                                   */
     DEFV(vrai_Int_de_base,INIT(etat_fichier,UNDEF));
                                        /* Etat du fichier.                                                                          */
     DEFV(FileStatus,file_status);
                                        /* Pour ranger les informations concernant le fichier.                                       */
     DEFV(Logical,INIT(la_taille_du_fichier_est_connue,FAUX));
                                        /* A priori, la taille du fichier n'est pas connue.                                          */
     /*..............................................................................................................................*/
     CLIR(Fsize_fichier_____nombre_de_caracteres);
     CLIR(Fsize_fichier_____nombre_de_lignes);
                                        /* Initialisation des differents compteurs.                                                  */

     VALIDATION_DES_NOMS_DE_FICHIERS(nom_du_fichier,editer_les_messages_d_erreur);

     EGAL(file_Rdescriptor,Open(nom_du_fichier,OPEN_READ));
                                        /* Tentative d'ouverture du fichier en lecture.                                              */

     Test(IFEQ(file_Rdescriptor,CANNOT_OPEN))
          Bblock
          MESSAGES_DES_FICHIERS(Prer1("Impossible d'ouvrir le fichier de nom '%s'.\n",nom_du_fichier)
                               ,editer_les_messages_d_erreur
                                );
          MESSAGES_DES_FICHIERS(Prer0("Verifier que le directory '$CWD' n'est pas '$Dconfiguration' de mode '$UMASK_NO_RW'.\n")
                               ,editer_les_messages_d_erreur
                                );
                                        /* Et on abandonne...                                                                        */
          CODE_ERROR(ERREUR08);
          Eblock
     ATes
          Bblock
          EGAL(etat_fichier,Fsta(file_Rdescriptor,file_status));

          Test(IFNE(etat_fichier,OK))
               Bblock
               MESSAGES_DES_FICHIERS(Prer1("BIZARRE : on a pu ouvrir le fichier '%s', mais pas son etat.\n",nom_du_fichier)
                                    ,editer_les_messages_d_erreur
                                     );
               CODE_ERROR(ERREUR09);
               Eblock
          ATes
               Bblock
               EGAL(Fsize_fichier_____nombre_de_caracteres,FLOT(ASD1(file_status,st_size)));

               Test(IFNE(Fsize_fichier_____nombre_de_caracteres,fINTE(Fsize_fichier_____nombre_de_caracteres)))
                                        /* Test introduit le 20060523092942 a cause de 'v $xil/defi_c1$vv$DEF 20060520121632'...     */
                    Bblock
                    PRINT_ERREUR("la taille d'un fichier est trop grande lors de sa determination");
                    CAL1(Prer3("son nom est '%s' et sa taille est %.0f alors qu'elle est limitee actuellement a %" ## BFd ## ".\n"
                              ,nom_du_fichier
                              ,Fsize_fichier_____nombre_de_caracteres
                              ,fINTE(Fsize_fichier_____nombre_de_caracteres)
                               )
                         );
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(INDIRECT(size_fichier),INTE(Fsize_fichier_____nombre_de_caracteres));
                                        /* Longueur du fichier (eventuellement tronquee...).                                         */
               EGAL(la_taille_du_fichier_est_connue,VRAI);
                                        /* En indiquant qu'elle est connue (ce qui signifie en plus que le fichier existe...).       */
               Eblock
          ETes

          CALZ(Clos(file_Rdescriptor));
                                        /* Et on ferme le fichier.                                                                   */
          Eblock
     ETes

     Test(IFET(EST_VRAI(la_taille_du_fichier_est_connue),IL_FAUT(Fsize_fichier_____compter_les_lignes)))
          Bblock
          Test(IZGT(Fsize_fichier_____nombre_de_caracteres))
                                        /* Test introduit le 20040529183923 en particulier a cause des programmes du type            */
                                        /* 'v $xrv/ABSO.01$K' dans le cas ou ils ont a traiter des fichiers vides...                 */
               Bblock
               DEFV(CHAR,INIT(POINTERc(caracteres_du_fichier),CHAINE_UNDEF));
                                        /* Zone dynamique contenant le fichier,                                                      */
               DEFV(Int,INIT(index_du_fichier,UNDEF));
                                        /* Index de balayage du fichier...                                                           */

               ckMalo(caracteres_du_fichier,INTE(Fsize_fichier_____nombre_de_caracteres),Fsize_fichier_____compteur_des_kMalo);
                                        /* Demande d'allocation memoire pour le fichier.                                             */
               CALS(Fload_fichier_non_formatte(nom_du_fichier
                                              ,caracteres_du_fichier
                                              ,INTE(Fsize_fichier_____nombre_de_caracteres)
                                              ,size_char
                                              ,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS
                                              ,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS
                                               )
                    );
                                        /* Chargement du fichier...                                                                  */

               DoIn(index_du_fichier,PREMIER_CARACTERE,LSTX(PREMIER_CARACTERE,INTE(Fsize_fichier_____nombre_de_caracteres)),I)
                    Bblock
                    Test(IFEQ(ITb0(caracteres_du_fichier,INDX(index_du_fichier,PREMIER_CARACTERE))
                             ,Fsize_fichier_____caractere_a_compter
                              )
                         )
                         Bblock
                         INCR(Fsize_fichier_____nombre_de_lignes,I);
                                        /* Comptage des caracteres 'Fsize_fichier_____caractere_a_compter', ce qui correspond a      */
                                        /* compter les lignes dans un fichier contenant un texte si l'on teste 'K_LF'...             */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               EDoI

               CALZ_FreFF(caracteres_du_fichier);
                                        /* Liberation de l'espace du fichier...                                                      */
               Eblock
          ATes
               Bblock
                                        /* Dans ce cas, le fichier ne contient aucune ligne...                                       */
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     EGAL(Fsize_fichier_____compter_les_lignes,NE_PAS_COMPTER_LES_LIGNES_DANS_Fsize_fichier);
                                        /* A priori...                                                                               */

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E S T R U C T I O N   D ' U N   F I C H I E R  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,Fdelete_fichier(nom_du_fichier,editer_les_messages_d_erreur)))
DEFV(Argument,DEFV(CHAR,DTb0(nom_du_fichier)));
                                        /* Nom du fichier a detruire.                                                                */
DEFV(Argument,DEFV(Logical,editer_les_messages_d_erreur));
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */
                                        /* eventuels...                                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(FileStatus,file_status);
                                        /* Pour ranger les informations concernant le fichier.                                       */
     /*..............................................................................................................................*/
     VALIDATION_DES_NOMS_DE_FICHIERS(nom_du_fichier,editer_les_messages_d_erreur);

     Test(PAS_D_ERREUR(CODE_ERROR(Ftest_fichier(nom_du_fichier,editer_les_messages_d_erreur))))
          Bblock
                                        /* 'CODE_ERROR()' est rendu necessaire par les appels 'EXECUTION_DE_PLUSIEURS_FONCTIONS()'.  */
          Test(PAS_D_ERREUR(Feta(nom_du_fichier,file_status)))
               Bblock
               Test(IFEQ(ETLO(ASD1(file_status,st_mode),S_IWRITE),S_IWRITE))
                    Bblock
                    CODE_ERROR(Unlink(nom_du_fichier));
                                        /* On ne peut detruire que les fichiers qui sont "en ecriture pour moa"...                   */
                    Eblock
               ATes
                    Bblock
                    MESSAGES_DES_FICHIERS(PRINT_ATTENTION("le fichier est indestructible (lecture seule)")
                                         ,editer_les_messages_d_erreur
                                          );
                    MESSAGES_DES_FICHIERS(Prer1("son nom est '%s'\n",nom_du_fichier)
                                         ,editer_les_messages_d_erreur
                                          );
                                        /* L'usage de 'MESSAGES_DES_FICHIERS(...)' a ete introduit le 20170425113854...              */

                    CODE_ERROR(ERREUR16);
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               MESSAGES_DES_FICHIERS(PRINT_ATTENTION("bizarre : le fichier existe, mais pas son etat")
                                    ,editer_les_messages_d_erreur
                                     );
               MESSAGES_DES_FICHIERS(Prer1("son nom est '%s'\n",nom_du_fichier)
                                    ,editer_les_messages_d_erreur
                                     );
                                        /* L'usage de 'MESSAGES_DES_FICHIERS(...)' a ete introduit le 20170425113854...              */

               CODE_ERROR(ERREUR17);
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          MESSAGES_DES_FICHIERS(Prer1("Demande de destruction du fichier '%s' qui est inexistant ou illisible.\n",nom_du_fichier)
                               ,editer_les_messages_d_erreur
                                );
          MESSAGES_DES_FICHIERS(Prer0("Verifier que le directory '$CWD' n'est pas '$Dconfiguration' de mode '$UMASK_NO_RW'.\n")
                               ,editer_les_messages_d_erreur
                                );
          Eblock
     ETes

     CALS(Fmise_a_jour_du_systeme_de_gestion_de_fichiers(FAIRE_LA_MISE_A_JOUR_DU_SYSTEME_DE_GESTION_DE_FICHIERS));
                                        /* Et soyons tres tres prudent en forcant la mise a jour des disques...                      */

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A R C H I V A G E   N O N   S E C U R I S E   D ' U N   F I C H I E R  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(Positive,INIT(Fstore_non_securise_fichier_non_formatte_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(Logical,SINT(Fstore_non_securise_fichier_non_formatte_____compacter_1,FAUX)));
                                        /* A priori, on ne tente pas de faire un compactage "simpliste"...                           */
DEFV(Common,DEFV(Float,SINT(Fstore_non_securise_fichier_non_formatte_____taux_de_compactage_1,FDU)));
                                        /* Si le compactage "simpliste" est actif, on definit ici son taux demande.                  */

DEFV(Local,DEFV(Int,INIT(Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit
                        ,TAILLE_EN_NOMBRE_DE_CARACTERES_D_UN_FICHIER_INEXISTANT
                         )
                )
     );
                                        /* Cette variable locale a ete introduite afin de permettre les tests de bonne ecriture      */
                                        /* d'un fichier qui utilisent la taille reellement ecrite pour savoir si tout s'est bien     */
                                        /* passe...                                                                                  */
                                        /*                                                                                           */
                                        /* On notera l'affreux "size_last_file_ecrit" destine en fait a reduire la longueur de       */
                                        /* certaines lignes...                                                                       */
                                        /*                                                                                           */
                                        /* Jusqu'au 20061122181848 la valeur par defaut etait 'UNDEF'. Malheureusement, cette        */
                                        /* valeur est une taille possible de fichier. Il est donc preferable de choisir une valeur   */
                                        /* impossible...                                                                             */
DEFV(Local,DEFV(Int,INIT(Fstore_non_securise_fichier_non_formatte_____un_compactage_a_ete_effectue,FAUX)));
                                        /* Indicateur introduit le 20120206080631...                                                 */

DEFV(Common,DEFV(FonctionI,Fstore_non_securise_fichier_non_formatte(fichier
                                                                   ,nom_du_fichier
                                                                   ,size_fichier
                                                                   ,unite_fichier
                                                                   ,editer_les_messages_d_erreur
                                                                    )
                 )
     )
DEFV(Argument,DEFV(CHAR,DTb0(fichier)));
                                        /* Ou le prendre en memoire,                                                                 */
DEFV(Argument,DEFV(CHAR,DTb0(nom_du_fichier)));
                                        /* Nom du fichier a ecrire,                                                                  */
DEFV(Argument,DEFV(Int,size_fichier));
                                        /* Et sa taille en octets.                                                                   */
DEFV(Argument,DEFV(Int,unite_fichier));
                                        /* Nombre d'octets dans l'unite du fichier.                                                  */
DEFV(Argument,DEFV(Logical,editer_les_messages_d_erreur));
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */
                                        /* eventuels...                                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(vrai_Int_de_base,INIT(file_Wdescriptor,CANNOT_OPEN));
                                        /* Descripteur du fichier en ecriture.                                                       */
     /*..............................................................................................................................*/
     EGAL(Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit,TAILLE_EN_NOMBRE_DE_CARACTERES_D_UN_FICHIER_INEXISTANT);
                                        /* A priori (introduit le 20061122120428 et remplacement de 'UNDEF' le 20061122182508 par    */
                                        /* 'TAILLE_EN_NOMBRE_DE_CARACTERES_D_UN_FICHIER_INEXISTANT').                                */
     EGAL(Fstore_non_securise_fichier_non_formatte_____un_compactage_a_ete_effectue,FAUX);
                                        /* A priori (introduit le 20120206080631)...                                                 */

     VALIDATION_DES_NOMS_DE_FICHIERS(nom_du_fichier,editer_les_messages_d_erreur);
     VALIDATION_DES_TAILLES_DE_FICHIERS(nom_du_fichier,size_fichier);

     Test(PAS_D_ERREUR(Ftest_fichier(nom_du_fichier,editer_les_messages_d_erreur)))
          Bblock
          MESSAGES_DES_FICHIERS(Prer1("Le fichier de nom '%s' existe deja (peut-etre parce qu'en lecture seule).\n",nom_du_fichier)
                               ,editer_les_messages_d_erreur
                                );
          CODE_ERROR(ERREUR04);
                                        /* Et on abandonne...                                                                        */
          Eblock
     ATes
          Bblock
          EGAL(file_Wdescriptor,OpenNew(nom_du_fichier,OPEN_READ_AND_WRITE_D_UN_FICHIER_INEXISTANT,MODE_CREAT));
                                        /* Comme le fichier n'existe pas, on le cree. On notera que jusqu'au 20070710105610, il y    */
                                        /* avait ici :                                                                               */
                                        /*                                                                                           */
                                        /*                  EGAL(file_Wdescriptor,Crea(nom_du_fichier,MODE_CREAT));                  */
                                        /*                                                                                           */
                                        /* Cette solution avait un gros defaut ; en effet, cela s'est vu lors de calculs paralleles  */
                                        /* ou deux process differents (sur la meme MACHINE ou pas) pouvaient creer le meme verrou... */
          Test(IFEQ(file_Wdescriptor,CANNOT_OPEN))
               Bblock
               MESSAGES_DES_FICHIERS(Prer1("Le fichier '%s' n'existe pas (ou est illisible), et ne peut etre cree.\n",nom_du_fichier)
                                    ,editer_les_messages_d_erreur
                                     );
               MESSAGES_DES_FICHIERS(Prer0("Verifier que le directory '$CWD' n'est pas '$Dconfiguration' de mode '$UMASK_NO_RW'.\n")
                                    ,editer_les_messages_d_erreur
                                     );
               CODE_ERROR(ERREUR05);
                                        /* Et on abandonne.                                                                          */
               Eblock
          ATes
               Bblock
               DEFV(Logical,INIT(il_y_a_compactage_1
                                ,IFET(IFEQ(Gval("COMPACTAGE_1"),EXIST)
                                     ,IL_FAUT(Fstore_non_securise_fichier_non_formatte_____compacter_1)
                                      )
                                 )
                    );
                                        /* Indicateur precisant s'il y a eu effectivement compactage lorsqu'il a ete demande...      */
               DEFV(Int,INIT(size_maximale_fichier_compacte
                            ,MULE(INTE(MUL2(Fstore_non_securise_fichier_non_formatte_____taux_de_compactage_1,size_fichier))
                                 ,ORDRE_DE_MULTIPLICITE_D_UN_FICHIER_COMPACTE_1
                                  )
                             )
                    );
                                        /* Taille maximale souhaitee pour la version compactee (qui doit etre paire, rappelons-le).  */
               DEFV(Int,INIT(size_fichier_compacte,UNDEF));
                                        /* Taille reelle occupee par la version compactee.                                           */
               DEFV(Logical,INIT(de_la_memoire_a_ete_allouee_pour_le_fichier_compacte,FAUX));
               DEFV(CHAR,INIT(POINTERc(fichier_compacte),CHAINE_UNDEF));
                                        /* Zone de manoeuvre ou mettre le fichier compacte, l'indicateur d'allocation effective      */
                                        /* ayant ete introduit le 20120206075618 (bien tardivement...).                              */
               DEFV(Int,INIT(size_fichier_reellement_ecrit,UNDEF));
                                        /* Taille du fichier reellement ecrit...                                                     */

               Test(EST_VRAI(il_y_a_compactage_1))
                    Bblock
                    ckMalo(fichier_compacte
                          ,size_maximale_fichier_compacte
                          ,Fstore_non_securise_fichier_non_formatte_____compteur_des_kMalo
                           );
                    EGAL(de_la_memoire_a_ete_allouee_pour_le_fichier_compacte,VRAI);
                                        /* Allocation de la memoire temporaire necessaire.                                           */

                    EGAL(size_fichier_compacte
                        ,Ftentative_de_compactage_1(fichier_compacte,size_maximale_fichier_compacte
                                                   ,fichier,size_fichier,unite_fichier
                                                    )
                         );
                                        /* Tentative de compactage...                                                                */
                    Test(IFNE(size_fichier_compacte,size_fichier))
                         Bblock
                                        /* Cas ou le compactage a reussi : on va enregistrer le fichier compacte...                  */
                         EGAL(Fstore_non_securise_fichier_non_formatte_____un_compactage_a_ete_effectue,VRAI);
                                        /* A priori (introduit le 20120206080631)...                                                 */
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou le compactage a echoue :                                                           */
                         EGAL(il_y_a_compactage_1,FAUX);
                                        /* Dans ces conditions on va enregistrer le fichier non compacte...                          */
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(CodeDErreurSystemeCourant,OK);
                                        /* ATTENTION : le code d'erreur renvoye eventuellement par 'Writ(...)' est remanant...       */
                                        /* code d'erreur eventuel au retour de 'Writ(...)'.                                          */

               Test(EST_VRAI(il_y_a_compactage_1))
                    Bblock
                    EGAL(Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit,size_fichier_compacte);
                    EGAL(size_fichier_reellement_ecrit,Writ(file_Wdescriptor,fichier_compacte,size_fichier_compacte));
                                        /* Le fichier compacte est ecrit et on ne teste pas au retour que ce qui a ete ecrit est     */
                                        /* correct...                                                                                */
                    Eblock
               ATes
                    Bblock
                    EGAL(Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit,size_fichier);
                    EGAL(size_fichier_reellement_ecrit,Writ(file_Wdescriptor,fichier,size_fichier));
                                        /* Le fichier non compacte est ecrit et on ne teste pas au retour que ce qui a ete ecrit est */
                                        /* correct...                                                                                */
                    Eblock
               ETes

               Test(IL_Y_A_ERREUR(CODE_ERROR(CodeDErreurSystemeCourant)))
                                        /* Code d'erreur eventuel au retour de 'Writ(...)'.                                          */
                    Bblock
                    MESSAGES_DES_FICHIERS(Prer2("L'ecriture du fichier '%s' donne le code d'erreur %" ## BFd ## ".\n"
                                               ,nom_du_fichier
                                               ,CODE_ERREUR
                                                )
                                         ,editer_les_messages_d_erreur
                                          );
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFNE(size_fichier_reellement_ecrit,Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit))
                    Bblock
                    MESSAGES_DES_FICHIERS
                        (Prer3(INTRODUCTION_FORMAT ## BFd ## " octets ecrits au lieu de %" ## BFd ## " pour le fichier '%s'.\n"
                              ,size_fichier_reellement_ecrit
                              ,Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit
                              ,nom_du_fichier
                               )
                        ,editer_les_messages_d_erreur
                         );

                    CODE_ERROR(ERREUR26);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(EST_VRAI(de_la_memoire_a_ete_allouee_pour_le_fichier_compacte))
                    Bblock
                    CALZ_FreFF(fichier_compacte);
                                        /* Lorsqu'un compactage a ete demande, et meme s'il a echoue, il faut rendre la memoire      */
                                        /* temporaire allouee.                                                                       */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_Y_A_ERREUR(Clos(file_Wdescriptor)))
                                        /* Et on ferme le fichier.                                                                   */
                    Bblock
                    MESSAGES_DES_FICHIERS(Prer1("La fermeture du fichier de nom '%s' s'est mal passee.\n",nom_du_fichier)
                                         ,editer_les_messages_d_erreur
                                          );
                                        /* Cette erreur correspond au fameux message "Input/output error" ce que l'on peut           */
                                        /* facilement verifier ici en faissant appel a la fonction 'perror("")'.                     */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               CALS(Fmise_a_jour_du_systeme_de_gestion_de_fichiers(FAIRE_LA_MISE_A_JOUR_DU_SYSTEME_DE_GESTION_DE_FICHIERS));
                                        /* Et soyons tres tres prudent en forcant la mise a jour des disques...                      */
               Eblock
          ETes
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

#undef    ORDRE_DE_MULTIPLICITE_D_UN_FICHIER_COMPACTE_1

#undef    FAIRE_LA_MISE_A_JOUR_DU_SYSTEME_DE_GESTION_DE_FICHIERS
#undef    NE_PAS_FAIRE_LA_MISE_A_JOUR_DU_SYSTEME_DE_GESTION_DE_FICHIERS

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N   N O M   R E L A T I F   T E M P O R A I R E  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Logical,SINT(generation_d_un_nom_relatif_temporaire_____compatibilite_20061226,FAUX)));
                                        /* Indicateur permettant de generer des noms invisibles de meme "forme" que ceux             */
                                        /* anterieurs au 20061226094456, date a laquelle une generation basee sur l'horloge          */
                                        /* et donc moins risquee (au niveau des "collisions") a ete introduite...                    */
DEFV(Common,DEFV(Logical,SINT(generation_d_un_nom_relatif_temporaire_____compatibilite_20231213,FAUX)));
                                        /* Indicateur permettant de generer des noms invisibles de meme "forme" que ceux             */
                                        /* anterieurs au 20231213170455...                                                           */

#define   NOMBRE_DE_CHIFFRES_DU_Gval_Gpid_DU_NOM_RELATIF_TEMPORAIRE                                                                     \
                    DEUX
#define   NOMBRE_DE_CHIFFRES_DE_Secondes_LONG__DU_NOM_RELATIF_TEMPORAIRE                                                                \
                    NEUF
#define   NOMBRE_DE_CHIFFRES_DE_Secondes_COURT_DU_NOM_RELATIF_TEMPORAIRE                                                                \
                    DEUX
#define   NOMBRE_DE_CHIFFRES_DE_MicroSecondes__DU_NOM_RELATIF_TEMPORAIRE                                                                \
                    CINQ
                                        /* Parametrage des differents numeros introduits le 20061226094456...                        */
                                        /*                                                                                           */
                                        /* ATTENTION : le nombre 'NEUF' semble etre un maximum pour 'chain_numero(...)'...           */
                                        /*                                                                                           */
                                        /* Le 20070423151129, 'NOMBRE_DE_CHIFFRES_DE_Secondes_COURT_DU_NOM_RELATIF_TEMPORAIRE'       */
                                        /* et 'NOMBRE_DE_CHIFFRES_DE_MicroSecondes__DU_NOM_RELATIF_TEMPORAIRE' sont passes de        */
                                        /* 'QUATRE' a 'DEUX' et de 'SIX' a 'CINQ' respectivement (et ce a cause de l'introduction    */
                                        /* de 'POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE' dans 'NOM_RELATIF_TEMPORAIRE_COURT'...           */

#define   NOM_DE_FICHIER_RELATIF_AU_DIRECTORY_COURANT                                                                                   \
                    PRED(PREMIER_CARACTERE)                                                                                             \
                                        /* Indicateur permettant de savoir si le nom contient ou pas des directories...              */

#define   SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                                                                    \
                    cSEPARATEUR_DES_COMPOSANTES_D_UN_NOM                                                                                \
                                        /* Separateur des differentes composantes (introduit le 20030921164547 afin d'ameliorer      */ \
                                        /* l'eventuelle lisibilite et reduire des risques de collision...).                          */

#define   PRE_FIXE_DU_NOM_RELATIF_TEMPORAIRE                                                                                            \
                    "_.xxxx"                                                                                                            \
                                        /* Pre-fixe du nom special relatif et suppose invisible ("invisible" parce que n'existant    */ \
                                        /* qu'une fraction de seconde ; c'est presque un objet quantique...). ATTENTION, lors de     */ \
                                        /* l'introduction du redimensionement 'Sdu' dans 'v $xci/filtre.01$K Sdu' le 19990414112509  */ \
                                        /* la definition de 'PRE_FIXE_DU_NOM_RELATIF_TEMPORAIRE' est passee de "__" a "_" afin de    */ \
                                        /* faire que '$xci/format.01$K' ne manipule pas des noms de fichiers trop long tels qu'ils   */ \
                                        /* sont definis dans 'v $xci/filtre.01$K generation_d_un_nom_relatif_temporaire' lors de la  */ \
                                        /* definition des noms des images temporaires au format 'Sdu'.                               */ \
                                        /*                                                                                           */ \
                                        /* Le 20231208105924, a "_" a ete ajoute une chaine contenant "xxxx" afin de permettre a     */ \
                                        /* l'alias 'trouvx' de retrouver de tels fichiers qui auraient ete conserves suite a un      */ \
                                        /* probleme (droits d'ecriture, espace sature,...).                                          */

#define   NUMERO_DE_LA_MACHINE_HOTE                                                                                                     \
                    "jHOTE"                                                                                                             \
                                        /* Afin d'acceder au numero de la machine hote physique...                                   */ \
                                        /*                                                                                           */ \
                                        /* Jusqu'au 20070522131844, la definition precedente etait :                                 */ \
                                        /*                                                                                           */ \
                                        /*                  #define   NUMERO_DE_LA_MACHINE_HOTE                                   \  */ \
                                        /*                                      "nHOTE"                                              */ \
                                        /*                                                                                           */ \
                                        /* mais a cause de la possibilite de deguiser une MACHINE en une autre ('v $Fdeguise' et     */ \
                                        /* 'v $Foptions vCOMPUTER'), ce numero doit etre unique, d'ou l'utilisation de l'adresse     */ \
                                        /* 'IP', mais sous une forme strictement numerique a cause de l'usage des 'Gval(...)'        */ \
                                        /* ci-apres. On notera au passage que sur les MACHINEs multi-coeurs, il subsistera malgre    */ \
                                        /* tout un probleme : il faudrait ajouter de plus le numero du processeur...                 */
#define   NOMBRE_CHIFFRES_NUMERO_MACHINE_HOTE_DU_NOM_RELATIF_TEMPORAIRE                                                                 \
                    PLUS_GRAND_NOMBRE_DE_CHIFFRES_POSSIBLE_DANS__chain_numero                                                           \
                                        /* Le nom special relatif invisible va contenir des chiffres fournis par 'Gval(...)' de      */ \
                                        /* facon a etre un nom local a chaque machine, et donc eviter des problemes de collisions    */ \
                                        /* lorsque plusieurs programmes tournent simultanement et creent des fichiers.               */ \
                                        /*                                                                                           */ \
                                        /* Le 20010305090636, la definition est passee de 'TROIS' a 'DEUX' afin de conserver         */ \
                                        /* inchangee la longueur du nom 'NOM_RELATIF_TEMPORAIRE'. En effet, a cette date les deux    */ \
                                        /* definitions '$W' et '$w' ont ete allongees ('v $FpostfixesG 20010305090636') d'un         */ \
                                        /* caractere ; il en est donc de meme de la definition de '$Wi'...                           */ \
                                        /*                                                                                           */ \
                                        /* Le 20070522131844, ce parametre est passe de 'DEUX' a une valeur extremale lors du        */ \
                                        /* passage de 'nHOTE' a 'jHOTE' pour 'NUMERO_DE_LA_MACHINE_HOTE' ci-dessus. On notera        */ \
                                        /* qu'au lieu de 'PLUS_GRAND_NOMBRE_DE_CHIFFRES_POSSIBLE_DANS__chain_numero', il aurait      */ \
                                        /* ete preferable d'utiliser 'MUL2(QUATRE,TROIS)', mais cette derniere valeur est trop       */ \
                                        /* grande...                                                                                 */

#define   NOMBRE_DE_CHIFFRES_DU_Gpid_DU_NOM_RELATIF_TEMPORAIRE                                                                          \
                    SIX                                                                                                                 \
                                        /* Le nom special relatif invisible va contenir des chiffres fournis par 'Gpid(...)' de      */ \
                                        /* facon a etre un nom local a chaque processus, et donc eviter des problemes de collisions  */ \
                                        /* lorsque plusieurs programmes tournent simultanement et creent des fichiers.               */
                                        /*                                                                                           */
                                        /* Le 20061225170338, a cause de 'v $xci/genere$K generation_d_un_nom_relatif_temporaire',   */
                                        /* 'NOMBRE_DE_CHIFFRES_DU_Gpid_DU_NOM_RELATIF_TEMPORAIRE' est passe de 'SEPT' a 'SIX'...     */

#define   DATE_COMPLETE_DU_CSH_COURANT                                                                                                  \
                    "DATE_COMPLETE"
#define   DATE_DU_CSH_COURANT                                                                                                           \
                    "DATE"
                                        /* Complement des noms temporaires introduit le 20231213170455...                            */

#define   POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE                                                                                           \
                    "Wi"                                                                                                                \
                                        /* Post-fixe du nom special relatif et suppose invisible ; il est destine a permettre la     */ \
                                        /* recuperation eventuelle de ces fichiers par '$xcg/Xdivers$Z' au cas ou ils subsisteraient */ \
                                        /* apres un abort ou un defaut. Mais ATTENTION, en general lors de '$Flogin', la commande    */ \
                                        /* '$xcg/Xtemporaires$Z' est executee ; or elle provoque justement le nettoyage de ce type   */ \
                                        /* de fichier (ce qui est en fait l'objectif en donnant ce postfixe a ces fichiers...). Donc */ \
                                        /* lors de '$Flogin' si une tache en "background" existe, et si elle cree des fichiers, il   */ \
                                        /* ne faut pas faire de menage, et donc repondre "non" a '$xcg/Xall$Z'. Malgre tout, et pour */ \
                                        /* se laisser une porte de sortie, on notera que l'on est passe de :                         */ \
                                        /*                                                                                           */ \
                                        /*                  #define   POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE                         \  */ \
                                        /*                                      "W"                                                  */ \
                                        /*                                                                                           */ \
                                        /* a :                                                                                       */ \
                                        /*                                                                                           */ \
                                        /*                  #define   POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE                         \  */ \
                                        /*                                      "Wi"                                                 */ \
                                        /*                                                                                           */ \
                                        /* ou "Wi" signifie "W" "intermediaire" (voir 'v $FpostfixesG'), ou "W" "invisible"...       */

#define   NOM_RELATIF_TEMPORAIRE_COURT                                                                                                  \
                    COND(IL_FAUT(generation_d_un_nom_relatif_temporaire_____compatibilite_20061226)                                     \
                        ,EGAs(chain_Aconcaten5(PRE_FIXE_DU_NOM_RELATIF_TEMPORAIRE                                                       \
                                              ,EGAs(chain_numero(Gval(NUMERO_DE_LA_MACHINE_HOTE)                                        \
                                                                ,NOMBRE_CHIFFRES_NUMERO_MACHINE_HOTE_DU_NOM_RELATIF_TEMPORAIRE          \
                                                                 )                                                                      \
                                                    )                                                                                   \
                                              ,EGAs(chain_numero(Gpid()                                                                 \
                                                                ,NOMBRE_DE_CHIFFRES_DU_Gpid_DU_NOM_RELATIF_TEMPORAIRE                   \
                                                                 )                                                                      \
                                                    )                                                                                   \
                                              ,chaineA                                                                                  \
                                              ,Gvar(POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE)                                                \
                                               )                                                                                        \
                              )                                                                                                         \
                        ,EGAs(chain_Aconcaten5(EGAs(chain_numero(MUL2(Gval(NUMERO_DE_LA_MACHINE_HOTE),Gpid())                           \
                                                                ,NOMBRE_DE_CHIFFRES_DU_Gval_Gpid_DU_NOM_RELATIF_TEMPORAIRE              \
                                                                 )                                                                      \
                                                    )                                                                                   \
                                              ,EGAs(chain_numero(Secondes                                                               \
                                                                ,NOMBRE_DE_CHIFFRES_DE_Secondes_COURT_DU_NOM_RELATIF_TEMPORAIRE         \
                                                                 )                                                                      \
                                                    )                                                                                   \
                                              ,EGAs(chain_numero(MicroSecondes                                                          \
                                                                ,NOMBRE_DE_CHIFFRES_DE_MicroSecondes__DU_NOM_RELATIF_TEMPORAIRE         \
                                                                 )                                                                      \
                                                    )                                                                                   \
                                              ,chaineA                                                                                  \
                                              ,Gvar(POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE)                                                \
                                               )                                                                                        \
                              )                                                                                                         \
                         )
#define   NOM_RELATIF_TEMPORAIRE__LONG                                                                                                  \
                    COND(IL_FAUT(generation_d_un_nom_relatif_temporaire_____compatibilite_20061226)                                     \
                        ,EGAs(chain_Aconcaten8(PRE_FIXE_DU_NOM_RELATIF_TEMPORAIRE                                                       \
                                              ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                               \
                                              ,EGAs(chain_numero(Gval(NUMERO_DE_LA_MACHINE_HOTE)                                        \
                                                                ,NOMBRE_CHIFFRES_NUMERO_MACHINE_HOTE_DU_NOM_RELATIF_TEMPORAIRE          \
                                                                 )                                                                      \
                                                    )                                                                                   \
                                              ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                               \
                                              ,EGAs(chain_numero(Gpid()                                                                 \
                                                                ,NOMBRE_DE_CHIFFRES_DU_Gpid_DU_NOM_RELATIF_TEMPORAIRE                   \
                                                                 )                                                                      \
                                                    )                                                                                   \
                                              ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                               \
                                              ,chaineA                                                                                  \
                                              ,Gvar(POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE)                                                \
                                               )                                                                                        \
                              )                                                                                                         \
                        ,COND(IL_FAUT(generation_d_un_nom_relatif_temporaire_____compatibilite_20231213)                                \
                             ,EGAs(chain_Aconcaten12(PRE_FIXE_DU_NOM_RELATIF_TEMPORAIRE                                                 \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,EGAs(chain_numero(Gval(NUMERO_DE_LA_MACHINE_HOTE)                                  \
                                                                      ,NOMBRE_CHIFFRES_NUMERO_MACHINE_HOTE_DU_NOM_RELATIF_TEMPORAIRE    \
                                                                       )                                                                \
                                                          )                                                                             \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,EGAs(chain_numero(Gpid()                                                           \
                                                                      ,NOMBRE_DE_CHIFFRES_DU_Gpid_DU_NOM_RELATIF_TEMPORAIRE             \
                                                                       )                                                                \
                                                          )                                                                             \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,EGAs(chain_numero(Secondes                                                         \
                                                                      ,NOMBRE_DE_CHIFFRES_DE_Secondes_LONG__DU_NOM_RELATIF_TEMPORAIRE   \
                                                                       )                                                                \
                                                          )                                                                             \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,EGAs(chain_numero(MicroSecondes                                                    \
                                                                      ,NOMBRE_DE_CHIFFRES_DE_MicroSecondes__DU_NOM_RELATIF_TEMPORAIRE   \
                                                                       )                                                                \
                                                          )                                                                             \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,chaineA                                                                            \
                                                    ,Gvar(POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE)                                          \
                                                     )                                                                                  \
                                   )                                                                                                    \
                             ,EGAs(chain_Aconcaten14(PRE_FIXE_DU_NOM_RELATIF_TEMPORAIRE                                                 \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,Gvar(DATE_DU_CSH_COURANT)                                                          \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,EGAs(chain_numero(Secondes                                                         \
                                                                      ,NOMBRE_DE_CHIFFRES_DE_Secondes_LONG__DU_NOM_RELATIF_TEMPORAIRE   \
                                                                       )                                                                \
                                                          )                                                                             \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,EGAs(chain_numero(MicroSecondes                                                    \
                                                                      ,NOMBRE_DE_CHIFFRES_DE_MicroSecondes__DU_NOM_RELATIF_TEMPORAIRE   \
                                                                       )                                                                \
                                                          )                                                                             \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,EGAs(chain_numero(Gval(NUMERO_DE_LA_MACHINE_HOTE)                                  \
                                                                      ,NOMBRE_CHIFFRES_NUMERO_MACHINE_HOTE_DU_NOM_RELATIF_TEMPORAIRE    \
                                                                       )                                                                \
                                                          )                                                                             \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,EGAs(chain_numero(Gpid()                                                           \
                                                                      ,NOMBRE_DE_CHIFFRES_DU_Gpid_DU_NOM_RELATIF_TEMPORAIRE             \
                                                                       )                                                                \
                                                          )                                                                             \
                                                    ,SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG                         \
                                                    ,chaineA                                                                            \
                                                    ,Gvar(POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE)                                          \
                                                     )                                                                                  \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )
                                        /* Nom special relatif et suppose invisible : version courte et version longue (introduite   */
                                        /* le 20030921164547).                                                                       */
                                        /*                                                                                           */
                                        /* Le 20070423151129, suite a l'utilisation du generateur de nom temporaire dans la          */
                                        /* fonction 'Ftest_fichier_avec_pre_mise_a_jour_du_cache_des_directories(...)', il est       */
                                        /* important que 'NOM_RELATIF_TEMPORAIRE_COURT' contienne lui-aussi (de la meme facon que    */
                                        /* 'NOM_RELATIF_TEMPORAIRE__LONG') 'POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE' et ce afin          */
                                        /* de permettre de detruire par 'v $xcg/Xdivers$Z' ces fichiers temporaires. On notera       */
                                        /* qu'en fait ils ne peuvent subsister qu'en cas d'un abort "fait au bon moment"...          */
                                        /*                                                                                           */
                                        /* Le 20170510094857, je note que le numero de processeur supportant l'execution courante    */
                                        /* de cette fonction sur la MACHINE 'NUMERO_DE_LA_MACHINE_HOTE' n'est pas connu. On pourrait */
                                        /* croire qu'il serait utile, mais en fait ce n'est pas le cas car, en effet, on utilise     */
                                        /* dans 'NOM_RELATIF_TEMPORAIRE_COURT' et dans 'NOM_RELATIF_TEMPORAIRE__LONG' le numero      */
                                        /* de processus (via 'Gpid(...)'), or ce numero est unique a un instant donne sur une        */
                                        /* MACHINE pour l'ensemble de ses processeurs...                                             */
                                        /*                                                                                           */
                                        /* Le 20231214132137, 'DATE_DU_CSH_COURANT' a remplace 'DATE_COMPLETE_DU_CSH_COURANT' afin   */
                                        /* de raccourcir un peu les noms temporaires...                                              */

DEFV(Common,DEFV(FonctionC,POINTERc(generation_d_un_nom_relatif_temporaire(chaineA))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine Argument eventuellement vide ('C_VIDE').                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Positive,INIT(Secondes,UNDEF));
     DEFV(Positive,INIT(MicroSecondes,UNDEF));
                                        /* Duree en {secondes,micro-secondes} ecoulee depuis le 19700101000000.                      */

     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     Test(IL_NE_FAUT_PAS(generation_d_un_nom_relatif_temporaire_____compatibilite_20061226))
          Bblock
          DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Secondes,MicroSecondes);

          EGAL(Secondes,INTE(MODF(Secondes,FZERO,PRED(PUIX(BASE10,PLUS_GRAND_NOMBRE_DE_CHIFFRES_POSSIBLE_DANS__chain_numero)))));
                                        /* Et ceci afin d'eviter des debordements dans 'chain_numero(...)'.                          */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     EGAp(chaineR
         ,NOM_RELATIF_TEMPORAIRE__LONG
          );
                                        /* Nom special relatif et suppose invisible de la forme suivante en version longue (cela     */
                                        /* fut introduit le 20030921164547) :                                                        */
                                        /*                                                                                           */
                                        /*                  _.MM.PPPPPPP.CHAINEA.W2                                                  */
                                        /*                  _.MM.PPPPPPP.CHAINEA.FM_____W2_____FM   (apres le 20180207140449)        */
                                        /*                                                                                           */
                                        /* ou 'MM' designe le numero unique de la machine physique, et 'PPPPPPP' le numero du        */
                                        /* processus local correspondant. Enfin, 'CHAINEA' designe une chaine Argument arbitraire    */
                                        /* (eventuellement vide)...                                                                  */
                                        /*                                                                                           */
                                        /* On notera le 20180514171222 qu'en fait 'MM' est une fonction de l'adresse 'IP' de         */
                                        /* la machine physique calcule a partir de '$jHOTE' via '$iHOTE' (voir a ce propos           */
                                        /* 'v $xig/fonct$vv$FON 20070522131844')...                                                  */
                                        /*                                                                                           */
                                        /* ATTENTION : 'Gvar(...)' provoque surement un 'Malo(...)' dont l'espace ne sera jamais     */
                                        /* rendu...                                                                                  */
                                        /*                                                                                           */
                                        /* A la date du 20070423151129, le nom special relatif 'NOM_RELATIF_TEMPORAIRE__LONG'        */
                                        /* est actuellement :                                                                        */
                                        /*                                                                                           */
                                        /*                  _.MM.PPPPPP.sssssssss.uuuuu.CHAINEA.W2                                   */
                                        /*                  _.MM.PPPPPP.sssssssss.uuuuu.CHAINEA.FM_____W2_____FM                     */
                                        /*                                                          (apres le 20180207140449)        */
                                        /*                                                                                           */
                                        /* ou 'MM' designe le numero unique de la machine physique, 'PPPPPP' donne les six derniers  */
                                        /* chiffres du numero du processus local correspondant, 'sssssssss' les neuf derniers        */
                                        /* chiffres du nombre de secondes et enfin 'uuuuu' les cinq derniers chiffres du nombre de   */
                                        /* micro-secondes...                                                                         */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* On notera le 20180328110513 que remplacer le 'EGAL(...)' ci-dessus par :                  */
                                        /*                                                                                           */
                                        /*                  begin_nouveau_block                                                      */
                                        /*                       Bblock                                                              */
                                        /*                       DEFV(CHAR,INIT(POINTERc(nom_relatif_temporaire__long)               */
                                        /*                                     ,NOM_RELATIF_TEMPORAIRE__LONG                         */
                                        /*                                      )                                                    */
                                        /*                            );                                                             */
                                        /*                                                                                           */
                                        /*                       EGAL(chaineR,nom_relatif_temporaire__long);                         */
                                        /*                                                                                           */
                                        /*                       CALZ_FreCC(nom_relatif_temporaire__long);                           */
                                        /*                       Eblock                                                              */
                                        /*                  end_nouveau_block                                                        */
                                        /*                                                                                           */
                                        /* est stupide car, en effet, 'chaineR' a pour valeur 'nom_relatif_temporaire__long' qui     */
                                        /* est un pointeur. Le 'CALZ_FreCC(...)' rend l'espace qui etait occupe et si une nouvelle   */
                                        /* allocation memoire est demandee avant que 'chaineR' soit utilisee, alors le               */
                                        /* 'nom_relatif_temporaire__long' genere par 'NOM_RELATIF_TEMPORAIRE__LONG' sera compromis.  */

     Test(IFGT(chain_Xtaille(chaineR),LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER))
          Bblock
          CALZ_FreCC(chaineR);
                                        /* Ceci a ete introduit le 20051021111351. Cela manquait puisqu'effectivement ci-dessus      */
                                        /* il y a eu une allocation memoire via 'NOM_RELATIF_TEMPORAIRE__LONG'...                    */
          EGAL(chaineR
              ,NOM_RELATIF_TEMPORAIRE_COURT
               );
                                        /* Nom special relatif et suppose invisible de la forme suivante en version courte :         */
                                        /*                                                                                           */
                                        /*                  _MMPPPPPPPCHAINEA.W2                                                     */
                                        /*                  _MMPPPPPPPCHAINEA.FM_____W2_____FM      (apres le 20180207140449)        */
                                        /*                                                                                           */
                                        /* ou 'MM' designe le numero unique de la machine physique, et 'PPPPPPP' le numero du        */
                                        /* processus local correspondant. Enfin, 'CHAINEA' designe une chaine Argument arbitraire    */
                                        /* (eventuellement vide)...                                                                  */
                                        /*                                                                                           */
                                        /* ATTENTION : 'Gvar(...)' provoque surement un 'Malo(...)' dont l'espace ne sera jamais     */
                                        /* rendu...                                                                                  */
                                        /*                                                                                           */
                                        /* A la date du 20070423151129, le nom special relatif 'NOM_RELATIF_TEMPORAIRE_COURT'        */
                                        /* devient :                                                                                 */
                                        /*                                                                                           */
                                        /*                  PPssuuuuuCHAINEA.W2                                                      */
                                        /*                  PPssuuuuuCHAINEA.FM_____W2_____FM      (apres le 20180207140449)         */
                                        /*                                                                                           */
                                        /* ou 'PP' donne les deux derniers chiffres du numero du processus local correspondant,      */
                                        /* 'ss' les deux derniers chiffres du nombre de secondes et enfin 'uuuuu' les cinq           */
                                        /* derniers chiffres du nombre de micro-secondes...                                          */
                                        /*                                                                                           */
                                        /*                                                                                           */
                                        /* On notera le 20180328110513 que remplacer le 'EGAL(...)' ci-dessus par :                  */
                                        /*                                                                                           */
                                        /*                  begin_nouveau_block                                                      */
                                        /*                       Bblock                                                              */
                                        /*                       DEFV(CHAR,INIT(POINTERc(nom_relatif_temporaire_court)               */
                                        /*                                     ,NOM_RELATIF_TEMPORAIRE_COURT                         */
                                        /*                                      )                                                    */
                                        /*                            );                                                             */
                                        /*                                                                                           */
                                        /*                       EGAL(chaineR,nom_relatif_temporaire_court);                         */
                                        /*                                                                                           */
                                        /*                       CALZ_FreCC(nom_relatif_temporaire_court);                           */
                                        /*                       Eblock                                                              */
                                        /*                  end_nouveau_block                                                        */
                                        /*                                                                                           */
                                        /* est stupide car, en effet, 'chaineR' a pour valeur 'nom_relatif_temporaire_court' qui     */
                                        /* est un pointeur. Le 'CALZ_FreCC(...)' rend l'espace qui etait occupe et si une nouvelle   */
                                        /* allocation memoire est demandee avant que 'chaineR' soit utilisee, alors le               */
                                        /* 'nom_relatif_temporaire_court' genere par 'NOM_RELATIF_TEMPORAIRE_COURT' sera compromis.  */

          Test(IFGT(chain_Xtaille(chaineR),LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER))
               Bblock
               Test(IL_FAUT(valider_la_longueur_des_noms_relatifs_de_fichiers))
                    Bblock
                    PRINT_ATTENTION("nom 'invisible' relatif de fichier trop long");
                    CAL1(Prer3("le nom '%s' risque d'etre tronque en '%.*s' sur certains SYSTEMEs archaiques -4-.\n"
                              ,chaineR
                              ,LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER
                              ,chaineR
                               )
                         );
                                        /* Le mot "archaiques" a ete introduit le 20060427121350...                                  */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

#undef    NOM_RELATIF_TEMPORAIRE__LONG
#undef    NOM_RELATIF_TEMPORAIRE_COURT
#undef    DATE_DU_CSH_COURANT
#undef    DATE_COMPLETE_DU_CSH_COURANT
#undef    POST_FIXE_DU_NOM_RELATIF_TEMPORAIRE
#undef    NOMBRE_DE_CHIFFRES_DU_Gpid_DU_NOM_RELATIF_TEMPORAIRE
#undef    NOMBRE_CHIFFRES_NUMERO_MACHINE_HOTE_DU_NOM_RELATIF_TEMPORAIRE
#undef    NUMERO_DE_LA_MACHINE_HOTE
#undef    PRE_FIXE_DU_NOM_RELATIF_TEMPORAIRE
#undef    SEPARATEUR_DES_COMPOSANTES_DU_NOM_RELATIF_TEMPORAIRE__LONG

#undef    NOMBRE_DE_CHIFFRES_DE_MicroSecondes__DU_NOM_RELATIF_TEMPORAIRE
#undef    NOMBRE_DE_CHIFFRES_DE_Secondes_COURT_DU_NOM_RELATIF_TEMPORAIRE
#undef    NOMBRE_DE_CHIFFRES_DE_Secondes_LONG__DU_NOM_RELATIF_TEMPORAIRE
#undef    NOMBRE_DE_CHIFFRES_DU_Gval_Gpid_DU_NOM_RELATIF_TEMPORAIRE

EFonctionC

#undef    PLUS_GRAND_NOMBRE_DE_CHIFFRES_POSSIBLE_DANS__chain_numero

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N   N O M   A B S O L U   T E M P O R A I R E  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(generation_d_un_nom_absolu_dans_xT_temporaire(chaineA))))
                                        /* ATTENTION : la valeur renvoyee par la fonction elle-meme                                  */
                                        /* est un pointeur vers la chaine resultante, d'ou le type 'FonctionC'.                      */
                                        /* Le resultat pourra donc etre place dans une variable POINTERc...                          */
                                        /*                                                                                           */
                                        /* Cette fonction fut introduite le 20061226110606...                                        */
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine Argument eventuellement vide ('C_VIDE').                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),CHAINE_UNDEF));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/
     EGAp(chaineR
         ,chain_Aconcaten3(Direct__xT
                          ,cSEPARATEUR_DES_PATHS
                          ,generation_d_un_nom_relatif_temporaire(chaineA)
                           )
          );
                                        /* Nom special absolu dans '$xT'...                                                          */

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        T E S T   D E   L ' E X I S T E N C E   D ' U N   F I C H I E R                                                            */
/*        A V E C   P R E - M I S E - A - J O U R   D U   C A C H E   D E S   D I R E C T O R I E S  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,Ftest_fichier_avec_pre_mise_a_jour_du_cache_des_directories(nom_du_fichier
                                                                                      ,pre_mettre_a_jour_le_cache_des_directories
                                                                                      ,editer_les_messages_d_erreur
                                                                                       )
                 )
     )
                                        /* Fonction introduite le 20070423104937 pour tenter de corriger l'anomalie decrite dans     */
                                        /* 'v $xcg/parallele.01$K 20070423095209'...                                                 */
DEFV(Argument,DEFV(CHAR,DTb0(nom_du_fichier)));
                                        /* Nom du fichier a tester.                                                                  */
DEFV(Argument,DEFV(Logical,pre_mettre_a_jour_le_cache_des_directories));
                                        /* Faut-il commencer par une pre-mise-a-jour du cache des directories et ce afin de          */
                                        /* corriger l'anomalie 'v $xcg/parallele.01$K 20070423095209' ?                              */
DEFV(Argument,DEFV(Logical,editer_les_messages_d_erreur));
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */
                                        /* eventuels...                                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IL_FAUT(pre_mettre_a_jour_le_cache_des_directories))
          Bblock
          DEFV(CHAR,INIT(POINTERc(nom_du_fichier_de_pre_mise_a_jour_du_cache_des_directories)
                        ,chain_Aconcaten3(nom_du_fichier
                                         ,cSEPARATEUR_DES_COMPOSANTES_D_UN_NOM
                                         ,generation_d_un_nom_relatif_temporaire(C_VIDE)
                                          )
                         )
               );
          DEFV(CHAR,INIS(DTb0(fichier_de_pre_mise_a_jour_du_cache_des_directories),Ichaine01(K_UNDEF)));
                                        /* Definition du fichier temporaire destine a provoquer une ecriture dans le directory       */
                                        /* de 'nom_du_fichier' et ainsi provoquer une mise a jour du cache des directories, ce       */
                                        /* qui devrait permettre un 'Ftest_fichier(...)' rapide et fiable ci-apres. Il est defini    */
                                        /* de facon a etre dans le meme directory que 'nom_du_fichier'...                            */
                                        /*                                                                                           */
                                        /* Le 20070424091006, la definition :                                                        */
                                        /*                                                                                           */
                                        /*        DEFV(CHAR,INIT(fichier_de_pre_mise_a_jour_du_cache_des_directories,K_UNDEF));      */
                                        /*                                                                                           */
                                        /* fut remplace par ce qui precede afin d'eviter le message :                                */
                                        /*                                                                                           */
                                        /*        warning: passing arg 1 of `Fstore_non_securise_fichier_non_formatte'               */
                                        /*        makes pointer from integer without a cast                                          */
                                        /*                                                                                           */
                                        /* sur '$LACT15'...                                                                          */

          BSaveModifyVariable(Logical
                             ,valider_la_longueur_des_noms_absolus_de_fichiers
                             ,NE_PAS_VALIDER_LA_LONGUEUR_DES_NOMS_ABSOLUS_DE_FICHIERS
                              );
          BSaveModifyVariable(Logical
                             ,valider_la_longueur_des_noms_relatifs_de_fichiers
                             ,NE_PAS_VALIDER_LA_LONGUEUR_DES_NOMS_RELATIFS_DE_FICHIERS
                              );
                                        /* Controle de la validation de la longueur des noms de fichiers...                          */
                                        /*                                                                                           */
                                        /* Mis sous cette forme le 20101115152019...                                                 */

          CALS(Fdelete_fichier(nom_du_fichier_de_pre_mise_a_jour_du_cache_des_directories
                              ,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS
                               )
               );
                                        /* Destruction initiale du fichier de manoeuvre au cas ou...                                 */

          CALS(Fstore_non_securise_fichier_non_formatte(fichier_de_pre_mise_a_jour_du_cache_des_directories
                                                       ,nom_du_fichier_de_pre_mise_a_jour_du_cache_des_directories
                                                       ,size_CHAR
                                                       ,size_CHAR
                                                       ,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS
                                                        )
               );
                                        /* Tentative d'ecriture du fichier avec comme nom le nom cache...                            */

          CALS(Fdelete_fichier(nom_du_fichier_de_pre_mise_a_jour_du_cache_des_directories
                              ,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS
                               )
               );
                                        /* Destruction finale du fichier de manoeuvre...                                             */

          ESaveModifyVariable(Logical,valider_la_longueur_des_noms_relatifs_de_fichiers);
          ESaveModifyVariable(Logical,valider_la_longueur_des_noms_absolus_de_fichiers);
                                        /* Controle de la validation de la longueur des noms de fichiers...                          */
                                        /*                                                                                           */
                                        /* Mis sous cette forme le 20101115152019...                                                 */

          CALZ_FreCC(nom_du_fichier_de_pre_mise_a_jour_du_cache_des_directories);
                                        /* Liberation de l'espace contenant le nom relatif dit "invisible"...                        */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Test(PAS_D_ERREUR(CODE_ERROR(Ftest_fichier(nom_du_fichier,editer_les_messages_d_erreur))))
          Bblock
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   D E S   " B U G S "   P R E S E N T S  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ  /* Common,DEFV(Fonction,) : bug...                   */
DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ));
                                        /* Ceci a ete introduit le 20020430164907...                                                 */
#Aifdef   BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ  /* Common,DEFV(Fonction,) : bug...                   */
#Eifdef   BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ  /* Common,DEFV(Fonction,) : bug...                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A R C H I V A G E   S E C U R I S E   D ' U N   F I C H I E R   C ' E S T - A - D I R E                                    */
/*        D O N T   O N   G A R A N T I T   L ' A C H E V E M E N T   C O R R E C T  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   VALIDER_LE_CONTENU_DES_FICHIERS_APRES_LEUR_ECRITURE_DANS_Fstore_fichier_non_formatte                                          \
                    VRAI
#define   NE_PAS_VALIDER_LE_CONTENU_DES_FICHIERS_APRES_LEUR_ECRITURE_DANS_Fstore_fichier_non_formatte                                   \
                    NOTL(VALIDER_LE_CONTENU_DES_FICHIERS_APRES_LEUR_ECRITURE_DANS_Fstore_fichier_non_formatte)
                                        /* Afin de controler la verification des fichiers apres leur ecriture...                     */

BFonctionI

DEFV(Common,DEFV(Positive,INIT(Fstore_fichier_non_formatte_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

#define   SIZE_FICHIER                                                                                                                  \
                    MIN2(size_fichier,Fstore_fichier_non_formatte_____seuil_size_fichier)
DEFV(Common,DEFV(Int,SINT(Fstore_fichier_non_formatte_____seuil_size_fichier,NE_PAS_SEUILLER_LA_TAILLE_DES_FICHIERS)));
                                        /* Introduit le 20140623100350 afin de permettre, par exemple, d'ecrire partiellement        */
                                        /* une image ('v $xci/CompressionDeCompressionMasquee$K seuil_size_fichier'). On notera que  */
                                        /* la valeur par defaut fait que, sauf modification de cette valeur, c'est 'size_fichier'    */
                                        /* qui est utilise...                                                                        */

#ifdef    BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ
#    define    VALIDER_Fstore                                                                                                           \
                         VALIDER_LE_CONTENU_DES_FICHIERS_APRES_LEUR_ECRITURE_DANS_Fstore_fichier_non_formatte
#Aifdef   BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ
#    define    VALIDER_Fstore                                                                                                           \
                         NE_PAS_VALIDER_LE_CONTENU_DES_FICHIERS_APRES_LEUR_ECRITURE_DANS_Fstore_fichier_non_formatte
#Eifdef   BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ

DEFV(Common,DEFV(Logical,SINT(Fstore_fichier_non_formatte_____valider_le_contenu_des_fichiers_apres_leur_ecriture,VALIDER_Fstore)));
                                        /* Doit-on verifier dans 'Fstore_fichier_non_formatte(...)' que le contenu d'un fichier      */
                                        /* apres son ecriture est bien identique a ce qui devait etre ecrit ?                        */
                                        /*                                                                                           */
                                        /* Cet indicateur a ete introduit le 20020429105701 a cause de problemes graves rencontres   */
                                        /* sur '$CMAP??' (en particulier 'quinet.polytechnique.fr' nommee alors '$CMAP27') lors de   */
                                        /* la generation de la sequence :                                                            */
                                        /*                                                                                           */
                                        /*                  xivPdf 14 1 / 028237_028748                                              */
                                        /*                                                                                           */
                                        /* ou des blocs de '\000' apparaissent dans les fichiers '$xiim/REFL.Wb.????', la longueur   */
                                        /* de ces blocs etant un multiple de la taille des blocs declares pour le montage 'NFS'      */
                                        /* (avec les options "rsize=' et "wsize=") supportant '$xiim'.                               */
                                        /*                                                                                           */
                                        /* On notera au passage que l'option de montage 'soft' etait alors active ; son remplacement */
                                        /* par 'hard' semble "masquer" le probleme (alors que de passer de 'udp' a 'tcp' ne suffit   */
                                        /* pas...). Au passage, pour voir si une certaine '$MACHINE' est victime du probleme, il     */
                                        /* suffit de repeter un certain nombre de fois la suite de commandes :                       */
                                        /*                                                                                           */
                                        /*                  $RSH      $MACHINE  "$xci/acces$X        A=$xiio/GRILLE_16x16            */
                                        /*                                                           convertir=VRAI                  */
                                        /*                                                           R=$xTG/TEST.11                  */
                                        /*                                                           Verifier=FAUX                   */
                                        /*                                                           $formatI                     ;  */
                                        /*                                       $xci/acces$X        A=$xTG/TEST.11                  */
                                        /*                                                           standard=FAUX zero=FAUX         */
                                        /*                                                           R=$xTG/TEST.12                  */
                                        /*                                                           Verifier=FAUX                   */
                                        /*                                                           $formatI                     ;  */
                                        /*                                       $xci/display$X      A=$xTG/TEST.12                  */
                                        /*                                                           p=$xiP/cercle.35                */
                                        /*                                                           $formatI"                       */
                                        /*                                                                                           */
                                        /* alors doit apparaitre une image identique a 'v $xiio/GRILLE_16x16'. Si au bout de         */
                                        /* quelques tentatives (une dizaine...), aucune barre noire horizontale n'est apparue, il    */
                                        /* est possible de considerer que cette '$MACHINE' n'est pas sujette a ce probleme...        */
                                        /*                                                                                           */
                                        /* ATTENTION : il ne faut evidemment pas "piper" les trois commandes ci-dessus entre-elles   */
                                        /* car, en effet, il faut que des fichiers flottants soient reellement crees afin de tester  */
                                        /* le probleme decrit ci-dessus. Enfin, on fera ATTENTION aux differentes variables          */
                                        /* utilisees qui peuvent avoir des valeurs differentes sur '$mHOTE' et sur '$MACHINE'...     */

#ifdef    BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ
#    undef     VALIDER_Fstore
#Aifdef   BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ
#    undef     VALIDER_Fstore
#Eifdef   BUG_SYSTEME_APC_Linux_trous_zeros_dans_des_fichiers_NFS_lors_de_Writ

#undef    VALIDER_LE_CONTENU_DES_FICHIERS_APRES_LEUR_ECRITURE_DANS_Fstore_fichier_non_formatte
#undef    NE_PAS_VALIDER_LE_CONTENU_DES_FICHIERS_APRES_LEUR_ECRITURE_DANS_Fstore_fichier_non_formatte

#define   TEMPORISATION_MINIMALE_D_ITERATION_D_ECRITURE_D_UN_FICHIER                                                                    \
                    UN
#define   TEMPORISATION_MAXIMALE_D_ITERATION_D_ECRITURE_D_UN_FICHIER                                                                    \
                    SECONDES_PAR_MINUTE
#define   INCREMENT_DE_TEMPORISATION_D_ITERATION_D_ECRITURE_D_UN_FICHIER                                                                \
                    UN
                                        /* Lorsqu'il y a un probleme d'ecriture d'un fichier, on attend un certain temps avant de    */
                                        /* renouveler l'operation. La duree de cette attente croit au cours du temps d'un minimum    */
                                        /* (1 seconde) a un maximum (60 secondes). Ce dispositif a ete mis en place le 1995022200    */
                                        /* car sinon, le volume des messages d'erreur, lui aussi participe a la saturation des       */
                                        /* espaces disques...                                                                        */

#define   RALENTISSEMENT_DES_TENTATIVES_DE_Fstore_fichier_non_formatte                                                                  \
                    Bblock                                                                                                              \
                    DODO(temporisation_d_iteration_d_ecriture_d_un_fichier);                                                            \
                                        /* On attend un peu avant de renouveler l'operation...                                       */ \
                    EGAL(temporisation_d_iteration_d_ecriture_d_un_fichier                                                              \
                        ,MIN2(ADD2(temporisation_d_iteration_d_ecriture_d_un_fichier                                                    \
                                  ,INCREMENT_DE_TEMPORISATION_D_ITERATION_D_ECRITURE_D_UN_FICHIER                                       \
                                   )                                                                                                    \
                             ,TEMPORISATION_MAXIMALE_D_ITERATION_D_ECRITURE_D_UN_FICHIER                                                \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Lorsqu'il y a un probleme d'ecriture d'un fichier, on attend un certain temps avant de    */ \
                                        /* renouveler l'operation. La duree de cette attente croit au cours du temps d'un minimum    */ \
                                        /* (1 seconde) a un maximum (60 secondes). Ce dispositif a ete mis en place le 1995022200    */ \
                                        /* car sinon, le volume des messages d'erreur, lui aussi participe a la saturation des       */ \
                                        /* espaces disques...                                                                        */ \
                    Eblock                                                                                                              \
                                        /* Procedure de mise en attente de 'Fstore_fichier_non_formatte(...)' lorsqu'il y a un       */ \
                                        /* defaut d'ecriture, la temporisation croissant au cours du temps d'un minumum vers un      */ \
                                        /* maximum...                                                                                */

DEFV(Common,DEFV(Logical,SINT(Fstore_fichier_non_formatte_____conserver_temporairement_le_fichier_s_il_existe_deja,FAUX)));
                                        /* Introduit le 20170424172730...                                                            */

DEFV(Common,DEFV(Logical,SINT(Fstore_fichier_non_formatte_____utiliser_un_directory_temporaire,FAUX)));
DEFV(Common,DEFV(Int,SINT(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xT)));
                                        /* Le 20160511094757, il a ete introduit la possibilite de generer le fichier de nom         */
                                        /* 'nom_cache_du_fichier' dans un directory temporaire...                                    */
                                        /*                                                                                           */
                                        /* Le 20160511105300, comme tout semble fonctionner correctemment, le dispositif a ete       */
                                        /* active en passant de 'FAUX' a 'VRAI'...                                                   */
                                        /*                                                                                           */
                                        /* Le 20160511114323, je me rends compte (lors de tests sur '$CMAP28'), qu'en fait, ce       */
                                        /* dispositif est relativement impraticable. En effet, la fonction 'Reno(...)' utilisee      */
                                        /* un peu plus loin, ne peut faire son travail de renommage que si l'ancien nom et le        */
                                        /* nouveau nom appartiennent au meme 'File System'. Or meme sur '$LACT19' cela pose un       */
                                        /* serieux probleme : par exemple '$xTSG', '$xTFG' et '$xTG' ne sont pas sur le meme...      */
                                        /* Le plus sage est donc de (provisoirement ?) repasser de 'VRAI' a 'FAUX'...                */
                                        /*                                                                                           */
                                        /* Le 20160512085913, il apparait qu'il faudrait etre capable de savoir de facon tres        */
                                        /* precise, si deux noms absolus appartiennent au meme 'File System' ou pas. En toute        */
                                        /* generalite, cela semble tres difficile. En particulier, il faudrait le verifier pour      */
                                        /* 'racine_du_nom_du_fichier' et 'numero_directory_temporaire_a_utiliser'...                 */
                                        /*                                                                                           */
                                        /* Ce probleme a ete resolu de facon heuristique le 20160512122844...                        */
DEFV(Common,DEFV(Int,SINT(Fstore_fichier_non_formatte_____index_heuristique_d_identite_de_File_Systems,DIX)));
                                        /* Introduit le 20160512122844 afin de pouvoir savoir si deux noms absolus appartiennent     */
                                        /* au meme 'File System'...                                                                  */

DEFV(Common,DEFV(Logical,SINT(Fstore_fichier_non_formatte_____introduire__nom_du_fichier__dans__nom_cache_du_fichier,VRAI)));
                                        /* Introduit le 20170424142123 pour pouvoir disposer de "noms caches" contenant malgre tout  */
                                        /* 'nom_du_fichier'...                                                                       */
                                        /*                                                                                           */
                                        /* Je note le 20180514163015 que par defaut dans le 'nom_cache_du_fichier' n'apparait        */
                                        /* pas 'nom_du_fichier' et que cela peut creer une difficulte d'association entre les        */
                                        /* deux dans les messages d'erreur (voir par exemple lors d'un 'execRVB' lorsque trois       */
                                        /* messages quasiment identiques sont edites). C'est pourquoi le 20180514161618 le message   */
                                        /* d'erreur 'v $xig/fonct$vv$FON est.conservee.temporairement' a ete enrichi par l'edition   */
                                        /* de 'nom_du_fichier' avant celle de 'nom_cache_du_fichier'...                              */
                                        /*                                                                                           */
                                        /* Finalement, le 20231213175017 cet indicateur passe de 'FAUX' a 'VRAI' par defaut...       */

DEFV(Common,DEFV(FonctionI,Fstore_fichier_non_formatte(fichier
                                                      ,nom_du_fichier
                                                      ,size_fichier
                                                      ,unite_fichier
                                                      ,editer_les_messages_d_erreur
                                                       )
                 )
     )
DEFV(Argument,DEFV(CHAR,DTb0(fichier)));
                                        /* Ou le prendre en memoire,                                                                 */
DEFV(Argument,DEFV(CHAR,DTb0(nom_du_fichier)));
                                        /* Nom du fichier a ecrire,                                                                  */
DEFV(Argument,DEFV(Int,size_fichier));
                                        /* Et sa taille en octets.                                                                   */
DEFV(Argument,DEFV(Int,unite_fichier));
                                        /* Nombre d'octets dans l'unite du fichier.                                                  */
DEFV(Argument,DEFV(Logical,editer_les_messages_d_erreur));
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */
                                        /* eventuels...                                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;

     DEFV(Logical,INIT(le_fichier_existe_deja,LUNDEF));
                                        /* Indicateur precisant si le fichier a creer n'existe pas deja...                           */
     /*..............................................................................................................................*/
     VALIDATION_DES_NOMS_DE_FICHIERS(nom_du_fichier,editer_les_messages_d_erreur);
     VALIDATION_DES_TAILLES_DE_FICHIERS(nom_du_fichier,SIZE_FICHIER);

     Test(PAS_D_ERREUR(Ftest_fichier(nom_du_fichier,editer_les_messages_d_erreur)))
                                        /* Cette operation de test de l'existence du fichier par 'Ftest_fichier(...)' n'est pas      */
                                        /* redondante avec celle de 'Fstore_non_securise_fichier_non_formatte(...)' a cause d'une    */
                                        /* part du 'nom_cache_du_fichier', et d'autre part parce que 'Reno(...)' detruit le          */
                                        /* "nouveau nom" s'il existe deja...                                                         */
          Bblock
          MESSAGES_DES_FICHIERS(Prer1("Le fichier de nom '%s' existe deja (peut-etre parce qu'en lecture seule).\n",nom_du_fichier)
                               ,editer_les_messages_d_erreur
                                );

          EGAL(le_fichier_existe_deja,VRAI);

          CODE_ERROR(ERREUR04);
          Eblock
     ATes
          Bblock
          EGAL(le_fichier_existe_deja,FAUX);
          Eblock
     ETes

     Test(IFOU(EST_FAUX(le_fichier_existe_deja)
              ,IFET(EST_VRAI(le_fichier_existe_deja)
                   ,IL_FAUT(Fstore_fichier_non_formatte_____conserver_temporairement_le_fichier_s_il_existe_deja)
                    )
               )
          )
                                        /* Test mis en place le 20170424172730 afin de pouvoir conserver la nouvelle version         */
                                        /* d'un fichier de facon temporaire dans le cas ou il existe deja...                         */
          Bblock
          DEFV(CHAR,INIT(POINTERc(racine_du_nom_du_fichier),C_VIDE));
                                        /* Contient, si necessaire, la racine du nom du fichier (et donc uniquement dans le cas      */
                                        /* ou 'nom_du_fichier' contient des directories...                                           */
          DEFV(CHAR,INIT(POINTERc(nom_du_fichier_sans_SEPARATEUR_DES_PATHS),C_VIDE));
                                        /* Introduit le 20170424142123 pour pouvoir disposer de "noms caches" contenant malgre tout  */
                                        /* 'nom_du_fichier'...                                                                       */
          DEFV(CHAR,INIT(POINTERc(nom_relatif_temporaire),CHAINE_UNDEF));
                                        /* Nom special relatif et suppose invisible.                                                 */
          DEFV(CHAR,INIT(POINTERc(nom_cache_du_fichier),CHAINE_UNDEF));
                                        /* Afin de generer un nom provisoire pour le fichier qui soit inconnu du demandeur ; cela    */
                                        /* est fait pour la raison suivante : imaginons deux process paralleles 'P1' et 'P2', l'un   */
                                        /* creant le fichier 'F1', et l'autre le detruisant (ou le renommant), par exemple a des     */
                                        /* fins de synchronisation (voir le cas de 'v $xrq/proton.K2$Z') :                           */
                                        /*                                                                                           */
                                        /*                  P1 : CALS(Fstore_fichier_non_formatte(F1,...));                          */
                                        /*                                                                                           */
                                        /*                  P2 : CALS(Fdelete_fichier(F1,...));                                      */
                                        /*                                                                                           */
                                        /* dans ces conditions, il peut arriver que 'P2' detruise 'F1' avant que 'P1' n'est fait le  */
                                        /* le test de securisation ci-dessous ('CALS(Fsize_fichier(F1,...));'. Alors ce test sera    */
                                        /* 'FAUX' pour 'P1', et donc il recrera le fichier 'F1'...                                   */
          DEFV(Int,INIT(index_du_dernier_separateur_de_composantes,NOM_DE_FICHIER_RELATIF_AU_DIRECTORY_COURANT));
                                        /* Index dans le nom du fichier Argument du dernier separateur "/".                          */

                                        /* ATTENTION, avant le 1995041100, il y avait ici la declaration suivante :                  */
                                        /*                                                                                           */
                                        /*                  DEFV(Int,INIT(index_de_la_feuille_du_nom_du_fichier,UNDEF));             */
                                        /*                                                                                           */
                                        /* ce qui etait sense representer "index dans le nom du fichier Argument de la 'feuille',    */
                                        /* c'est-a-dire du nom relatif par rapport a une arborescence". Or l'introduction de         */
                                        /* 'SYSTEME_SGPCM801_IRIX_CC' a montre qu'elle etait en fait inutilisee...                   */

          DEFV(Logical,INIT(renommer_le_fichier,VRAI));
                                        /* Indicateur logique indiquant si le fichier doit etre renomme ; il est 'VRAI' la premiere  */
                                        /* fois, mais aussi les fois suivantes s'il y a eu un probleme de renommage par 'Reno(...)'  */
                                        /* (par exemple si une operation de nettoyage -voir 'v $xcg/Xall$Z'- simultanee etait en     */
                                        /* cours sur cette machine, ou bien sur une autre...). Dans ce cas, malheureusement tout     */
                                        /* est a refaire...                                                                          */

          EGAL(index_du_dernier_separateur_de_composantes
              ,chain_recherche_dernier_caractere(nom_du_fichier,SEPARATEUR_DES_DIRECTORIES_D_UN_NOM_DE_FICHIER)
               );
                                        /* Recherche du dernier separateur de directories dans le nom Argument.                      */

          Test(IL_FAUT(Fstore_fichier_non_formatte_____introduire__nom_du_fichier__dans__nom_cache_du_fichier))
               Bblock
               BSaveModifyVariable(Logical
                                  ,MOVE_CARACTERE_____remplacer_les_SEPARATEUR_DES_PATHS
                                  ,VRAI
                                   );
               BSaveModifyVariable(Logical
                                  ,MOVE_CARACTERE_____remplacer_les_SEPARATEUR_DES_COMPOSANTES_D_UN_NOM
                                  ,VRAI
                                   );
                                        /* Introduit le 20231209100818...                                                            */

               EGAp(nom_du_fichier_sans_SEPARATEUR_DES_PATHS,chain_Acopie(nom_du_fichier));

               ESaveModifyVariable(Logical
                                  ,MOVE_CARACTERE_____remplacer_les_SEPARATEUR_DES_COMPOSANTES_D_UN_NOM
                                   );
               ESaveModifyVariable(Logical
                                  ,MOVE_CARACTERE_____remplacer_les_SEPARATEUR_DES_PATHS
                                   );
               Eblock
          ATes
               Bblock
               EGAp(nom_du_fichier_sans_SEPARATEUR_DES_PATHS,chain_Acopie(C_VIDE));
               Eblock
          ETes

          EGAp(nom_relatif_temporaire,generation_d_un_nom_relatif_temporaire(nom_du_fichier_sans_SEPARATEUR_DES_PATHS));
                                        /* Nom special relatif et suppose invisible. ATTENTION : 'Gvar(...)' provoque surement       */
                                        /* un 'Malo(...)' dont l'espace ne sera jamais rendu... Le nom invisible a donc la forme     */
                                        /* suivante :                                                                                */
                                        /*                                                                                           */
                                        /*   _MMPPPPPPP.W2                                                                           */
                                        /*                                                                                           */
                                        /*   1 2   7    2 (soit 13 < 'LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER' caracteres)     */
                                        /*                                                                                           */
                                        /* ou 'MM' designe le numero unique de la machine physique, et 'PPPPPPP' le numero du        */
                                        /* processus local correspondant. Ceci n'est plus vrai a compter du 20180207140449,          */
                                        /* puisque le nom invisible est a compter de cette date :                                    */
                                        /*                                                                                           */
                                        /*   _MMPPPPPPP.FM_____W2_____FM                                                             */
                                        /*                                                                                           */
                                        /*   1 2   7           16        (soit 26...)                                                */
                                        /*                                                                                           */
                                        /* Le 20170424142123, 'nom_du_fichier_sans_SEPARATEUR_DES_PATHS' (valant 'C_VIDE' par        */
                                        /* defaut) a remplace 'C_VIDE'...                                                            */

          CALZ_FreCC(nom_du_fichier_sans_SEPARATEUR_DES_PATHS);

          Test(IFEQ(index_du_dernier_separateur_de_composantes,NOM_DE_FICHIER_RELATIF_AU_DIRECTORY_COURANT))
               Bblock
               EGAp(racine_du_nom_du_fichier
                   ,chain_Acopie(CURRENT_DIRECTORY)
                    );
                                        /* Dans le cas ou le nom du fichier Argument est relatif au directory courant, le nom cache  */
                                        /* choisi pour le fichier est le nom invisible.                                              */
                                        /*                                                                                           */
                                        /* Le 20160512114426, je me demande si le "directory courant" est bien celui qui est         */
                                        /* defini par 'CURRENT_DIRECTORY' ? Si oui, on pourrait "unifier" le generation du nom       */
                                        /* 'nom_cache_du_fichier', en definissant ici :                                              */
                                        /*                                                                                           */
                                        /*                   EGAL(racine_du_nom_du_fichier,chain_Acopie(CURRENT_DIRECTORY));         */
                                        /*                                                                                           */
                                        /* Le 20160512114809, j'essaye donc cela...                                                  */
               Eblock
          ATes
               Bblock
               EGAp(racine_du_nom_du_fichier
                   ,chain_ANcopie(nom_du_fichier,LENG(PREMIER_CARACTERE,index_du_dernier_separateur_de_composantes))
                    );
                                        /* Dans le cas ou le nom du fichier Argument contient au moins un nom de directory, il faut  */
                                        /* recuperer la racine (c'est-a-dire la chaine de directory amenant a la "feuille").         */
               Eblock
          ETes

          Test(IL_FAUT(Fstore_fichier_non_formatte_____utiliser_un_directory_temporaire))
               Bblock
               DEFV(CHAR,INIT(POINTERc(racine_temporaire_du_nom_du_fichier),CHAINE_UNDEF));
                                        /* Contient, si necessaire, une racine temporaire du nom du fichier. Ceci a ete introduit    */
                                        /* le 20160512115906 et a cette date, cela peut paraitre redondant. Mais en fait, cela est   */
                                        /* destine a savoir si 'racine_du_nom_du_fichier' et 'racine_temporaire_du_nom_du_fichier'   */
                                        /* sont dans le meme 'File System' (et ce a terme...).                                       */
                                        /*                                                                                           */
                                        /* Ceci a ete rendu possible de facon heuristique le 20160512122844...                       */

               EGAp(racine_temporaire_du_nom_du_fichier
                   ,chain_Aconcaten2(CON21(IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xBTG)
                                          ,Direct__xBTG
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xBTG0)
                                          ,Direct__xBTG0
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xBTM)
                                          ,Direct__xBTM
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xBTR)
                                          ,Direct__xBTR
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xT)
                                          ,Direct__xT
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTC)
                                          ,Direct__xTC
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTF)
                                          ,Direct__xTF
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTFG)
                                          ,Direct__xTFG
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTFGL)
                                          ,Direct__xTFGL
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTG)
                                          ,Direct__xTG
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTGL)
                                          ,Direct__xTGL
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTG0)
                                          ,Direct__xTG0
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTG0L)
                                          ,Direct__xTG0L
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTL)
                                          ,Direct__xTL
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTM)
                                          ,Direct__xTM
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTR)
                                          ,Direct__xTR
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTS)
                                          ,Direct__xTS
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTSG)
                                          ,Direct__xTSG
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTSGL)
                                          ,Direct__xTSGL
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTSUG)
                                          ,Direct__xTSUG
                                          ,IFEQ(Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser,nDirect__xTV)
                                          ,Direct__xTV
                                          ,Direct__xT
                                           )
                                    ,cSEPARATEUR_DES_DIRECTORIES_D_UN_NOM_DE_FICHIER
                                     )
                    );
                                        /* Possibilite introduite le 20160511094757. Mais, a cause de la fonction 'Reno(...)'        */
                                        /* utilisee un peu plus loin, ce dispostif est en general inutilisable (voir a ce propos     */
                                        /* 'v $xig/fonct$vv$FON 20160511114323')...                                                  */
                                        /*                                                                                           */
                                        /* Le directory '$xTSUG' a ete introduit le 20170515103942...                                */

               CALS(chain_compare(racine_du_nom_du_fichier,racine_temporaire_du_nom_du_fichier));
                                        /* Comparaison des deux racines...                                                           */

               Test(IFGE(chain_compare_____index_des_derniers_caracteres_identiques
                        ,Fstore_fichier_non_formatte_____index_heuristique_d_identite_de_File_Systems
                         )
                    )
                    Bblock
                    EGAp(racine_du_nom_du_fichier
                        ,chain_Acopie(racine_temporaire_du_nom_du_fichier)
                         );
                                        /* Lorsqu'il semble que 'racine_du_nom_du_fichier' et 'racine_temporaire_du_nom_du_fichier'  */
                                        /* sont dans le meme 'File System', on accepte 'racine_temporaire_du_nom_du_fichier'. Sinon, */
                                        /* on conserve 'racine_du_nom_du_fichier' pour le fichier temporaire...                      */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               CALZ_FreCC(racine_temporaire_du_nom_du_fichier);
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          EGAp(nom_cache_du_fichier
              ,chain_Aconcaten2(racine_du_nom_du_fichier,nom_relatif_temporaire)
               );
                                        /* Puis, afin de generer le nom cache, on concatene le nom invisible a la racine...          */

          CALZ_FreCC(nom_relatif_temporaire);
                                        /* Liberation de l'espace contenant le nom relatif dit "invisible"...                        */

          Tant(IL_FAUT(renommer_le_fichier))
               Bblock
               DEFV(Logical,INIT(ecrire_le_fichier,VRAI));
                                        /* Indicateur logique indiquant si le fichier doit etre ecrit ; cela est 'VRAI' la premiere  */
                                        /* fois, mais aussi les fois suivantes s'il y a eu un probleme d'ecriture (par exemple si    */
                                        /* l'espace disque est sature...).                                                           */
                                        /* Le 19980917121313, cette definition a ete placee ici afin qu'a chaque tentative de        */
                                        /* renommage du fichier, on [re]commence un cycle complet d'ecriture...                      */
               DEFV(Int,INIT(temporisation_d_iteration_d_ecriture_d_un_fichier
                            ,TEMPORISATION_MINIMALE_D_ITERATION_D_ECRITURE_D_UN_FICHIER
                             )
                    );
                                        /* Lorsqu'il y a un probleme d'ecriture d'un fichier, on attend un certain temps avant de    */
                                        /* renouveler l'operation. La duree de cette attente croit au cours du temps d'un minimum    */
                                        /* (1 seconde) a un maximum (60 secondes). Ce dispositif a ete mis en place le 1995022200    */
                                        /* car sinon, le volume des messages d'erreur, lui aussi participe a la saturation des       */
                                        /* espaces disques...                                                                        */
                                        /* Le 19980917121313, cette definition a ete placee ici afin qu'a chaque tentative de        */
                                        /* renommage du fichier, on [re]commence un cycle complet d'ecriture...                      */

               Tant(IL_FAUT(ecrire_le_fichier))
                    Bblock
                    DEFV(Int,INIT(size_fichier_reellement_ecrit,UNDEF));
                                        /* Taille du fichier reellement ecrit...                                                     */

                    Test(PAS_D_ERREUR(Ftest_fichier(nom_cache_du_fichier,editer_les_messages_d_erreur)))
                         Bblock
                         CALS(Fdelete_fichier(nom_cache_du_fichier,editer_les_messages_d_erreur));
                                        /* Le fichier "cache" doit etre detruit au prealable s'il existe...                          */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    CALS(Fstore_non_securise_fichier_non_formatte(fichier
                                                                 ,nom_cache_du_fichier
                                                                 ,SIZE_FICHIER
                                                                 ,unite_fichier
                                                                 ,editer_les_messages_d_erreur
                                                                  )
                         );
                                        /* Tentative d'ecriture du fichier avec comme nom le nom cache...                            */

                    Test(PAS_D_ERREUR(Ftest_fichier(nom_cache_du_fichier,editer_les_messages_d_erreur)))
                         Bblock
                                        /* Cas ou le fichier 'nom_cache_du_fichier' a bien ete cree. Ce test fut introduit le        */
                                        /* 20061122120428 pour tenir compte des cas ou le directory auquel appartient le fichier     */
                                        /* n'existerait pas, ce qui correspond a la cause la plus frequente ; cela s'est vu a cette  */
                                        /* date avec 'v $Darchives/commandes/images/PALETTES/20061122094317/PALETTE$K NOM_PALETTE'   */
                                        /* qui cherchait a creer la palette "palettes/NOM_PALETTE" dans '$xiP' alors que le          */
                                        /* dispositif 'v $xiii/files$FON files_____faciliter_l_acces_au_directory_images' etait      */
                                        /* evidemment actif (le directory ou creer 'NOM_PALETTE' etait donc '$xiP/palettes'...).     */
                         CALS(Fsize_fichier(nom_cache_du_fichier,ADRESSE(size_fichier_reellement_ecrit),editer_les_messages_d_erreur));
                                        /* Apres l'ecriture, on regarde combien d'octets ont ete ecrits. Nota : cet dispositif       */
                                        /* a ete introduit apres le montage d'un file system du 'SYSTEME_DPX5000_SPIX' sur           */
                                        /* 'SYSTEME_VAX9000_ULTRIX' ; environ 70% des ecritures depuis 'SYSTEME_VAX9000_ULTRIX' sont */
                                        /* correctes, les 30% restantes donnant une taille inferieure. Il est difficile de savoir    */
                                        /* qui est responsable (bien que cela soit surement 'SYSTEME_DPX5000_SPIX'), mais pour des   */
                                        /* raisons evidentes, on ne peut faire ici de compilations conditionnelles, car en effet, il */
                                        /* faudrait qu'elles soient en quelque sorte "croisees"...                                   */

                         Test(IFEQ(size_fichier_reellement_ecrit,Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit))
                              Bblock
                              Test(IFET(IL_FAUT(Fstore_fichier_non_formatte_____valider_le_contenu_des_fichiers_apres_leur_ecriture)
                                       ,EST_FAUX(Fstore_non_securise_fichier_non_formatte_____un_compactage_a_ete_effectue)
                                        )
                                   )
                                        /* Cette sequence a ete introduite le 20020429105701 a cause de problemes graves rencontres  */
                                        /* sur '$CMAP??' lors de la generation de la sequence :                                      */
                                        /*                                                                                           */
                                        /*                  xivPdf 14 1 / 028237_028748                                              */
                                        /*                                                                                           */
                                        /* ou des blocs de '\000' apparaissent dans les fichiers '$xiim/REFL.Wb.????', la longueur   */
                                        /* de ces blocs etant un multiple de la taille des blocs declares pour le montage 'NFS'      */
                                        /* supportant '$xiim'. Il y a alors des "trous" de "zeros" dans les fichiers...              */
                                        /*                                                                                           */
                                        /* Le 20120206080631 a ete introduit une condition supplementaire : la comparaison entre     */
                                        /* le fichier a ecrire et ce qui a ete effectivement ecrit ne peut evidemment avoir lieu     */
                                        /* que s'il n'y a pas eu de compactage...                                                    */
                                   Bblock
                                   DEFV(Int,INIT(index_de_comparaison,UNDEF));
                                        /* Index de comparaison des deux fichiers ("a ecrire" et "ecrit").                           */
                                   DEFV(Logical,INIT(les_deux_fichiers_sont_identiques,VRAI));
                                        /* Afin de savoir si les deux fichiers ("a ecrire" et "ecrit") sont identiques...            */
                                   DEFV(CHAR,INIT(POINTERc(fichier_reellement_ecrit),CHAINE_UNDEF));
                                   ckMalo(fichier_reellement_ecrit
                                         ,Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit
                                         ,Fstore_fichier_non_formatte_____compteur_des_kMalo
                                          );
                                        /* Zone de manoeuvre ou mettre le fichier reellement ecrit...                                */

                                   CALS(Fload_fichier_non_formatte(nom_cache_du_fichier
                                                                  ,fichier_reellement_ecrit
                                                                  ,Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit
                                                                  ,unite_fichier
                                                                  ,editer_les_messages_d_erreur
                                                                  ,editer_les_messages_d_erreur
                                                                   )
                                        );
                                        /* Relecture immediate du fichier qui vient juste d'etre ecrit...                            */

                                   DoIn(index_de_comparaison
                                       ,PREMIER_CARACTERE
                                       ,LSTX(PREMIER_CARACTERE,Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit)
                                       ,I
                                        )
                                        Bblock
                                        Test(IFNE(ITb0(fichier_reellement_ecrit,INDX(index_de_comparaison,PREMIER_CARACTERE))
                                                 ,ITb0(fichier,INDX(index_de_comparaison,PREMIER_CARACTERE))
                                                  )
                                             )
                                             Bblock
                                             EGAL(les_deux_fichiers_sont_identiques,FAUX);
                                        /* Une difference au moins a ete trouvee...                                                  */
                                             Eblock
                                        ATes
                                             Bblock
                                             Eblock
                                        ETes
                                        Eblock
                                   EDoI

                                   Test(EST_VRAI(les_deux_fichiers_sont_identiques))
                                        Bblock
                                        EGAL(ecrire_le_fichier,FAUX);
                                        /* Les deux fichiers ("a ecrire" et "ecrit") etant identiques, on arrete la...               */
                                        Eblock
                                   ATes
                                        Bblock
                                        PRINT_ERREUR("probleme lors de l'ecriture d'un fichier ('trous' a l'interieur)");
                                        CAL1(Prer2("Il s'agit du fichier '%s' et sa taille est %" ## BFd ## "\n"
                                                  ,nom_du_fichier
                                                  ,Fstore_non_securise_fichier_non_formatte_____size_last_file_ecrit
                                                   )
                                             );
                                        /* Ces messages ne sont pas conditionnes par 'MESSAGES_DES_FICHIERS(...)' car, en effet,     */
                                        /* ils sont vitaux.                                                                          */
                                        Eblock
                                   ETes

                                   CALZ_FreFF(fichier_reellement_ecrit);
                                        /* Lorsque la comparaison a ete demandee, il faut rendre la memoire temporaire allouee.      */
                                   Eblock
                              ATes
                                   Bblock
                                   EGAL(ecrire_le_fichier,FAUX);
                                        /* En general, tout est bon, et on arrete la...                                              */
                                   Eblock
                              ETes
                              Eblock
                         ATes
                              Bblock
                              PRINT_ERREUR("probleme lors de l'ecriture d'un fichier (1)");

                              begin_nouveau_block
                                   Bblock
                                   DEFV(CHAR,INIC(POINTERc(format_EGAq_1____ERREUR)
                                       ,chain_Aconcaten2("(saturation de l'espace disque disponible ","?)\n")
                                                  )
                                        );

                                   CAL1(Prer0(format_EGAq_1____ERREUR));
                                        /* La presence de 'chain_Aconcaten2(...)' est rendue necessaire par la presence d'un espace  */
                                        /* devant le caractere "?", espace qui disparait alors dans 'v $xcc/cpp$D/compacte.1$sed'... */

                                   CALZ_FreCC(format_EGAq_1____ERREUR);
                                   Eblock
                              end_nouveau_block

                              CAL1(Prer1("Il s'agit du fichier '%s'\n",nom_du_fichier));
                              SEQUENCE_ARCHAIQUE(PRINT_ERREUR("(ou erreur 'NFS' sur 'LACT11' ('SYSTEME_DPX5000_SPIX'))"););
                                        /* Ces messages ne sont pas conditionnes par 'MESSAGES_DES_FICHIERS(...)' car, en effet,     */
                                        /* ils sont vitaux.                                                                          */
                              Eblock
                         ETes

                         Test(IL_FAUT(ecrire_le_fichier))
                              Bblock
                              RALENTISSEMENT_DES_TENTATIVES_DE_Fstore_fichier_non_formatte;
                                        /* Lorsqu'il y a un probleme d'ecriture d'un fichier, on attend un certain temps avant de    */
                                        /* renouveler l'operation, ce temps augmentant lui-meme progressivement...                   */
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                                        /* Cas ou le fichier 'nom_cache_du_fichier' n'a pas pu etre cree :                           */
                         PRINT_ERREUR("probleme lors de l'ecriture d'un fichier (2)");

                         begin_nouveau_block
                              Bblock
                              DEFV(CHAR,INIC(POINTERc(format_EGAq_2____ERREUR)
                                            ,chain_Aconcaten2("(saturation de l'espace disque disponible ou directory inexistant "
                                                             ,"?)\n"
                                                              )
                                             )
                                   );

                              CAL1(Prer0(format_EGAq_2____ERREUR));
                                        /* La presence de 'chain_Aconcaten2(...)' est rendue necessaire par la presence d'un espace  */
                                        /* devant le caractere "?", espace qui disparait alors dans 'v $xcc/cpp$D/compacte.1$sed'... */

                              CALZ_FreCC(format_EGAq_2____ERREUR);
                              Eblock
                         end_nouveau_block

                         CAL1(Prer1("Il s'agit du fichier '%s'\n",nom_du_fichier));

                         EGAL(ecrire_le_fichier,FAUX);
                                        /* Il ne faut pas boucler,                                                                   */
                         EGAL(renommer_le_fichier,FAUX);
                                        /* Et il ne faut pas renommer le fichier, puisqu'il n'existe pas...                          */
                         Eblock
                    ETes
                    Eblock
               ETan

               Test(EST_FAUX(le_fichier_existe_deja))
                                        /* Test mis en place le 20170424172730 afin de pouvoir conserver la nouvelle version         */
                                        /* d'un fichier de facon temporaire dans le cas ou il existe deja...                         */
                    Bblock
                    Test(IL_FAUT(renommer_le_fichier))
                         Bblock
                                        /* Cas ou le fichier 'nom_cache_du_fichier' a bien ete cree. Ce test fut introduit le        */
                                        /* 20061122120428 pour tenir compte des cas ou le directory auquel appartient le fichier     */
                                        /* n'existerait pas, ce qui correspond a la cause la plus frequente ; cela s'est vu a cette  */
                                        /* date avec 'v $Darchives/commandes/images/PALETTES/20061122094317/PALETTE$K NOM_PALETTE'   */
                                        /* qui cherchait a creer la palette "palettes/NOM_PALETTE" dans '$xiP' alors que le          */
                                        /* dispositif 'v $xiii/files$FON files_____faciliter_l_acces_au_directory_images' etait      */
                                        /* evidemment actif (le directory ou creer 'NOM_PALETTE' etait donc '$xiP/palettes'...).     */
                         Test(IL_Y_A_ERREUR(Reno(nom_cache_du_fichier,nom_du_fichier)))
                                        /* L'erreur 'EROFS' ("oldpath and newpath are not on the same mounted file system") a pu     */
                                        /* apparaitre pendant quelques instants, jusqu'au 20160512122844, lorsqu'un moyen            */
                                        /* heuristique permettant de savoir si deux noms appartenaient ou pas au meme 'File System'. */
                                        /* a pu etre mis en place...                                                                 */
                              Bblock
                              MESSAGES_DES_FICHIERS(Prer2("Impossible de renommer le fichier '%s' en '%s'.\n"
                                                         ,nom_cache_du_fichier,nom_du_fichier
                                                          )
                                                   ,editer_les_messages_d_erreur
                                                    );

                              RALENTISSEMENT_DES_TENTATIVES_DE_Fstore_fichier_non_formatte;
                                        /* Lorsqu'il y a un probleme d'ecriture d'un fichier, on attend un certain temps avant de    */
                                        /* renouveler l'operation, ce temps augmentant lui-meme progressivement...                   */

                              EGAL(renommer_le_fichier,VRAI);
                                        /* Lorsqu'il y a eu un probleme de renommage par 'Reno(...)' (par exemple si une operation   */
                                        /* de nettoyage -voir 'v $xcg/Xall$Z'- simultanee etait en cours sur cette machine, ou bien  */
                                        /* sur une autre...), alors, malheureusement tout est a refaire... On notera que cet         */
                                        /* 'EGAL(...)' n'est pas utile puisque l'indicateur 'renommer_le_fichier' est 'VRAI' par     */
                                        /* initialisation. Cet 'EGAL(...)' est donc mis uniquement par symetrie...                   */
                              Eblock
                         ATes
                              Bblock
                              EGAL(renommer_le_fichier,FAUX);
                                        /* En general, tout est bon, et on arrete la...                                              */
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    MESSAGES_DES_FICHIERS(Prer2("La future nouvelle version de '%s' est conservee temporairement sous le nom '%s'.\n"
                                               ,nom_du_fichier
                                               ,nom_cache_du_fichier
                                                )
                                         ,editer_les_messages_d_erreur
                                          );
                                        /* L'edition de 'nom_du_fichier' a ete introduite le 20180514161618. Cette information       */
                                        /* est en particulier utile lors d'un 'execRVB' pour faire la difference entre les trois     */
                                        /* composantes chromatiques d'une image...                                                   */

                    EGAL(renommer_le_fichier,FAUX);
                                        /* En general, tout est bon, et on arrete la...                                              */
                    Eblock
               ETes
               Eblock
          ETan

          Test(IFNE(nom_cache_du_fichier,CHAINE_UNDEF))
               Bblock
               CALZ_FreCC(nom_cache_du_fichier);
                                        /* Liberation de l'espace contenant le nom cache du fichier Argument.                        */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFNE(racine_du_nom_du_fichier,CHAINE_UNDEF))
               Bblock
               CALZ_FreCC(racine_du_nom_du_fichier);
                                        /* Liberation de l'espace contenant la racine du nom du fichier Argument.                    */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

#undef    RALENTISSEMENT_DES_TENTATIVES_DE_Fstore_fichier_non_formatte

#undef    INCREMENT_DE_TEMPORISATION_D_ITERATION_D_ECRITURE_D_UN_FICHIER
#undef    TEMPORISATION_MAXIMALE_D_ITERATION_D_ECRITURE_D_UN_FICHIER
#undef    TEMPORISATION_MINIMALE_D_ITERATION_D_ECRITURE_D_UN_FICHIER

#undef    SIZE_FICHIER

EFonctionI

#undef    NOM_DE_FICHIER_RELATIF_AU_DIRECTORY_COURANT

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C E S   A   U N   F I C H I E R   N O N   F O R M A T T E  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* Avant le 20100317145025, la fonction 'Fload_fichier_non_formatte(...)' etait ici...       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   F O R M A T S   D E   L E C T U R E / E C R I T U R E                                        */
/*        D E S   F I C H I E R S   F O R M A T T E S   E N T I E R / F L O T T A N T  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_CHAR                                                                                 \
                    "%c\n"                                                                                                              \
                                        /* Format d'ecriture et de lecture d'un element de type 'Char' d'un fichier formatte.        */

#if       (PRECISION_DU_Int==SIMPLE_PRECISION)
#    define    FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Int                                                                             \
                         "%d\n"                                                                                                         \
                                        /* Format d'ecriture et de lecture d'un element de type 'Int' d'un fichier formatte.         */
#Aif      (PRECISION_DU_Int==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Int==SIMPLE_PRECISION)

#if       (PRECISION_DU_Int==DOUBLE_PRECISION)
#    define    FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Int                                                                             \
                         "%ld\n"                                                                                                        \
                                        /* Format d'ecriture et de lecture d'un element de type 'Int' d'un fichier formatte.         */
#Aif      (PRECISION_DU_Int==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Int==DOUBLE_PRECISION)

#if       (PRECISION_DU_Float==SIMPLE_PRECISION)
#    define    FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Float                                                                           \
                         "%g\n"                                                                                                         \
                                        /* Format d'ecriture et de lecture d'un element de type 'Float' d'un fichier formatte.       */
#Aif      (PRECISION_DU_Float==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Float==SIMPLE_PRECISION)

#if       (PRECISION_DU_Float==DOUBLE_PRECISION)
#    define    FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Float                                                                           \
                         "%lg\n"                                                                                                        \
                                        /* Format d'ecriture et de lecture d'un element de type 'Float' d'un fichier formatte.       */
#Aif      (PRECISION_DU_Float==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Float==DOUBLE_PRECISION)

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   T O U T E S   L E S   F O N C T I O N S   D E   R A N G E M E N T                              */
/*        D ' U N   F I C H I E R   F O R M A T T E   ( ' Float '   O U   ' Int ' )  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   GENERE__FonctionI_Fstore(nom_et_arguments_de_la_fonction,type_fichier,format_de_lecture)                                      \
                                        /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees       */ \
                                        /* a la recuperation automatique des fichiers d'arguments. Enfin, on notera que les noms des */ \
                                        /* Arguments ont ete raccourcis au maximum afin de faire tenir l'appel de cette procedure    */ \
                                        /* sur une ligne, et que ces noms sont choisis de facon a eviter au maximum des conflits     */ \
                                        /* avec des procedures pre-existantes (par exemple 'val(...)').                              */ \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
                                        /* ATTENTION, il ne faut pas ecrire :                                                        */ \
                                        /*                                                                                           */ \
                                        /*                  DEFV(Common,DEFV(FonctionI,nom_et_arguments_de_la_fonction))             */ \
                                        /*                                                                                           */ \
                                        /* puisqu'en effet la directive 'Common' est utilisee lors de l'appel par :                  */ \
                                        /*                                                                                           */ \
                                        /*                  DEFV(Common,GENERE__FonctionI_Fstore(...))                               */ \
                                        /*                                                                                           */ \
                                        /* Actuellement cette redondance ne serait pas genante, mais plus tard...                    */ \
DEFV(Argument,DEFV(CHAR,DTb0(NoM)));                                                                                                    \
                                        /* Nom du fichier a ecrire. Cet argument s'appelle d'habitude 'nom_du_fichier'.              */ \
DEFV(Argument,DEFV(type_fichier,DTb0(FiC)));                                                                                            \
                                        /* Ou le prendre en memoire,                                                                 */ \
DEFV(Argument,DEFV(Int,SiZ));                                                                                                           \
                                        /* Et taille en nombre d'elements de type 'type_fichier'. Cet argument s'appelle             */ \
                                        /* d'habitude 'size_fichier'...                                                              */ \
DEFV(Argument,DEFV(Positive,PaS));                                                                                                      \
                                        /* Cet Argument supplementaire permet de sauter periodiquement des elements dans le fichier. */ \
                                        /* On notera que la valeur standard ('ZERO') permet de memoriser tous les elements...        */ \
DEFV(Argument,DEFV(Logical,EdI));                                                                                                       \
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */ \
                                        /* eventuels. Cet argument s'appelle d'habitude 'editer_les_messages_d_erreur'.              */ \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     INIT_ERROR;                                                                                                                        \
                                                                                                                                        \
     DEFV(File,POINTERs(file_Wdescriptor));                                                                                             \
                                        /* Descripteur du fichier.                                                                   */ \
     DEFV(Int,INIT(index,UNDEF));                                                                                                       \
                                        /* Index de remplissage du fichier...                                                        */ \
     DEFV(type_fichier,INIT(element_saute,ZERO));                                                                                       \
                                        /* Tampon destine a mettre les eventuelles valeurs que l'on saute lorsque l'Argument 'PaS'   */ \
                                        /* n'est pas nul. On notera l'initialisation en fait inutile, mais rendue obligatoire par    */ \
                                        /* 'SYSTEME_ES9000_AIX_CC' pour eviter le message :                                          */ \
                                        /*                                                                                           */ \
                                        /*        w "fonction.c",L...: Variable "element_saute" is possibly referenced before set.   */ \
                                        /*                                                                                           */ \
                                        /* Enfin, la valeur initiale choisie ('ZERO') l'est afin d'etre independante du type de      */ \
                                        /* l'element 'type_fichier'...                                                               */ \
     /*..............................................................................................................................*/ \
     VALIDATION_DES_NOMS_DE_FICHIERS(NoM,EdI);                                                                                          \
     VALIDATION_DES_TAILLES_DE_FICHIERS(NoM,SiZ);                                                                                       \
                                                                                                                                        \
     EGAL(file_Wdescriptor,Fopen(NoM,file_Wmode));                                                                                      \
                                        /* Tentative d'ouverture du fichier en ecriture.                                             */ \
     Test(IFEQ(file_Wdescriptor,DESCRIPTEUR_D_UN_FICHIER_INEXISTANT))                                                                   \
          Bblock                                                                                                                        \
          MESSAGES_DES_FICHIERS(Prer1("Impossible d'ouvrir le fichier de nom '%s'.\n",NoM)                                              \
                               ,EdI                                                                                                     \
                                );                                                                                                      \
                                        /* Et on abandonne...                                                                        */ \
          CODE_ERROR(ERREUR01);                                                                                                         \
          Eblock                                                                                                                        \
     ATes                                                                                                                               \
          Bblock                                                                                                                        \
          DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,LSTX(PREMIER_ELEMENT_D_UN_FICHIER,SiZ),I)                                             \
               Bblock                                                                                                                   \
               CALZ(FPrin1(file_Wdescriptor                                                                                             \
                          ,NE_PAS_FLUSHER_LE_FILE                                                                                       \
                          ,format_de_lecture                                                                                            \
                          ,ITb0(FiC,INDX(index,PREMIER_ELEMENT_D_UN_FICHIER))                                                           \
                           )                                                                                                            \
                    );                                                                                                                  \
                                        /* Ecriture de l'element courant...                                                          */ \
                                                                                                                                        \
               Test(IFLT(index,LSTX(PREMIER_ELEMENT_D_UN_FICHIER,SiZ)))                                                                 \
                    Bblock                                                                                                              \
                                        /* Cas ou l'on n'est pas sur le dernier element :                                            */ \
                    Repe(PaS)                                                                                                           \
                         Bblock                                                                                                         \
                         CALZ(FPrin1(file_Wdescriptor                                                                                   \
                                    ,NE_PAS_FLUSHER_LE_FILE                                                                             \
                                    ,format_de_lecture                                                                                  \
                                    ,element_saute                                                                                      \
                                     )                                                                                                  \
                              );                                                                                                        \
                                        /* Saut eventuel de quelques elements...                                                     */ \
                         Eblock                                                                                                         \
                    ERep                                                                                                                \
                    Eblock                                                                                                              \
               ATes                                                                                                                     \
                    Bblock                                                                                                              \
                                        /* Le saut de certains elements n'a pas lieu pour le dernier element car la chose n'est      */ \
                                        /* alors plus utile, et evite ainsi l'emission de messages d'erreur...                       */ \
                    Eblock                                                                                                              \
               ETes                                                                                                                     \
               Eblock                                                                                                                   \
          EDoI                                                                                                                          \
          CALZ(Fclos(file_Wdescriptor));                                                                                                \
                                        /* Et on ferme le fichier.                                                                   */ \
          Eblock                                                                                                                        \
     ETes                                                                                                                               \
                                                                                                                                        \
     RETU_ERROR;                                                                                                                        \
     Eblock

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R A N G E M E N T   D ' U N   F I C H I E R   F O R M A T T E   E N T I E R  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   FsfI                                                                                                                          \
                    FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Int                                                                        \
                                        /* Format d'ecriture d'un element de type 'Int' d'un fichier formatte.                       */

BFonctionI

DEFV(Common,GENERE__FonctionI_Fstore(Fstore_fichier_formatte_Int(NoM,FiC,SiZ,PaS,EdI),Int,FsfI))         /* Common,DEFV(Fonction,) : */

EFonctionI

#undef    FsfI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R A N G E M E N T   D ' U N   F I C H I E R   F O R M A T T E   F L O T T A N T  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   FsfF                                                                                                                          \
                    FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Float                                                                      \
                                        /* Format d'ecriture d'un element de type 'Float' d'un fichier formatte.                     */

BFonctionI

DEFV(Common,GENERE__FonctionI_Fstore(Fstore_fichier_formatte_Float(NoM,FiC,SiZ,PaS,EdI),Float,FsfF))     /* Common,DEFV(Fonction,) : */

EFonctionI

#undef    FsfF

#undef    GENERE__FonctionI_Fstore

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   T O U T E S   L E S   F O N C T I O N S   D ' A C C E S                                        */
/*        A   U N   F I C H I E R   F O R M A T T E   ( ' Float '   O U   ' Int ' )  :                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Rangement en memoire :                                                                                                     */
/*                                                                                                                                   */
/*                    Les images image(X,Y) sont rangees sequentiellement                                                            */
/*                  dans la memoire de la facon suivante image[Y][X] : c'est la                                                      */
/*                  coordonnee "X" qui varie la plus vite ; on trouve donc                                                           */
/*                  ainsi dans l'ordre les points {X,Y} :                                                                            */
/*                                                                                                                                   */
/*                            (0,0),(1,0),(2,0),...                                                                                  */
/*                            (0,1),(1,1),(2,1),...                                                                                  */
/*                            (0,2),(1,2),(2,2),...                                                                                  */
/*                            .                                                                                                      */
/*                            .                                                                                                      */
/*                            .                                                                                                      */
/*                                                                                                                                   */
/*                  ainsi que cela est decrit dans 'v $xiii/Images$DEF Rangement.en.memoire'.                                        */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* On designera ci-apres par 'ValUndef" les valeurs :                                        */
                                        /*                                                                                           */
                                        /*                  Fload_fichier_formatte_Int_____valeur_indefinie                          */
                                        /*                  Fload_fichier_formatte_Float_____valeur_indefinie                        */
                                        /*                                                                                           */
                                        /* respectivement suivant le type {Int,Float} d'acces au fichier.                            */

#define   CODES_DESIGNANT_DES_VALEURS_NUMERIQUES_DUPLIQUEES_DANS_FonctionI_Fload                                                        \
                    K_D                                                                                                                 \
                                        /* Code reperant des valeurs a "Dupliquer" par rapport a la precedente lorsque des valeurs   */ \
                                        /* indefinies sont rencontrees (au debut d'un fichier, c'est la valeur par defaut 'ValUndef' */ \
                                        /* qui est utilisee).                                                                        */
#define   CODES_DESIGNANT_DES_VALEURS_NUMERIQUES_EXTRAPOLEES_DANS_FonctionI_Fload                                                       \
                    K_E                                                                                                                 \
                                        /* Code reperant des valeurs a "Extrapoler" par rapport aux deux valeurs precedentes (au     */ \
                                        /* debut d'un fichier, c'est la valeur par defaut 'ValUndef' qui est utilisee). On notera    */ \
                                        /* que l'on ne peut "Interpoler" puisqu'en effet la valeur suivante n'est pas encore connue. */
#define   CODES_DESIGNANT_DES_VALEURS_NUMERIQUES_UNDEFINIES_DANS_FonctionI_Fload                                                        \
                    K_U                                                                                                                 \
                                        /* Code reperant des valeurs "Undefinies" auxquelles sera substituee la valeur 'ValUndef'.   */

DEFV(Common,DEFV(Positive,INIT(FonctionI_Fload_____taille_du_fichier,UNDEF)));
                                        /* Taille du fichier recupere par une fonction definie par 'GENERE__FonctionI_Fload(...)'.   */
                                        /* On notera que cette taille est commune a toutes les fonctions ainsi definies et est       */
                                        /* donnee en nombre d'elements de type 'type_fichier' (introduit le 20010420094445).         */
                                        /*                                                                                           */
                                        /* ATTENTION : contrairement a ce que j'esperais, 'FonctionI_Fload_____taille_du_fichier'    */
                                        /* ne peut etre utilise pour 'v $xig/fonct$vv$DEF __ParaLon' car, en effet, il y a en        */
                                        /* quelque sorte "asynchronisme" entre son positionnement et son utilisation pour editer     */
                                        /* la valeur des Parametres d'une commande ('v $xig/fonct$vv$DEF GET_PARAMETRES.nombre'      */
                                        /* pour voir comment fonctionne la recuperation des parametres et leur edition -edition      */
                                        /* qui n'a pas lieu au cours du meme tour de 'gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS'-). Alors, */
                                        /* la valeur de 'FonctionI_Fload_____taille_du_fichier' qui est utilisee correspond au       */
                                        /* dernier appel de la fonction 'FonctionI_Fload' qui n'est pas, en general, celle du        */
                                        /* parametre edite. En consequence, tous les :                                               */
                                        /*                                                                                           */
                                        /*                  &define   __ParaLon FonctionI_Fload_____taille_du_fichier&&&             */
                                        /*                                                                                           */
                                        /* qui avaient mis en place ont ete modifie le 20010422205046 (voir par exemple              */
                                        /* 'v $xrv/particule.11$I __ParaLon').                                                       */
DEFV(Common,DEFV(Positive,INIT(FonctionI_Fload_____compteur_valeurs_numeriques_DUPLIQUEES,UNDEF)));
DEFV(Common,DEFV(Positive,INIT(FonctionI_Fload_____compteur_valeurs_numeriques_EXTRAPOLEES,UNDEF)));
DEFV(Common,DEFV(Positive,INIT(FonctionI_Fload_____compteur_valeurs_numeriques_UNDEFINIES,UNDEF)));
                                        /* Compteurs des valeurs {DUPLIQUEES,EXTRAPOLEES,UNDEFINIES}. On notera que ces compteurs    */
                                        /* sont communs a toutes les fonctions definies par 'GENERE__FonctionI_Fload(...)' pour une  */
                                        /* raison particulierement ridicule : la longueur des lignes sur lesquelles elles sont       */
                                        /* definis (qui sont actuellement "tangentes"...). Ceci a ete ajoute le 20000125121521.      */

DEFV(Common,DEFV(Float,INIT(FonctionI_Fload_____valeur_minimale,FLOT__UNDEF)));
DEFV(Common,DEFV(Float,INIT(FonctionI_Fload_____valeur_moyenne,FLOT__UNDEF)));
DEFV(Common,DEFV(Float,INIT(FonctionI_Fload_____valeur_maximale,FLOT__UNDEF)));
                                        /* Donne en permanence les valeurs {minimale,moyenne,maximale} du fichier courant. On notera */
                                        /* que ces valeurs sont "partagees" par les fonctions :                                      */
                                        /*                                                                                           */
                                        /*                  Fload_fichier_formatte_Int                                               */
                                        /*                  Fload_fichier_formatte_Float                                             */
                                        /*                                                                                           */
                                        /* et ce pour des raisons de simplicite. Le type utilise ('Float') est donc le type          */
                                        /* "maximal" compatible pour les deux fonctions. Ce dispositif a ete introduit le            */
                                        /* 20001218152849 lors de modifications portant sur 'v $xrk/verhulst.22$K'.                  */

#define   MESSAGE_DE_GENERE__FonctionI_Fload                                                                                            \
                    "Il y a des elements non numeriques ou il n'y a pas assez d'elements %s de nom '%s' et de type formatte '%s'.\n"    \
                                        /* Introduit le 20080611110553 pour alleger 'MESSAGES_DE_GENERE__FonctionI_Fload(...)', ses  */ \
                                        /* sorties etant un peu "lourdes"...                                                         */
#define   MESSAGES_DE_GENERE__FonctionI_Fload(message_specifique,type_fichier)                                                          \
                    Bblock                                                                                                              \
                    MESSAGES_DES_FICHIERS(Prer3(MESSAGE_DE_GENERE__FonctionI_Fload                                                      \
                                               ,message_specifique                                                                      \
                                               ,No                                                                                      \
                                               ,type_fichier                                                                            \
                                                );                                                                                      \
                                         ,Ed                                                                                            \
                                          );                                                                                            \
                    Eblock                                                                                                              \
                                        /* Envoi des messages d'erreur de 'MESSAGES_DE_GENERE__FonctionI_Fload(...)'.                */

#define   NOMBRE_D_OCTETS_POUR_LES_CODES_NON_NUMERIQUES                                                                                 \
                    UN                                                                                                                  \
                                        /* Nombre d'octets necessaires pour recuperer les codes non numeriques...                    */

DEFV(Common,DEFV(Logical,ZINT(FonctionI_Fload_____les_noms_des_fichiers_sont_convertissables_en_valeurs_numeriques,VRAI)));
                                        /* Indicateur introduit le 20031130101228 qui permet d'outrepasser l'argument 'Co' des       */
                                        /* fonctions definies par 'GENERE__FonctionI_Fload(...)'.                                    */
                                        /*                                                                                           */
                                        /* ATTENTION : ce parametre doit etre modifie ('v $xig/fonct$vv$DEF NomsConvertissables')    */
                                        /* evidemment avant d'etre utilise via les fonctions 'Fload_fichier_formatte_Int(...)'       */
                                        /* et 'Fload_fichier_formatte_Float(...)'.                                                   */

#define   GENERE__FonctionI_Fload(nom_et_arguments_de_la_fonction,type_fichier,fonction_de_conversion,format_de_lecture,ValUndef)       \
                                        /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees       */ \
                                        /* a la recuperation automatique des fichiers d'arguments. Enfin, on notera que les noms des */ \
                                        /* Arguments ont ete raccourcis au maximum afin de faire tenir l'appel de cette procedure    */ \
                                        /* sur une ligne, et que ces noms sont choisis de facon a eviter au maximum des conflits     */ \
                                        /* avec des procedures pre-existantes (par exemple 'val(...)').                              */ \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
                                        /* ATTENTION, il ne faut pas ecrire :                                                        */ \
                                        /*                                                                                           */ \
                                        /*                  DEFV(Common,DEFV(FonctionI,nom_et_arguments_de_la_fonction))             */ \
                                        /*                                                                                           */ \
                                        /* puisqu'en effet la directive 'Common' est utilisee lors de l'appel par :                  */ \
                                        /*                                                                                           */ \
                                        /*                  DEFV(Common,GENERE__FonctionI_Fload(...))                                */ \
                                        /*                                                                                           */ \
                                        /* Actuellement cette redondance ne serait pas genante, mais plus tard...                    */ \
DEFV(Argument,DEFV(CHAR,DTb0(No)));                                                                                                     \
                                        /* Nom du fichier a lire. Cet argument s'appelle d'habitude 'nom_du_fichier'.                */ \
                                        /*                                                                                           */ \
                                        /* L'utilisation du contenu de ce fichier est la suivante :                                  */ \
                                        /*                                                                                           */ \
                                        /*                   <------- P0 ------->  <- Pa ->  <- Pa ->  <- Pa ->  ...                 */ \
                                        /*                                       1         1         1                               */ \
                                        /*                   -----------------------------------------------------------             */ \
                                        /*                  |///////////////////| |///////| |///////| |///////   ...    |            */ \
                                        /*                  |///////////////////| |///////| |///////| |///////          |            */ \
                                        /*                   -----------------------------------------------------------             */ \
                                        /*                                                                                           */ \
                                        /* ou '1' designe la position des octets utiles (c'est-a-dire ceux qui sont recuperes) et    */ \
                                        /* les hachures "//" representent les octets sautes (c'est-a-dire ceux qui sont ignores).    */ \
DEFV(Argument,DEFV(type_fichier,DTb0(Fi)));                                                                                             \
                                        /* Ou le mettre en memoire,                                                                  */ \
DEFV(Argument,DEFV(Int,Si));                                                                                                            \
                                        /* Et taille en nombre d'elements de type 'type_fichier'. Cet argument s'appelle             */ \
                                        /* d'habitude 'size_fichier'...                                                              */ \
DEFV(Argument,DEFV(Positive,P0));                                                                                                       \
                                        /* Cet Argument supplementaire permet de sauter des elements en tete du fichier.             */ \
                                        /* On notera que la valeur standard ('ZERO') permet de recuperer tous les elements...        */ \
DEFV(Argument,DEFV(Positive,Pa));                                                                                                       \
                                        /* Cet Argument supplementaire permet de sauter periodiquement des elements dans le fichier. */ \
                                        /* On notera que la valeur standard ('ZERO') permet de recuperer tous les elements...        */ \
DEFV(Argument,DEFV(Logical,Ed));                                                                                                        \
                                        /* Indicateur logique demandant d'editer ('VRAI') ou pas ('FAUX') les messages d'erreur      */ \
                                        /* eventuels. Cet argument s'appelle d'habitude 'editer_les_messages_d_erreur'.              */ \
DEFV(Argument,DEFV(type_fichier,Va));                                                                                                   \
                                        /* Valeur par defaut que l'on donnera aux elements du fichier si par malheur il n'y en avait */ \
                                        /* pas assez. Cet argument s'appelle d'habitude 'valeur_par_defaut'.                         */ \
DEFV(Argument,DEFV(Logical,Co));                                                                                                        \
                                        /* Indicateur logique permettant de savoir si l'on a le droit d'essayer de convertir le nom  */ \
                                        /* 'No' du fichier en une valeur numerique ('VRAI') ou pas ('FAUX')...                       */ \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     INIT_ERROR;                                                                                                                        \
                                                                                                                                        \
     DEFV(File,POINTERs(file_Rdescriptor));                                                                                             \
                                        /* Descripteur du fichier.                                                                   */ \
     DEFV(Int,INIT(index,UNDEF));                                                                                                       \
                                        /* Index de remplissage du fichier...                                                        */ \
     DEFV(type_fichier,element_saute);                                                                                                  \
                                        /* Tampon destine a mettre les eventuelles valeurs que l'on saute lorsque l'Argument 'Pa'    */ \
                                        /* n'est pas nul...                                                                          */ \
     DEFV(Logical,INIT(le_nom_du_fichier_a_ete_converti_en_une_valeur_numerique,FAUX));                                                 \
                                        /* Indicateur precisant si le nom du fichier a ete converti en une valeur numerique ou pas.  */ \
     /*..............................................................................................................................*/ \
     CLIR(FonctionI_Fload_____compteur_valeurs_numeriques_DUPLIQUEES);                                                                  \
     CLIR(FonctionI_Fload_____compteur_valeurs_numeriques_EXTRAPOLEES);                                                                 \
     CLIR(FonctionI_Fload_____compteur_valeurs_numeriques_UNDEFINIES);                                                                  \
                                        /* Initialisation des compteurs des valeurs {DUPLIQUEES,EXTRAPOLEES,UNDEFINIES}.             */ \
                                                                                                                                        \
     VALIDATION_DES_TAILLES_DE_FICHIERS(No,Si);                                                                                         \
                                                                                                                                        \
     EGAL(FonctionI_Fload_____taille_du_fichier,Si);                                                                                    \
                                        /* Taille en nombre d'elements de type 'type_fichier'. Ceci a ete introduit le               */ \
                                        /* 20010420094445 pour permettre au retour et dans tous les cas de savoir la taille du       */ \
                                        /* fichier ; cela peut paraitre inutile, puisque l'argument d'appel 'Si' donne cette         */ \
                                        /* meme taille qui est donc connue avant l'appel de cette fonction. Mais, en fait, il        */ \
                                        /* s'agit de faciliter l'usage de procedures du type 'v $xrv/ARITHMET.11$I lTRANSFORMAT_01'  */ \
                                        /* qui ne connaissent pas a priori la taille du fichier, or cela peut etre utile pour        */ \
                                        /* agrementer l'edition des parametres ('v $xrv/ARITHMET.11$I __ParaVal').                   */ \
                                                                                                                                        \
     gLOAD_FICHIER_AVEC_CONVERSION(No                                                                                                   \
                                  ,IFET(EST_VRAI(Co)                                                                                    \
                                       ,EST_VRAI(FonctionI_Fload_____les_noms_des_fichiers_sont_convertissables_en_valeurs_numeriques)  \
                                        )                                                                                               \
                                  ,type_fichier                                                                                         \
                                  ,fonction_de_conversion                                                                               \
                                  ,BLOC(Bblock                                                                                          \
                                        DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,LSTX(PREMIER_ELEMENT_D_UN_FICHIER,Si),I)                \
                                             Bblock                                                                                     \
                                             EGAL(ITb0(Fi,INDX(index,PREMIER_ELEMENT_D_UN_FICHIER)),valeur_du_nom);                     \
                                        /* Lorsque le nom du fichier a ete bien converti, la valeur resultante est donnee a tous     */ \
                                        /* les elements que l'on doit initialiser...                                                 */ \
                                             Eblock                                                                                     \
                                        EDoI                                                                                            \
                                        Eblock                                                                                          \
                                        )                                                                                               \
                                  ,le_nom_du_fichier_a_ete_converti_en_une_valeur_numerique                                             \
                                   );                                                                                                   \
                                                                                                                                        \
     Test(EST_FAUX(le_nom_du_fichier_a_ete_converti_en_une_valeur_numerique))                                                           \
                                        /* Cas ou il faut lire le fichier de nom 'No' :                                              */ \
          Bblock                                                                                                                        \
          VALIDATION_DES_NOMS_DE_FICHIERS(No,Ed);                                                                                       \
                                                                                                                                        \
          EGAL(file_Rdescriptor,Fopen(No,file_Rmode));                                                                                  \
                                        /* Tentative d'ouverture du fichier en lecture.                                              */ \
                                        /*                                                                                           */ \
                                        /* En ce qui concerne le probleme 'v $xig/fonct$vv$FON 20051019113924', si l'on place ici    */ \
                                        /* les deux instructions (suite a 'v $xig/fonct$vv$FON 20051207151403') :                    */ \
                                        /*                                                                                           */ \
                                        /*                  CALS(Fclos(file_Rdescriptor));                                           */ \
                                        /*                  EGAL(file_Rdescriptor,Fopen(No,file_Rmode));                             */ \
                                        /*                                                                                           */ \
                                        /* alors, apres le 'Fclos(...)' apparait le message :                                        */ \
                                        /*                                                                                           */ \
                                        /*                  Segmentation fault                                                       */ \
                                        /*                                                                                           */ \
                                        /* Si de plus, l'option :                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  setenv    MALLOC_CHECK_       1                                          */ \
                                        /*                                                                                           */ \
                                        /* est activee, le 'Fclos(...)' provoque le message :                                        */ \
                                        /*                                                                                           */ \
                                        /*                  free(): invalid pointer 0x???????!                                       */ \
                                        /*                                                                                           */ \
                                        /* ou la valeur du pointeur est en fait 'file_Rdescriptor'...                                */ \
                                        /*                                                                                           */ \
                                        /* Cela laisse bien supposer que je ne suis pas responsable de ce probleme puisque dans      */ \
                                        /* ce cas, je ne fais rien entre le 'Fopen(...)' et le 'Fclos(...)'...                       */ \
          Test(IFEQ(file_Rdescriptor,DESCRIPTEUR_D_UN_FICHIER_INEXISTANT))                                                              \
               Bblock                                                                                                                   \
                                        /* Cas ou le fichier ne peut etre ouvert :                                                   */ \
               MESSAGES_DES_FICHIERS(Prer1("Impossible d'ouvrir le fichier de nom '%s'.\n",No)                                          \
                                    ,Ed                                                                                                 \
                                     );                                                                                                 \
                                        /* Et on abandonne...                                                                        */ \
                                                                                                                                        \
               DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,LSTX(PREMIER_ELEMENT_D_UN_FICHIER,Si),I)                                         \
                    Bblock                                                                                                              \
                    EGAL(ITb0(Fi,INDX(index,PREMIER_ELEMENT_D_UN_FICHIER)),Va);                                                         \
                                        /* Lorsqu'il y a erreur d'acces au fichier (parce qu'en general il n'existe pas), on force   */ \
                                        /* la valeur par defaut...                                                                   */ \
                    Eblock                                                                                                              \
               EDoI                                                                                                                     \
                                                                                                                                        \
               CODE_ERROR(ERREUR01);                                                                                                    \
               Eblock                                                                                                                   \
          ATes                                                                                                                          \
               Bblock                                                                                                                   \
                                        /* Cas ou le fichier a pu etre ouvert :                                                      */ \
               DEFV(type_fichier,INIT(element_precedent_precedent_dans_le_fichier,ValUndef));                                           \
               DEFV(type_fichier,INIT(element_precedent_dans_le_fichier,ValUndef));                                                     \
                                        /* Contiennent en permanence les deux elements precedents de l'element courant.              */ \
                                                                                                                                        \
               Repe(P0)                                                                                                                 \
                    Bblock                                                                                                              \
                    Test(IFEQ(Fscan(file_Rdescriptor                                                                                    \
                                   ,format_de_lecture                                                                                   \
                                   ,element_saute                                                                                       \
                                    )                                                                                                   \
                             ,UN                                                                                                        \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Certains elements peuvent etre sautes en tete du fichier...                               */ \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         MESSAGES_DE_GENERE__FonctionI_Fload("a sauter en tete du fichier","type_fichier");                             \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
               ERep                                                                                                                     \
                                                                                                                                        \
               DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,LSTX(PREMIER_ELEMENT_D_UN_FICHIER,Si),I)                                         \
                    Bblock                                                                                                              \
                    Test(IFEQ(Fscan(file_Rdescriptor                                                                                    \
                                   ,format_de_lecture                                                                                   \
                                   ,ITb0(Fi,INDX(index,PREMIER_ELEMENT_D_UN_FICHIER))                                                   \
                                    )                                                                                                   \
                             ,UN                                                                                                        \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Les elements du fichier sont recuperes un a un...                                         */ \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         DEFV(CHAR,DTb1(code_non_numerique,NOMBRE_D_OCTETS_POUR_LES_CODES_NON_NUMERIQUES));                             \
                                        /* Pour voir s'il ne s'agit pas d'un code non numerique...                                   */ \
                         DEFV(Logical,INIT(il_y_a_un_code_non_numerique_valide,VRAI));                                                  \
                                        /* Pour savoir si on a corrige ou pas...                                                     */ \
                         DEFV(type_fichier,INIT(valeur_a_forcer,Va));                                                                   \
                                        /* Valeur a donner a l'element courant du fichier et initialisee avec la valeur par defaut   */ \
                                        /* qui sera donc utilisee ci-apres si 'EST_FAUX(il_y_a_un_code_non_numerique_valide)'.       */ \
                                                                                                                                        \
                         Test(IFEQ(vrai_Fscan(file_Rdescriptor                                                                          \
                                             ,FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_CHAR                                             \
                                             ,code_non_numerique                                                                        \
                                              )                                                                                         \
                                  ,UN                                                                                                   \
                                   )                                                                                                    \
                              )                                                                                                         \
                                        /* Regardons s'il ne s'agit pas d'un code non numerique unique (le 19991123172246).          */ \
                              Bblock                                                                                                    \
                              Choi(ITb1(code_non_numerique,PREMIER_CARACTERE))                                                          \
                                   Bblock                                                                                               \
                                   Ca1e(CODES_DESIGNANT_DES_VALEURS_NUMERIQUES_DUPLIQUEES_DANS_FonctionI_Fload)                         \
                                        Bblock                                                                                          \
                                        EGAL(valeur_a_forcer,element_precedent_dans_le_fichier);                                        \
                                        /* On force la valeur de l'element precedent.                                                */ \
                                                                                                                                        \
                                        INCK(FonctionI_Fload_____compteur_valeurs_numeriques_DUPLIQUEES);                               \
                                        /* Comptage des valeurs "DUPLIQUEES".                                                        */ \
                                        Eblock                                                                                          \
                                   ECa1                                                                                                 \
                                                                                                                                        \
                                   Ca1e(CODES_DESIGNANT_DES_VALEURS_NUMERIQUES_EXTRAPOLEES_DANS_FonctionI_Fload)                        \
                                        Bblock                                                                                          \
                                        EGAL(valeur_a_forcer                                                                            \
                                            ,EXTD(element_precedent_precedent_dans_le_fichier,element_precedent_dans_le_fichier)        \
                                             );                                                                                         \
                                        /* On force la valeur obtenue par extrapolation des deux elements precedents. On notera      */ \
                                        /* que, malheureusement, on ne peut interpoler puisque l'on ne connait pas encore l'element  */ \
                                        /* suivant...                                                                                */ \
                                                                                                                                        \
                                        INCK(FonctionI_Fload_____compteur_valeurs_numeriques_EXTRAPOLEES);                              \
                                        /* Comptage des valeurs "EXTRAPOLEES".                                                       */ \
                                        Eblock                                                                                          \
                                   ECa1                                                                                                 \
                                                                                                                                        \
                                   Ca1e(CODES_DESIGNANT_DES_VALEURS_NUMERIQUES_UNDEFINIES_DANS_FonctionI_Fload)                         \
                                        Bblock                                                                                          \
                                        EGAL(valeur_a_forcer,ValUndef);                                                                 \
                                        /* On force la valeur "indefinie"...                                                         */ \
                                                                                                                                        \
                                        INCK(FonctionI_Fload_____compteur_valeurs_numeriques_UNDEFINIES);                               \
                                        /* Comptage des valeurs "UNDEFINIES".                                                        */ \
                                        Eblock                                                                                          \
                                   ECa1                                                                                                 \
                                                                                                                                        \
                                   Defo                                                                                                 \
                                        Bblock                                                                                          \
                                        EGAL(il_y_a_un_code_non_numerique_valide,FAUX);                                                 \
                                        /* Rien n'a pu etre force ; on va donc utiliser 'Va' ci-apres...                             */ \
                                        Eblock                                                                                          \
                                   EDef                                                                                                 \
                                   Eblock                                                                                               \
                              ECho                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(il_y_a_un_code_non_numerique_valide,FAUX);                                                           \
                                        /* Rien n'a pu etre force ; on va donc utiliser 'Va' ci-apres (ceci a ete rajoute le         */ \
                                        /* 20000724165215 car il semble que cela manquait...                                         */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         Test(EST_FAUX(il_y_a_un_code_non_numerique_valide))                                                            \
                              Bblock                                                                                                    \
                              MESSAGES_DE_GENERE__FonctionI_Fload("a exploiter dans le fichier","type_fichier");                        \
                              MESSAGES_DES_FICHIERS(Prer1(" (L'element courant a le numero %" ## BFd ## ").\n",index)                   \
                                                   ,Ed                                                                                  \
                                                    );                                                                                  \
                                        /* Lorsqu'il n'y a pas assez d'elements, c'est la valeur par defaut qui est forcee (voir     */ \
                                        /* l'initialisation de 'valeur_a_forcer').                                                   */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         EGAL(ITb0(Fi,INDX(index,PREMIER_ELEMENT_D_UN_FICHIER)),valeur_a_forcer);                                       \
                                        /* Positionnement de l'element courant avec une valeur forcee...                             */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IFLT(index,LSTX(PREMIER_ELEMENT_D_UN_FICHIER,Si)))                                                             \
                         Bblock                                                                                                         \
                                        /* Cas ou l'on n'est pas sur le dernier element :                                            */ \
                         Repe(Pa)                                                                                                       \
                              Bblock                                                                                                    \
                              Test(IFEQ(Fscan(file_Rdescriptor                                                                          \
                                             ,format_de_lecture                                                                         \
                                             ,element_saute                                                                             \
                                              )                                                                                         \
                                       ,UN                                                                                              \
                                        )                                                                                               \
                                   )                                                                                                    \
                                        /* Certains elements peuvent etre sautes, et ce de facon periodique...                       */ \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   MESSAGES_DE_GENERE__FonctionI_Fload("a sauter entre deux elements du fichier","type_fichier");       \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ERep                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                                        /* Le saut de certains elements n'a pas lieu pour le dernier element car la chose n'est      */ \
                                        /* alors plus utile, et evite ainsi l'emission de messages d'erreur...                       */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(element_precedent_precedent_dans_le_fichier,element_precedent_dans_le_fichier);                                \
                    EGAL(element_precedent_dans_le_fichier,ITb0(Fi,INDX(index,PREMIER_ELEMENT_D_UN_FICHIER)));                          \
                                        /* Memorisation du nouvel element precedent...                                               */ \
                    Eblock                                                                                                              \
               EDoI                                                                                                                     \
                                                                                                                                        \
               CALZ(Fclos(file_Rdescriptor));                                                                                           \
                                        /* Et on ferme le fichier.                                                                   */ \
                                        /*                                                                                           */ \
                                        /* C'est ici qu'apparait le :                                                                */ \
                                        /*                                                                                           */ \
                                        /*                  Segmentation fault                                                       */ \
                                        /*                                                                                           */ \
                                        /* du probleme 'v $xig/fonct$vv$FON 20051019113924' ainsi que les tests effectues le         */ \
                                        /* 20051025102718 (voir 'v $xig/fonct$vv$FON 20051207151403') :                              */ \
                                        /*                                                                                           */ \
                                        /* Les tests du 20051208141231 ont montre qu'en activant l'option :                          */ \
                                        /*                                                                                           */ \
                                        /*                  setenv    MALLOC_CHECK_       1                                          */ \
                                        /*                                                                                           */ \
                                        /* on recuperait lors de ce 'Fclos(...)' des messages :                                      */ \
                                        /*                                                                                           */ \
                                        /*                  free(): invalid pointer 0x???????!                                       */ \
                                        /*                                                                                           */ \
                                        /* ou la valeur du pointeur est en fait 'file_Rdescriptor'...                                */ \
                                        /*                                                                                           */ \
                                        /* De plus, si le 'Fclos(...)' est supprime, le :                                            */ \
                                        /*                                                                                           */ \
                                        /*                  Segmentation fault                                                       */ \
                                        /*                                                                                           */ \
                                        /* apparait malgre tout a la fin de l'execution du programme courant, car alors, tous        */ \
                                        /* les fichiers ouverts sont fermes et c'est la que le probleme apparait...                  */ \
                                        /*                                                                                           */ \
                                        /* Le 20051209092309, avant le 'Fclos(...)' le mot de 32 bits qui precede celui qui est      */ \
                                        /* pointe par 'file_Rdescriptor' a ete edite. Celui-ci contient le nombre d'octets           */ \
                                        /* reellement alloues (c'est-a-dire le nombre d'octets demandes dans 'Malo(...)' auquel      */ \
                                        /* s'ajoute 8 octets d'en-tete qui precede le bloc alloue) exprime en multiple de 8 par      */ \
                                        /* exces, auquel s'ajoute enfin une unite ('v $xtc/malloc.01$c exces'). La valeur ainsi      */ \
                                        /* editee (0x69 = 105 = 13x8+1 en mode 'MALLOC_CHECK_' et 0x61 = 97 = 12x8+1 en l'absence    */ \
                                        /* du mode 'MALLOC_CHECK_') etait toujours la meme, qu'il y ait ou pas le message            */ \
                                        /* "invalid pointer". Cela montre que ce mot etait valide a cet instant, alors que sa        */ \
                                        /* modification est l'une des causes de ce message ('v $xtc/malloc.01$c invalid.pointer').   */ \
                                        /* Malgre tout, ce mot peut etre modifie ensuite, entre cette edition et le 'Free(...)'      */ \
                                        /* de 'file_Rdescriptor' (effectue dans 'Fclos(...)') qui est la cause du probleme...        */ \
                                        /* Au passge, le mot qui precede (donc d'index -2) a un contenu dont je n'ai pu comprendre   */ \
                                        /* la signification ; il ne semble pas s'agir d'un pointeur (il est environ 16 fois trop     */ \
                                        /* petit), mais change de valeur d'un bloc a l'autre facon erratique, mais par petits        */ \
                                        /* increments positifs ou negatifs ('v $xtc/malloc.01$c')... Ainsi que le montre les         */ \
                                        /* editions precedentes, l'en-tete qui precede les octets alloues et utilisables semble      */ \
                                        /* passer de 8 a 16 octets lorsque le mode 'MALLOC_CHECK_' est active. Peut-etre ces 8       */ \
                                        /* octets supplementaires sont alors tout simplement une copie des 8 octets "de base",       */ \
                                        /* dont on verifie ensuite la coherence lors d'un 'Free(...)'. Juste une chose bizarre :     */ \
                                        /* le programme 'v $xtc/malloc.01$c' ne voit pas cette augmentation de 8 en activant le      */ \
                                        /* mode 'MALLOC_CHECK_'...                                                                   */ \
               Eblock                                                                                                                   \
          ETes                                                                                                                          \
          Eblock                                                                                                                        \
     ATes                                                                                                                               \
                                        /* Cas ou le nom 'No' du fichier argument etait une bonne valeur numerique...                */ \
          Bblock                                                                                                                        \
          Eblock                                                                                                                        \
     ETes                                                                                                                               \
                                                                                                                                        \
     EGAL(FonctionI_Fload_____valeur_minimale,F_INFINI);                                                                                \
     EGAL(FonctionI_Fload_____valeur_moyenne,FZERO);                                                                                    \
     EGAL(FonctionI_Fload_____valeur_maximale,F_MOINS_L_INFINI);                                                                        \
                                        /* Initialisation des valeurs {minimale,moyenne,maximale} du fichier courant.                */ \
                                                                                                                                        \
     DoIn(index,PREMIER_ELEMENT_D_UN_FICHIER,LSTX(PREMIER_ELEMENT_D_UN_FICHIER,Si),I)                                                   \
          Bblock                                                                                                                        \
          DEFV(type_fichier,INIT(element_courant_dans_le_fichier,ITb0(Fi,INDX(index,PREMIER_ELEMENT_D_UN_FICHIER))));                   \
                                                                                                                                        \
          EGAL(FonctionI_Fload_____valeur_minimale                                                                                      \
              ,MIN2(element_courant_dans_le_fichier,FonctionI_Fload_____valeur_minimale)                                                \
               );                                                                                                                       \
          INCR(FonctionI_Fload_____valeur_moyenne,element_courant_dans_le_fichier);                                                     \
          EGAL(FonctionI_Fload_____valeur_maximale                                                                                      \
              ,MAX2(element_courant_dans_le_fichier,FonctionI_Fload_____valeur_maximale)                                                \
               );                                                                                                                       \
                                        /* Calcul des valeurs {minimale,moyenne,maximale} du fichier courant.                        */ \
          Eblock                                                                                                                        \
     EDoI                                                                                                                               \
                                                                                                                                        \
     EGAL(FonctionI_Fload_____valeur_moyenne,DIVZ(FonctionI_Fload_____valeur_moyenne,FLOT(Si)));                                        \
                                        /* Et enfin, calcul de la valeur moyenne...                                                  */ \
                                                                                                                                        \
     RETU_ERROR;                                                                                                                        \
     Eblock

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C E S   A   U N   F I C H I E R   F O R M A T T E   E N T I E R  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   fI                                                                                                                            \
                    FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Int                                                                        \
                                        /* Format de lecture d'un element de type 'Int' d'un fichier formatte.                       */
DEFV(Common,DEFV(Int,ZINT(Fload_fichier_formatte_Int_____valeur_indefinie,ZERO)));
                                        /* Le 20000126173913 il a semble plus "universel" de remplacer 'UNDEF' par 'ZERO'.           */
                                        /* Evidemment dans 'v $xig/fonct$vv$DEF Fload_fichier_formatte_Int_____valeur_indefinie'     */
                                        /* cette variable recoit la valeur 'PETIT_INFINI', mais il peut-etre trop tard car il y a    */
                                        /* peut-etre des fichiers qui ont ete traites avant de trouver l'option "Int_indefini=".     */
#define   U                                                                                                                             \
                    Fload_fichier_formatte_Int_____valeur_indefinie                                                                     \
                                        /* Valeur correspondant a un element indefini. On notera l'utilisation de 'PETIT_INFINI'     */ \
                                        /* pour permettre des operation arithmetiques dessus telle 'EXTD(...)' et surtout des        */ \
                                        /* elevations aux carres via 'v $xrv/variation.01$K RdisF2D'... Mais cette initialisation    */ \
                                        /* doit etre differee jusqu'a 'GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE' car, en effet,  */ \
                                        /* 'PETIT_INFINI' utilise des fonctions et n'est donc pas constante...                       */

BFonctionI

DEFV(Common,GENERE__FonctionI_Fload(Fload_fichier_formatte_Int(No,Fi,Si,P0,Pa,Ed,Va,Co),tI,int,fI,U))    /* Common,DEFV(Fonction,) : */
                                        /* Je rappelle le 20170111095622 que si le nom du fichier est une "bonne" valeur numerique,  */
                                        /* c'est elle qui l'emporte, meme si il existe un fichier portant ce nom. Cela ne peut       */
                                        /* evidemment se produire que si ce dernier fichier est designe de facon relative (et donc   */
                                        /* dans '$CWD'). Pour forcer l'acces a ce fichier (et donc ne pas utiliser la valeur         */
                                        /* numerique correspondant a son nom), il suffit d'absolutiser ce nom, qui alors ne          */
                                        /* ressemblera plus a une "bonne" valeur numerique...                                        */

EFonctionI

#undef    U
#undef    fI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C E S   A   U N   F I C H I E R   F O R M A T T E   F L O T T A N T  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   fF                                                                                                                            \
                    FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Float                                                                      \
                                        /* Format de lecture d'un element de type 'Float' d'un fichier formatte.                     */
DEFV(Common,DEFV(Float,ZINT(Fload_fichier_formatte_Float_____valeur_indefinie,FZERO)));
                                        /* Le 20000126173913 il a semble plus "universel" de remplacer 'FLOT__UNDEF' par 'FZERO'.    */
                                        /* Evidemment dans 'v $xig/fonct$vv$DEF Fload_fichier_formatte_Float_____valeur_indefinie'   */
                                        /* cette variable recoit la valeur 'F_PETIT_INFINI', mais il peut-etre trop tard car il y a  */
                                        /* peut-etre des fichiers qui ont ete traites avant de trouver l'option "Float_indefini=".   */
#define   U                                                                                                                             \
                    Fload_fichier_formatte_Float_____valeur_indefinie                                                                   \
                                        /* Valeur correspondant a un element indefini. On notera l'utilisation de 'F_PETIT_INFINI'   */ \
                                        /* pour permettre des operation arithmetiques dessus telle 'EXTD(...)' et surtout des        */ \
                                        /* elevations aux carres via 'v $xrv/variation.01$K RdisF2D'... Mais cette initialisation    */ \
                                        /* doit etre differee jusqu'a 'GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE' car, en effet,  */ \
                                        /* 'F_PETIT_INFINI' utilise des fonctions et n'est donc pas constante...                     */

BFonctionI

DEFV(Common,GENERE__FonctionI_Fload(Fload_fichier_formatte_Float(No,Fi,Si,P0,Pa,Ed,Va,Co),tF,flot,fF,U)) /* Common,DEFV(Fonction,) : */
                                        /* Je rappelle le 20170111095622 que si le nom du fichier est une "bonne" valeur numerique,  */
                                        /* c'est elle qui l'emporte, meme si il existe un fichier portant ce nom. Cela ne peut       */
                                        /* evidemment se produire que si ce dernier fichier est designe de facon relative (et donc   */
                                        /* dans '$CWD'). Pour forcer l'acces a ce fichier (et donc ne pas utiliser la valeur         */
                                        /* numerique correspondant a son nom), il suffit d'absolutiser ce nom, qui alors ne          */
                                        /* ressemblera plus a une "bonne" valeur numerique...                                        */

EFonctionI

#undef    U
#undef    fF

#if       (PRECISION_DU_Float==SIMPLE_PRECISION)
#    undef     FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Float
#Aif      (PRECISION_DU_Float==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Float==SIMPLE_PRECISION)

#if       (PRECISION_DU_Float==DOUBLE_PRECISION)
#    undef     FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Float
#Aif      (PRECISION_DU_Float==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Float==DOUBLE_PRECISION)

#if       (PRECISION_DU_Int==SIMPLE_PRECISION)
#    undef     FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Int
#Aif      (PRECISION_DU_Int==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Int==SIMPLE_PRECISION)

#if       (PRECISION_DU_Int==DOUBLE_PRECISION)
#    undef     FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_Int
#Aif      (PRECISION_DU_Int==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Int==DOUBLE_PRECISION)

#undef    FORMAT_D_ECRITURE_ET_DE_LECTURE_FORMATTE_CHAR

#undef    GENERE__FonctionI_Fload
#undef    CODES_DESIGNANT_DES_VALEURS_NUMERIQUES_DUPLIQUEES_DANS_FonctionI_Fload
#undef    CODES_DESIGNANT_DES_VALEURS_NUMERIQUES_EXTRAPOLEES_DANS_FonctionI_Fload
#undef    CODES_DESIGNANT_DES_VALEURS_NUMERIQUES_UNDEFINIES_DANS_FonctionI_Fload
#undef    NOMBRE_D_OCTETS_POUR_LES_CODES_NON_NUMERIQUES
#undef    MESSAGES_DE_GENERE__FonctionI_Fload
#undef    MESSAGE_DE_GENERE__FonctionI_Fload

#undef    VALIDATION_DES_TAILLES_DE_FICHIERS
#undef    VALIDATION_DES_NOMS_DE_FICHIERS

#if       (         (defined(SYSTEME_DPX2000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_DPX5000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_SPS9_ROS_CC))                                                                                      \
          ||        (defined(SYSTEME_SPS9_ROS_RC))                                                                                      \
           )
#    undef     VALIDATION_DES_NOMS_RELATIFS_DE_FICHIERS
#Aif      (         (defined(SYSTEME_DPX2000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_DPX5000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_SPS9_ROS_CC))                                                                                      \
          ||        (defined(SYSTEME_SPS9_ROS_RC))                                                                                      \
           )
#    undef     VALIDATION_DES_NOMS_RELATIFS_DE_FICHIERS
#Eif      (         (defined(SYSTEME_DPX2000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_DPX5000_SPIX_CC))                                                                                  \
          ||        (defined(SYSTEME_SPS9_ROS_CC))                                                                                      \
          ||        (defined(SYSTEME_SPS9_ROS_RC))                                                                                      \
           )

#undef    VALIDATION_DES_NOMS_ABSOLUS_DE_FICHIERS

#undef    NE_PAS_SEUILLER_LA_TAILLE_DES_FICHIERS

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P O U R   P E R M E T T R E   L ' E N T R E E   D E S   P A R A M E T R E S                                                */
/*        D ' U N E   C O M M A N D E   V I A   D E S   ' setenv '  :                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(entrer_des_parametres_via_des_setenv,NE_PAS_PERMETTRE_L_ENTREE_DES_PARAMETRES_VIA_DES_setenv)));
                                        /* A priori, on ne peux pas entrer les parametres via des 'setenv's (le 19980420092917).     */
DEFV(Common,DEFV(Logical,ZINT(bloquer_provisoirement__entrer_des_parametres_via_des_setenv,FAUX)));
                                        /* Afin de bloquer provisoirement 'entrer_des_parametres_via_des_setenv' pour certains       */
                                        /* parametres :                                                                              */
                                        /*                                                                                           */
                                        /*                  "Bugs="                                                                  */
                                        /*                  "Includes="                                                              */
                                        /*                  "ListeFonctions="                                                        */
                                        /*                  "ListerMessages="                                                        */
                                        /*                  "NomSynthetique="                                                        */
                                        /*                  "Parametres="                                                            */
                                        /*                  "Setenv="                                                                */
                                        /*                  "SetenvSO="                                                              */
                                        /*                  "SourceProgramme="                                                       */
                                        /*                  "Versions="                                                              */
                                        /*                  "VersionsSO="                                                            */
                                        /*                                                                                           */
                                        /* car ceux-la provoquent l'arret immediat des commandes. Il ne faut donc pas que si,        */
                                        /* par hasard, certaines variables '$P__...' (avec les parametres ci-dessus) etaient         */
                                        /* positionnees, elles provoquent l'arret immediat des commandes. Ceci fut introduit le      */
                                        /* 20090422090535...                                                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P O U R   D O N N E R   D E S   A I D E S   D I V E R S E S  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(ne_rien_faire_et_sortir_immediatement,FAUX)));
                                        /* Ceci a ete introduit le 20061110090459 afin de permettre de tester qu'un certain '$X'     */
                                        /* peut s'executer et qu'en particulier il est compatible avec les '$SO' dont il a besoin.   */
DEFV(Common,DEFV(Logical,ZINT(forcer_l_execution_malgre_les_editions_demandees,FAUX)));
                                        /* Ceci a ete introduit le 20170604111109 afin de forcer l'execution d'une commande et ce    */
                                        /* malgre les editions demandees ('v $xig/fonct$vv$DEF arret.immediat.de.cette.commande').   */

DEFV(Common,DEFV(Logical,ZINT(marqueur_____debut_des_parametres_generaux,LUNDEF)));
DEFV(Common,DEFV(Logical,ZINT(marqueur_____fin_des_parametres_generaux,LUNDEF)));
DEFV(Common,DEFV(Logical,ZINT(marqueur_____debut_des_parametres_images,LUNDEF)));
DEFV(Common,DEFV(Logical,ZINT(marqueur_____fin_des_parametres_images,LUNDEF)));
                                        /* Arguments fictifs destines a marquer le debut et la fin des parametres generaux et        */
                                        /* et "Images" (c'est-a-dire ceux qui sont communs a toutes les commandes...). Ces arguments */
                                        /* ont ete introduits le 20010420143829. Il est important qu'ils soient differents les       */
                                        /* uns des autres afin de ne pas disparaitre (sauf le premier) lors de l'elimination des     */
                                        /* synonymes (si 'IL_NE_FAUT_PAS(editer_les_synonymes_des_parametres_d_une_commande)').      */
                                        /*                                                                                           */
                                        /* ATTENTION : ces marqueurs de debut et de fin sont referencees explicitement dans          */
                                        /* 'v $xcc/cpp$Z 20060203094047'.                                                            */
DEFV(Common,DEFV(Logical,ZINT(marqueur_____debut_des_parametres_automatiques,LUNDEF)));
DEFV(Common,DEFV(Logical,ZINT(marqueur_____fin_des_parametres_automatiques,LUNDEF)));
                                        /* Marqueurs introduits le 20120701115513 relatifs aux Parametres Generaux mis en place      */
                                        /* automatiquement...                                                                        */
DEFV(Common,DEFV(Logical,ZINT(marqueur_____debut_des_parametres_specifiques,LUNDEF)));
DEFV(Common,DEFV(Logical,ZINT(marqueur_____fin_des_parametres_specifiques,LUNDEF)));
                                        /* Arguments fictifs destines a marquer le debut et la fin des parametres specifiques.       */
                                        /* Ces arguments ont ete introduits le 20010421090617.                                       */
                                        /*                                                                                           */
                                        /* ATTENTION : ces marqueurs de debut et de fin sont referencees explicitement dans          */
                                        /* 'v $xcc/cpp$Z 20060203094047'.                                                            */

DEFV(Common,DEFV(Logical,ZINT(lister_les_parametres_non_parfaitement_reconnus,VRAI)));
                                        /* Cet indicateur introduit le 20150530094806 permet de bloquer l'edition des messages       */
                                        /* emis lorsqu'un ou plusieurs parametres n'existent pas ou sont mal utilises...             */

DEFV(Common,DEFV(Logical,ZINT(editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation,FAUX)));
                                        /* Cet indicateur introduit le 20091027115528 permet de demander globalementles editions     */
                                        /* {"Bugs=","Includes=","ListerMessages=","NomSynthetique=","Parametres=","Versions="}.      */

DEFV(Common,DEFV(Logical,ZINT(editer_le_nom_des_parametres_non_generes_d_une_commande
                             ,NE_PAS_EDITER_LE_NOM_DES_PARAMETRES_NON_GENERES_D_UNE_COMMANDE
                              )
                 )
     );
                                        /* Cet indicateur indique les parametres non generes d'une commande (via le dispositif       */
                                        /* 'v $xi/NePasGenerer_PARAMETRE_____.generaux$vv$I' et                                      */
                                        /* 'v $xi/NePasGenerer_PARAMETRE_____.images$vv$I') introduit le 20180228104919...           */
DEFV(Common,DEFV(Logical,ZINT(editer_la_valeur_des_parametres_d_une_commande,NE_PAS_EDITER_LES_VALEURS_APRES_Fconversion)));
                                        /* Cet indicateur indique si les fonctions 'Fconversion?' doivent editer la valeur des       */
                                        /* parametres (courante ou par defaut, suivant les cas) en fin de recherche ('VRAI') ou      */
                                        /* pas '(FAUX')...                                                                           */
DEFV(Common,DEFV(Logical,ZINT(editer_le_nom_des_parametres_d_une_commande,NE_PAS_EDITER_LE_NOM_DES_SYMBOLES_APRES_Fconversion)));
                                        /* Dans le cas ou 'iL_FAUT(editer_la_valeur_des_parametres_d_une_commande)', cet indicateur  */
                                        /* indique s'il faut de plus editer le nom du symbole correspondant, ce qui est a utiliser   */
                                        /* conjointement avec l'alias 'vv'.                                                          */
DEFV(Common,DEFV(Logical,ZINT(editer_les_synonymes_des_parametres_d_une_commande,EDITER_LES_SYNONYMES_APRES_Fconversion)));
                                        /* Cet indicateur indique si les synonymes de parametres doivent etre edites ('VRAI') ou     */
                                        /* pas ('FAUX') auquel cas, seule la premiere occurence est editee. Ceci a ete introduit     */
                                        /* le 20010420140719.                                                                        */
DEFV(Common,DEFV(Logical,ZINT(grouper_les_synonymes_des_parametres_d_une_commande,NE_PAS_GROUPER_LES_SYNONYMES_APRES_Fconversion)));
                                        /* Cet indicateur indique si les synonymes de parametres doivent etre groupes ('VRAI') ou    */
                                        /* pas ('FAUX') auquel cas, ils sont edites les uns apres les autres. Ceci a ete introduit   */
                                        /* le 20070330091133.                                                                        */
                                        /*                                                                                           */
                                        /* On notera que 'IL_FAUT(editer_les_synonymes_des_parametres_d_une_commande)' si l'on       */
                                        /* veut que 'grouper_les_synonymes_des_parametres_d_une_commande' soit actif...              */
DEFV(Common,DEFV(CHAR,INIT(POINTERc(liste_des_____titre_attendu_____synonymes),CHAINE_UNDEF)));
                                        /* Liste des titres attendus synonymes (introduit le 20070325172306) afin de pouvoir etre    */
                                        /* utilise dans 'DETECTION_DE_PRESENCE_D_UN_ARGUMENT_OBLIGATOIRE'.                           */
                                        /*                                                                                           */
                                        /* Le 20070330091133 cette chaine est devenue globale afin de simplifier l'implantation      */
                                        /* de 'grouper_les_synonymes_des_parametres_d_une_commande'...                               */
DEFV(Common,DEFV(Int,ZINT(editer_la_valeur_des_parametres_d_une_commande_____longueur_maximale_des_vecteurs
                         ,LONGUEUR_MAXIMALE_DES_VECTEURS_DANS_EDITER_LES_VALEURS_APRES_Fconversion
                          )
                 )
     );
                                        /* Nombre d'elements edites par defaut dans le cas des vecteurs lorsque                      */
                                        /* 'IL_FAUT(editer_la_valeur_des_parametres_d_une_commande)'.                                */

DEFV(Common,DEFV(Logical,ZINT(tester_la_double_definition_des_parametres,NE_PAS_TESTER_LA_DOUBLE_DEFINITION_DES_PARAMETRES)));
                                        /* A priori, on ne teste pas la double definition des parametres...                          */

DEFV(Common,DEFV(Logical,ZINT(editer_les_commandes_avant_execution,NE_PAS_EDITER_LES_COMMANDES_AVANT_EXECUTION)));
                                        /* Cet indicateur indique si les commandes avec leurs arguments effectifs doivent etre       */
                                        /* editees avant leur execution ('VRAI') ou pas '(FAUX')...                                  */

DEFV(Common,DEFV(Logical,ZINT(permettre_l_acces_au_source_du_programme,NE_PAS_PERMETTRE_L_ACCES_AU_SOURCE_DU_PROGRAMME)));
                                        /* A priori, on ne presentera pas le source du programme...                                  */

DEFV(Common,DEFV(Logical,ZINT(permettre_l_acces_a_la_liste_des_fonctions_referencees_par_le_programme
                             ,NE_PAS_PERMETTRE_L_ACCES_A_LA_LISTE_DES_FONCTIONS_REFERENCEES_PAR_LE_PROGRAMME
                              )
                 )
     );
                                        /* A priori, on ne presentera pas la liste des fonctions referencees par le programme        */
                                        /* (introduit le 20120626104422).                                                            */

DEFV(Common,DEFV(Logical,ZINT(editer_le_NOM_SYNTHETIQUE_de_la_commande_courante
                             ,NE_PAS_EDITER_LE_NOM_SYNTHETIQUE_DE_LA_COMMANDE_COURANTE
                              )
                 )
     );
                                        /* A priori, on n'editera pas le nom "synthetique" de la commande courante...                */

DEFV(Common,DEFV(Logical,ZINT(editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante
                             ,NE_PAS_EDITER_LE_NOM_ABSOLU_DU_SOURCE_c_DE_LA_COMMANDE_COURANTE
                              )
                 )
     );
                                        /* A priori, on n'editera pas le nom absolu du source '$c' de la commande courante...        */

DEFV(Common,DEFV(Logical,ZINT(editer_les_differentes_variables_d_environnement_utiles
                             ,NE_PAS_EDITER_EDITER_LES_DIFFERENTES_VARIABLES_D_ENVIRONNEMENT_UTILES
                              )
                 )
     );
DEFV(Common,DEFV(Logical,ZINT(editer_les_differentes_variables_d_environnement_utiles_dans_les_librairies_dynamiques
                             ,NE_PAS_EDITER_EDITER_LES_DIFFERENTES_VARIABLES_D_ENVIRONNEMENT_UTILES_DANS_LES_LIBRAIRIES_DYNAMIQUES
                              )
                 )
     );
                                        /* A priori, on n'editera pas les differentes variables d'environnement utiles au programme  */
                                        /* (introduit le 20091114114231 et le 20091116092651 en ce qui concerne les librairies       */
                                        /* dynamiques).                                                                              */

DEFV(Common,DEFV(Logical,ZINT(editer_les_differentes_versions_du_programme
                             ,NE_PAS_EDITER_LES_DIFFERENTES_VERSIONS_DU_PROGRAMME
                              )
                 )
     );
DEFV(Common,DEFV(Logical,ZINT(editer_les_differentes_versions_du_programme_dans_les_librairies_dynamiques
                             ,NE_PAS_EDITER_LES_DIFFERENTES_VERSIONS_DU_PROGRAMME_DANS_LES_LIBRAIRIES_DYNAMIQUES
                              )
                 )
     );
                                        /* A priori, on n'editera pas les differentes "VERSION"s du programme (introduit le          */
                                        /* en ce qui concerne les librairies dynamiques).                                            */

DEFV(Common,DEFV(Logical,ZINT(editer_la_liste_des_librairies_dynamiques_utilisees
                             ,NE_PAS_EDITER_LA_LISTE_DES_LIBRAIRIES_DYNAMIQUES_UTILISEES
                              )
                 )
     );
                                        /* A priori, on n'editera pas la liste des librairies dynamiques utilisees (introduit        */
                                        /* le 20220824180126).                                                                       */

DEFV(Common,DEFV(Logical,ZINT(editer_les_differents_bugs_reconnus,NE_PAS_EDITER_LES_DIFFERENTS_BUGS_RECONNUS)));
                                        /* A priori, on n'editera pas les differents "BUGS"s reconnus...                             */

DEFV(Common,DEFV(Logical,ZINT(editer_les_differents_includes_du_programme,NE_PAS_EDITER_LES_DIFFERENTS_INCLUDES_DU_PROGRAMME)));
                                        /* A priori, on n'editera pas les differents "include"s du programme...                      */

DEFV(Common,DEFV(Logical,ZINT(lister_tous_les_messages_possibles,NE_PAS_LISTER_TOUS_LES_MESSAGES_POSSIBLES)));
                                        /* A priori, on n'editera pas l'ensemble des messages possibles d'un programme. Cet          */
                                        /* indicateur a ete introduit le 20000524180053.                                             */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   U N I X   ( C O M M A N D E S   S Y S T E M E )  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI
                                        /* Le 20230405173814, le type 'FonctionV' est devenu 'FonctionI' suite a la                  */
                                        /* modification importante 'v $xil/defi_c1$vv$DEF 20230405140116'...                         */

DEFV(Common,DEFV(FonctionI,FgEXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(suite_de_commandes)))
                                        /* Fonction introduite le 20221128102511 afin d'economiser de la place aussi bien au         */
                                        /* niveau des '$c's que des '$X's...                                                         */
DEFV(Argument,DEFV(CHAR,DTb0(suite_de_commandes)));
                                        /* Suite de commandes a executer...                                                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     gEXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(suite_de_commandes);

     RETU_ERROR;
                                        /* Le 20230405173456, 'RETU_VIDE' a ete remplace par 'RETU_ERROR' suite a la                 */
                                        /* modification importante 'v $xil/defi_c1$vv$DEF 20230405140116'...                         */
     Eblock

EFonctionI

BFonctionI
                                        /* Le 20230405173814, le type 'FonctionV' est devenu 'FonctionI' suite a la                  */
                                        /* modification importante 'v $xil/defi_c1$vv$DEF 20230405140116'...                         */

DEFV(Common,DEFV(FonctionI,FgEXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH(suite_de_commandes)))
                                        /* Fonction introduite le 20221128102511 afin d'economiser de la place aussi bien au         */
                                        /* niveau des '$c's que des '$X's...                                                         */
DEFV(Argument,DEFV(CHAR,DTb0(suite_de_commandes)));
                                        /* Suite de commandes a executer...                                                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     gEXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH(suite_de_commandes);

     RETU_ERROR;
                                        /* Le 20230405173456, 'RETU_VIDE' a ete remplace par 'RETU_ERROR' suite a la                 */
                                        /* modification importante 'v $xil/defi_c1$vv$DEF 20230405140116'...                         */
     Eblock

EFonctionI

BFonctionV

DEFV(Common,DEFV(FonctionV,FgEXECUTION_D_UNE_COMMANDE_AVEC_ARGUMENTS_SOUS_CSH(suite_de_commandes)))
                                        /* Fonction introduite le 20221128102511 afin d'economiser de la place aussi bien au         */
                                        /* niveau des '$c's que des '$X's...                                                         */
DEFV(Argument,DEFV(CHAR,DTb0(suite_de_commandes)));
                                        /* Suite de commandes a executer...                                                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     gEXECUTION_D_UNE_COMMANDE_AVEC_ARGUMENTS_SOUS_CSH(suite_de_commandes);

     RETU_VIDE;
     Eblock

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E X E C U T I O N   D ' U N E   F O N C T I O N   S H E L L   Q U E L C O N Q U E  :                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    cette procedure permet de recuperer                                                                            */
/*                  les resultats d'une fonction du shell ;                                                                          */
/*                  elle s'utilise de la facon suivante :                                                                            */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        DEFV(CHAR,INIT(POINTERc(variable),CHAINE_UNDEF));                                                                          */
/*                                      /* pointeur vers la chaine de caracteres-valeur de la variable,                              */
/*                                      /* l'allocation memoire etant faite par "get-shell".                                         */
/*        EGAL(variable,exec_shell("XXXX"));                                                                                         */
/*                                      /* mise dans "variable" du resultat de la fonction shell de nom "XXXX".                      */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(exec_shell_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionC,POINTERc(exec_shell(nom_fonction))))
DEFV(Argument,DEFV(CHAR,DTb0(nom_fonction)));
                                        /* Nom de la fonction sous la forme "XXXX".                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(nom_du_fichier_de_manoeuvre),CHAINE_UNDEF));
                                        /* Nom du fichier de manoeuvre...                                                            */
     DEFV(Positive,INIT(taille_de_commande,UNDEF));
     DEFV(CHAR,INIT(POINTERc(commande),CHAINE_UNDEF));
                                        /* Zone de manoeuvre ou generer la commande au shell.                                        */
     DEFV(CHAR,INIT(POINTERc(redirection),C_SH__REDIRECTION_FICHIER));
                                        /* Pour rediriger dans un fichier.                                                           */
                                        /*                                                                                           */
                                        /* Passage de 'C_REDIRECTION_FICHIER' a 'C_SH__REDIRECTION_FICHIER' le 20111117080848...     */
     DEFV(Int,INIT(size_fichier,UNDEF));
                                        /* Taille du fichier de manoeuvre. ATTENTION : autrefois, il s'agissait d'un :               */
                                        /*                                                                                           */
                                        /*                  DEFV(Positive,INIT(size_fichier,UNDEF));                                 */
                                        /*                                                                                           */
                                        /* mais l'argument de 'Fsize_fichier(...)' etant un 'Int', il convient d'etre homogene...    */
     DEFV(CHAR,INIT(POINTERc(valeur),CHAINE_UNDEF));
                                        /* Zone dynamique contenant le fichier,                                                      */
                                        /* et donc la valeur de la variable-shell.                                                   */
     /*..............................................................................................................................*/
     EGAp(nom_du_fichier_de_manoeuvre,generation_d_un_nom_absolu_dans_xT_temporaire(C_VIDE));
                                        /* Generation du nom du fichier de manoeuvre...                                              */

     CALS(Fdelete_fichier(nom_du_fichier_de_manoeuvre,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS));
                                        /* Destruction initiale du fichier de manoeuvre au cas ou...                                 */

     EGAL(taille_de_commande
         ,ADD2(ADD2(chain_Xtaille(nom_fonction)
                   ,ADD2(chain_Xtaille(redirection)
                        ,chain_Xtaille(nom_du_fichier_de_manoeuvre)
                         )
                    )
              ,chain_taille(C_VIDE)
               )
          );

     ckMalo(commande,taille_de_commande,exec_shell_____compteur_des_kMalo);

     CALS(chain_concatene(commande,nom_fonction,redirection));
     CALS(chain_concatene(commande,commande,nom_du_fichier_de_manoeuvre));

     VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(commande),taille_de_commande)
                                                         ,BLOC(Bblock
                                                               BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                               ,C_VERITABLE_QUOTE
                                                                               ,commande
                                                                               ,C_VERITABLE_QUOTE
                                                                                );
                                        /* Le 20041024095621 je note qu'il est essentiel d'utiliser ici 'BASIQUE____Prer3(...)'      */
                                        /* alors qu'ici 'Prer3(...)' serait utilisable car, en effet, l'utilisation de cette         */
                                        /* derniere pourrait conduire a une suite infinie d'appels correspondant a un defaut         */
                                        /* dans l'allocation memoire via 'chain_Aconcaten2(...)' par exemple...                      */
                                                               Eblock
                                                               )
                                                          );
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */

     EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(commande);
                                        /* Envoi au shell de la fonction "nom".                                                      */

     CALS(Fsize_fichier(nom_du_fichier_de_manoeuvre,ADRESSE(size_fichier),EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS));

     ckMalo(valeur,size_fichier,exec_shell_____compteur_des_kMalo);
                                        /* Demande d'allocation memoire pour la chaine de caracteres resultat.                       */

     CALS(Fload_fichier_non_formatte(nom_du_fichier_de_manoeuvre
                                    ,valeur
                                    ,size_fichier
                                    ,size_char
                                    ,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS
                                    ,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS
                                     )
          );
                                        /* Et enfin, recuperation du resultat de la fonction shell sous forme                        */
                                        /* d'une chaine de caracteres.                                                               */

     CALZ_FreDD(commande);
                                        /* Liberation de l'espace de la commande.                                                    */

     CALS(Fdelete_fichier(nom_du_fichier_de_manoeuvre,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS));
                                        /* Et enfin, nettoyage...                                                                    */

     CALZ_FreCC(nom_du_fichier_de_manoeuvre);
                                        /* Liberation de l'espace du nom du fichier de manoeuvre (en fait oublie et introduit le     */
                                        /* 20020416133343).                                                                          */

     RETU(valeur);
                                        /* Et bien sur renvoi de la valeur...                                                        */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C U P E R A T I O N   D E   V A R I A B L E S   D U   S H E L L  :                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    cette procedure permet de recuperer                                                                            */
/*                  la valeur d'une variable du shell ;                                                                              */
/*                  elle s'utilise de la facon suivante :                                                                            */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        DEFV(CHAR,INIT(POINTERc(variable),CHAINE_UNDEF));                                                                          */
/*                                      /* pointeur vers la chaine de caracteres-valeur de la variable,                              */
/*                                      /* l'allocation memoire etant faite par "get-shell".                                         */
/*        EGAL(variable,getv_shell("XXXX"));                                                                                         */
/*                                      /* mise dans "variable" de la valeur de la variable-shell de nom "XXXX".                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(getv_shell_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionC,POINTERc(getv_shell(nom_variable))))
DEFV(Argument,DEFV(CHAR,DTb0(nom_variable)));
                                        /* Nom de la variable sous la forme "XXXX".                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Schar,INIS(DTb0(echo),"echo $"));
                                        /* Commande-shell pour obtenir une variable-shell.                                           */
     DEFV(Positive,INIT(taille_de_commande,UNDEF));
     DEFV(CHAR,INIT(POINTERc(commande),CHAINE_UNDEF));
                                        /* Zone de manoeuvre ou generer la commande au shell.                                        */
     DEFV(CHAR,INIT(POINTERc(reponse),CHAINE_UNDEF));
                                        /* Zone de manoeuvre ou generer la reponse du shell.                                         */
     /*..............................................................................................................................*/
     EGAL(taille_de_commande
         ,ADD2(ADD2(chain_Xtaille(echo)
                   ,chain_Xtaille(nom_variable)
                    )
              ,chain_taille(C_VIDE)
               )
          );
     ckMalo(commande,taille_de_commande,getv_shell_____compteur_des_kMalo);
     CALS(chain_concatene(commande,echo,nom_variable));

     VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(commande),taille_de_commande)
                                                         ,BLOC(Bblock
                                                               BASIQUE____Prer3("La chaine Resultante est %s%s%s.\n"
                                                                               ,C_VERITABLE_QUOTE
                                                                               ,commande
                                                                               ,C_VERITABLE_QUOTE
                                                                                );
                                        /* Le 20041024095621 je note qu'il est essentiel d'utiliser ici 'BASIQUE____Prer3(...)'      */
                                        /* alors qu'ici 'Prer3(...)' serait utilisable car, en effet, l'utilisation de cette         */
                                        /* derniere pourrait conduire a une suite infinie d'appels correspondant a un defaut         */
                                        /* dans l'allocation memoire via 'chain_Aconcaten2(...)' par exemple...                      */
                                                               Eblock
                                                               )
                                                          );
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */

     EGAp(reponse,exec_shell(commande));
                                        /* Execution de la commande.                                                                 */
     CALZ_FreDD(commande);
                                        /* Liberation de l'espace de la commande.                                                    */

     RETU(reponse);
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E S   L I S T E S  :                                                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    les fonctions suivantes vont                                                                                   */
/*                  permettre de gerer une liste,                                                                                    */
/*                  en la creant, la mettant a jour...                                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Utilisation :                                                                                                              */
/*                                                                                                                                   */
/*                    On definira une liste d'abord                                                                                  */
/*                  par sa tete via un pointeur :                                                                                    */
/*                                                                                                                                   */
/*                  DEFV(l_element,INIT(POINTERs(tete_de_liste),LISTE_UNDEF));                                                       */
/*                                                                                                                                   */
/*                  on definira eventuellement des                                                                                   */
/*                  elements de nom 'elementXX'                                                                                      */
/*                  via un pointeur par :                                                                                            */
/*                                                                                                                                   */
/*                  DEFV(l_element,INIT(POINTERs(elementXX),ELEMENT_UNDEF));                                                         */
/*                                                                                                                                   */
/*                  puis, on la creera par :                                                                                         */
/*                                                                                                                                   */
/*                  EGAL(tete_de_liste,Flist_creation());                                                                            */
/*                                                                                                                                   */
/*                  et, 'elementXX' designant un element                                                                             */
/*                  a generer dans la liste, on inserera                                                                             */
/*                  en tete par :                                                                                                    */
/*                                                                                                                                   */
/*                  EGAL(elementXX,Flist_GTelement(tete_de_liste,"CHAINE DE CARACTERES"));                                           */
/*                                                                                                                                   */
/*                  ou en queue par :                                                                                                */
/*                                                                                                                                   */
/*                  EGAL(elementXX,Flist_GQelement(tete_de_liste,"CHAINE DE CARACTERES"));                                           */
/*                                                                                                                                   */
/*                    Enfin, 'informations' designant un                                                                             */
/*                  pointeur du type :                                                                                               */
/*                                                                                                                                   */
/*                  DEFV(CHAR,INIT(POINTERc(informations),CHAINE_UNDEF));                                                            */
/*                                                                                                                                   */
/*                  Cette valeur 'CHAINE_UNDEF' est                                                                                  */
/*                  utilisable pour un test en retour                                                                                */
/*                  de la validite des informations et                                                                               */
/*                  des conditions d'execution d'une                                                                                 */
/*                  fonction (par exemple 'Flist_Selement',                                                                          */
/*                  'Flist_STelement' et 'Flist_SQelement').                                                                         */
/*                                                                                                                                   */
/*                  On recuperera l'information contenue                                                                             */
/*                  dans un l'element 'elementXX' que l'on                                                                           */
/*                  detruit simultanement, par :                                                                                     */
/*                                                                                                                                   */
/*                  EGAL(informations,Flist_Selement(elementXX));                                                                    */
/*                                                                                                                                   */
/*                  sachant que le pointeur 'informations'                                                                           */
/*                  est indefini en cas d'erreur...                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E S T R U C T I O N   B R U T A L E   D ' U N   E L E M E N T  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,Flist_Delement(courant_element)))
DEFV(Argument,DEFV(l_element,POINTERs(courant_element)));
                                        /* Element que l'on veut detruire brutalement...                                             */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     VALIDATION_LISTE
         (
          courant_element
         ,BLOC(Test(IFET(IFEQ(ASI2(courant_element,header,precedent_chainage),courant_element)
                        ,IFEQ(ASI2(courant_element,header,suivant_chainage),courant_element)
                         )
                    )
                    Bblock
                    EGAL(ASI2(courant_element,header,clef_validation),UNDEF);
                                        /* Et on invalide la clef de validation au cas ou...                                         */
                    CALZ_FreLL(courant_element);
                                        /* On libere brutalement l'espace de l'element courant.                                      */
                    Eblock
               ATes
                    Bblock
                    CODE_ERROR(ERREUR11);
                                        /* Erreur, l'operation de suppression de l'element courant est refusee,                      */
                                        /* car en effet, celui-ci n'est pas auto-chaine sur lui-meme.                                */
                    Eblock
               ETes
               )
         ,BLOC(CODE_ERROR(ERREUR12);
               )
          );

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E M P L I S S A G E   D ' U N   E L E M E N T   D O N T   L A   M E M O I R E   E S T   D E J A   A L L O U E E  :       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,Flist_Relement(courant_element
                                         ,precedent_element
                                         ,suivant_element
                                         ,informations
                                          )
                 )
     )
                                        /* ATTENTION : les arguments 'courant_element', 'precedent_element' et                       */
                                        /* 'suivant_element' ne sont pas declares par "ARGUMENT_POINTEUR", car en                    */
                                        /* effet, ces memes arguments sont declares "POINTEUR" avant l'appel                         */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : la valeur renvoyee par cette fonction est egale au nombre                      */
                                        /* d'octets total mis en place dans l'element courant.                                       */
DEFV(Argument,DEFV(l_element,POINTERs(courant_element)));
                                        /* Adresse du bloc deja alloue ou creer l'element avec les arguments qui suivent :           */
DEFV(Argument,DEFV(l_element,POINTERs(precedent_element)));
                                        /* Adresse de l'element precedant l'element courant,                                         */
DEFV(Argument,DEFV(l_element,POINTERs(suivant_element)));
                                        /* Adresse de l'element suivant l'element courant.                                           */
DEFV(Argument,DEFV(CHAR,DTb0(informations)));
                                        /* Chaine d'octets a memoriser dans l'element courant.                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(l_element,element_dummy);
                                        /* On definit ici un element "bidon", afin de pouvoir calculer                               */
                                        /* facilement sa longueur ; mais ATTENTION : il ne faut le confondre avec                    */
                                        /* 'element' que l'on genere reellement !!!                                                  */
     /*..............................................................................................................................*/
     EGAL(ASI2(courant_element,header,precedent_chainage),precedent_element);
     EGAL(ASI2(courant_element,header,suivant_chainage),suivant_element);
                                        /* Les chainages "arriere" et "avant" sont initialises.                                      */
     EGAL(ASI2(courant_element,header,clef_validation),CLEF_VALIDATION_LISTE);
                                        /* Et on met en place une clef de validation...                                              */
     CALS(chain_copie(ASI1(courant_element,informations),informations));
     EGAL(ASI2(courant_element,header,volume),chain_taille(ASI1(courant_element,informations)));
                                        /* Et l'information memorisee est la chaine argument.                                        */
     RETU(ADD2(SIZP(ASD1(element_dummy,header)),chain_taille(ASI1(courant_element,informations))));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P L A C E M E N T   D ' U N   E L E M E N T   E N T R E   D E U X   A U T R E S   E L E M E N T S  :                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,Flist_Pelement(courant_element
                                         ,precedent_element
                                         ,suivant_element
                                          )
                 )
     )
                                        /* ATTENTION : les arguments 'courant_element', 'precedent_element' et                       */
                                        /* 'suivant_element' ne sont pas declares par "ARGUMENT_POINTEUR", car en                    */
                                        /* effet, ces memes arguments sont declares "POINTEUR" avant l'appel                         */
                                        /* lors de la definition des variables de la fonction appelante.                             */
DEFV(Argument,DEFV(l_element,POINTERs(courant_element)));
                                        /* Adresse du bloc deja alloue ou creer l'element avec les arguments qui suivent :           */
DEFV(Argument,DEFV(l_element,POINTERs(precedent_element)));
                                        /* Adresse de l'element precedant l'element courant,                                         */
DEFV(Argument,DEFV(l_element,POINTERs(suivant_element)));
                                        /* Adresse de l'element suivant l'element courant.                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     VALIDATION_LISTE
         (
          precedent_element
         ,BLOC(VALIDATION_LISTE
                   (
                    courant_element
                   ,BLOC(VALIDATION_LISTE
                             (
                              suivant_element
                             ,BLOC(Test(IFOU(IFNE(ASI2(precedent_element,header,suivant_chainage),suivant_element)
                                            ,IFNE(ASI2(suivant_element,header,precedent_chainage),precedent_element)
                                             )
                                        )
                                        Bblock
                                        PRINT_ERREUR("les elements precedent et suivant ne sont pas chaines entre-eux");
                                        CAL1(Prer2("precedent=%08X    suivant(precedent)=%08X\n"
                                                  ,precedent_element,ASI2(precedent_element,header,suivant_chainage)
                                                   )
                                             );
                                        CAL1(Prer2("suivant  =%08X    precedent(suivant)=%08X\n"
                                                  ,suivant_element,ASI2(suivant_element,header,precedent_chainage)
                                                   )
                                             );
                                        CODE_ERROR(ERREUR10);
                                        Eblock
                                   ATes
                                        Bblock
                                        EGAL(ASI2(courant_element,header,precedent_chainage),precedent_element);
                                        EGAL(ASI2(courant_element,header,suivant_chainage),suivant_element);
                                        /* Les chainages "arriere" et "avant" de l'element a inserer sont initialises.               */
                                        EGAL(ASI2(precedent_element,header,suivant_chainage),courant_element);
                                        /* Les chainages "avant" de l'element precedent est modifie.                                 */
                                        EGAL(ASI2(suivant_element,header,precedent_chainage),courant_element);
                                        /* Les chainages "arriere" de l'element suivant est modifie.                                 */
                                        Eblock
                                   ETes
                                   )
                             ,BLOC(CODE_ERROR(ERREUR12);
                                   )
                              );
                         )
                   ,BLOC(CODE_ERROR(ERREUR12);
                         )
                    );
               )
         ,BLOC(CODE_ERROR(ERREUR12);
               )
          );

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N   E L E M E N T   E N T R E   D E U X   A U T R E S   E L E M E N T S  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionE

DEFV(Common,DEFV(Positive,INIT(Flist_Gelement_____compteur_des_tMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionE,POINTERs(Flist_Gelement(precedent_element
                                                  ,suivant_element
                                                  ,informations
                                                   )
                                    )
                 )
     )
                                        /* ATTENTION : les arguments 'courant_element', 'precedent_element' et                       */
                                        /* 'suivant_element' ne sont pas declares par "ARGUMENT_POINTEUR", car en                    */
                                        /* effet, ces memes arguments sont declares "POINTEUR" avant l'appel                         */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : l'adresse de l'element courant est renvoye.                                    */
DEFV(Argument,DEFV(l_element,POINTERs(precedent_element)));
                                        /* Adresse de l'element precedant l'element a generer,                                       */
DEFV(Argument,DEFV(l_element,POINTERs(suivant_element)));
                                        /* Adresse de l'element suivant l'element a generer.                                         */
DEFV(Argument,DEFV(CHAR,DTb0(informations)));
                                        /* Chaine d'octets a memoriser dans l'element courant.                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(l_element,INIT(POINTERs(courant_element),ELEMENT_UNDEF));
                                        /* Adresse du bloc deja alloue ou creer l'element avec les arguments qui suivent :           */
     DEFV(l_element,element_dummy);
                                        /* On definit ici un element "bidon", afin de pouvoir calculer                               */
                                        /* facilement sa longueur ; mais ATTENTION : il ne faut le confondre avec                    */
                                        /* 'element' que l'on genere reellement !!!                                                  */
     /*..............................................................................................................................*/
     ctMalo(courant_element
           ,ADD2(SIZP(ASD1(element_dummy,header)),chain_taille(informations))
           ,l_element,Flist_Gelement_____compteur_des_tMalo
            );
                                        /* Allocation memoire pour l'element courant que l'on cree (en-tete et informations), et     */
                                        /* que l'on renvoie dans 'courant_element' du pointeur vers ce bloc.                         */

     CALS(Flist_Relement(courant_element
                                        /* Adresse du descripteur de l'element que l'on genere,                                      */
                        ,precedent_element
                                        /* Adresse de l'element precedent,                                                           */
                        ,suivant_element
                                        /* Adresse de l'element suivant,                                                             */
                        ,informations
                                        /* Et enfin, informations a memoriser...                                                     */
                         )
          );
                                        /* Mise en place des informations et des chainages dans le bloc a generer.                   */

     CALS(Flist_Pelement(courant_element,precedent_element,suivant_element));
                                        /* Et enfin, insertion de l'element courant entre l'element precedent et                     */
                                        /* et l'element suivant.                                                                     */
     RETU(courant_element);
     Eblock

EFonctionE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N   E L E M E N T   E N   T E T E   D ' U N E   L I S T E  :                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionE

DEFV(Common,DEFV(FonctionE,POINTERs(Flist_GTelement(tete_de_liste,informations))))
DEFV(Argument,DEFV(l_element,POINTERs(tete_de_liste)));
                                        /* Tete de la liste dans laquelle on veut inserer l'informations.                            */
                                        /* RESULTAT : l'adresse de l'element courant est renvoye.                                    */
DEFV(Argument,DEFV(CHAR,DTb0(informations)));
                                        /* Chaine d'octets a memoriser dans l'element courant.                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(l_element,INIT(POINTERs(courant_element),ELEMENT_UNDEF));
                                        /* Adresse du bloc alloue pour le bloc courant.                                              */
     /*..............................................................................................................................*/
     VALIDATION_LISTE
         (
          tete_de_liste
         ,BLOC(EGAL(courant_element
                   ,Flist_Gelement(tete_de_liste
                                  ,ASI2(tete_de_liste,header,suivant_chainage)
                                  ,informations
                                   )
                    );
                                        /* Et on insere l'element courant en tant que suivant de la tete.                            */
               )
         ,BLOC(VIDE;
                                        /* Une adresse indefinie sera renvoyee pour le bloc courant.                                 */
               )
          );

     RETU(courant_element);
     Eblock

EFonctionE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N   E L E M E N T   E N   Q U E U E   D ' U N E   L I S T E  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionE

DEFV(Common,DEFV(FonctionE,POINTERs(Flist_GQelement(tete_de_liste,informations))))
DEFV(Argument,DEFV(l_element,POINTERs(tete_de_liste)));
                                        /* Tete de la liste dans laquelle on veut inserer l'informations.                            */
                                        /* RESULTAT : l'adresse de l'element courant est renvoye.                                    */
DEFV(Argument,DEFV(CHAR,DTb0(informations)));
                                        /* Chaine d'octets a memoriser dans l'element courant.                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(l_element,INIT(POINTERs(courant_element),ELEMENT_UNDEF));
                                        /* Adresse du bloc alloue pour le bloc courant.                                              */
     /*..............................................................................................................................*/
     VALIDATION_LISTE
         (
          tete_de_liste
         ,BLOC(EGAL(courant_element
                   ,Flist_Gelement(ASI2(tete_de_liste,header,precedent_chainage)
                                  ,tete_de_liste
                                  ,informations
                                   )
                    );
                                        /* Et on insere l'element courant en tant que precedent de la tete.                          */
               )
         ,BLOC(VIDE;
                                        /* Une adresse indefinie sera renvoyee pour le bloc courant.                                 */
               )
          );

     RETU(courant_element);
     Eblock

EFonctionE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S U P P P R E S S I O N   D ' U N   E L E M E N T   E T   R E N V O I   D E   L ' I N F O R M A T I O N                    */
/*        A V E C   A L L O C A T I O N   M E M O I R E   P O U R   L ' I N F O R M A T I O N   R E N O Y E E  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(Positive,INIT(Flist_Selement_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionC,POINTERs(Flist_Selement(courant_element))))
                                        /* ATTENTION : l'argument 'courant_element'                                                  */
                                        /* n'est pas declare par "ARGUMENT_POINTEUR", car en                                         */
                                        /* effet, ce meme argument est declare "POINTEUR" avant l'appel                              */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : les informations contenues dans le bloc libere, ou                             */
                                        /* 'ELEMENT_VIDE' si la liste etait vide...                                                  */
DEFV(Argument,DEFV(l_element,POINTERs(courant_element)));
                                        /* Adresse du bloc a liberer.                                                                */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(l_element,INIT(POINTERs(precedent_element),ELEMENT_UNDEF));
                                        /* Pour memoriser l'element precedent dans la liste.                                         */
     DEFV(l_element,INIT(POINTERs(suivant_element),ELEMENT_UNDEF));
                                        /* Pour memoriser l'element suivant dans la liste.                                           */
     DEFV(CHAR,INIT(POINTERc(informations),CHAINE_UNDEF));
                                        /* Afin de recuperer l'information contenue dans le bloc courant.                            */
     /*..............................................................................................................................*/
     VALIDATION_LISTE
         (
          courant_element
         ,BLOC(ckMalo(informations,ASI2(courant_element,header,volume),Flist_Selement_____compteur_des_kMalo);
                                        /* Allocation memoire pour l'information a recuperer.                                        */
               CALS(chain_copie(informations,ASI1(courant_element,informations)));
                                        /* Et on recupere l'information avant les autres operations.                                 */
               EGAL(precedent_element,ASI2(courant_element,header,precedent_chainage));
               EGAL(suivant_element,ASI2(courant_element,header,suivant_chainage));
                                        /* Recuperation des elements precedent et suivant.                                           */
               VALIDATION_LISTE
                   (
                    precedent_element
                   ,BLOC(VALIDATION_LISTE
                             (
                              suivant_element
                             ,BLOC(Test(IFET(IFNE(courant_element,precedent_element)
                                            ,IFNE(courant_element,suivant_element)
                                             )
                                        )
                                        /* La liberation de l'element courant n'a lieu que lorsque celui-ci                          */
                                        /* n'est pas la tete de liste...                                                             */
                                        Bblock
                                        EGAL(ASI2(precedent_element,header,suivant_chainage),suivant_element);
                                        EGAL(ASI2(suivant_element,header,precedent_chainage),precedent_element);
                                        /* Et on chaine entre eux les anciens precedent et suivant.                                  */
                                        EGAL(ASI2(courant_element,header,precedent_chainage),courant_element);
                                        EGAL(ASI2(courant_element,header,suivant_chainage),courant_element);
                                        /* Les chainages "arriere" et "avant" sont auto-chaines sur                                  */
                                        /* l'element courant afin que 'Flist_Delement' fonctionne correctement.                      */
                                        Test(IL_Y_A_ERREUR(Flist_Delement(courant_element)))
                                        /* Et enfin, on libere l'espace de l'element courant si cela est possible.                   */
                                             Bblock
                                             PRINT_ERREUR("bizarre : dans 'Flist_Selement', 'Flist_Delement' s'est mal passe");
                                             Eblock
                                        ATes
                                             Bblock
                                             Eblock
                                        ETes
                                        Eblock
                                   ATes
                                        Bblock
                                        Eblock
                                   ETes
                                   )
                             ,BLOC(VIDE;
                                   )
                              );
                         )
                   ,BLOC(VIDE;
                         )
                    );
                                        /* Nota : il y avait autrefois ici un 'CALS(FreLL(courant_element));' qui, me semble-t'il,   */
                                        /* etait redondant avec celui qui est fait dans 'Flist_Delement(courant_element)'...         */
               )
            ,BLOC(VIDE;
                  )
          );

     RETU(informations);
                                        /* Et on renvoie les informations utiles sous la forme d'un pointeur                         */
                                        /* vers la chaine des caracteres, ou une adresse indefinie en cas d'erreur.                  */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S U P P P R E S S I O N   D ' U N   E L E M E N T   E N   T E T E                                                          */
/*        E T   R E N V O I   D E   L ' I N F O R M A T I O N  :                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERs(Flist_STelement(tete_de_liste))))
                                        /* ATTENTION : l'argument 'tete_de_liste'                                                    */
                                        /* n'est pas declare par "ARGUMENT_POINTEUR", car en                                         */
                                        /* effet, ce meme argument est declare "POINTEUR" avant l'appel                              */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : les informations contenues dans le bloc libere, ou                             */
                                        /* 'ELEMENT_VIDE' si la liste etait vide...                                                  */
DEFV(Argument,DEFV(l_element,POINTERs(tete_de_liste)));
                                        /* Adresse de l'en-tete de la liste auquelle appartient le bloc a liberer.                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(informations),CHAINE_UNDEF));
                                        /* Afin de recuperer l'information contenue dans le bloc courant.                            */
     /*..............................................................................................................................*/
     VALIDATION_LISTE
         (
          tete_de_liste
         ,BLOC(EGAp(informations,Flist_Selement(ASI2(tete_de_liste,header,suivant_chainage)));
                                        /* Recuperation de l'information et suppression de l'element.                                */
               )
         ,BLOC(VIDE;
               )
          );

     RETU(informations);
                                        /* Et on renvoie les informations utiles sous la forme d'un pointeur                         */
                                        /* vers la chaine des caracteres, ou une adresse indefinie en cas d'erreur.                  */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S U P P P R E S S I O N   D ' U N   E L E M E N T   E N   Q U E U E                                                        */
/*        E T   R E N V O I   D E   L ' I N F O R M A T I O N  :                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERs(Flist_SQelement(tete_de_liste))))
                                        /* ATTENTION : l'argument 'tete_de_liste'                                                    */
                                        /* n'est pas declare par "ARGUMENT_POINTEUR", car en                                         */
                                        /* effet, ce meme argument est declare "POINTEUR" avant l'appel                              */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : les informations contenues dans le bloc libere, ou                             */
                                        /* 'ELEMENT_VIDE' si la liste etait vide...                                                  */
DEFV(Argument,DEFV(l_element,POINTERs(tete_de_liste)));
                                        /* Adresse de l'en-tete de la liste auquelle appartient le bloc a liberer.                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(informations),CHAINE_UNDEF));
                                        /* Afin de recuperer l'information contenue dans le bloc courant.                            */
     /*..............................................................................................................................*/
     VALIDATION_LISTE
         (
          tete_de_liste
         ,BLOC(EGAL(informations,Flist_Selement(ASI2(tete_de_liste,header,precedent_chainage)));
                                        /* Recuperation de l'information et suppression de l'element.                                */
               )
         ,BLOC(VIDE;
               )
          );

     RETU(informations);
                                        /* Et on renvoie les informations utiles sous la forme d'un pointeur                         */
                                        /* vers la chaine des caracteres, ou une adresse indefinie en cas d'erreur.                  */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C R E A T I O N   D ' U N E   L I S T E  :                                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionE

DEFV(Common,DEFV(Positive,INIT(Flist_creation_____compteur_des_tMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

DEFV(Common,DEFV(FonctionE,POINTERs(Flist_creation())))
                                        /* RESULTAT : la fonction renvoie l'adresse du descripteur de tete de la liste.              */
                                        /* ATTENTION : la fonction 'Flist_creation()' doit etre definie apres 'Flist_Relement(...)'  */
                                        /* afin que le type de 'Flist_Relement(...)' soit connu...                                   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(l_element,INIT(POINTERs(tete_de_liste),LISTE_UNDEF));
     DEFV(l_element,element_dummy);
                                        /* On definit ici un element de tete "bidon", afin de pouvoir calculer                       */
                                        /* facilement sa longueur ; mais ATTENTION : il ne faut pas le confondre avec                */
                                        /* la 'tete de liste' que l'on genere reellement !!!                                         */
     /*..............................................................................................................................*/
     ctMalo(tete_de_liste
           ,ADD2(SIZP(ASD1(element_dummy,header)),chain_taille(ELEMENT_VIDE))
           ,l_element
           ,Flist_creation_____compteur_des_tMalo
            );
                                        /* Allocation memoire pour la tete de la liste que l'on cree, et renvoi                      */
                                        /* dans 'tete_de_liste' du pointeur vers ce bloc.                                            */

     CALS(Flist_Relement(tete_de_liste
                                        /* Adresse du descripteur de la tete de liste,                                               */
                        ,tete_de_liste
                                        /* Adresse de l'element precedent, qui est ici le descripteur de la tete de liste,           */
                        ,tete_de_liste
                                        /* Adresse de l'element suivant, qui est ici le descripteur de la tete de liste.             */
                        ,ELEMENT_VIDE
                         )
          );
                                        /* Les chainages "arriere" et "avant" sont auto-initialises                                  */
                                        /* sur l'element de tete lui-meme,                                                           */
                                        /* et l'information memorisee est la chaine vide...                                          */
     RETU(tete_de_liste);
     Eblock

EFonctionE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   P I L E S  :                                                                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Une pile est une liste geree                                                                                   */
/*                  "LIFO", c'est-a-dire telle que                                                                                   */
/*                  le dernier element insere (on dira                                                                               */
/*                  en queue) est le premier qui                                                                                     */
/*                  sortira.                                                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Utilisation :                                                                                                              */
/*                                                                                                                                   */
/*                    Le descripteur de pile devra                                                                                   */
/*                  avoir ete defini par :                                                                                           */
/*                                                                                                                                   */
/*                  DEFV(l_element,INIT(POINTERs(descripteur_de_pile),PILE_UNDEF));                                                  */
/*                                                                                                                                   */
/*                  et les elements (qui sont en fait                                                                                */
/*                  toujours de type "CHAR") a empiler                                                                               */
/*                  et depiler par :                                                                                                 */
/*                                                                                                                                   */
/*                  DEFV(CHAR,INIT(POINTERc(informations),CHAINE_UNDEF));                                                            */
/*                                                                                                                                   */
/*                  puis, on la creera ou la detruira par :                                                                          */
/*                                                                                                                                   */
/*                  CREATION_PILE(descripteur_de_pile);                                                                              */
/*                  DESTRUCTION_PILE(descripteur_de_pile);                                                                           */
/*                                                                                                                                   */
/*                    Enfin, on empilera et depilera les chaines                                                                     */
/*                  de caracteres par les primitives :                                                                               */
/*                                                                                                                                   */
/*                  PUSH(descripteur_de_pile,informations);                                                                          */
/*                  PULL(descripteur_de_pile,informations);                                                                          */
/*                                                                                                                                   */
/*                  (ATTENTION : 'PULL()' provoque de l'allocation memoire, qu'il faut rendre un jour...)                            */
/*                                                                                                                                   */
/*                  ou :                                                                                                             */
/*                                                                                                                                   */
/*                  CALS(Fpush(descripteur_de_pile,informations));                                                                   */
/*                  EGAL(informations,Fpull(descripteur_de_pile));                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N U M E R O   D E   L A   V E R S I O N  :                                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#nodefine GESTION_PILES_VERSION_01                                                                                                      \
                                        /* ATTENTION : la 'VERSION_01' ne permet pas, etant donne le                                 */ \
                                        /* format du multiplex, de manipuler des donnes en double-precision...                       */
#define   GESTION_PILES_VERSION_02                                                                                                      \
                                        /* La 'VERSION_02' quant a elle, permet, etant donne le format du                            */ \
                                        /* multiplex, de manipuler des donnes en double-precision...                                 */

#ifdef    GESTION_PILES_VERSION_01                                              /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____GESTION_PILES_VERSION_01));
#Aifdef   GESTION_PILES_VERSION_01                                              /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   GESTION_PILES_VERSION_01                                              /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    GESTION_PILES_VERSION_02                                              /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____GESTION_PILES_VERSION_02));
#Aifdef   GESTION_PILES_VERSION_02                                              /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   GESTION_PILES_VERSION_02                                              /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P E R A T I O N   D E   M U L T I P L E X A G E   D ' I N F O R M A T I O N S                                            */
/*        D E   F O R M A T   V A R I E   ( E N T I E R   E T   F L O T T A N T )  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    GESTION_PILES_VERSION_01
#    define    SIZE_ALPHA_MULTIPLEX                                                                                                     \
                         MUL2(NHXOC,NOCMO)                                                                                              \
                                        /* Taille maximale d'une entree du multiplex ; on prend un double mot                        */ \
                                        /* car, afin d'eliminer les eventuels faux caracteres 'K_NULL' qui                           */ \
                                        /* peuvent exister dans une valeur numerique, on double astucieusement                       */ \
                                        /* leur longueur..                                                                           */
Dunion_02(NUM_MULTIPLEX_1
         ,Dunion_02(NOM_VIDE
                                        /* 'INFORMATION_NUMERIQUE' contient donc l'information significative                         */
                                        /* suivant son type.                                                                         */
                   ,DEFV(Int,NUMERIQUE_INT)
                                        /* On trouve ici une valeur entiere signee,                                                  */
                   ,DEFV(Float,NUMERIQUE_FLOAT)
                                        /* Et la une valeur flottante.                                                               */
                   ,INFORMATION_NUMERIQUE
                    )
         ,DEFV(Positive,NUMERIQUE_BINAIRE)
                                        /* Ainsi, les valeurs numeriques typees ("init" ou "Float") sont                             */
                                        /* mise en paralleles avec une valeur "binaire"...                                           */
         ,NOM_VIDE
          );
Typedef(num_multiplex_1,UNIO(NUM_MULTIPLEX_1))
Dunion_02(ALPHA_MULTIPLEX
         ,Dstruct02(NOM_VIDE
                   ,DEFV(Positive,premiere_partie)
                                        /* Contient la premiere partie du binaire code,                                              */
                   ,DEFV(Positive,deuxieme_partie)
                                        /* Contient la deuxieme partie du binaire code,                                              */
                   ,BINAIRE_CODEE
                    )
         ,Dstruct02(NOM_VIDE
                   ,DEFV(CHAR,DTb1(CHAINE_EQUIVALENTE,SIZE_ALPHA_MULTIPLEX))
                                        /* Cette chaine de caracteres est en parallele des donnees numeriques                        */
                                        /* precedentes ; elle permet de placer celles-ci dans les listes (et donc                    */
                                        /* piles) puisque les listes ne connaissent que les chaines de caracteres                    */
                                        /* comme type d'information...                                                               */
                   ,DEFV(CHAR,END_NUMERIQUE)
                                        /* Et on trouvera ici le caractere de fin de chaine ('K_NULL') mis                           */
                                        /* en place systematiquement lors de chaque rangement de donnees                             */
                                        /* dans une telle structure 'MULTIPLEX'.                                                     */
                   ,ALPHA_CODE
                    )
         ,NOM_VIDE
          );
Typedef(alpha_multiplex,UNIO(ALPHA_MULTIPLEX))
DEFV(Local,DEFV(num_multiplex_1,num_acces_pile));
                                        /* Ce bloc 'MULTIPLEX' permet de traiter les valeurs numeriques,                             */
                                        /* quelqu'en soit le type comme une chaine binaire.                                          */
DEFV(Local,DEFV(alpha_multiplex,alpha_acces_pile));
                                        /* Ce bloc 'MULTIPLEX' permet de considerer deux mots consecutifs binaires                   */
                                        /* comme une chaine alpha-numerique (apres bien sur qu'on ait elimine les                    */
                                        /* caracteres 'K_NULL".                                                                      */
#    define    STOM(variable,cast)                                                                                                      \
                         Bblock                                                                                                         \
                         EGAL(ASD2(num_acces_pile,INFORMATION_NUMERIQUE,cast),variable);                                                \
                                        /* Mise en place de l'information numerique en binaire pur.                                  */ \
                         EGAL(ASD2(alpha_acces_pile,ALPHA_CODE,END_NUMERIQUE),K_NULL);                                                  \
                         Eblock                                                                                                         \
                                        /* Mise en place de la fin de chaine systematiquement, car en                                */ \
                                        /* effet je n'arrive pas a initialiser automatiquement les                                   */ \
                                        /* entrees du bloc 'MULTIPLEX'.                                                              */
#    define    STOI(variable)                                                                                                           \
                         Bblock                                                                                                         \
                         STOM(variable,NUMERIQUE_INT)                                                                                   \
                         Eblock                                                                                                         \
                                        /* Rangement d'une variable entiere.                                                         */
#    define    STOF(variable)                                                                                                           \
                         Bblock                                                                                                         \
                         STOM(variable,NUMERIQUE_FLOAT)                                                                                 \
                         Eblock                                                                                                         \
                                        /* Rangement d'une variable flottante.                                                       */
#    define    LOAM(variable,cast)                                                                                                      \
                         Bblock                                                                                                         \
                         EGAL(variable,ASD2(num_acces_pile,INFORMATION_NUMERIQUE,cast))                                                 \
                         Eblock                                                                                                         \
                                        /* Acces a l'information sous le format approprie ; a noter que cette                        */ \
                                        /* fonction est utilisable dans une expression (a cause de 'EGAL' sans ";").                 */
#    define    LOAI(variable)                                                                                                           \
                         Bblock                                                                                                         \
                         LOAM(variable,NUMERIQUE_INT)                                                                                   \
                         Eblock                                                                                                         \
                                        /* Acces a une variable entiere.                                                             */
#    define    LOAF(variable)                                                                                                           \
                         Bblock                                                                                                         \
                         LOAM(variable,NUMERIQUE_FLOAT)                                                                                 \
                         Eblock                                                                                                         \
                                        /* Acces a une variable flottante.                                                           */

#Aifdef   GESTION_PILES_VERSION_01
#Eifdef   GESTION_PILES_VERSION_01

/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A C C E S   D E S   V A R I A B L E S   N U M E R I Q U E S   A U X   P I L E S  :                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    En plus des considerations precedentes                                                                         */
/*                  sur les piles, on rajoute ici des fonc-                                                                          */
/*                  tions qui permettent a des variables                                                                             */
/*                  numeriques (entieres et flottantes)                                                                              */
/*                  d'atteindre les piles :                                                                                          */
/*                                                                                                                                   */
/*                  PUSHI(descripteur_de_pile,variable_entiere);                                                                     */
/*                  PUSHF(descripteur_de_pile,variable_simple_precision);                                                            */
/*                  PUSHD(descripteur_de_pile,variable_double_precision);                                                            */
/*                  PULLI(descripteur_de_pile,variable_entiere);                                                                     */
/*                  PULLF(descripteur_de_pile,variable_simple_precision);                                                            */
/*                  PULLD(descripteur_de_pile,variable_simple_precision);                                                            */
/*                  ou :                                                                                                             */
/*                                                                                                                                   */
/*                  CALS(FpushI(descripteur_de_pile,valeur_entiere));                                                                */
/*                  CALS(FpushL(descripteur_de_pile,valeur_logique));                                                                */
/*                  CALS(FpushF(descripteur_de_pile,valeur_simple_precision));                                                       */
/*                  CALS(FpushD(descripteur_de_pile,valeur_double_precision));                                                       */
/*                  EGAL(variable_entiere,FpullI(descripteur_de_pile));                                                              */
/*                  EGAL(variable_logique,FpullL(descripteur_de_pile));                                                              */
/*                  EGAL(variable_simple_precision,FpullF(descripteur_de_pile));                                                     */
/*                  EGAL(variable_double_precision,FpullD(descripteur_de_pile));                                                     */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota important :                                                                                                           */
/*                                                                                                                                   */
/*                    Etant donne qu'une variable entiere                                                                            */
/*                  ou flottante peut contenir n'importe quelle                                                                      */
/*                  configuration de bits (et en particulier                                                                         */
/*                  le fameux 'K_NULL'...) je ne me suis                                                                             */
/*                  pas vraiment fatigue : plutot que de                                                                             */
/*                  convertir ces variables en chaines, ou                                                                           */
/*                  bien de transmettre leur longueur, je                                                                            */
/*                  les ai dedoublees (par exemple, la                                                                               */
/*                  variable 0x0012345F donne le couple                                                                              */
/*                  0x0F1E3C5A et 0xF0D2B40F ou chaque                                                                               */
/*                  chiffre de la variable initiale (par                                                                             */
/*                  exemple "3") se retrouve associe a                                                                               */
/*                  son complement par rapport au masque                                                                             */
/*                  hexa-decimal 'MHEXA' (soit "C")).                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    GESTION_PILES_VERSION_01
#    define    PMASQUE                                                                                                                  \
                         OUIN(SLLS(MHEXA,NBITOC),MHEXA)
#    define    PMASQUE1                                                                                                                 \
                         OUIN(SLLS(PMASQUE,NBITHW),PMASQUE)
#    define    PMASQUE2                                                                                                                 \
                         COMK(PMASQUE1)
#    define    PUSHX_DEMI(descipteur_de_pile,partie,DECA,Pmasque1,Pmasque2)                                                             \
                         Bblock                                                                                                         \
                         EGAL(ASD2(alpha_acces_pile,BINAIRE_CODEE,partie)                                                               \
                             ,OUIN(ETLO(COMK(DECA(ASD1(num_acces_pile,NUMERIQUE_BINAIRE),NBITHX)                                        \
                                             )                                                                                          \
                                       ,Pmasque2                                                                                        \
                                        )                                                                                               \
                                  ,ETLO(ASD1(num_acces_pile,NUMERIQUE_BINAIRE),Pmasque1)                                                \
                                   )                                                                                                    \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                                        /* Transfert de la variable dans le bloc multiplex ; ce                                      */ \
                                        /* bricolage est destine a eliminer les faux caracteres                                      */ \
                                        /* 'K_NULL' qui peuvent apparaitre dans les constantes                                       */ \
                                        /* numeriques : en fait on double chaque chiffre hexa-decimal                                */ \
                                        /* en l'associant a son complement...                                                        */
#    define    PUSHX(descripteur_de_pile,variable,STOX)                                                                                 \
                                        /* Empilement d'une variable de type 'X'.                                                    */ \
                         Bblock                                                                                                         \
                         DEFV(CHAR,INIT(POINTERc(Achaine_equivalente),ADRESSE(ASD1(alpha_acces_pile,ALPHA_CODE))));                     \
                         VALIDATION_PILE                                                                                                \
                             (descripteur_de_pile                                                                                       \
                             ,BLOC(STOX(variable);                                                                                      \
                                        /* On convertit la variable numerique en binaire...                                          */ \
                                   PUSHX_DEMI(descipteur_de_pile,premiere_partie,SCLS,PMASQUE1,PMASQUE2);                               \
                                        /* Transfert d'une moitie des bits.                                                          */ \
                                   PUSHX_DEMI(descipteur_de_pile,deuxieme_partie,SCRS,PMASQUE2,PMASQUE1);                               \
                                        /* Transfert de la deuxieme moitie des bits.                                                 */ \
                                   PUSH(descripteur_de_pile,Achaine_equivalente);                                                       \
                                        /* Et empilement sous la forme d'une chaine de caracteres.                                   */ \
                                   )                                                                                                    \
                             ,BLOC(PRINT_ERREUR("lors d'un 'PUSHI/F' l'adresse du descripteur_de_pile est invalide");                   \
                                   CAL1(Prer1("   Son adresse est %08X\n",descripteur_de_pile));                                        \
                                   )                                                                                                    \
                              );                                                                                                        \
                         Eblock
#    define    PUSHI(descripteur_de_pile,variable)                                                                                      \
                         Bblock                                                                                                         \
                         PUSHX(descripteur_de_pile,variable,STOI);                                                                      \
                         Eblock                                                                                                         \
                                        /* Empilement d'une variable entiere.                                                        */
#    define    PUSHF(descripteur_de_pile,variable)                                                                                      \
                         Bblock                                                                                                         \
                         PUSHX(descripteur_de_pile,variable,STOF);                                                                      \
                         Eblock                                                                                                         \
                                        /* Empilement d'une variable flottante.                                                      */
#    define    PULLX_DEMI(descipteur_de_pile,partie,DECA,Pmasque1,Pmasque2)                                                             \
                         Bblock                                                                                                         \
                         Test(IFNE(ETLO(ASD2(alpha_acces_pile,BINAIRE_CODEE,partie)                                                     \
                                       ,Pmasque1                                                                                        \
                                        )                                                                                               \
                                  ,ETLO(COMK(DECA(ETLO(ASD2(alpha_acces_pile,BINAIRE_CODEE,partie)                                      \
                                                      ,Pmasque2                                                                         \
                                                       )                                                                                \
                                                 ,NBITHX                                                                                \
                                                  )                                                                                     \
                                             )                                                                                          \
                                       ,Pmasque1                                                                                        \
                                        )                                                                                               \
                                   )                                                                                                    \
                              )                                                                                                         \
                              Bblock                                                                                                    \
                              PRINT_ERREUR("dans un 'PULLX_DEMI', les deux parties ne sont pas complementaires");                       \
                              CAL1(Prer1("le champ binaire vaut %08X\n",ASD2(alpha_acces_pile,BINAIRE_CODEE,partie)));                  \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         EGAL(ASD2(alpha_acces_pile,BINAIRE_CODEE,partie)                                                               \
                             ,ETLO(ASD2(alpha_acces_pile,BINAIRE_CODEE,partie)                                                          \
                                  ,Pmasque1                                                                                             \
                                   )                                                                                                    \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                                        /* On elimine ainsi les bits inutiles...                                                     */
#    define    PULLX(descripteur_de_pile,variable,LOAX)                                                                                 \
                                        /* Depilement d'une variable de type 'X'.                                                    */ \
                         Bblock                                                                                                         \
                         DEFV(CHAR,INIT(POINTERc(Achaine_equivalente),ADRESSE(ASD1(alpha_acces_pile,ALPHA_CODE))));                     \
                         DEFV(CHAR,INIT(POINTERc(liste_depilee),CHAINE_UNDEF));                                                         \
                         VALIDATION_PILE                                                                                                \
                             (descripteur_de_pile                                                                                       \
                             ,BLOC(PULL(descripteur_de_pile,liste_depilee);                                                             \
                                        /* On depile l'information sous forme alpha-numerique,                                       */ \
                                        /* avec comme pointeur 'liste_depilee'.                                                      */ \
                                   Test(IFNE(liste_depilee,CHAINE_UNDEF))                                                               \
                                        Bblock                                                                                          \
                                        CALS(chain_copie(Achaine_equivalente,liste_depilee));                                           \
                                        /* Transfert de la chaine dans le bloc multiplex alpha-numerique ; en effet,                 */ \
                                        /* 'PULL' renvoie seulement un pointeur, et non la liste elle-meme.                          */ \
                                        CALZ_FreLL(liste_depilee);                                                                      \
                                        /* On libere brutalement l'espace de l'element depile apres sa recuperation dans             */ \
                                        /* 'Achaine_equivalente'.                                                                    */ \
                                        PULLX_DEMI(descripteur_de_pile,deuxieme_partie,SCLS,PMASQUE2,PMASQUE1);                         \
                                        /* Recuperation de la deuxieme moitie...                                                     */ \
                                        PULLX_DEMI(descripteur_de_pile,premiere_partie,SCRS,PMASQUE1,PMASQUE2);                         \
                                        /* Recuperation de la premiere moitie...                                                     */ \
                                        EGAL(ASD1(num_acces_pile,NUMERIQUE_BINAIRE)                                                     \
                                            ,OUIN(ASD2(alpha_acces_pile,BINAIRE_CODEE,premiere_partie)                                  \
                                                 ,ASD2(alpha_acces_pile,BINAIRE_CODEE,deuxieme_partie)                                  \
                                                  )                                                                                     \
                                             );                                                                                         \
                                        /* Et on reconcatene les deux moities...                                                     */ \
                                        LOAX(variable);                                                                                 \
                                        /* Et enfin transfert de la variable reconstituee depuis                                     */ \
                                        /* le bloc multiplex.                                                                        */ \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        PRINT_ERREUR("lors d'un 'PULLI/F', 'PULL' a renvoye une adresse indefinie");                    \
                                        /* Nota : la 'variable' reste inchangee...                                                   */ \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   )                                                                                                    \
                             ,BLOC(PRINT_ERREUR("lors d'un 'PULLI/F' l'adresse du descripteur_de_pile est invalide");                   \
                                   CAL1(Prer1("   Son adresse est %08X\n",descripteur_de_pile));                                        \
                                        /* Nota : la 'variable' reste inchangee...                                                   */ \
                                   )                                                                                                    \
                              );                                                                                                        \
                         Eblock
#    define    PULLI(descripteur_de_pile,variable)                                                                                      \
                         Bblock                                                                                                         \
                         PULLX(descripteur_de_pile,variable,LOAI);                                                                      \
                         Eblock                                                                                                         \
                                        /* Depilement d'une variable entiere.                                                        */
#    define    PULLF(descripteur_de_pile,variable)                                                                                      \
                         Bblock                                                                                                         \
                         PULLX(descripteur_de_pile,variable,LOAF);                                                                      \
                         Eblock                                                                                                         \
                                        /* Depilement d'une variable flottante.                                                      */
#Aifdef   GESTION_PILES_VERSION_01
#Eifdef   GESTION_PILES_VERSION_01

#ifdef    GESTION_PILES_VERSION_02
#    define    PUSHX(descripteur_de_pile,variable,SORTIE_X)                                                                             \
                                        /* Empilement d'une variable de type 'X'.                                                    */ \
                         Bblock                                                                                                         \
                         VALIDATION_PILE                                                                                                \
                             (descripteur_de_pile                                                                                       \
                             ,BLOC(PUSH(descripteur_de_pile,SORTIE_X(variable));                                                        \
                                        /* Et empilement sous la forme d'une chaine de caracteres.                                   */ \
                                   )                                                                                                    \
                             ,BLOC(PRINT_ERREUR("lors d'un 'PUSHI/F' l'adresse du descripteur_de_pile est invalide");                   \
                                   CAL1(Prer1("   Son adresse est %08X\n",descripteur_de_pile));                                        \
                                   )                                                                                                    \
                              );                                                                                                        \
                         Eblock
#    define    PUSHI(descripteur_de_pile,variable_entiere)                                                                              \
                         Bblock                                                                                                         \
                         PUSHX(descripteur_de_pile,variable_entiere,Fsortie_entier);                                                    \
                         Eblock                                                                                                         \
                                        /* Empilement d'une variable entiere.                                                        */
#    define    PUSHF(descripteur_de_pile,variable_simple_precision)                                                                     \
                         Bblock                                                                                                         \
                         PUSHX(descripteur_de_pile,variable_simple_precision,Fsortie_simple_precision);                                 \
                         Eblock                                                                                                         \
                                        /* Empilement d'une variable simple-precision.                                               */
#    define    PUSHD(descripteur_de_pile,variable_double_precision)                                                                     \
                         Bblock                                                                                                         \
                         PUSHX(descripteur_de_pile,variable_double_precision,Fsortie_double_precision);                                 \
                         Eblock                                                                                                         \
                                        /* Empilement d'une variable double-precision.                                               */
#    define    PULLX(descripteur_de_pile,variable,ENTREE_X)                                                                             \
                                        /* Depilement d'une variable de type 'X'.                                                    */ \
                         Bblock                                                                                                         \
                         DEFV(CHAR,INIT(POINTERc(liste_depilee),CHAINE_UNDEF));                                                         \
                         VALIDATION_PILE                                                                                                \
                             (descripteur_de_pile                                                                                       \
                             ,BLOC(PULL(descripteur_de_pile,liste_depilee);                                                             \
                                        /* On depile l'information sous forme alpha-numerique,                                       */ \
                                        /* avec comme pointeur 'liste_depilee'.                                                      */ \
                                   Test(IFNE(liste_depilee,CHAINE_UNDEF))                                                               \
                                        Bblock                                                                                          \
                                        EGAL(variable,ENTREE_X(liste_depilee));                                                         \
                                        /* Et enfin transfert de la variable reconstituee depuis                                     */ \
                                        /* le bloc multiplex.                                                                        */ \
                                        CALZ_FreLL(liste_depilee);                                                                      \
                                        /* On libere brutalement l'espace de l'element depile apres sa recuperation dans             */ \
                                        /* 'ENTREE_X()'.                                                                             */ \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        PRINT_ERREUR("lors d'un 'PULLI/F', 'PULL' a renvoye une adresse indefinie");                    \
                                        /* Nota : la 'variable' reste inchangee...                                                   */ \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   )                                                                                                    \
                             ,BLOC(PRINT_ERREUR("lors d'un 'PULLI/F' l'adresse du descripteur_de_pile est invalide");                   \
                                   CAL1(Prer1("   Son adresse est %08X\n",descripteur_de_pile));                                        \
                                        /* Nota : la 'variable' reste inchangee...                                                   */ \
                                   )                                                                                                    \
                              );                                                                                                        \
                         Eblock
#    define    PULLI(descripteur_de_pile,variable_entiere)                                                                              \
                         Bblock                                                                                                         \
                         PULLX(descripteur_de_pile,variable_entiere,Fentree_entier);                                                    \
                         Eblock                                                                                                         \
                                        /* Depilement d'une variable entiere.                                                        */
#    define    PULLF(descripteur_de_pile,variable_simple_precision)                                                                     \
                         Bblock                                                                                                         \
                         PULLX(descripteur_de_pile,variable_simple_precision,Fentree_simple_precision);                                 \
                         Eblock                                                                                                         \
                                        /* Depilement d'une variable simple-precision.                                               */
#    define    PULLD(descripteur_de_pile,variable_double_precision)                                                                     \
                         Bblock                                                                                                         \
                         PULLX(descripteur_de_pile,variable_double_precision,Fentree_double_precision);                                 \
                         Eblock                                                                                                         \
                                        /* Depilement d'une variable double-precision.                                               */
#Aifdef   GESTION_PILES_VERSION_02
#Eifdef   GESTION_PILES_VERSION_02

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O R M A T   D E   C O N V E R S I O N   B I N A I R E - C A R A C T E R E S  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Local,DEFV(CHAR,INIT(POINTERc(format_double),CHAINE_UNDEF)));
                                        /* Pointeur vers le format de conversion des donnees binaires (simple                        */
                                        /* ou double) en chaines de caracteres, et inversement.                                      */

DEFV(Common,DEFV(num_multiplex,zone_de_conversion));
                                        /* Multiplex ou effectuer les conversions. On notera la mise en 'Common' afin de pouvoir     */
                                        /* utiliser les fonctions 'Fsortie_...(...)' (v $xcg/print_hexa$K').                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N   L O G I Q U E   E N   C H A I N E   D E   C A R A C T E R E S  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(Fsortie_logique(valeur_logique))))
DEFV(Argument,DEFV(Logical,valeur_logique));
                                        /* Valeur logique argument a sortir sous forme de chaine de caracteres.                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     EGAL(ASD2(zone_de_conversion,logique,valeur),valeur_logique);
     FORMAT_DOUBLE;
                                        /* Initialisation eventuelle du format de conversion.                                        */
     CALZ(SPrin2(ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique)
                ,format_double
                ,ASD2(zone_de_conversion,binaire_equivalent,premiere_partie)
                ,ASD2(zone_de_conversion,binaire_equivalent,deuxieme_partie)
                 )
          );
     RETU(ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique));
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N E   C H A I N E   D E   C A R A C T E R E S   E N   L O G I Q U E  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionL

DEFV(Common,DEFV(FonctionL,Fentree_logique(chaine_a_convertir)))
DEFV(Argument,DEFV(CHAR,POINTERc(chaine_a_convertir)));
                                        /* Chaine argument contenant la valeur logique a recuperer.                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     FORMAT_DOUBLE;
                                        /* Initialisation eventuelle du format de conversion.                                        */
     CALZ(SSca2(chaine_a_convertir
               ,format_double
               ,ADRESSE(ASD2(zone_de_conversion,binaire_equivalent,premiere_partie))
               ,ADRESSE(ASD2(zone_de_conversion,binaire_equivalent,deuxieme_partie))
                )
          );
                                        /* On utilise 'chaine_a_convertir' et non pas la zone du multiplex                           */
                                        /* 'ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique)' au cas               */
                                        /* ou il y aurait des incompatibilites de longueur...                                        */
     RETU(ASD2(zone_de_conversion,logique,valeur));
     Eblock

EFonctionL

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N   E N T I E R   E N   C H A I N E   D E   C A R A C T E R E S  :                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(Fsortie_entier(valeur_entiere))))
DEFV(Argument,DEFV(Int,valeur_entiere));
                                        /* Valeur entiere argument a sortir sous forme de chaine de caracteres.                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     EGAL(ASD2(zone_de_conversion,entier,valeur),valeur_entiere);
     FORMAT_DOUBLE;
                                        /* Initialisation eventuelle du format de conversion.                                        */
     CALZ(SPrin2(ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique)
                ,format_double
                ,ASD2(zone_de_conversion,binaire_equivalent,premiere_partie)
                ,ASD2(zone_de_conversion,binaire_equivalent,deuxieme_partie)
                 )
          );
     RETU(ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique));
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N E   C H A I N E   D E   C A R A C T E R E S   E N   E N T I E R  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,Fentree_entier(chaine_a_convertir)))
DEFV(Argument,DEFV(CHAR,POINTERc(chaine_a_convertir)));
                                        /* Chaine argument contenant la valeur entiere a recuperer.                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     FORMAT_DOUBLE;
                                        /* Initialisation eventuelle du format de conversion.                                        */
     CALZ(SSca2(chaine_a_convertir
               ,format_double
               ,ADRESSE(ASD2(zone_de_conversion,binaire_equivalent,premiere_partie))
               ,ADRESSE(ASD2(zone_de_conversion,binaire_equivalent,deuxieme_partie))
                )
          );
                                        /* On utilise 'chaine_a_convertir' et non pas la zone du multiplex                           */
                                        /* 'ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique)' au cas               */
                                        /* ou il y aurait des incompatibilites de longueur...                                        */
     RETU(ASD2(zone_de_conversion,entier,valeur));
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N   S I M P L E - P R E C I S I O N   E N   C H A I N E   D E   C A R A C T E R E S  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(Fsortie_simple_precision(valeur_simple_precision))))
DEFV(Argument,DEFV(Float,valeur_simple_precision));
                                        /* Valeur simple-precision argument a sortir sous forme de chaine de caracteres.             */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     EGAL(ASD2(zone_de_conversion,simple_precision,valeur),valeur_simple_precision);
     FORMAT_DOUBLE;
                                        /* Initialisation eventuelle du format de conversion.                                        */
     CALZ(SPrin2(ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique)
                ,format_double
                ,ASD2(zone_de_conversion,binaire_equivalent,premiere_partie)
                ,ASD2(zone_de_conversion,binaire_equivalent,deuxieme_partie)
                 )
          );
     RETU(ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique));
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N E   C H A I N E   D E   C A R A C T E R E S   S I M P L E - P R E C I S I O N  :             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,Fentree_simple_precision(chaine_a_convertir)))
DEFV(Argument,DEFV(CHAR,POINTERc(chaine_a_convertir)));
                                        /* Chaine argument contenant la valeur simple-precision a recuperer.                         */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     FORMAT_DOUBLE;
                                        /* Initialisation eventuelle du format de conversion.                                        */
     CALZ(SSca2(chaine_a_convertir
               ,format_double
               ,ADRESSE(ASD2(zone_de_conversion,binaire_equivalent,premiere_partie))
               ,ADRESSE(ASD2(zone_de_conversion,binaire_equivalent,deuxieme_partie))
                )
          );
                                        /* On utilise 'chaine_a_convertir' et non pas la zone du multiplex                           */
                                        /* 'ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique)' au cas               */
                                        /* ou il y aurait des incompatibilites de longueur...                                        */
     RETU(ASD2(zone_de_conversion,simple_precision,valeur));
     Eblock

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N   D O U B L E - P R E C I S I O N   E N   C H A I N E   D E   C A R A C T E R E S  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(Fsortie_double_precision(valeur_double_precision))))
DEFV(Argument,DEFV(Double,valeur_double_precision));
                                        /* Valeur double-precision argument a sortir sous forme de chaine de caracteres.             */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     EGAL(ASD2(zone_de_conversion,double_precision,valeur),valeur_double_precision);
     FORMAT_DOUBLE;
                                        /* Initialisation eventuelle du format de conversion.                                        */
     CALZ(SPrin2(ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique)
                ,format_double
                ,ASD2(zone_de_conversion,binaire_equivalent,premiere_partie)
                ,ASD2(zone_de_conversion,binaire_equivalent,deuxieme_partie)
                 )
          );
     RETU(ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique));
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N E   C H A I N E   D E   C A R A C T E R E S   D O U B L E - P R E C I S I O N  :             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionD

DEFV(Common,DEFV(FonctionD,Fentree_double_precision(chaine_a_convertir)))
DEFV(Argument,DEFV(CHAR,POINTERc(chaine_a_convertir)));
                                        /* Chaine argument contenant la valeur double-precision a recuperer.                         */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     FORMAT_DOUBLE;
                                        /* Initialisation eventuelle du format de conversion.                                        */
     CALZ(SSca2(chaine_a_convertir
               ,format_double
               ,ADRESSE(ASD2(zone_de_conversion,binaire_equivalent,premiere_partie))
               ,ADRESSE(ASD2(zone_de_conversion,binaire_equivalent,deuxieme_partie))
                )
          );
                                        /* On utilise 'chaine_a_convertir' et non pas la zone du multiplex                           */
                                        /* 'ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique)' au cas               */
                                        /* ou il y aurait des incompatibilites de longueur...                                        */
     RETU(ASD2(zone_de_conversion,double_precision,valeur));
     Eblock

EFonctionD

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N   ' Float '   E N   C H A I N E   D E   C A R A C T E R E S  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(Fsortie_Float(valeur_Float))))
DEFV(Argument,DEFV(Float,valeur_Float));
                                        /* Valeur flottante argument a sortir sous forme de chaine de caracteres.                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/

#if       (PRECISION_DU_Float==SIMPLE_PRECISION)
     CALS(Fsortie_simple_precision(valeur_Float));
#Aif      (PRECISION_DU_Float==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Float==SIMPLE_PRECISION)

#if       (PRECISION_DU_Float==DOUBLE_PRECISION)
     CALS(Fsortie_double_precision(valeur_Float));
#Aif      (PRECISION_DU_Float==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Float==DOUBLE_PRECISION)

     RETU(ASD2(zone_de_conversion,binaire_equivalent,chaine_alpha_numerique));
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E M P I L E M E N T   D ' U N E   C H A I N E   D E   C A R A C T E R E S  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,Fpush(descripteur_de_pile,informations)))
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Descripteur de la pile dans laquelle on veut inserer l'informations.                      */
DEFV(Argument,DEFV(CHAR,DTb0(informations)));
                                        /* Chaine d'octets a memoriser dans l'element courant.                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     PUSH(descripteur_de_pile,informations);
                                        /* Et on empile l'information.                                                               */

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P I L E M E N T   D ' U N E   C H A I N E   D E   C A R A C T E R E S                                                  */
/*        A V E C   A L L O C A T I O N   M E M O I R E   P O U R   E L L E  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(Fpull(descripteur_de_pile))))
                                        /* ATTENTION : l'argument 'descripteur_de_pile'                                              */
                                        /* n'est pas declare par "ARGUMENT_POINTEUR", car en                                         */
                                        /* effet, ce meme argument est declare "POINTEUR" avant l'appel                              */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : un pointeur vers les informations depilees ou vers                             */
                                        /* 'CHAINE_UNDEF' si la pile parait incorrecte...                                            */
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Adresse de l'en-tete de la pile a laquelle appartient la chaine a depiler.                */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(informations),CHAINE_UNDEF));
                                        /* Pointeur de recuperation de la chaine de caracteres depiles.                              */
     /*..............................................................................................................................*/
     PULL(descripteur_de_pile,informations);
     RETU(informations);
                                        /* Et on renvoie les informations utiles sous la forme d'un pointeur vers                    */
                                        /* une chaine de caracteres, ou une adresse indefinie ('CHAINE_UNDEF') en                    */
                                        /* cas de gros problemes. ATTENTION : on n'oubliera pas que la memoire ici                   */
                                        /* allouee doit etre rendue un jour !!!                                                      */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E M P I L E M E N T   D ' U N E   V A L E U R   E N T I E R E  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FpushI(descripteur_de_pile,valeur_entiere)))
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Descripteur de la pile dans laquelle on veut inserer l'informations.                      */
DEFV(Argument,DEFV(Int,valeur_entiere));
                                        /* Variable entiere a empiler.                                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     PUSHI(descripteur_de_pile,valeur_entiere);
                                        /* Et on empile l'information.                                                               */

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P I L E M E N T   D ' U N E   V A L E U R   E N T I E R E  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FpullI(descripteur_de_pile)))
                                        /* ATTENTION : l'argument 'descripteur_de_pile'                                              */
                                        /* n'est pas declare par "ARGUMENT_POINTEUR", car en                                         */
                                        /* effet, ce meme argument est declare "POINTEUR" avant l'appel                              */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : la valeur entiere depilee ou 'UNDEF' si la pile parait mauvaise.               */
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Adresse de l'en-tete de la pile a laquelle appartient la valeur a depiler.                */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(valeur_entiere,UNDEF));
                                        /* Pointeur de recuperation de la chaine de caracteres depiles.                              */
     /*..............................................................................................................................*/
     PULLI(descripteur_de_pile,valeur_entiere);
     RETU(valeur_entiere);
                                        /* Et on renvoie la valeur entiere (ou 'UNDEF' en cas de problemes)...                       */
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E M P I L E M E N T   D ' U N E   V A L E U R   L O G I Q U E  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FpushL(descripteur_de_pile,valeur_logique)))
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Descripteur de la pile dans laquelle on veut inserer l'informations.                      */
DEFV(Argument,DEFV(Logical,valeur_logique));
                                        /* Variable logique a empiler.                                                               */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     PUSHI(descripteur_de_pile,INTE(valeur_logique));
                                        /* Et on empile l'information.                                                               */

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P I L E M E N T   D ' U N E   V A L E U R   L O G I Q U E  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionL

DEFV(Common,DEFV(FonctionL,FpullL(descripteur_de_pile)))
                                        /* ATTENTION : l'argument 'descripteur_de_pile'                                              */
                                        /* n'est pas declare par "ARGUMENT_POINTEUR", car en                                         */
                                        /* effet, ce meme argument est declare "POINTEUR" avant l'appel                              */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : la valeur entiere depilee ou 'UNDEF' si la pile parait mauvaise.               */
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Adresse de l'en-tete de la pile a laquelle appartient la valeur a depiler.                */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(valeur_entiere,UNDEF));
                                        /* Pointeur de recuperation de la chaine de caracteres depiles.                              */
     /*..............................................................................................................................*/
     PULLI(descripteur_de_pile,valeur_entiere);
     RETU(LOGI(valeur_entiere));
                                        /* Et on renvoie la valeur logique (ou 'UNDEF' en cas de problemes)...                       */
     Eblock

EFonctionL

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E M P I L E M E N T   D ' U N E   V A L E U R   S I M P L E   P R E C I S I O N  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FpushF(descripteur_de_pile,valeur_simple_precision)))
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Descripteur de la pile dans laquelle on veut inserer l'informations.                      */
DEFV(Argument,DEFV(Float,valeur_simple_precision));
                                        /* Variable simple precision a empiler.                                                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     PUSHF(descripteur_de_pile,valeur_simple_precision);
                                        /* Et on empile l'information.                                                               */

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P I L E M E N T   D ' U N E   V A L E U R   S I M P L E   P R E C I S I O N  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(FonctionF,FpullF(descripteur_de_pile)))
                                        /* ATTENTION : l'argument 'descripteur_de_pile'                                              */
                                        /* n'est pas declare par "ARGUMENT_POINTEUR", car en                                         */
                                        /* effet, ce meme argument est declare "POINTEUR" avant l'appel                              */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : la valeur simple precision depilee ou 'UNDEF' si la pile                       */
                                        /* parait mauvaise.                                                                          */
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Adresse de l'en-tete de la pile a laquelle appartient la valeur a depiler.                */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(valeur_simple_precision,FLOT__UNDEF));
                                        /* Valeur flottante simple precision depilee.                                                */
     /*..............................................................................................................................*/
     PULLF(descripteur_de_pile,valeur_simple_precision);
     RETU(valeur_simple_precision);
                                        /* Et on renvoie la valeur simple precision (ou 'UNDEF' en cas de problemes)...              */
     Eblock

EFonctionF

#ifdef    GESTION_PILES_VERSION_01                                              /* Common,DEFV(Fonction,) : gestion des piles.       */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E M P I L E M E N T   D ' U N E   V A L E U R   D O U B L E   P R E C I S I O N  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Local,DEFV(FonctionI,FpushD(descripteur_de_pile,valeur_double_precision)))
                                        /* NOTA : 'FpushD' de la 'VERSION_01' n'est pas un 'Common' pour eviter                      */
                                        /* les doubles definitions dans le fichier des 'extern's.                                    */
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Descripteur de la pile dans laquelle on veut inserer l'informations.                      */
DEFV(Argument,DEFV(Float,valeur_double_precision));
                                        /* Variable double precision a empiler.                                                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     PRINT_ERREUR("la gestion des piles en double precision n'est pas implementee dans la VERSION_01");

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P I L E M E N T   D ' U N E   V A L E U R   D O U B L E   P R E C I S I O N  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionD

DEFV(Local,DEFV(FonctionD,FpullD(descripteur_de_pile)))
                                        /* NOTA : 'FpullD' de la 'VERSION_01' n'est pas un 'Common' pour eviter                      */
                                        /* les doubles definitions dans le fichier des 'extern's.                                    */
                                        /* ATTENTION : l'argument 'descripteur_de_pile'                                              */
                                        /* n'est pas declare par "ARGUMENT_POINTEUR", car en                                         */
                                        /* effet, ce meme argument est declare "POINTEUR" avant l'appel                              */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : la valeur double precision depilee ou 'UNDEF' si la pile                       */
                                        /* parait mauvaise.                                                                          */
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Adresse de l'en-tete de la pile a laquelle appartient la valeur a depiler.                */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(valeur_double_precision,FLOT__UNDEF));
                                        /* Valeur flottante double precision depilee.                                                */
     /*..............................................................................................................................*/
     PRINT_ERREUR("la gestion des piles en double precision n'est pas implementee dans la VERSION_01");
     RETU(valeur_double_precision);
                                        /* Et on renvoie la valeur double precision (ou 'UNDEF' en cas de problemes)...              */
     Eblock

EFonctionD

#    undef     PULLF
#    undef     PULLI
#    undef     PULLX
#    undef     PULLX_DEMI
#    undef     PUSHF
#    undef     PUSHI
#    undef     PUSHX
#    undef     PUSHX_DEMI
#    undef     PMASQUE2
#    undef     PMASQUE1
#    undef     PMASQUE

#    undef     LOAF
#    undef     LOAI
#    undef     LOAM
#    undef     STOF
#    undef     STOI
#    undef     STOM
#    undef     SIZE_ALPHA_MULTIPLEX

#Aifdef   GESTION_PILES_VERSION_01                                              /* Common,DEFV(Fonction,) : gestion des piles.       */
#Eifdef   GESTION_PILES_VERSION_01                                              /* Common,DEFV(Fonction,) : gestion des piles.       */

#ifdef    GESTION_PILES_VERSION_02                                              /* Common,DEFV(Fonction,) : gestion des piles.       */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E M P I L E M E N T   D ' U N E   V A L E U R   D O U B L E   P R E C I S I O N  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FpushD(descripteur_de_pile,valeur_double_precision)))
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Descripteur de la pile dans laquelle on veut inserer l'informations.                      */
DEFV(Argument,DEFV(Float,valeur_double_precision));
                                        /* Variable double precision a empiler.                                                      */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     PUSHD(descripteur_de_pile,valeur_double_precision);
                                        /* Et on empile l'information.                                                               */

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E P I L E M E N T   D ' U N E   V A L E U R   D O U B L E   P R E C I S I O N  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionD

DEFV(Common,DEFV(FonctionD,FpullD(descripteur_de_pile)))
                                        /* ATTENTION : l'argument 'descripteur_de_pile'                                              */
                                        /* n'est pas declare par "ARGUMENT_POINTEUR", car en                                         */
                                        /* effet, ce meme argument est declare "POINTEUR" avant l'appel                              */
                                        /* lors de la definition des variables de la fonction appelante.                             */
                                        /* RESULTAT : la valeur double precision depilee ou 'UNDEF' si la pile                       */
                                        /* parait mauvaise.                                                                          */
DEFV(Argument,DEFV(l_element,POINTERs(descripteur_de_pile)));
                                        /* Adresse de l'en-tete de la pile a laquelle appartient la valeur a depiler.                */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float,INIT(valeur_double_precision,FLOT__UNDEF));
                                        /* Valeur flottante double precision depilee.                                                */
     /*..............................................................................................................................*/
     PULLD(descripteur_de_pile,valeur_double_precision);
     RETU(valeur_double_precision);
                                        /* Et on renvoie la valeur double precision (ou 'UNDEF' en cas de problemes)...              */
     Eblock

EFonctionD

#    undef     PULLD
#    undef     PULLF
#    undef     PULLI
#    undef     PULLX
#    undef     PUSHD
#    undef     PUSHF
#    undef     PUSHI
#    undef     PUSHX

#Aifdef   GESTION_PILES_VERSION_02                                              /* Common,DEFV(Fonction,) : gestion des piles.       */
#Eifdef   GESTION_PILES_VERSION_02                                              /* Common,DEFV(Fonction,) : gestion des piles.       */

#undef    GESTION_PILES_VERSION_02

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O R M A T   D ' E D I T I O N   D E S   P A R A M E T R E S   ' Int '   E T   ' Flot '  :                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

DEFV(Common,DEFV(CHAR,SINS(DTb0(signe_de_FORMAT_INTE_EDITION)
                          ,Ichaine01(K_PLUS)
                           )
                 )
     );
                                        /* Afin de permettre de signer (par defaut) ou pas les nombres 'Int'...                      */
                                        /* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de         */
                                        /* faciliter le travail de '$xcg/gen.ext$Z'...                                               */

DEFV(Common,DEFV(FonctionC,POINTERc(format_INTE_EDITION())))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),chain_Acopie(_FORMAT_INTE_EDITION)));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(format_INTE_EDITION__NON_SIGNE())))
                                        /* Fonction introduite le 20190930114212...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),chain_Acopie(_FORMAT_INTE_EDITION__NON_SIGNE)));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

BFonctionC

DEFV(Common,DEFV(CHAR,SINS(DTb0(signe_de_FORMAT_FLOT_EDITION)
                          ,Ichaine01(K_PLUS)
                           )
                 )
     );
                                        /* Afin de permettre de signer (par defaut) ou pas les nombres 'Flot'...                     */
                                        /* ATTENTION : cette definition est mise sur plusieurs lignes afin principalement de         */
                                        /* faciliter le travail de '$xcg/gen.ext$Z'...                                               */

DEFV(Common,DEFV(FonctionC,POINTERc(format_FLOT_EDITION())))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),chain_Acopie(_FORMAT_FLOT_EDITION)));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(format_FLOT_EDITION__NON_SIGNE())))
                                        /* Fonction introduite le 20190929105709...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(chaineR),chain_Acopie(_FORMAT_FLOT_EDITION__NON_SIGNE)));
                                        /* Afin de creer dynamiquement la chaine resultante.                                         */
     /*..............................................................................................................................*/

     RETU(chaineR);
                                        /* Renvoi d'un pointeur sur la chaine resultante.                                            */
     Eblock

EFonctionC

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P O U R   C O M P T A B I L I S E R   L E S   S U C C E S   L O R S                                                        */
/*        D E S   R E C H E R C H E S   D E S   T I T R E S   A T T E N D U S  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Int,ZINT(NUMERO_UNIQUE_de_l_argument_possible_courant,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES)));
                                        /* Donne en permanence l'identite UNIQUE (dans le sens ou deux parametres "synonymes" ont    */
                                        /* la meme identite) du parametre en cours de traitement (introduit le 20000202084613).      */
                                        /*                                                                                           */
                                        /* Je note le 20111220112513 que 'NUMERO_UNIQUE_de_l_argument_possible_courant' n'a de       */
                                        /* sens que lorsque 'IL_FAUT(editer_la_valeur_des_parametres_d_une_commande)' (voir a        */
                                        /* ce propos 'v $xig/fonct$vv$DEF 20111219175904'...).                                       */
DEFV(Common,DEFV(Int,ZINT(NUMERO_UNIQUE_maximal_de_l_argument_possible_courant,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES)));
                                        /* Donne en permanence le maximum de 'NUMERO_UNIQUE_de_l_argument_possible_courant'          */
                                        /* Ceci fut introduit le 20081117101554 afin de valider 'nombre_d_arguments_possibles_...'   */
                                        /* en notant bien que ce dernier ne peut etre remplace par cette nouvelle variable car,      */
                                        /* en effet, celle-ci est dynamique alors qu'il faut quelque chose de stable lors des        */
                                        /* editions faites lorsque 'EST_VRAI(c_est_la_derniere_recherche_des_parametres)'...         */

DEFV(Common,DEFV(Int,INIT(nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes,UNDEF)));
                                        /* Le 20081113173432 j'ai tente d'introduire l'edition du nombre maximal de parametres via : */
                                        /*                                                                                           */
                                        /*   DEFV(Common,DEFV(Int,SINT(nombre_d_arguments_possibles_regroupes_par_classe...,ZERO))); */
                                        /*                                                                                           */
                                        /* (en comptant pour un seul tous les synonymes d'un meme parametre) apres l'edition de      */
                                        /* 'NUMERO_UNIQUE_de_l_argument_possible_courant'. Malheureusement cela fut impossible       */
                                        /* pour plusieurs raisons :                                                                  */
                                        /*                                                                                           */
                                        /* 1-Ce comptage doit avoir lieu si 'EST_VRAI(c_est_la_premiere_recherche_des_parametres)'   */
                                        /* afin d'etre disponible lorsque 'EST_VRAI(c_est_la_derniere_recherche_des_parametres)'.    */
                                        /* Le nombre d'arguments possibles ne peut donc pas etre corriges dans ce dernier cas, car   */
                                        /* evidemment sa valeur doit etre constante pendant l'edition des parametres.                */
                                        /*                                                                                           */
                                        /* 2-Certaines procedures posent probleme. Par exemple :                                     */
                                        /*                                                                                           */
                                        /*                  GET_ARGUMENT_L("nom_si_VRAI=",variable);                                 */
                                        /*                  GET_ARGUMENT_N("nom_si_FAUX=",variable);                                 */
                                        /*                                                                                           */
                                        /* (ainsi que celles qui leur ressemblent...).                                               */
                                        /*                                                                                           */
                                        /* Dans l'exemple precedent, le symbole 'variable' est commun aux deux appels ; alors        */
                                        /* 'NUMERO_UNIQUE_de_l_argument_possible_courant' sera identique (soit 'nnnn') lors de       */
                                        /* l'edition suivante :                                                                      */
                                        /*                                                                                           */
                                        /*                  Parametre.2. nnnn/pppp : nom_si_VRAI=                       L   :: VRAI  */
                                        /*                  Parametre.2. nnnn/pppp : nom_si_FAUX=                       N   :: FAUX  */
                                        /*                                                                                           */
                                        /* Mais par contre, nous serons passes deux fois ici dans 'gPROCESS_PARAMETRE(...)' et le    */
                                        /* nombre d'arguments possibles aura ete incremente de 2. Cela implique qu'en general le     */
                                        /* nombre d'arguments possibles edites (soit 'pppp' ci-dessus) sera plus grand que le numero */
                                        /* du dernier parametre (soit '____________________FinParametresSpecifiques'). Cela pouvait  */
                                        /* justifier un 'DECR(...,I)' place a la sortie de 'GET_PARAMETRE_N(...)' compensant le      */
                                        /* 'INCR(...,I)' en trop relatif a l'evaluation du nombre maximal de parametres. Mais cela   */
                                        /* n'est pas tres elegant...                                                                 */
                                        /*                                                                                           */
                                        /* 3-Certains parametres sont definis a l'aide de plusieurs procedures differentes. C'est    */
                                        /* ainsi le cas pour 'v $xci/valeurs_SurR$K' ou, a cette date, on trouve les deux synonymes  */
                                        /* suivants :                                                                                */
                                        /*                                                                                           */
                                        /*                  Parametre.2. 0035/0095 : ChiffresFlot=                      I   :: 16    */
                                        /*                  (...)                                                                    */
                                        /*                  ............ 0035/0095 : decimales=                         I   :: 16    */
                                        /*                                                                                           */
                                        /* Or ils ne sont pas definis ensemble : le premier dans 'v $xig/fonct$vv$DEF ChiffresFlot=' */
                                        /* et le second l'est dans 'v $xci/valeurs.02$I decimales='. Il y a donc la encore deux      */
                                        /* appels differents a 'GET_ARGUMENT_I(...)', d'ou une valeur trop grande d'une unite pour   */
                                        /* le nombre d'arguments possibles. Ce probleme se reposera a chaque fois que des synonymes  */
                                        /* ne seront pas definis ensemble.                                                           */
                                        /*                                                                                           */
                                        /* 4-Enfin, dans 'GET_PARAMETRES(...)' il y a deux 'PARCOURS_DE_LA_LISTE_DES_ARGUMENTS(...)' */
                                        /* l'un pour 'liste_de_recuperation_1', l'autre pour 'liste_de_recuperation_2' ce qui vient  */
                                        /* compliquer le traitement des parametres de type '...ParametresSpecifique'...              */
                                        /*                                                                                           */
                                        /* Pour toutes ces raisons, je renonce le 20081115105349...                                  */
                                        /*                                                                                           */
                                        /* Finalement, cela a pu etre retabli grace a 'v $xcc/cpp$Z 20081116112629'...               */

DEFV(Common,DEFV(Positive,ZINT(nombre_de_parametres_supportant_PreFixeParametres,ZERO)));
                                        /* Ce compteur a ete introduit le 20030708090727 afin de savoir si l'utilisation de          */
                                        /* 'prefixe_destine_a_abreger_certains_Parametres_qui_suivent' a un sens (ce compteur        */
                                        /* doit alors etre non nul) ou pas (ce compteur reste alors nul)...                          */
DEFV(Common,DEFV(Positive,ZINT(nombre_de_demandes_effectives_de_PreFixeParametres,ZERO)));
                                        /* Ce compteur a ete introduit le 20030708090727 afin de savoir s'il y a eu ou pas des       */
                                        /* modifications de 'prefixe_destine_a_abreger_certains_Parametres_qui_suivent'.             */

DEFV(Common,DEFV(Logical,ZINT(c_est_la_premiere_recherche_des_parametres,LUNDEF)));
                                        /* Cet indicateur permet de savoir si on est en train de faire le premier "balayage" d'une   */
                                        /* commande. Il permet donc de savoir si l'on est en train de traiter le premier argument    */
                                        /* d'appel d'un '$X' :                                                                       */
                                        /*                                                                                           */
                                        /*                  Commande$X          Argument1 Argument2 (...)     ArgumentN              */
                                        /*                                      ---------                                            */
                                        /*                                                                                           */
                                        /* Ceci fut introduit "preventivement" le 20060213115951...                                  */
DEFV(Common,DEFV(Logical,ZINT(c_est_la_derniere_recherche_des_parametres,LUNDEF)));
                                        /* Cet indicateur permet de savoir si on est en train de faire le dernier "balayage" d'une   */
                                        /* commande. Il permet donc de savoir si l'on est en train de traiter le dernier argument    */
                                        /* d'appel d'un '$X' :                                                                       */
                                        /*                                                                                           */
                                        /*                  Commande$X          Argument1 Argument2 (...)     ArgumentN              */
                                        /*                                                                    ---------              */
                                        /*                                                                                           */
                                        /* ce qui est important car, en effet, c'est a ce moment-la, en particulier, qu'il est       */
                                        /* possible d'editer la valeur de tous les arguments possibles...                            */

DEFV(Common,DEFV(Logical,ZINT(valeur_recherchee,LUNDEF)));
                                        /* Cet indicateur est positionne dans les fonctions 'Fconversion?' suivant                   */
                                        /* que la valeur recherchee a ete trouvee ('EXIST') ou pas ('NEXIST').                       */
DEFV(Common,DEFV(Logical,ZINT(cumul_logique_de_valeur_recherchee,NEXIST)));
                                        /* Cumul logique de 'valeur_recherchee'. Cela permet de savoir, par exemple, si un argument  */
                                        /* au moins a ete defini. Cela fut introduit le 20050603145824 pour etre utilise dans la     */
                                        /* commande 'v $xci/multi_02.04$K cumul_logique_de_valeur_recherchee' ou un grand nombre     */
                                        /* d'arguments n'ont de sens que si 'EST_FAUX(les_images_sont_standards)'. A priori, cet     */
                                        /* indicateur vaut 'EXIST' des qu'un parametre au moins a ete reconnu ; mais comme cela      */
                                        /* fait dans 'v $xci/multi_02.04$K cumul_logique_de_valeur_recherchee', il peut etre         */
                                        /* reinitialise explicitement ce qui permet de savoir donc si ensuite un autre parametre     */
                                        /* est reconnu...                                                                            */
DEFV(Common,DEFV(Logical,ZINT(valeur_trouvee_et_vide,LUNDEF)));
                                        /* Cet indicateur est positionne dans les fonctions 'Fconversion?' apres qu'une valeur       */
                                        /* ait ete trouvee, si la valeur est vide ('VRAI') ou non vide ('FAUX'). Ceci a ete          */
                                        /* introduit le 19970507100509 lors de l'introduction de l'argument 'valeurs_signees'        */
                                        /* dans 'v $xci/valeurs.03$I valeurs_signees'. En effet, si l'on ne veut pas que les         */
                                        /* valeurs editees par les commandes '$xci/valeur*$K' soient signees, il faut rentrer        */
                                        /* un argument "signe=" vide. Or cela n'etait pas possible jusqu'a cette date, d'ou cette    */
                                        /* modification. Enfin, cette valeur n'a de sens que si 'PRESENT(valeur_recherchee)'.        */
DEFV(Common,DEFV(Logical,ZINT(valeur_trouvee_mais_avec_des_caracteres_parasites_en_queue,LUNDEF)));
                                        /* Cet indicateur est positionne dans les fonctions 'Fconversion?' apres qu'une valeur       */
                                        /* ait bien ete retrouvee, mais avec des caracteres parasites en queue...                    */

#define   LONGUEUR_MAXIMALE_VALEUR_INTERACTIVE_SOUS_FORME_ALPHANUMERIQUE                                                                \
                    DOUB(NOMBRE_MAXIMAL_CARACTERES_PARASITES_TRAINANT_DERRIERE_VALEUR_PARAMETRE)                                        \
                                        /* Longueur maximale d'une valeur entree interactivement vue comme une chaine de caracteres. */ \
                                        /*                                                                                           */ \
                                        /* Le 20051111190211, cette longueur est passee de 'CENT' a 'MILLE' afin de rendre tres tres */ \
                                        /* improbable le debordement de la chaine 'valeur_interactive'...                            */
#define   NOMBRE_MAXIMAL_CARACTERES_PARASITES_TRAINANT_DERRIERE_VALEUR_PARAMETRE                                                        \
                    MILLE                                                                                                               \
                                        /* Nombre maximal de caracteres en trop trainant derriere la valeur d'un parametre (cela     */ \
                                        /* a ete introduit le 20051114124617...). La valeur 'MILLE' est destinee a rendre tres tres  */ \
                                        /* improbable le debordement de 'caracteres_parasites_derriere_la_valeur_d_un_parametre'...  */

DEFV(Common,DEFV(CHAR,ZINS(DTb0(introduction_d_une_valeur_interactive)
                          ,Ichaine01(INTRODUCTION_D_UNE_VALEUR_INTERACTIVE)
                           )
                 )
     );
                                        /* Chaine reduite a un caractere permettant de dire qu'une valeur (quel que soit son type)   */
                                        /* doit etre entree interactivement. On notera que la valeur 'K_INTERROGATION' choisie a     */
                                        /* cette date implique de faire :                                                            */
                                        /*                                                                                           */
                                        /*                  set       noglob                                                         */
                                        /*                                                                                           */
                                        /* au prealable...                                                                           */

DEFV(Common,DEFV(Logical,ZINT(tenter_une_entree_interactive_des_parametres,FAUX)));
                                        /* Pour autoriser si besoin est l'entree interactive des parametres. Cela fut introduit le   */
                                        /* 20051111140741 pour permettre de ne faire apparaitre dans les histories certaines valeurs */
                                        /* de parametres considerees comme secretes, par exemple dans les operations de cryptage...  */
                                        /*                                                                                           */
                                        /* ATTENTION : je note le 20051117100842 que cette possibilite n'a pas de sens dans le cas   */
                                        /* ou 'STANDARD_IN' du programme courant est en fait un "pipe". Ceci a conduit a la          */
                                        /* modification 'v $xig/fonct$vv$DEF 20051117101713'...                                      */

DEFV(Common,DEFV(CHAR,INIT(POINTERc(sequence_d_echappement_VT100_alternance_des_parametres)
                          ,SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________BLEU
                           )
                 )
     );
                                        /* Le 20180328140252, je note que c'est bien 'INIT(...)' et non pas 'ZINT(...)' et ce        */
                                        /* a cause de 'v $xil/defi_c1$vv$DEF 20071109091647'. En effet, 'ZINT(...)' (ou 'ZINS(...)') */
                                        /* genererait :                                                                              */
                                        /*                                                                                           */
                                        /*        unsigned char*(sequence_...)= "44",ValeurParDefautDe_____*(sequence_...)= "44";    */
                                        /*                                                                                           */
                                        /*                                                                /|\                        */
                                        /*                                                                 |                         */
                                        /*                                                                  -------                  */
                                        /*                                                                         |                 */
                                        /*                                                                                           */
                                        /*        (error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token)         */
                                        /*                                                                                           */
DEFV(Common,DEFV(Logical,ZINT(alterner_les_parametres_pour_plus_de_lisibilite,FAUX)));
                                        /* Pour autoriser si besoin est l'inversion d'un parametre sur deux afin d'en ameliorer la   */
                                        /* lisibilite lors de leur edition (introduit le 20060610102859...). Le 20060610114057 a     */
                                        /* ete introduit la possibilite de changer le type d'inversion (par exemple en la remplacant */
                                        /* par de la couleur...                                                                      */
                                        /*                                                                                           */
                                        /* La valeur par defaut doit etre 'FAUX' afin que si des fichiers sont generes pour donner   */
                                        /* la liste des parametres d'une commande, ceux-ci ne contiennent pas les sequences          */
                                        /* d'alternance qui en fait ne sont pas entierement alphanumerique (a cause du 'K_ESC'       */
                                        /* contenu dans 'v $xig/fonct$vv$DEF SEQUENCE_D_ECHAPPEMENT_VT100_DEBUT_1').                 */
                                        /*                                                                                           */
                                        /* ATTENTION, on notera que 'sequence_d_echappement_VT100_alternance_des_parametres' ne peut */
                                        /* etre initialisee par 'SEQUENCE_D_ECHAPPEMENT_VT100_INVERSION' par 'INIC(...)' ici puisque */
                                        /* en general 'INIC(...)' reference une fonction qui ne peut s'executer au niveau du         */
                                        /* 'Common'. Cette initialisation est donc faite dans 'v $xig/fonct$vv$DEF 20060610115523',  */
                                        /* mais il est apparu le 20060610145653 que cela est en fait inutile. Si cette impossibilite */
                                        /* reapparaissait, il conviendrait de remplacer 'SEQUENCE_D_ECHAPPEMENT_VT100_INVERSION'     */
                                        /* ci-dessus par 'CHAINE_UNDEF', soit :                                                      */
                                        /*                                                                                           */
                                        /*   DEFV(Common,DEFV(CHAR                                                                   */
                                        /*                   ,INIT(POINTERc(sequence_d_echappement_VT100_alternance_des_parametres)  */
                                        /*                        ,CHAINE_UNDEF                                                      */
                                        /*                         )                                                                 */
                                        /*                    )                                                                      */
                                        /*        );                                                                                 */
                                        /*                                                                                           */
                                        /* et evidemment de retablir dans 'v $xig/fonct$vv$DEF 20060610150539' le 'EGAL(...)' qui    */
                                        /* a ete supprime a cette date...                                                            */
                                        /*                                                                                           */
                                        /* Avant le 20060612134516, 'SEQUENCE_D_ECHAPPEMENT_VT100_INVERSION' etait la valeur par     */
                                        /* defaut ; l'inversion video sur fond blanc ainsi generee etait un peu aggressive, d'ou     */
                                        /* cette nouvelle facon de faire sur fond jaune...                                           */
                                        /*                                                                                           */
                                        /* Avant le 20060619103314, on trouvait dans l'ordre les codes suivants :                    */
                                        /*                                                                                           */
                                        /*                  SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________JAUNE                   */
                                        /*                  ## C_POINT_VIRGULE ##                                                    */
                                        /*                  SEQUENCE_D_ECHAPPEMENT_VT100_INVERSION                                   */
                                        /*                                                                                           */
                                        /* Le 20060619103314, il a ete decide de remplacer les caracteres noir sur fond jaune par    */
                                        /* des caracteres blancs sur fond bleu. Cela possede deux avantages : d'une part  ce n'est   */
                                        /* pas agressif et d'autre art toutes les lignes ont une apparence tres voisine ce qui fait  */
                                        /* que l'on n'a pas tendance a n'en lire qu'une sur deux...                                  */
                                        /*                                                                                           */
                                        /* Avant le 20060619105004, on trouvait dans l'ordre les codes suivants :                    */
                                        /*                                                                                           */
                                        /*                  SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________BLANC                   */
                                        /*                  ## C_POINT_VIRGULE ##                                                    */
                                        /*                  SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________BLEU                          */
                                        /*                                                                                           */
                                        /* mais forcer la couleur des caracteres est tres ennuyeux dans le cas ou la couleur des     */
                                        /* caracteres n'est pas blanche en standard (c'est le cas des fenetres ouvertes a distance   */
                                        /* sur une autre MACHINE : 'v $xEa/cHost$vv$Y Orange'), d'ou cette nouvelle solution qui     */
                                        /* consiste a ne toucher qu'au fond...                                                       */
                                        /*                                                                                           */
                                        /* On notera le 20070227164657 que 'SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________BLEU' n'est   */
                                        /* pas approprie pour les fenetres a fond blanc. C'est aussi cette valeur initiale (qui      */
                                        /* est donc differente de 'v $Falias_use 20070227103733' qui fait que l'alias 'use', utilise */
                                        /* d'abord 'SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________BLEU' dans une fenetre a fond blanc,  */
                                        /* puis bascule sur 'SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________VERT' des que le parametre   */
                                        /* 'TypeAlternanceParametres=' est interprete et alors l'alternance passe du bleu au vert... */
                                        /*                                                                                           */
                                        /* On notera le 20070228082142 que 'sequence_d_echappement_VT100_alternance_des_parametres'  */
                                        /* pourrait etre initialise avec 'C_VIDE' ce qui aurait l'avantage de resoudre le probleme   */
                                        /* des fenetres a fond blanc. Mais l'inconvenient de cette solution est que lors de          */
                                        /* l'usage de l'alias 'use', tant que le parametre "TypeAlternanceParametres=" n'est pas     */
                                        /* interprete, il n'y aurait pas d'alternance. Ainsi en initialisant ainsi, des le debut     */
                                        /* de l'edition des parametres par 'use', il y a alternance. On notera que dans le cas des   */
                                        /* fenetres a fond blanc, l'alternance commence avec un fond bleu (a cause de cette          */
                                        /* initialisation ci-dessus), puis bascule sur le fond vert ('v $Falias_use 42') des que     */
                                        /* le parametre "TypeAlternanceParametres=" est interprete...                                */

#define   INTRODUCTION_DE_Type                                                                                                          \
                    C_BLANC                                                                                                             \
                                        /* Introduit le 20070403093918...                                                            */

#define   TITRE_ATTENDU_D_UNE_VALEUR(mes)                                                                                               \
                    COND(IFET(IL_FAUT(editer_les_synonymes_des_parametres_d_une_commande)                                               \
                             ,IL_FAUT(grouper_les_synonymes_des_parametres_d_une_commande)                                              \
                              )                                                                                                         \
                        ,liste_des_____titre_attendu_____synonymes                                                                      \
                        ,mes                                                                                                            \
                         )                                                                                                              \
                                        /* Introduit le 20070330091133...                                                            */

#define   CHAIN_aCOPIE_AVEC_CONVERSIONS_POSSIBLES_MAJUSCULES_MINUSCULES(chaineA,maj_min,min_maj,carret)                                 \
                    CHAINE_UNDEF                                                                                                        \
                                        /* Introduit le 20150203125900 pour remplacer la fonction                                    */ \
                                        /* 'chain_Acopie_avec_conversions_possibles_majuscules_minuscules(...)' dans le cas          */ \
                                        /* ou l'argument 'chaineA' n'a pas le bon type...                                            */

DEFV(Common,DEFV(Positive,INIT(RECHERCHE_D_UNE_VALEUR_____compteur_des_kMalo,ZERO)));
                                        /* Introduit le 20180317073614 pour evaluer le nombre de 'kMalo(...)'s realises par          */
                                        /* 'chain_Aconcaten2(...)' et ainsi disposer d'un majorant du nombre de 'CALZ_FreCC(...)'s   */
                                        /* qui manquent...                                                                           */

#define   RECHERCHE_D_UNE_VALEUR(chaine_recherche,Titre,mes,format_valeur,format_valeur_EDITION,Valeur,editer_valeur,Type,nom,A_R,chAc) \
                                        /* ATTENTION, a ce niveau 'Valeur' represente une valeur dans le cas de 'FORMAT_CHAI', et    */ \
                                        /* 'ADRESSE(Valeur)' dans les autres cas. L'argument 'nom' a ete ajoute le 20011230080029.   */ \
                                        /*                                                                                           */ \
                                        /* Le parametre 'mes' (pour 'MESsage') a ete introduit le 20021204100150 afin de faciliter   */ \
                                        /* l'edition de 'titre_attendu' dans le cas de 'FconversionI(...)' avec une entree au        */ \
                                        /* format hexa-decimal (via 'titre_attendu_etendu')...                                       */ \
                                        /*                                                                                           */ \
                                        /* Le 20051111123040, le parametre 'valeur' est devenu 'Valeur' afin d'eviter des problemes  */ \
                                        /* de substitution dans des 'PRINT_ERREUR(...)' par exemple...                               */ \
                                        /*                                                                                           */ \
                                        /* Le 20051114121047, le parametre 'type' est devenu 'Type' afin d'eviter des problemes      */ \
                                        /* de substitution dans des 'Prme2(...)' ci-apres par exemple...                             */ \
                                        /*                                                                                           */ \
                                        /* Le 20060310093722, le parametre 'titre_attendu' est devenu 'titre_att' afin de raccourcir */ \
                                        /* la definition precedente. Le 20150203150634, il est devenu 'Titre' pour la meme raison.   */ \
                                        /*                                                                                           */ \
                                        /* Le 20150203125900, le parametre 'chAc' a ete introduit afin d'eviter des problemes de     */ \
                                        /* compilation avec 'chain_Acopie_avec_conversions_possibles_majuscules_minuscules(...)'     */ \
                                        /* lorsque son premier argument n'a pas le bon type...                                       */ \
                    Bblock                                                                                                              \
                    DEFV(CHAR,INIT(POINTERc(format_de_recherche_et_d_edition),CHAINE_UNDEF));                                           \
                                        /* Afin de ne concatener qu'une seule fois "titre_att" avec "format_valeur" et               */ \
                                        /* "format_valeur_EDITION", puis de rendre la memoire allouee...                             */ \
                    DEFV(Int,INIT(nombre_d_occurences,UNDEF));                                                                          \
                                        /* Permet de faire la recherche de la valeur par 'SScan', puis de savoir                     */ \
                                        /* comment celle-ci s'est deroulee...                                                        */ \
                    DEFV(CHAR,INIT(POINTERc(chaine_recherche_effective),CHAINE_UNDEF));                                                 \
                                        /* Pour gerer l'entree interactive des valeurs (introduite le 20051111123040).               */ \
                                                                                                                                        \
                    Test(IL_FAUT(tenter_une_entree_interactive_des_parametres))                                                         \
                                        /* Test introduit le 20051111140741...                                                       */ \
                         Bblock                                                                                                         \
                         DEFV(CHAR,INIT(POINTERc(titre_attendu_interactif)                                                              \
                                       ,chain_Aconcaten2(Titre,introduction_d_une_valeur_interactive)                                   \
                                        )                                                                                               \
                              );                                                                                                        \
                                        /* Pour gerer l'entree interactive des valeurs (introduite le 20051111123040).               */ \
                                                                                                                                        \
                         Test(IFEQ_chaine(chaine_recherche,titre_attendu_interactif))                                                   \
                              Bblock                                                                                                    \
                              DEFV(Int,INIT(nombres_d_elements,UNDEF));                                                                 \
                                        /* Introduit le 20100522104738 afin d'eviter le message :                                    */ \
                                        /*                                                                                           */ \
                                        /*                  warning: ignoring return value of 'scanf',                               */ \
                                        /*                  declared with attribute warn_unused_result                               */ \
                                        /*                                                                                           */ \
                                        /* lors du 'Scan(...)' suivant sur 'abbesses.polytechnique.fr'...                            */ \
                              DEFV(CHAR,INIT(POINTERc(valeur_interactive),CHAINE_UNDEF));                                               \
                              ckMalo(valeur_interactive                                                                                 \
                                    ,ADD2(LONGUEUR_MAXIMALE_VALEUR_INTERACTIVE_SOUS_FORME_ALPHANUMERIQUE                                \
                                         ,SIZC(C_VIDE)                                                                                  \
                                          )                                                                                             \
                                    ,RECHERCHE_D_UNE_VALEUR_____compteur_des_kMalo                                                      \
                                     );                                                                                                 \
                                        /* Valeur entree interactivement vue comme une chaine de caracteres...                       */ \
                                                                                                                                        \
                              CAL3(Prme2("Entree interactive du Parametre '%s' (de type '%s') : ",mes,Type));                           \
                                                                                                                                        \
                              begin_nouveau_block                                                                                       \
                                   Bblock                                                                                               \
                                   DEFV(CHAR,INIC(POINTERc(format_EGAq_1__RECHERCHE_D_UNE_VALEUR)                                       \
                                                 ,chain_Aentier(LONGUEUR_MAXIMALE_VALEUR_INTERACTIVE_SOUS_FORME_ALPHANUMERIQUE)         \
                                                  )                                                                                     \
                                        );                                                                                              \
                                   DEFV(CHAR,INIC(POINTERc(format_EGAq_2__RECHERCHE_D_UNE_VALEUR),CHAINE_UNDEF));                       \
                                   EGAp(format_EGAq_2__RECHERCHE_D_UNE_VALEUR                                                           \
                                       ,chain_Aconcaten3(FORMAT_CHAI_1,format_EGAq_1__RECHERCHE_D_UNE_VALEUR,"s")                       \
                                        );                                                                                              \
                                                                                                                                        \
                                   EGAL(nombres_d_elements,Scan(format_EGAq_2__RECHERCHE_D_UNE_VALEUR,valeur_interactive));             \
                                                                                                                                        \
                                   CALZ_FreCC(format_EGAq_2__RECHERCHE_D_UNE_VALEUR);                                                   \
                                   CALZ_FreCC(format_EGAq_1__RECHERCHE_D_UNE_VALEUR);                                                   \
                                   Eblock                                                                                               \
                              end_nouveau_block                                                                                         \
                                                                                                                                        \
                              CALS(Fsauts_de_lignes(UN));                                                                               \
                                        /* Entree interactive de la valeur vue comme une chaine de caracteres, en n'entrant que ce   */ \
                                        /* qui est possible (cette limitation a ete introduite le 20051117174126, rendant ainsi      */ \
                                        /* theoriquement mpossible de passer par le 'Exit(...)' qui suit...                          */ \
                                                                                                                                        \
                              Test(IFLE(chain_Xtaille(valeur_interactive)                                                               \
                                       ,LONGUEUR_MAXIMALE_VALEUR_INTERACTIVE_SOUS_FORME_ALPHANUMERIQUE                                  \
                                        )                                                                                               \
                                   )                                                                                                    \
                                   Bblock                                                                                               \
                                   Test(IFEQ(chain_Xtaille(valeur_interactive)                                                          \
                                            ,LONGUEUR_MAXIMALE_VALEUR_INTERACTIVE_SOUS_FORME_ALPHANUMERIQUE                             \
                                             )                                                                                          \
                                        )                                                                                               \
                                        Bblock                                                                                          \
                                        DEFV(Logical,INIT(lire_le_caractere_courant,VRAI));                                             \
                                        DEFV(Logical,INIT(c_est_la_premiere_iteration_de_lecture_du_caractere_courant,VRAI));           \
                                        DEFV(Char,INIT(caractere_courant,K_UNDEF));                                                     \
                                        /* Tout ceci afin de "purger" l'entree sur 'STANDARD_IN' si besoin est.                      */ \
                                                                                                                                        \
                                        Tant(IL_FAUT(lire_le_caractere_courant))                                                        \
                                        /* Cette boucle est destinee a "purger" l'entree sur 'STANDARD_IN' au cas ou plus de         */ \
                                        /* 'LONGUEUR_MAXIMALE_VALEUR_INTERACTIVE_SOUS_FORME_ALPHANUMERIQUE' caracteres auraient      */ \
                                        /* ete frappes...                                                                            */ \
                                        /*                                                                                           */ \
                                        /* On notera au passage que cela ne peut etre fait simplement via un :                       */ \
                                        /*                                                                                           */ \
                                        /*                  CALS(Fflush(STREAM_IN));                                                 */ \
                                        /*                                                                                           */ \
                                        /* car, en effet, cette solution est reservee aux "streams"s qui sont en ecriture (par       */ \
                                        /* exemple 'STREAM_OUT') et non pas a ceux qui sont en lecture ('STREAM_IN')...              */ \
                                        /*                                                                                           */ \
                                        /* On notera de plus que l'on ne peut faire comme d'habitude :                               */ \
                                        /*                                                                                           */ \
                                        /*                  Tant(GetcharT(caractere_courant))                                        */ \
                                        /*                       Bblock                                                              */ \
                                        /*                       (...)                                                               */ \
                                        /*                       Eblock                                                              */ \
                                        /*                  ETan                                                                     */ \
                                        /*                                                                                           */ \
                                        /* car ici la fin du flot en entree est marquee par un 'K_LF' que ne detecte pas le          */ \
                                        /* 'GetcharT(...)', d'ou la structure plus compliquee qui suit et qui a ete mise en          */ \
                                        /* place aux environs du 20051118085010...                                                   */ \
                                             Bblock                                                                                     \
                                             Test(GetcharT(caractere_courant))                                                          \
                                                  Bblock                                                                                \
                                                  Test(IFEQ(caractere_courant,K_LF))                                                    \
                                                       Bblock                                                                           \
                                                       EGAL(lire_le_caractere_courant,FAUX);                                            \
                                        /* La rencontre de 'K_LF' la fin de la "purge" de 'STANDARD_IN'...                           */ \
                                                       Eblock                                                                           \
                                                  ATes                                                                                  \
                                                       Bblock                                                                           \
                                                       Test(EST_VRAI(c_est_la_premiere_iteration_de_lecture_du_caractere_courant))      \
                                                            Bblock                                                                      \
                                                            PRINT_ERREUR("les caracteres en trop sont ignores");                        \
                                                            CALS(FPrme0("Il s'agit de :\n"));                                           \
                                                                                                                                        \
                                                            EGAL(c_est_la_premiere_iteration_de_lecture_du_caractere_courant,FAUX);     \
                                                            Eblock                                                                      \
                                                       ATes                                                                             \
                                                            Bblock                                                                      \
                                                            Eblock                                                                      \
                                                       ETes                                                                             \
                                                                                                                                        \
                                                       CAL3(Prme1("%c",caractere_courant));                                             \
                                                       Eblock                                                                           \
                                                  ETes                                                                                  \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                                  EGAL(lire_le_caractere_courant,FAUX);                                                 \
                                        /* La fin de fichier ('PROBLEMES') signifie aussi la fin de la "purge" de 'STANDARD_IN'...   */ \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                             Eblock                                                                                     \
                                        ETan                                                                                            \
                                                                                                                                        \
                                        Test(EST_FAUX(c_est_la_premiere_iteration_de_lecture_du_caractere_courant))                     \
                                             Bblock                                                                                     \
                                             CALS(Fsauts_de_lignes(UN));                                                                \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   EGAp(chaine_recherche_effective,chain_Aconcaten2(Titre,valeur_interactive));                         \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   BASIQUE____Prer0("Dans 'Fconversion?' : valeur interactive trop longue, abort immediat.\n\n");       \
                                        /* Au lieu d'utiliser 'PRINT_ERREUR(...)'c'est 'BASIQUE____Prer0(...)' qui est utilisee      */ \
                                        /* et ce afin de sortir le plus vite possible en limitant au maximum la propagation de       */ \
                                        /* l'anomalie... Le 20051111185017, j'ai essaye, via un 'BASIQUE____Prer2(...)', d'editer    */ \
                                        /* les valeurs de 'LONGUEUR_MAXIMALE_VALEUR_INTERACTIVE_SOUS_FORME_ALPHANUMERIQUE'           */ \
                                        /* et de 'chain_taille(valeur_interactive)', mais cela a provoque :                          */ \
                                        /*                                                                                           */ \
                                        /*                  Segmentation fault                                                       */ \
                                        /*                                                                                           */ \
                                        /* avant de faire le 'Exit(...)'.                                                            */ \
                                                                                                                                        \
                                   Abort(ERREUR29);                                                                                     \
                                        /* Que faire d'autre que cette sortie brutale afin que cette grosse anomalie ne se           */ \
                                        /* propage pas sous forme de violations memoire ou de perturbations incomprehensibles ?      */ \
                                        /* On notera au passage, qu'avant d'arriver ici, un :                                        */ \
                                        /*                                                                                           */ \
                                        /*                  Segmentation fault                                                       */ \
                                        /*                                                                                           */ \
                                        /* n'est pas exclu...                                                                        */ \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                                                                                                                                        \
                              CALZ_FreCC(valeur_interactive);                                                                           \
                                        /* Liberation de l'espace contenant la valeur interactive sous forme de chaine de            */ \
                                        /* caracteres...                                                                             */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAp(chaine_recherche_effective,chain_Acopie(chaine_recherche));                                          \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         CALZ_FreCC(titre_attendu_interactif);                                                                          \
                                        /* Liberation de l'espace contenant le titre attendu en mode interactif...                   */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         EGAp(chaine_recherche_effective,chain_Acopie(chaine_recherche));                                               \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IFNE_chaine(format_valeur,FORMAT_CHAI))                                                                        \
                         Bblock                                                                                                         \
                         DEFV(CHAR,INIC(POINTERc(format_EGAq____RECHERCHE_D_UNE_VALEUR)                                                 \
                                       ,chain_Aentier(NOMBRE_MAXIMAL_CARACTERES_PARASITES_TRAINANT_DERRIERE_VALEUR_PARAMETRE)           \
                                        )                                                                                               \
                              );                                                                                                        \
                                                                                                                                        \
                         EGAp(format_de_recherche_et_d_edition                                                                          \
                             ,chain_Aconcaten5(Titre                                                                                    \
                                              ,format_valeur                                                                            \
                                              ,FORMAT_CHAI_1                                                                            \
                                              ,format_EGAq____RECHERCHE_D_UNE_VALEUR                                                    \
                                              ,"s"                                                                                      \
                                               )                                                                                        \
                              );                                                                                                        \
                                        /* Generation du format de la recherche et de l'eventuelle edition. Le 20051114124617        */ \
                                        /* fut introduit en queue 'FORMAT_CHAI' destine a detecter d'eventuels caracteres            */ \
                                        /* parasites derriere la valeur du parametre courant. Le 20051117174126 a ete introduit      */ \
                                        /* une limitation du nombre de caracteres parasites detectables, rendant ainsi theoriquement */ \
                                        /* impossible de passer par le 'Exit(...)' qui suit...                                       */ \
                                                                                                                                        \
                         CALZ_FreCC(format_EGAq____RECHERCHE_D_UNE_VALEUR);                                                             \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         EGAp(format_de_recherche_et_d_edition                                                                          \
                             ,chain_Aconcaten2(Titre                                                                                    \
                                              ,format_valeur                                                                            \
                                               )                                                                                        \
                              );                                                                                                        \
                                        /* Generation du format de la recherche et de l'eventuelle edition. On notera que pour       */ \
                                        /* le 'FORMAT_CHAI', cela n'a pas de sens de tester d'eventuels caracteres parasites         */ \
                                        /* derriere la valeur du parametre courant...                                                */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(valeur_recherchee,NEXIST);                                                                                     \
                                        /* A priori, on fait comme si la valeur recherchee n'existait pas...                         */ \
                    EGAL(valeur_trouvee_et_vide,FAUX);                                                                                  \
                                        /* A priori, on fait comme si la valeur recherchee existait et etait non vide, mais en       */ \
                                        /* fait cet indicateur n'a de sens que si 'PRESENT(valeur_recherchee)'...                    */ \
                    EGAL(valeur_trouvee_mais_avec_des_caracteres_parasites_en_queue,FAUX);                                              \
                                        /* A priori, on fait comme si la valeur recherchee existait et n'avait pas de caracteres     */ \
                                        /* parasites en queue, mais en fait cet indicateur n'a de sens que si                        */ \
                                        /* 'PAS_PRESENT(valeur_recherchee)'...                                                       */ \
                                                                                                                                        \
                    Test(IFNE_chaine(chaine_recherche_effective,Titre))                                                                 \
                         Bblock                                                                                                         \
                         DEFV(CHAR,INIT(POINTERc(caracteres_parasites_derriere_la_valeur_d_un_parametre),CHAINE_UNDEF));                \
                         ckMalo(caracteres_parasites_derriere_la_valeur_d_un_parametre                                                  \
                               ,ADD2(NOMBRE_MAXIMAL_CARACTERES_PARASITES_TRAINANT_DERRIERE_VALEUR_PARAMETRE                             \
                                    ,SIZC(C_VIDE)                                                                                       \
                                     )                                                                                                  \
                               ,RECHERCHE_D_UNE_VALEUR_____compteur_des_kMalo                                                           \
                                );                                                                                                      \
                                        /* Afin de detecter les eventuels caracteres parasites derriere le parametre courant...      */ \
                                        /* On notera que meme dans le cas de 'FORMAT_CHAI' l'allocation a lieu, meme si dans ce      */ \
                                        /* cas, elle ne sert a rien...                                                               */ \
                                                                                                                                        \
                         Test(IFNE_chaine(format_valeur,FORMAT_CHAI))                                                                   \
                              Bblock                                                                                                    \
                              EGAL(nombre_d_occurences                                                                                  \
                                  ,SSca2(chaine_recherche_effective                                                                     \
                                        ,format_de_recherche_et_d_edition                                                               \
                                        ,Valeur                                                                                         \
                                        ,caracteres_parasites_derriere_la_valeur_d_un_parametre                                         \
                                         )                                                                                              \
                                   );                                                                                                   \
                                        /* Lorsque la chaine dans laquelle on doit faire la recherche et le titre attendu            */ \
                                        /* sont differents, on peut utiliser 'SScan', car alors la chaine qui suit le titre          */ \
                                        /* (lorsqu'on l'a trouve) n'est pas vide. Dans les cas autres que 'FORMAT_CHAI', on          */ \
                                        /* teste l'existence d'eventuels caracteres parasites derriere la valeur du parametre        */ \
                                        /* courant...                                                                                */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(nombre_d_occurences                                                                                  \
                                  ,SSca1(chaine_recherche_effective                                                                     \
                                        ,format_de_recherche_et_d_edition                                                               \
                                        ,Valeur                                                                                         \
                                         )                                                                                              \
                                   );                                                                                                   \
                                        /* Lorsque la chaine dans laquelle on doit faire la recherche et le titre attendu            */ \
                                        /* sont differents, on peut utiliser 'SScan', car alors la chaine qui suit le titre          */ \
                                        /* (lorsqu'on l'a trouve) n'est pas vide...                                                  */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         Test(PAS_DE_PROBLEMES(nombre_d_occurences))                                                                    \
                              Bblock                                                                                                    \
                              Test(IFGT(nombre_d_occurences,W))                                                                         \
                                        /* Ce test a ete introduit le 20051114124617 et permet donc de savoir si des caracteres      */ \
                                        /* "parasites" ne traineraient pas derriere la "bonne" valeur d'un parametre...              */ \
                                   Bblock                                                                                               \
                                   Test(IFLE(chain_Xtaille(caracteres_parasites_derriere_la_valeur_d_un_parametre)                      \
                                            ,NOMBRE_MAXIMAL_CARACTERES_PARASITES_TRAINANT_DERRIERE_VALEUR_PARAMETRE                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                        Bblock                                                                                          \
                                        PRINT_ERREUR("il y a des caracteres parasites derriere une valeur");                            \
                                        CAL1(Prer2("il s'agit du Parametre introduit par '%s' et des caracteres '%s[...]'.\n"           \
                                                  ,mes                                                                                  \
                                                  ,caracteres_parasites_derriere_la_valeur_d_un_parametre                               \
                                                   )                                                                                    \
                                             );                                                                                         \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        BASIQUE____Prer0("Dans 'Fconversion?' : trop caracteres parasites, abort immediat.\n\n");       \
                                        /* Au lieu d'utiliser 'PRINT_ERREUR(...)'c'est 'BASIQUE____Prer0(...)' qui est utilisee      */ \
                                        /* et ce afin de sortir le plus vite possible en limitant au maximum la propagation de       */ \
                                        /* l'anomalie...                                                                             */ \
                                                                                                                                        \
                                        Abort(ERREUR30);                                                                                \
                                        /* Que faire d'autre que cette sortie brutale afin que cette grosse anomalie ne se           */ \
                                        /* propage pas sous forme de violations memoire ou de perturbations incomprehensibles ?      */ \
                                        /* On notera au passage, qu'avant d'arriver ici, un :                                        */ \
                                        /*                                                                                           */ \
                                        /*                  Segmentation fault                                                       */ \
                                        /*                                                                                           */ \
                                        /* n'est pas exclu...                                                                        */ \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                                                                                                                        \
                                   EGAL(valeur_trouvee_mais_avec_des_caracteres_parasites_en_queue,VRAI);                               \
                                        /* On notera qu'alors l'indicateur 'valeur_recherchee' reste a la valeur 'NEXIST'...         */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         CALZ_FreCC(caracteres_parasites_derriere_la_valeur_d_un_parametre);                                            \
                                        /* Liberation de l'espace contenant les eventuels caracteres en trop. Cette liberation       */ \
                                        /* doit se faire meme dans le cas de 'FORMAT_CHAI' puisque l'allocation a eu lieu, meme      */ \
                                        /* si dans ce cas, elle ne servait a rien...                                                 */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         EGAL(nombre_d_occurences,W);                                                                                   \
                                        /* Lorsque la chaine dans laquelle on doit faire la recherche et le titre attendu            */ \
                                        /* sont identiques, la chaine qui suit le titre est vide, ce que 'SScan' n'accepte           */ \
                                        /* pas ; on traite ce cas a part, et la valeur cherchee est (et reste) donc la valeur        */ \
                                        /* par defaut pour le moment. Jusqu'au 19970507101129, ceci etait definitif. A partir        */ \
                                        /* de cette date, il apparait preferable de pouvoir entrer des valeurs vides. Malheureusment */ \
                                        /* ceci ne peut se faire ici car en effet le type de 'Valeur' est a priori quelconque, et il */ \
                                        /* est donc impossible d'utiliser simplement la fonction 'EGAL(Valeur,...)'. Ceci doit donc  */ \
                                        /* etre place eventuellement apres l'appel de 'RECHERCHE_D_UNE_VALEUR(...)'.                 */ \
                         EGAL(valeur_trouvee_et_vide,VRAI);                                                                             \
                                        /* Memorisation d'une valeur trouvee mais vide...                                            */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    CALZ_FreCC(chaine_recherche_effective);                                                                             \
                                        /* Liberation de l'espace contenant la chaine recherchee effective...                        */ \
                                                                                                                                        \
                    Test(PAS_DE_PROBLEMES(nombre_d_occurences))                                                                         \
                         Bblock                                                                                                         \
                         Test(IFEQ(nombre_d_occurences,W))                                                                              \
                              Bblock                                                                                                    \
                              EGAL(valeur_recherchee,EXIST);                                                                            \
                                        /* Dans le cas d'une occurence unique, la valeur recherchee existe...                        */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IFGT(nombre_d_occurences,ADD2(W,W)))                                                                 \
                                   Bblock                                                                                               \
                                   PRINT_ERREUR("le nombre d'occurences ne vaut ni 0, ni 1, ni 2");                                     \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(cumul_logique_de_valeur_recherchee,OUIN(cumul_logique_de_valeur_recherchee,valeur_recherchee));                \
                                        /* Afin de savoir si au moins un argument a ete rencontre (introduit le 20050603145824)...   */ \
                                                                                                                                        \
                    CALZ_FreCC(format_de_recherche_et_d_edition);                                                                       \
                                        /* Liberation de l'espace contenant le format de recherche...                                */ \
                                                                                                                                        \
                    Test(IL_FAUT(editer_valeur))                                                                                        \
                         Bblock                                                                                                         \
                         DEFV(CHAR,INIT(POINTERc(INTRODUCTION_DE_Type__Type__A_R),chain_Aconcaten3(INTRODUCTION_DE_Type,Type,A_R)));    \
                                        /* Afin de permettre un 'CALZ_FreCC(...)' ensuite (introduit le 20180313102545)...           */ \
                                                                                                                                        \
                         ALTERNANCE_DES_PARAMETRES_DEBUT;                                                                               \
                                        /* Inversion d'un parametre sur deux (introduit le 20060610102859)...                        */ \
                                                                                                                                        \
                         begin_nouveau_block                                                                                            \
                              Bblock                                                                                                    \
                              DEFV(CHAR,INIT(POINTERc(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_1),CHAINE_UNDEF));        \
                              DEFV(CHAR,INIT(POINTERc(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre),CHAINE_UNDEF));          \
                              DEFV(CHAR,INIT(POINTERc(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_1),CHAINE_UNDEF));                  \
                              DEFV(CHAR,INIT(POINTERc(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_2),CHAINE_UNDEF));                  \
                              DEFV(CHAR,INIT(POINTERc(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES),CHAINE_UNDEF));                    \
                                                                                                                                        \
                              EGAp(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_1                                            \
                                  ,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_1                                                   \
                                   );                                                                                                   \
                              EGAp(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre                                              \
                                  ,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre                                                     \
                                   );                                                                                                   \
                              EGAp(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_1,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_1);           \
                              EGAp(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_2,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_2);           \
                              EGAp(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES);               \
                                                                                                                                        \
                              EGAp(format_de_recherche_et_d_edition                                                                     \
                                  ,chain_Aconcaten5(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES                                       \
                                                   ,FORMAT_D_EDITION_DES_TITRES                                                         \
                                                   ,FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_SCALAIRES                                    \
                                                   ,FORMAT_D_EDITION_DU_NOM_DES_VALEURS                                                 \
                                                   ,format_valeur_EDITION                                                               \
                                                    )                                                                                   \
                                   );                                                                                                   \
                                        /* Generation du format d'edition. Le 20000529170948, "%s : " a ete remplace par "%s :: "    */ \
                                        /* afin de faciliter des traitements automatique de ces editions, car, en effet, la chaine   */ \
                                        /* 'FORMAT_D_EDITION_DES_IDENTITES_UNIQUES' contient "%0*d : " ; ainsi on peut faire la      */ \
                                        /* difference ente ":" et "::".                                                              */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : on notera qu'a ce niveau la valeur courante et effective du parametre         */ \
                                        /* courant ('Valeur') est connue. Cela permet, si besoin est, a 'format_valeur_EDITION'      */ \
                                        /* d'etre conditionnel comme c'est le cas dans 'v $xig/fonct$vv$FON FconversionK'...         */ \
                                                                                                                                        \
                              CALZ_FreCC(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES);                                                \
                              CALZ_FreCC(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_2);                                              \
                              CALZ_FreCC(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_1);                                              \
                              CALZ_FreCC(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre);                                      \
                              CALZ_FreCC(format_FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_1);                                    \
                              Eblock                                                                                                    \
                         end_nouveau_block                                                                                              \
                                                                                                                                        \
                         Test(IFNE_chaine(format_valeur,FORMAT_CHAI))                                                                   \
                              Bblock                                                                                                    \
                              CAL3(Prme9(format_de_recherche_et_d_edition                                                               \
                                        ,NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES                     \
                                        ,NUMERO_UNIQUE_de_l_argument_possible_courant                                                   \
                                        ,NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES                     \
                                        ,nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes                                 \
                                        ,SOUS(tabulation_des_valeurs_affectees_aux_titres,chain_Xtaille(INTRODUCTION_DE_Type))          \
                                        ,TITRE_ATTENDU_D_UNE_VALEUR(mes)                                                                \
                                        ,INTRODUCTION_DE_Type__Type__A_R                                                                \
                                        ,nom                                                                                            \
                                        ,COND(IFNE_chaine(format_valeur_EDITION,FORMAT_CHAR_HEXA_DECIMAL_EDITION)                       \
                                             ,INDIRECT(Valeur)                                                                          \
                                             ,INTE(INDIRECT(Valeur))                                                                    \
                                              )                                                                                         \
                                         )                                                                                              \
                                   );                                                                                                   \
                                        /* Edition de la valeur lorsqu'elle n'est pas du type 'FORMAT_CHAI'...                       */ \
                                        /*                                                                                           */ \
                                        /* La concatenation de 'A_R' a ete introduite le 20060310093722...                           */ \
                                        /*                                                                                           */ \
                                        /* L'introduction du 'SOUS(...)" et de la concatenation de "C_BLANC" devant le 'Type' a eu   */ \
                                        /* lieu le 20070403093918 afin de garantir qu'il y aura toujours un espace devant le         */ \
                                        /* 'Type', garantissant ainsi la lisibilite...                                               */ \
                                        /*                                                                                           */ \
                                        /* L'edition du nombre de parametres a ete introduite le 20081116113445 apres bien des       */ \
                                        /* difficultes grace a 'v $xcc/cpp$Z 20070820203242'...                                      */ \
                                        /*                                                                                           */ \
                                        /* Le 20120329143728, le test de 'FORMAT_CHAR_HEXA_DECIMAL_EDITION' a ete introduit car, en  */ \
                                        /* effet, 'chain_Acopie_avec_gestion_des_formats_des_editions_entieres(...)' modifie les     */ \
                                        /* formats decimaux et hexa-decimaux sur les MACHINEs de type 'SYSTEME_64_BITS' pour prendre */ \
                                        /* en compte les "long int"s. Or dans le cas 'FORMAT_CHAR_HEXA_DECIMAL_EDITION', c'est un    */ \
                                        /* caractere que l'on edite et il faut donc le convertir en 'INTE(...)' pour eviter des      */ \
                                        /* affichages incorrects (sur 16 chiffres hexa-decimaux...) puisqu'il est impossible de      */ \
                                        /* bloquer cette extension ("%d" et "%x" en "%ld" et "%lx" respectivement...).               */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IFET(IFNE_chaine(Type,TYPE_FORMAT_LOGI),IFNE_chaine(Type,TYPE_FORMAT_NOGI)))                         \
                                        /* Test introduit le 20150203125900...                                                       */ \
                                   Bblock                                                                                               \
                                   CAL3(Prme9(format_de_recherche_et_d_edition                                                          \
                                             ,NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES                \
                                             ,NUMERO_UNIQUE_de_l_argument_possible_courant                                              \
                                             ,NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES                \
                                             ,nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes                            \
                                             ,SOUS(tabulation_des_valeurs_affectees_aux_titres,chain_Xtaille(INTRODUCTION_DE_Type))     \
                                             ,TITRE_ATTENDU_D_UNE_VALEUR(mes)                                                           \
                                             ,INTRODUCTION_DE_Type__Type__A_R                                                           \
                                             ,nom                                                                                       \
                                             ,Valeur                                                                                    \
                                              )                                                                                         \
                                        );                                                                                              \
                                        /* Edition de la valeur lorsqu'elle est du type 'FORMAT_CHAI', mais sans etre une valeur     */ \
                                        /* logique...                                                                                */ \
                                        /*                                                                                           */ \
                                        /* La concatenation de 'A_R' a ete introduite le 20060310093722...                           */ \
                                        /*                                                                                           */ \
                                        /* L'introduction du 'SOUS(...)" et de la concatenation de "C_BLANC" devant le 'Type' a eu   */ \
                                        /* lieu le 20070403093918 afin de garantir qu'il y aura toujours un espace devant le         */ \
                                        /* 'Type', garantissant ainsi la lisibilite...                                               */ \
                                        /*                                                                                           */ \
                                        /* L'edition du nombre de parametres a ete introduite le 20081116113445 apres bien des       */ \
                                        /* difficultes grace a 'v $xcc/cpp$Z 20070820203242'...                                      */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   DEFV(CHAR,INIT(POINTERc(Valeur_en_majuscules)                                                        \
                                                 ,chAc(Valeur                                                                           \
                                                      ,NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES                           \
                                                      ,TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES                                  \
                                                      ,END_OF_CHAIN                                                                     \
                                                       )                                                                                \
                                                  )                                                                                     \
                                        );                                                                                              \
                                   CAL3(Prme9(format_de_recherche_et_d_edition                                                          \
                                             ,NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES                \
                                             ,NUMERO_UNIQUE_de_l_argument_possible_courant                                              \
                                             ,NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES                \
                                             ,nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes                            \
                                             ,SOUS(tabulation_des_valeurs_affectees_aux_titres,chain_Xtaille(INTRODUCTION_DE_Type))     \
                                             ,TITRE_ATTENDU_D_UNE_VALEUR(mes)                                                           \
                                             ,INTRODUCTION_DE_Type__Type__A_R                                                           \
                                             ,nom                                                                                       \
                                             ,CON10(IMEQ_chaine(Valeur_en_majuscules,C_VRAI____,C_VRAI_____ABREGE),C_VRAI____           \
                                                   ,IMEQ_chaine(Valeur_en_majuscules,C_EXIST___,C_EXIST____ABREGE),C_EXIST___           \
                                                   ,IMEQ_chaine(Valeur_en_majuscules,C_ACTIF___,C_ACTIF____ABREGE),C_ACTIF___           \
                                                   ,IMEQ_chaine(Valeur_en_majuscules,C_AUTORISE,C_AUTORISE_ABREGE),C_AUTORISE           \
                                                   ,IMEQ_chaine(Valeur_en_majuscules,C_VALIDE__,C_VALIDE___ABREGE),C_VALIDE__           \
                                                   ,IMEQ_chaine(Valeur_en_majuscules,C_FAUX____,C_FAUX_____ABREGE),C_FAUX____           \
                                                   ,IMEQ_chaine(Valeur_en_majuscules,C_NEXIST__,C_NEXIST___ABREGE),C_NEXIST__           \
                                                   ,IMEQ_chaine(Valeur_en_majuscules,C_INACTIF_,C_INACTIF__ABREGE),C_INACTIF_           \
                                                   ,IMEQ_chaine(Valeur_en_majuscules,C_INTERDIT,C_INTERDIT_ABREGE),C_INTERDIT           \
                                                   ,IMEQ_chaine(Valeur_en_majuscules,C_INVALIDE,C_INVALIDE_ABREGE),C_INVALIDE           \
                                                                                                                  ,C_UNDEF              \
                                                    )                                                                                   \
                                              )                                                                                         \
                                        );                                                                                              \
                                        /* Edition de la valeur lorsqu'elle est du type 'FORMAT_CHAI' et etant en fait une valeur    */ \
                                        /* logique. Ceci a ete introduit le 20150203125900 afin de garantir une edition correcte     */ \
                                        /* des parametres logiques, meme s'ils sont les derniers de la liste. Cela signifie que      */ \
                                        /* si un parametre logique 'Param' apparait en dernier lors de l'appel d'un '$X' et que sa   */ \
                                        /* valeur est "compactee" avec par exemple :                                                 */ \
                                        /*                                                                                           */ \
                                        /*                  Param=v                                                                  */ \
                                        /*                                                                                           */ \
                                        /* il apparaitra bien sous la forme :                                                        */ \
                                        /*                                                                                           */ \
                                        /*                  Param=VRAI                                                               */ \
                                        /*                                                                                           */ \
                                        /* meme s'il est le dernier de la liste courante des arguments de ce '$X'. Ceci n'etait      */ \
                                        /* pas le cas avant le 20150203125900 ; avant cette date, on voyait apparaitre :             */ \
                                        /*                                                                                           */ \
                                        /*                  Param=v                                                                  */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* On notera le 20170721101512, qu'ici la chaine correspond en fait a 'VRAI' ou a 'FAUX',    */ \
                                        /* c'est-a-dire a la valeur logique "fondamentale" de la chaine Argument. Ainsi, par         */ \
                                        /* exemple,                                                                                  */ \
                                        /*                                                                                           */ \
                                        /*                  Fc=InTeRdIt                                                              */ \
                                        /*                                                                                           */ \
                                        /* donne ici la chaine 'FAUX' (qui a meme valeur logique que 'INTERDIT'...).                 */ \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         ALTERNANCE_DES_PARAMETRES_FIN;                                                                                 \
                                        /* Inversion d'un parametre sur deux (introduit le 20060610102859). Cette sequence de        */ \
                                        /* reinitialisation est faite systematiquement afin d'eviter d'eventuels problemes...        */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : cela doit avoir lieu avant le "\n" qui suit afin d'eviter, par exemple, des   */ \
                                        /* problemes avec l'alias 'use' lors de la recherche de parametres ('v $Falias_use ArS').    */ \
                                                                                                                                        \
                         CALS(Fsauts_de_lignes(UN));                                                                                    \
                                        /* Et ce afin d'aerer la mise en page...                                                     */ \
                                                                                                                                        \
                         CALZ_FreCC(format_de_recherche_et_d_edition);                                                                  \
                                        /* Liberation de l'espace contenant le format d'edition...                                   */ \
                                                                                                                                        \
                         CALZ_FreCC(INTRODUCTION_DE_Type__Type__A_R);                                                                   \
                                        /* Introduit le 20180313102545...                                                            */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                                        /* ATTENTION : la structure a l'interieur de laquelle on est :                               */ \
                                        /*                                                                                           */ \
                                        /*                  Test(IL_FAUT(editer_valeur))                                             */ \
                                        /*                       Bblock                                                              */ \
                                        /*                       <SEQUENCE 1>                                                        */ \
                                        /*                       Eblock                                                              */ \
                                        /*                  ATes                                                                     */ \
                                        /*                       Bblock                                                              */ \
                                        /*                       Test(IL_NE_FAUT_PAS(editer_valeur))                                 */ \
                                        /*                            Bblock                                                         */ \
                                        /*                            <SEQUENCE 2>                                                   */ \
                                        /*                            Eblock                                                         */ \
                                        /*                       ATes                                                                */ \
                                        /*                            Bblock                                                         */ \
                                        /*                            <SEQUENCE 3>                                                   */ \
                                        /*                            Eblock                                                         */ \
                                        /*                       ETes                                                                */ \
                                        /*                       Eblock                                                              */ \
                                        /*                  ETes                                                                     */ \
                                        /*                                                                                           */ \
                                        /* peut sembler incomprehensible. En fait, il faut voir qu'il s'agit en fait de tester       */ \
                                        /* si l'argument 'editer_valeur' est une valeur logique bien cadree. Si elle l'est, elle     */ \
                                        /* ne peut qu'avoir deux valeurs {FAUX,VRAI}, auquel cas, le chemin suivi est soit           */ \
                                        /* '<SEQUENCE 1>' (pour 'VRAI'), soit '<SEQUENCE 2>' (pour 'FAUX'). Dans le cas contraire,   */ \
                                        /* sa valeur sera en general differente de {FAUX,VRAI} ce qui implique que le chemin suivi   */ \
                                        /* sera alors '<SEQUENCE 3>'...                                                              */ \
                         Test(IL_NE_FAUT_PAS(editer_valeur))                                                                            \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              PRINT_ERREUR("il y a surement un conflit de typage d'un Parametre (1)");                                  \
                                        /* Cela a ete introduit le 20010329144054 a cause de 'SYSTEME_APC_Linux...' et d'une         */ \
                                        /* erreur dans 'v $xrk/rdn_walk.52$K seuil_de_Mgradient_local_tri_dimensionnel_X', cette     */ \
                                        /* variable etant declaree 'Logical' (alors qu'elle aurait du etre 'Float') et recuperee     */ \
                                        /* par un 'GET_ARGUMENT_F(...)'. Cette procedure appelait donc la fonction :                 */ \
                                        /*                                                                                           */ \
                                        /*                  FconversionF(chaineA,titre_attendu,valeur_par_defaut,editer_valeur,nom)  */ \
                                        /*                               ------- ------------- ----------------- -------------       */ \
                                        /*                                  ||         ||               |              |             */ \
                                        /*                     ------------- |         ||               |              |             */ \
                                        /*                    | -------------          ||               |              |             */ \
                                        /*                    ||                       ||               |              |             */ \
                                        /*                    ||    ------------------- |               |              |             */ \
                                        /*                    ||   | -------------------                |              |             */ \
                                        /*                    ||   ||                                   |              |             */ \
                                        /*                    ||   ||            -----------------------               |             */ \
                                        /*                    ||   ||           |                                      |             */ \
                                        /*                    ||   ||           |               -----------------------              */ \
                                        /*                    ||   ||           |              |                                     */ \
                                        /*                                      |              |                                     */ \
                                        /* dont les 4 arguments sont de type :  |              |                                     */ \
                                        /*                                      |              |                                     */ \
                                        /*                    ||   ||           |              |                                     */ \
                                        /*                    ||   ||           |              |                                     */ \
                                        /*                   ---- ----        -----         -------                                  */ \
                                        /*                  |CHAR|CHAR|      |Float|       |Logical|...                              */ \
                                        /*                   ---- ----        -----         -------                                  */ \
                                        /*                    ||   ||           |              |                                     */ \
                                        /*                    ||   ||       ----      ---------                                      */ \
                                        /*                    ||   ||      |         |                                               */ \
                                        /*                                                                                           */ \
                                        /* Or 'valeur_par_defaut' etait donc, par erreur, de type 'Logical' et n'occupait donc       */ \
                                        /* qu'un seul mot, ce qui semble avoir decale d'un mot la "pile" des arguments :             */ \
                                        /*                                                                                           */ \
                                        /*                    ||   ||      |         |                                               */ \
                                        /*                    ||   ||      |         |                                               */ \
                                        /*                   ---- ----  -------   -------                                            */ \
                                        /*                  |CHAR|CHAR||Logical| |Logical|...                                        */ \
                                        /*                   ---- ----  -------   -------                                            */ \
                                        /*                                                                                           */ \
                                        /* et a donne ainsi a 'editer_valeur' une valeur incorrecte (1077551224 en decimal) qui      */ \
                                        /* doit etre le mot qui le suivait dans la pile. D'ou ce nouveau test permettant de          */ \
                                        /* valider la valeur de 'editer_valeur' qui ne peut etre que 'VRAI' ou 'FAUX'...             */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : ce phenomene ne semble se manifester que sur 'SYSTEME_APC_Linux...' ; les     */ \
                                        /* tests effectues sur 'SYSTEME_SG...' ne montraient pas d'anomalies. Malgre tout, cette     */ \
                                        /* nouvelle sequence n'est pas rendue conditionnelle en fonction de '$SYSTEME', pour         */ \
                                        /* simplifier...                                                                             */ \
                              CAL1(Prer1("il s'agit du Parametre introduit par '%s'.\n"                                                 \
                                        ,mes                                                                                            \
                                         )                                                                                              \
                                   );                                                                                                   \
                                        /* Avant le 20051115105049, il y avait ici :                                                 */ \
                                        /*                                                                                           */ \
                                        /*                  CAL1(Prer2("il s'agit du Parametre numero %d introduit par '%s'.\n"      */ \
                                        /*                            ,NUMERO_UNIQUE_de_l_argument_possible_courant                  */ \
                                        /*                            ,mes                                                           */ \
                                        /*                             )                                                             */ \
                                        /*                       );                                                                  */ \
                                        /*                                                                                           */ \
                                        /* mais en fait, le numero du Parametre n'a aucun interet...                                 */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Cette procedure permet de faire la recherche d'une valeur par 'SScan',                    */ \
                                        /* puis de savoir comment celle-ci s'est deroulee en positionnant la                         */ \
                                        /* variable logique 'valeur_recherchee'...                                                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D E S   P A R A M E T R E S   N O N   G E N E R E S  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionV

DEFV(Common,DEFV(FonctionV,FgPROCESS_PARAMETRE__EDITION_PARAMETRES_NON_GENERES(titre_attendu)))
                                        /* Fonction introduite le 20180301034941...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(titre_attendu)));
                                        /* "Titre" attendu...                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     gPROCESS_PARAMETRE__EDITION_PARAMETRES_NON_GENERES(titre_attendu);
                                        /* Edition eventuelle d'un parametre non genere...                                           */

     RETU_VIDE;
     Eblock

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D ' U N   C O M P T E U R   Q U E L C O N Q U E  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionV

DEFV(Common,DEFV(FonctionV,Fedition_d_un_compteur_quelconque(en_tete,fonction,compteur,tabulation)))
                                        /* Fonction introduite le 20180410180201...                                                  */
DEFV(Argument,DEFV(CHAR,DTb0(en_tete)));
DEFV(Argument,DEFV(CHAR,DTb0(fonction)));
DEFV(Argument,DEFV(Int,compteur));
DEFV(Argument,DEFV(Int,tabulation));
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     Test(IZGT(compteur))
                                        /* Test introduit le 20180410182000...                                                       */
          Bblock
          DEFV(CHAR,INIC(POINTERc(nom_fonction_a_editer),chain_Aconcaten3(en_tete,fonction,"(...)'")));

          CAL3(Prme4("%-*s%s%d\n"
                    ,tabulation
                    ,nom_fonction_a_editer
                    ,SIGNE_EGAL
                    ,compteur
                     )
               );

          CALZ_FreCC(nom_fonction_a_editer);
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_VIDE;
     Eblock

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C U P E R A T I O N   D ' U N E   S O U S - C H A I N E   D E   C A R A C T E R E S  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Positive,INIT(GENERE__FonctionC_FconversionC_____compteur_des_kMalo,ZERO)));
                                        /* Le comptage des 'kMalo(...)'s a ete introduit le 20180316131852. On notera que ce         */
                                        /* compteur est commun a 'FconversionC(...)', 'FconversionCL(...)' et a                      */
                                        /* 'FconversionCN(...)' pour une raison assez stupide : sur les lignes de generation         */
                                        /* 'GENERE__FonctionC_FconversionC(...)' il n'y a pas assez de place pour placer un          */
                                        /* troisieme argument qui serait un compteur...                                              */
                                        /*                                                                                           */
                                        /* On notera que 'GENERE__FonctionC_FconversionC_____compteur_des_kMalo' doit etre defini    */
                                        /* avant 'FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE(...)'      */
                                        /* qui suit...                                                                               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E D I T I O N   D E S   C O M P T E U R S   D ' A L L O C A T I O N / D E S A L L O C A T I O N   M E M O I R E  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionV

DEFV(Common,DEFV(Logical,SINT(FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE_____activer,FAUX)));
                                        /* Introduit le 20180411075320...                                                            */

DEFV(Common,DEFV(FonctionV,FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE()))
                                        /* Fonction introduite le 20180316135237 et ce afin que le code correspondant genere         */
                                        /* par 'gEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE' ne soit pas  */
                                        /* implante plusieurs fois via 'ABORT_Commande' et 'RETU_Commande'...                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     gEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE;
                                        /* Edition eventuelle des compteurs d'allocation/desallocation memoire.                      */

     RETU_VIDE;
     Eblock

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E S   P A R A M E T R E S   D E S   C O M M A N D E S  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

#ifdef    gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_01                       /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_01));
#Aifdef   gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_01                       /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_01                       /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_02                       /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_02));
#Aifdef   gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_02                       /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_02                       /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#ifdef    gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01                       /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01));
#Aifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01                       /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01                       /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02                       /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02));
#Aifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02                       /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02                       /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#ifdef    gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01                         /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
DEFV(Common,DEFV(Logical,_____gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01));
#Aifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01                         /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01                         /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02                         /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
DEFV(Common,DEFV(Logical,_____gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02));
#Aifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02                         /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02                         /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

DEFV(Common,DEFV(Int,INIT(niveau_des_gPROCESS_PARAMETRE,UNDEF)));
                                        /* Introduit le 20060208102046 dans le but de distinguer les appels aux procedures de        */
                                        /* type 'GET_ARGUMENT_?(...)' et 'PROCESS_ARGUMENT_?(...)' qui ont lieu directement          */
                                        /* (par exemple 'v $xrv/particule.10$K GET_ARGUMENT_C."palette="') et ceux qui ont lieu via  */
                                        /* une autre procedure (par exemple 'v $xrv/particule.10$K PROCESS_ARGUMENTS_GEOMETRIQUES'). */

DEFV(Common,DEFV(Logical,SINT(c_est_le_premier_argument_possible_courant,VRAI)));
DEFV(Common,DEFV(Int,INIT(IDENTITE_de_l_argument_possible_precedent_precedent,UNDEF)));
DEFV(Common,DEFV(Int,INIT(IDENTITE_de_l_argument_possible_precedent,UNDEF)));
DEFV(Common,DEFV(Int,INIT(IDENTITE_de_l_argument_possible_courant,UNDEF)));
                                        /* Donnees utiles a l'identification UNIQUE des parametres possibles avec prise en compte    */
                                        /* des synonymes. Le 20060316173342 fut introduit l'element '..._precedent_precedent'        */
                                        /* pour 'v $xig/fonct$vv$DEF 20060316170930'. On notera qu'en fait, une bonne partie du      */
                                        /* temps en dehors de la procedure 'gPROCESS_PARAMETRE_IDENTITE', on a :                     */
                                        /*                                                                                           */
                                        /*                  courant == precedent                                                     */
                                        /*                                                                                           */
                                        /* et donc c'est 'precedent_precedent' qu'il faut tester et non pas 'precedent' si l'on      */
                                        /* veut savoir si l'element courant est le synonyme de l'element precedent. Cela justifie    */
                                        /* la programmation de 'v $xig/fonct$vv$DEF FORMAT_D_EDITION_DES_IDENTITES_UNIQUES'...       */
DEFV(Common,DEFV(Int,SINT(NUMERO_de_l_argument_possible_courant,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES)));
DEFV(Common,DEFV(PointerInt,DTb1(IDENTITE_des_arguments_possibles
                                ,NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES
                                 )
                 )
     );
DEFV(Common,DEFV(PointerInt,DTb1(ITYP_des_arguments_possibles
                                ,NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES
                                 )
                 )
     );
                                        /* Le 20000221094143, il a fallu passer de 'Int' a 'PointerInt' afin d'eviter un probleme de */
                                        /* "collisions" vu lors du test de '$xrv/variation.01$X' pour lequel les deux arguments      */
                                        /* "AVERTISSEMENT=" et "d2m=" donnaient la meme identite '0016'...                           */
                                        /*                                                                                           */
                                        /* Le 20061121091238, la liste 'STYP_des_arguments_possibles' a ete introduite afin de       */
                                        /* resoudre le probleme rencontre en particulier avec 'v $xcg/FloatHexa$vv$K xd=' dans       */
                                        /* 'nombre_flottant_en_Float' qui est une structure et qui donnait avec la commande 'suse'   */
                                        /* les trois synonymes suivants (avant donc cette modification...) :                         */
                                        /*                                                                                           */
                                        /*   Parametre.1. 0070 : i2=  I   :: 0            FloatInt_Int_2(nombre_flottant_en_Float)   */
                                        /*                                                                                           */
                                        /*   Parametre.1. 0070 : x=   F   :: 0            FloatInt_Float(nombre_flottant_en_Float)   */
                                        /*   Parametre.1. 0070 : xd=  F   :: 0            FloatInt_Float(nombre_flottant_en_Float)   */
                                        /*                                                                                           */
                                        /* qui correspondent a la meme adresse dans la liste 'IDENTITE_des_arguments_possibles'      */
                                        /* alors qu'ils n'ont pas le meme type. D'ou 'STYP_des_arguments_possibles' pour lever       */
                                        /* cette ambiguite. On notera que cela ne serait d'aucune utilite, par exemple, pour         */
                                        /* distinguer un 'Int' et un 'Logical' qui serait "en parallele" dans une structure...       */
                                        /* Pour bien faire il faudrait que 'STYP_des_arguments_possibles' fassent vraiment la        */
                                        /* difference entre tous les types possibles sans utiliser la longueur qui leur est          */
                                        /* associee...                                                                               */
                                        /*                                                                                           */
                                        /* Le 20061123175305, le nom 'STYP_des_arguments_possibles' a ete change en                  */
                                        /* 'ITYP_des_arguments_possibles' afin de resoudre l'ambiguite evoquee ci-dessus...          */

DEFV(Common,DEFV(Int,SINT(numero_de_l_argument_possible_courant__en_ne_tenant_pas_compte_des_synonymes
                         ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES
                          )
                 )
     );
DEFV(Common,DEFV(Int,SINT(numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes
                         ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES
                          )
                 )
     );
DEFV(Common,DEFV(PointerInt,DTb1(UTILISATION_des_arguments_possibles
                                ,NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES
                                 )
                 )
     );
                                        /* Le 20070820112735, la liste 'UTILISATION_des_arguments_possibles' a ete introduite afin   */
                                        /* de connaitre les arguments possibles qui sont utilises et ceux qui ne le sont pas...      */
                                        /*                                                                                           */
                                        /* On notera le 20070820150001 que 'NUMERO_UNIQUE_de_l_argument_possible_courant' n'equivaut */
                                        /* pas a 'numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes'      */
                                        /* pour la raison decrite dans 'v $xig/fonct$vv$DEF 20070820164448', ce dernier numero       */
                                        /* etant "local" a 'gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(...)' (en ce qui concerne sa         */
                                        /* gestion et non pas son implementation) et non global au '$K' courant. Ainsi donc          */
                                        /* 'numero_de_l_argument_possible_courant__en_ne_tenant_pas_compte_des_synonymes' et         */
                                        /* 'numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes' ne         */
                                        /* peuvent pas etre utilises pour donner ni le nombre total de parametres, ni le nombre      */
                                        /* de familles de parametres (en prenant en compte les synonymes...).                        */

DEFV(Common,DEFV(FonctionI,FgINITIALISATION_DE_LA_LISTE_DES_UTILISATIONS_DES_ARGUMENTS_POSSIBLES()))
                                        /* Fonction introduite le 20070821091839 pour le probleme 'v $xcc/cpp$Z 20070820203242'...   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     gINITIALISATION_DE_LA_LISTE_DES_UTILISATIONS_DES_ARGUMENTS_POSSIBLES;

     RETU_ERROR;
     Eblock

EFonctionI

BFonctionI

DEFV(Common,DEFV(Logical,SINT(l_argument_possible_courant_est_un_synonyme_d_argument_anterieur,LUNDEF)));
                                        /* Pour permettre de ne pas editer les synonymes (introduit le 20010420140719).              */

DEFV(Common,DEFV(Int,INIT(nombre_effectif_d_arguments,UNDEF)));
                                        /* Nombre effectifs d'arguments. Pendant longtemps, le nom de la commande a ete exclu, ce    */
                                        /* qui fait que l'on commencait sur 'NUMERO_PREMIER_ARGUMENT' et non pas comme dorenavant    */
                                        /* sur 'NUMERO_PREMIER_ARGUMENT'. En effet, cela a ete rendu necessaire par les commandes    */
                                        /* qui seraient appelees sans argument alors qu'elles utilisent, par exemple, la procedure   */
                                        /* 'GIT_ARGUMENT_I(...)' et donc 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)'. Or pour que     */
                                        /* l'initialisation des parametres correspondant se fasse, il faut qu'il y ait au moins un   */
                                        /* argument d'appel a la commande afin que l'exploration de la liste des arguments possibles */
                                        /* se fasse au moins une fois. D'ou la re-introduction du nom de la commande le 1996062700.  */
                                        /* correspondantes soient faites...                                                          */
DEFV(Common,DEFV(Int,SINT(nombre_d_arguments_recuperes,ZERO)));
                                        /* Afin de comptabiliser les arguments corrects recuperes.                                   */
                                        /* On notera que 'nombre_d_arguments_recuperes' peut etre utilise pour connaitre l'ordre     */
                                        /* (a partir de 0) des arguments recuperes (voir 'v $xrv/champs_5.1A$I' qui exploite cela).  */
                                        /* Le 20000801165648 la remise a 0 a ete rajoutee dans '$xig/fonct$vv$DEF GET_PARAMETRES'    */
                                        /* car elle y manquait au cas d'une "re-rentree" dans le 'Main(...)' telle celle qui est     */
                                        /* faite par 'v $xiii/files$FON Iload_image_avec_redimensionnement_eventuel'. Malgre,        */
                                        /* cela, sa valeur initiale doit etre 'ZERO' alors que logiquement, il aurait fallu lui      */
                                        /* donner la valeur 'UNDEF' ; en effet, cela est du a des raisons de compatibilite sur les   */
                                        /* MACHINEs utilisant des '$SO' et poure le '$K' n'ayant pas ete recompiles. Pour eux, alors */
                                        /* la valeur initiale serait 'UNDEF' car la mise 'ZERO' n'a pas ete encore generee...        */
DEFV(Common,DEFV(Int,INIT(numero_d_argument_courant,UNDEF)));
                                        /* Donne en permanence le numero de l'argument courant.                                      */

#define   NargumentsNom                                                                                                                 \
                    nombre_d_arguments_y_compris_le_nom                                                                                 \
                                        /* Pour raccourcir la longueur des lignes referencant 'nombre_d_arguments_y_compris_le_nom'. */

DEFV(Common,DEFV(PointerInt,DdTb1(POINTERi,IDENTITE_des_arguments_presents,NargumentsNom,ADRESSE_NON_ENCORE_DEFINIE)));
                                        /* Liste d'identite des arguments presents.                                                  */
                                        /*                                                                                           */
                                        /* Le 20000221094143, il a fallu passer de 'Int' a 'PointerInt' afin d'eviter un probleme de */
                                        /* "collisions" vu lors du test de '$xrv/variation.01$X' pour lequel les deux arguments      */
                                        /* "AVERTISSEMENT=" et "d2m=" donnaient la meme identite '0016'...                           */
                                        /*                                                                                           */
                                        /* ATTENTION, doit etre sur une seule ligne a cause de 'v $xcg/gen.ext$Z'...                 */
DEFV(Common,DEFV(Int,DdTb1(POINTERi,compteur_reconnaissance_des_arguments_presents,NargumentsNom,ADRESSE_NON_ENCORE_DEFINIE)));
                                        /* Compteur de reconnaissance de chacun des arguments presents. ATTENTION, on notera que     */
                                        /* le nombre d'elements de ce tableau est 'nombre_d_arguments_y_compris_le_nom', et non      */
                                        /* pas 'nombre_effectif_d_arguments' (comme on pourrait s'y attendre), car, en effet, la     */
                                        /* variable d'indexation des arguments 'numero_d_argument_courant' a comme valeur initiale   */
                                        /* 'NUMERO_PREMIER_ARGUMENT' ; elle indexe donc bien les arguments (y compris le nom de la   */
                                        /* commande). Il faut donc autant d'elements qu'il y a reellement d'arguments...             */
                                        /*                                                                                           */
                                        /* ATTENTION, doit etre sur une seule ligne a cause de 'v $xcg/gen.ext$Z'...                 */

#undef    NargumentsNom

DEFV(Common,DEFV(Void,INIT(POINTERv(pointeurV_parametre),ADRESSE_NON_ENCORE_DEFINIE)));
DEFV(Common,DEFV(CHAR,INIT(POINTERc(pointeurC_parametre),ADRESSE_NON_ENCORE_DEFINIE)));
DEFV(Common,DEFV(Int,INIT(parametre_fictif_IDENTITE_des_arguments,UNDEF)));
DEFV(Common,DEFV(Void,INIT(POINTERv(pointeurV_parametre_fictif_IDENTITE_des_arguments),ADRESSE_NON_ENCORE_DEFINIE)));
DEFV(Common,DEFV(CHAR,INIT(POINTERc(pointeurC_parametre_fictif_IDENTITE_des_arguments),ADRESSE_NON_ENCORE_DEFINIE)));
                                        /* Parametre fictif destine uniquement a simplifier la gestion du vecteur                    */
                                        /* 'IDENTITE_des_arguments_presents' et ses deux pointeurs, le premier non type              */
                                        /* et le second nous amenant dans l'unite de base (celle des caracteres...).                 */
DEFV(Common,DEFV(Logical,INIT(FgPROCESS_PARAMETRE_TITRAGE_pas_encore_effectue,VRAI)));
                                        /* Afin de n'editer le titre qu'une seule fois...                                            */

DEFV(Common,DEFV(FonctionI,FgPROCESS_PARAMETRE_TITRAGE()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IL_FAUT(EST_VRAI(IFET(IL_FAUT(editer_la_valeur_des_parametres_d_une_commande)
                               ,EST_VRAI(c_est_la_derniere_recherche_des_parametres)
                                )
                           )
                  )
          )
          Bblock
          Test(EST_VRAI(FgPROCESS_PARAMETRE_TITRAGE_pas_encore_effectue))
               Bblock
               CALS(Fsauts_de_lignes(UN));
               CAL3(Prme2("%s%s"
                         ,"Valeur de tous les parametres de cette commande (apres modification[s] eventuelle[s]) :\n"
                         ,"-------------------------------------------------------------------------------------\n"
                          )
                    );
               CALS(Fsauts_de_lignes(DEUX));

               EGAL(FgPROCESS_PARAMETRE_TITRAGE_pas_encore_effectue,FAUX);
                                        /* Afin de n'editer le titre qu'une seule fois...                                            */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

BFonctionL

DEFV(Common,DEFV(FonctionL,Ftest_IDENTITE_de_l_argument_possible()))
                                        /* Fonction introduite le 20221101101020 et mise ici le 20221101102938...                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(test_IDENTITE_de_l_argument_possible,LUNDEF));
     /*..............................................................................................................................*/
     EGAL(test_IDENTITE_de_l_argument_possible
         ,IFET(IFGT(NUMERO_de_l_argument_possible_courant
                   ,LSTX(PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES
                        ,NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES
                         )
                    )
              ,IFEQ(IDENTITE_de_l_argument_possible_courant
                   ,IDENTITE_de_l_argument_possible_precedent
                    )
               )
          );

     RETU(test_IDENTITE_de_l_argument_possible);
     Eblock

EFonctionL

BFonctionI

DEFV(Common,DEFV(FonctionI,FgPROCESS_PARAMETRE_IDENTITE(identite_du_type_attendu)))
DEFV(Argument,DEFV(Int,identite_du_type_attendu));
                                        /* Taille du type attendu (introduit le 20061121091238). Le 20061123180423, cet argument     */
                                        /* 'taille_du_type_attendu' a ete remplace par 'identite_du_type_attendu' qui n'est pas      */
                                        /* ambigu car different d'un type a l'autre contrairement a la taille...                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     gPROCESS_PARAMETRE_IDENTITE(identite_du_type_attendu);
                                        /* Gestion de l'identite des parametres destinee principalement a identifier les synonymes.  */

     RETU_ERROR;
     Eblock

EFonctionI

BFonctionI

DEFV(Common,DEFV(FonctionI,FgPROCESS_PARAMETRE_VALIDATION_DU_TYPE(titre_attendu,taille_du_type_attendu,taille_courante)))
DEFV(Argument,DEFV(CHAR,DTb0(titre_attendu)));
                                        /* "Titre" attendu...                                                                        */
DEFV(Argument,DEFV(Int,taille_du_type_attendu));
                                        /* Taille du type attendu...                                                                 */
DEFV(Argument,DEFV(Int,taille_courante));
                                        /* Taille du parametre courant...                                                            */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     gPROCESS_PARAMETRE_VALIDATION_DU_TYPE(titre_attendu,taille_du_type_attendu,taille_courante);
                                        /* Validation eventuelle du type du parametre courant...                                     */

     RETU_ERROR;
     Eblock

EFonctionI

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(FgPROCESS_PARAMETRE_SYNONYME_COURANT(titre_attendu,premier_caractere_de_____titre_attendu))))
                                        /* Cette fonction a ete introduite le 20070228083938 afin de reduire le code genere          */
                                        /* par 'gPROCESS_PARAMETRE(...)'.                                                            */
DEFV(Argument,DEFV(CHAR,POINTERc(titre_attendu)));
                                        /* Liste des titres attendus synonymes.                                                      */
DEFV(Argument,DEFV(Int,premier_caractere_de_____titre_attendu));
                                        /* Index du premier caractere a traiter dans 'titre_attendu'...                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(titre_attendu_unique_parmi_une_liste_de_titres_synonymes),CHAINE_UNDEF));
                                        /* Titre attendu unique...                                                                   */
     /*..............................................................................................................................*/
     gPROCESS_PARAMETRE_SYNONYME_COURANT(titre_attendu
                                        ,titre_attendu_unique_parmi_une_liste_de_titres_synonymes
                                        ,premier_caractere_de_____titre_attendu
                                         );

     RETU(titre_attendu_unique_parmi_une_liste_de_titres_synonymes);
     Eblock

EFonctionC

BFonctionI

DEFV(Common,DEFV(FonctionI,FgPROCESS_PARAMETRE_DEBUT(titre_attendu,taille_du_type_attendu,taille_courante,identite_du_type_attendu)))
DEFV(Argument,DEFV(CHAR,DTb0(titre_attendu)));
                                        /* "Titre" attendu...                                                                        */
DEFV(Argument,DEFV(Int,taille_du_type_attendu));
                                        /* Taille du type attendu...                                                                 */
DEFV(Argument,DEFV(Int,taille_courante));
                                        /* Taille du parametre courant...                                                            */
DEFV(Argument,DEFV(Int,identite_du_type_attendu));
                                        /* Identite du parametre courant (introduit le 20061123180423)...                            */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     gPROCESS_PARAMETRE_DEBUT(titre_attendu,taille_du_type_attendu,taille_courante,identite_du_type_attendu);
                                        /* Gestion de l'identite des parametres destinee principalement a identifier les synonymes,  */
                                        /* puis edition eventuelle du titre des "Parametres" apres que la variable                   */
                                        /* 'NUMERO_UNIQUE_de_l_argument_possible_courant' ait ete mise a jour et enfin validation    */
                                        /* validation eventuelle du type du parametre courant...                                     */

     RETU_ERROR;
     Eblock

EFonctionI

BFonctionC

DEFV(Common,DEFV(FonctionC,POINTERc(FgPROCESS_PARAMETRE_RECUPERATION_ET_TRANSFORMATION(liste_des_arguments
                                                                                      ,numero_d_argument_courant
                                                                                      ,abreviation_possible
                                                                                       )
                                    )
                 )
     )
                                        /* Cette fonction a ete introduite le 20030706114308 afin de reduire le code genere          */
                                        /* par 'gPROCESS_PARAMETRE(...)'.                                                            */
DEFV(Argument,DEFV(CHAR,POINTERc(DTb0(liste_des_arguments))));
                                        /* Liste des arguments.                                                                      */
DEFV(Argument,DEFV(Int,numero_d_argument_courant));
                                        /* Numero de l'argument courant a traiter.                                                   */
DEFV(Argument,DEFV(Logical,abreviation_possible));
                                        /* Indique si cet argument peut etre abgreger ('VRAI') ou pas ('FAUX')...                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(POINTERc(argument_courant_apres_conversions_majuscules_minuscules_et_prefixage_eventuels_2),CHAINE_UNDEF));
                                        /* Chaine resultante de la recuperation et de la transformation de l'argument courant...     */
                                        /*                                                                                           */
                                        /* Le postfixe "_2" a ete introduit le 20051025152708 afin de faire la difference            */
                                        /* entre cette variable et celle postfixee "_1" qui est definie dans la procedure            */
                                        /* 'v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_RECUPERATION_ET_TRANSFORMATION'. Cette            */
                                        /* etait a priori inutile, mais ameliorera la lisibilite...                                  */
     /*..............................................................................................................................*/
     gPROCESS_PARAMETRE_RECUPERATION_ET_TRANSFORMATION(liste_des_arguments,numero_d_argument_courant,abreviation_possible);

     RETU(argument_courant_apres_conversions_majuscules_minuscules_et_prefixage_eventuels_2);
     Eblock

EFonctionC

BFonctionI

DEFV(Common,DEFV(FonctionI,FgPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT(__ParaTyp,__ParaLon)))
DEFV(Argument,DEFV(CHAR,DTb0(__ParaTyp)));
                                        /* Type du vecteur courant.                                                                  */
DEFV(Argument,DEFV(Positive,__ParaLon));
                                        /* Longueur du vecteur courant.                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT(__ParaTyp,__ParaLon);
                                        /* Debut de l'edition des vecteurs de longueur variable et connue.                           */

     RETU_ERROR;
     Eblock

EFonctionI

BFonctionI

DEFV(Common,DEFV(FonctionI,FgPROCESS_PARAMETRE_EDITION_VECTEUR_N_FIN(__ParaLon,premier__ParaVal,dernier__ParaVal)))
DEFV(Argument,DEFV(Positive,__ParaLon));
                                        /* Longueur du vecteur courant.                                                              */
DEFV(Argument,DEFV(Int,premier__ParaVal));
DEFV(Argument,DEFV(Int,dernier__ParaVal));
                                        /* Premier et dernier elements du vecteur '__ParaVal' a editer.                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     gPROCESS_PARAMETRE_EDITION_VECTEUR_N_FIN(__ParaLon,premier__ParaVal,dernier__ParaVal);
                                        /* Fin de l'edition des vecteurs de longueur variable et connue.                             */

     RETU_ERROR;
     Eblock

EFonctionI

#ifdef    gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01                       /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Aifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01                       /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01                       /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02                       /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

BFonctionI

DEFV(Common,DEFV(FonctionI,FgPROCESS_PARAMETRE_EDITION_VECTEUR_N_Float(__ParaTyp,__ParaLon,__ParaFor,__ParaVal)))
DEFV(Argument,DEFV(CHAR,DTb0(__ParaTyp)));
                                        /* Type du vecteur courant.                                                                  */
DEFV(Argument,DEFV(Positive,__ParaLon));
                                        /* Longueur du vecteur courant.                                                              */
DEFV(Argument,DEFV(CHAR,DTb0(__ParaFor)));
                                        /* Format d'edition d'un element du vecteur courant.                                         */
DEFV(Argument,DEFV(Float,DTb0(__ParaVal)));
                                        /* Vecteur courant. ATTENTION : Cet argument doit etre le dernier de la liste au cas ou      */
                                        /* '__ParaTyp' ne serait pas 'TYPE_FORMAT_FLOT', ce qui aurait pour consequence de decaler   */
                                        /* la liste des arguments...                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IFEQ_chaine(__ParaTyp,TYPE_FORMAT_FLOT))
          Bblock
          gPROCESS_PARAMETRE_EDITION_VECTEUR_N(__ParaTyp,__ParaLon,__ParaFor,__ParaVal);
                                        /* Edition des vecteurs de longueur variable et connue.                                      */
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("le vecteur (de longueur connue) dont l'edition est demandee n'est pas de type 'Float'");
          CAL1(Prer2("(le type est '%s' alors que '%s' etait attendu)\n",__ParaTyp,TYPE_FORMAT_FLOT));
                                        /* La solution a ce probleme est soit de renoncer a cette fonction et revenir a :            */
                                        /*                                                                                           */
                                        /*        gPROCESS_PARAMETRE_EDITION_VECTEUR_N(__ParaTyp,__ParaLon,__ParaFor,__ParaVal);     */
                                        /*                                                                                           */
                                        /* dans 'v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_EDITION_VECTEUR_N', soit d'exploiter le      */
                                        /* code d'erreur ('CODE_ERREUR') en retour de cette fonction afin de permettre l'appel       */
                                        /* d'une fonction alternative permettant, par exemple, d'editer le type 'Int'...             */
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

#Aifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02                       /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02                       /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

#ifdef    gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01                         /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Aifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01                         /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */
#Eifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01                         /* Common,DEFV(Fonction,) : avec 'VERSION_01'.       */

#ifdef    gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02                         /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

BFonctionI

DEFV(Common,DEFV(FonctionI,FgPROCESS_PARAMETRE_EDITION_VECTEUR_Float(__ParaTyp,__ParaInd,__ParaFor,__ParaVal)))
DEFV(Argument,DEFV(CHAR,DTb0(__ParaTyp)));
                                        /* Type du vecteur courant.                                                                  */
DEFV(Argument,DEFV(Int,__ParaInd));
                                        /* Index d'un element du vecteur courant.                                                    */
DEFV(Argument,DEFV(CHAR,DTb0(__ParaFor)));
                                        /* Format d'edition d'un element du vecteur courant.                                         */
DEFV(Argument,DEFV(Float,DTb0(__ParaVal)));
                                        /* Vecteur courant. ATTENTION : Cet argument doit etre le dernier de la liste au cas ou      */
                                        /* '__ParaTyp' ne serait pas 'TYPE_FORMAT_FLOT', ce qui aurait pour consequence de decaler   */
                                        /* la liste des arguments...                                                                 */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IFEQ_chaine(__ParaTyp,TYPE_FORMAT_FLOT))
          Bblock
          gPROCESS_PARAMETRE_EDITION_VECTEUR(__ParaTyp,__ParaInd,__ParaFor,__ParaVal);
                                        /* Edition des vecteurs de longueur variable et connue.                                      */
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("le vecteur (de longueur inconnue) dont l'edition est demandee n'est pas de type 'Float'");
          CAL1(Prer2("(le type est '%s' alors que '%s' etait attendu)\n",__ParaTyp,TYPE_FORMAT_FLOT));
                                        /* La solution a ce probleme est soit de renoncer a cette fonction et revenir a :            */
                                        /*                                                                                           */
                                        /*        gPROCESS_PARAMETRE_EDITION_VECTEUR(__ParaTyp,__ParaInd,__ParaFor,__ParaVal);       */
                                        /*                                                                                           */
                                        /* dans 'v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_EDITION_VECTEUR_N', soit d'exploiter le      */
                                        /* code d'erreur ('CODE_ERREUR') en retour de cette fonction afin de permettre l'appel       */
                                        /* d'une fonction alternative permettant, par exemple, d'editer le type 'Int'...             */
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

#Aifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02                         /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */
#Eifdef   gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02                         /* Common,DEFV(Fonction,) : avec 'VERSION_02'.       */

BFonctionI

DEFV(Common,DEFV(FonctionI,FgPROCESS_PARAMETRE_COMPTAGE(valeur_recherchee_dans_la_liste_des_arguments)))
DEFV(Argument,DEFV(Logical,valeur_recherchee_dans_la_liste_des_arguments));
                                        /* Afin de savoir si l'on a trouve la valeur cherchee dans la liste 'liste_des_arguments'.   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     gPROCESS_PARAMETRE_COMPTAGE(valeur_recherchee_dans_la_liste_des_arguments);
                                        /* Comptage des parametres...                                                                */

     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N   P O U R   L A   P R O C E D U R E   G E N E R A L E   ' GET_PARAMETRES(...) '  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____editer_les_differentes_variables_d_environnement_utiles()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     PRINT_ERREUR("fonction ne pouvant etre definie car necessite des donnees locales aux '$X's.");

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____editer_les_differentes_versions_du_programme()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     PRINT_ERREUR("fonction ne pouvant etre definie car necessite des donnees locales aux '$X's.");

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____editer_les_differents_includes_du_programme()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     PRINT_ERREUR("fonction ne pouvant etre definie car necessite des donnees locales aux '$X's.");

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____lister_tous_les_messages_possibles()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     PRINT_ERREUR("fonction ne pouvant etre definie car necessite des donnees locales aux '$X's.");

     RETU_VIDE;
     Eblock

EFonctionV


BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____lister_les_parametres_non_parfaitement_reconnus()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     GET_PARAMETRES_____lister_les_parametres_non_parfaitement_reconnus;

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____ne_rien_faire_et_sortir_immediatement()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     GET_PARAMETRES_____ne_rien_faire_et_sortir_immediatement;

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____forcer_l_execution_malgre_les_editions_demandees()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     GET_PARAMETRES_____forcer_l_execution_malgre_les_editions_demandees;

     RETU_VIDE;
     Eblock

EFonctionV


BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____editer_les_differents_bugs_reconnus()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     GET_PARAMETRES_____editer_les_differents_bugs_reconnus;

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____permettre_l_acces_au_source_du_programme()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     GET_PARAMETRES_____permettre_l_acces_au_source_du_programme;

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____permettre_l_acces_a_la_liste_des_fonctions_referencees()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     GET_PARAMETRES_____permettre_l_acces_a_la_liste_des_fonctions_referencees;

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____editer_le_NOM_SYNTHETIQUE_de_la_commande_courante()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     PRINT_ERREUR("fonction ne pouvant etre definie car necessite des donnees locales aux '$X's.");

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante()))
                                        /* Fonction introduite le 20240104111155...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     PRINT_ERREUR("fonction ne pouvant etre definie car necessite des donnees locales aux '$X's.");

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____editer_la_liste_des_librairies_dynamiques_utilisees()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     GET_PARAMETRES_____editer_la_liste_des_librairies_dynamiques_utilisees;

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____VALIDATION_DES_CLASSES_DE_SYNONYMES_D_ARGUMENTS()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     GET_PARAMETRES_____VALIDATION_DES_CLASSES_DE_SYNONYMES_D_ARGUMENTS;

     RETU_VIDE;
     Eblock

EFonctionV

BFonctionV

DEFV(Common,DEFV(FonctionV,FgGET_PARAMETRES_____editer_les_commandes_avant_execution()))
                                        /* Fonction introduite le 20221112133942...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     GET_PARAMETRES_____editer_les_commandes_avant_execution;

     RETU_VIDE;
     Eblock

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P T I M I S A T I O N   D E S   A L L O C A T I O N S   M E M O I R E                                                    */
/*        D E   C H A I N E S   D E   C A R A C T E R E S   T R E S   U T I L I S E E S  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* Le 20180402010510, ces definitions ont ete placees dans 'v $xig/allocation$vv$FON'        */
                                        /* a cause d'un probleme de reference en avant dans la fonction 'chain_Acopie(...)' qui      */
                                        /* reference la fonction 'allocation_memoire_et_generation_des_format_EGAr(...)'...          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O M P T A G E   D E   L ' E N T R E E   D E S   A R G U M E N T S   D E S   ' $K ' S  :                                  */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_K_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_C_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_M_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_I_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_E_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_J_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_X_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_Y_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_F_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_G_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENT_P_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2_K_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2_C_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2_I_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2g_I_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2_X_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2_F_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2g_F_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS2_P_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3_K_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3_C_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3_I_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3g_I_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3_X_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3_F_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3g_F_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS3_P_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS4_K_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS4_C_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS4_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS4_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS4_I_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS4_X_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS4_F_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS4_P_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS5_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS5_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS6_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS6_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS7_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS7_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS8_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS8_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS9_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTS9_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTSa_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(GET_ARGUMENTSa_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_K_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_C_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_FICHIER_____Pcompteur_DAppel,ZERO)));
                                        /* Compteur introduit le 20190403133439 et complete le 20190403141958, puis simplifie        */
                                        /* le 20190404081932...                                                                      */
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_I_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_J_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_X_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_Y_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_F_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENT_P_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENTS2_K_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENTS2_C_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENTS2_L_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENTS2_N_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENTS2_I_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENTS2_X_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENTS2_F_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESS_ARGUMENTS2_P_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROCESF_ARGUMENT_C_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROKESF_ARGUMENT_C_____Pcompteur_DAppel,ZERO)));

DEFV(Common,DEFV(Positive,INIT(PROCESF_ARGUMENT_FICHIER_____Pcompteur_DAppel,ZERO)));
DEFV(Common,DEFV(Positive,INIT(PROKESF_ARGUMENT_FICHIER_____Pcompteur_DAppel,ZERO)));
                                        /* Compteurs introduits le 20190408143822...                                                 */

BFonctionV

#define   TABULATION_EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S                                                               \
                    QUARANTE

DEFV(Common,DEFV(Logical,ZINT(cumul_des_compteurs_d_entree_des_arguments_des_K_s,ZERO)));

#define   EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S(fonction,compteur)                                                       \
                    Bblock                                                                                                              \
                    CALS(Fedition_d_un_compteur_quelconque("# de '"                                                                     \
                                                          ,fonction                                                                     \
                                                          ,compteur                                                                     \
                                                          ,TABULATION_EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S              \
                                                           )                                                                            \
                         );                                                                                                             \
                                        /* Cette solution implementee le 20180410180201 permet d'economiser de la memoire puisque    */ \
                                        /* les 'CAL3(Prme4(...))' ne sont implementes qu'une seule fois (c'est-a-dire dans la        */ \
                                        /* fonction 'Fedition_d_un_compteur_quelconque(...)'.                                        */ \
                                                                                                                                        \
                    INCR(cumul_des_compteurs_d_entree_des_arguments_des_K_s,compteur);                                                  \
                    Eblock

DEFV(Common,DEFV(Logical,SINT(FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ENTREE_DES_ARGUMENTS_DES_K_S____activer,FAUX)));
                                        /* Introduit le 20180411075320...                                                            */

DEFV(Common,DEFV(FonctionV,FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ENTREE_DES_ARGUMENTS_DES_K_S()))
                                        /* Fonction introduite le 20180410114635...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/

     Test(IL_FAUT(FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ENTREE_DES_ARGUMENTS_DES_K_S____activer))
          Bblock
          PRINT_MESSAGE(C_VIDE,"EDITION DES COMPTEURS D'ENTREE DES ARGUMENTS DES '$K'S");

          CALS(Fsauts_de_lignes(UN));

          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_K",GET_ARGUMENT_K_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_C",GET_ARGUMENT_C_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_L",GET_ARGUMENT_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_M",GET_ARGUMENT_M_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_N",GET_ARGUMENT_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_I",GET_ARGUMENT_I_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_E",GET_ARGUMENT_E_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_J",GET_ARGUMENT_J_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_X",GET_ARGUMENT_X_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_Y",GET_ARGUMENT_Y_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_F",GET_ARGUMENT_F_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_G",GET_ARGUMENT_G_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENT_P",GET_ARGUMENT_P_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2_K",GET_ARGUMENTS2_K_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2_C",GET_ARGUMENTS2_C_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2_L",GET_ARGUMENTS2_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2_N",GET_ARGUMENTS2_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2_I",GET_ARGUMENTS2_I_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2g_I",GET_ARGUMENTS2g_I_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2_X",GET_ARGUMENTS2_X_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2_F",GET_ARGUMENTS2_F_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2g_F",GET_ARGUMENTS2g_F_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS2_P",GET_ARGUMENTS2_P_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3_K",GET_ARGUMENTS3_K_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3_C",GET_ARGUMENTS3_C_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3_L",GET_ARGUMENTS3_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3_N",GET_ARGUMENTS3_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3_I",GET_ARGUMENTS3_I_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3g_I",GET_ARGUMENTS3g_I_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3_X",GET_ARGUMENTS3_X_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3_F",GET_ARGUMENTS3_F_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3g_F",GET_ARGUMENTS3g_F_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS3_P",GET_ARGUMENTS3_P_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS4_K",GET_ARGUMENTS4_K_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS4_C",GET_ARGUMENTS4_C_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS4_L",GET_ARGUMENTS4_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS4_N",GET_ARGUMENTS4_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS4_I",GET_ARGUMENTS4_I_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS4_X",GET_ARGUMENTS4_X_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS4_F",GET_ARGUMENTS4_F_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS4_P",GET_ARGUMENTS4_P_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS5_L",GET_ARGUMENTS5_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS5_N",GET_ARGUMENTS5_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS6_L",GET_ARGUMENTS6_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS6_N",GET_ARGUMENTS6_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS7_L",GET_ARGUMENTS7_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS7_N",GET_ARGUMENTS7_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS8_L",GET_ARGUMENTS8_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS8_N",GET_ARGUMENTS8_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS9_L",GET_ARGUMENTS9_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTS9_N",GET_ARGUMENTS9_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTSa_L",GET_ARGUMENTSa_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("GET_ARGUMENTSa_N",GET_ARGUMENTSa_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_K",PROCESS_ARGUMENT_K_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_C",PROCESS_ARGUMENT_C_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_FICHIER"
                                                              ,PROCESS_ARGUMENT_FICHIER_____Pcompteur_DAppel
                                                               );
                                        /* Edition introduite le 20190404092750...                                                   */
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_L",PROCESS_ARGUMENT_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_N",PROCESS_ARGUMENT_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_I",PROCESS_ARGUMENT_I_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_J",PROCESS_ARGUMENT_J_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_X",PROCESS_ARGUMENT_X_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_Y",PROCESS_ARGUMENT_Y_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_F",PROCESS_ARGUMENT_F_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENT_P",PROCESS_ARGUMENT_P_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENTS2_K",PROCESS_ARGUMENTS2_K_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENTS2_C",PROCESS_ARGUMENTS2_C_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENTS2_L",PROCESS_ARGUMENTS2_L_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENTS2_N",PROCESS_ARGUMENTS2_N_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENTS2_I",PROCESS_ARGUMENTS2_I_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENTS2_X",PROCESS_ARGUMENTS2_X_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENTS2_F",PROCESS_ARGUMENTS2_F_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESS_ARGUMENTS2_P",PROCESS_ARGUMENTS2_P_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESF_ARGUMENT_C",PROCESF_ARGUMENT_C_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROKESF_ARGUMENT_C",PROKESF_ARGUMENT_C_____Pcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROCESF_ARGUMENT_FICHIER"
                                                              ,PROCESF_ARGUMENT_FICHIER_____Pcompteur_DAppel
                                                               );
          EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S("PROKESF_ARGUMENT_FICHIER"
                                                              ,PROKESF_ARGUMENT_FICHIER_____Pcompteur_DAppel
                                                               );

          CALS(Fsauts_de_lignes(UN));

          CAL3(Prme2("Cumul des compteurs d'entree des arguments des '$K's%s%d\n"
                    ,SIGNE_EGAL
                    ,cumul_des_compteurs_d_entree_des_arguments_des_K_s
                     )
               );

          CALS(Fsauts_de_lignes(UN));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_VIDE;
     Eblock

#undef    EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S
#undef    TABULATION_EDITION_D_UN_COMPTEUR_D_ENTREE_DES_ARGUMENTS_DES_K_S

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A V A N T   E T   A P R E S   ' GET_PARAMETRES(...) '  :                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,FgACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_AVANT_GET_PARAMETRES()))
                                        /* Fonction introduite le 20180217182658 destinee a eviter la recompilation des '$K's        */
                                        /* dans le cas ou des actions nouvelles seraient introduites ici...                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(EST_FAUX(allocation_memoire_et_generation_des_format_EGAr_____initialisation_faite))
          Bblock
          CALS(allocation_memoire_et_generation_des_format_EGAr());
                                        /* Ceci a ete introduit le 20180401123053 afin de permettre aux '$X' non encore              */
                                        /* recompiles de pouvoir s'executer normalement. Ceci est evidemment du a la procedure       */
                                        /* 'v $xil/defi_c1$vv$DEF BCommande' qui est chargee de ces initialisations...               */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

BFonctionI

DEFV(Common,DEFV(Logical,SINT(GENERE_TYPE_SETENV_____editer_les_variables_SETENV_universelles,FAUX)));
                                        /* Introduit le 20180218174630...                                                            */

#define   GENERE_TYPE_SETENV_INTRODUCTION                                                                                               \
                    "     "
#define   GENERE_TYPE_SETENV_TABULATION                                                                                                 \
                    SOUS(QUARANTE,chain_Xtaille(GENERE_TYPE_SETENV_INTRODUCTION))
#define   GENERE_TYPE_SETENV(nom_de_la_variable_setenv,variable_correspondante,fonction_recuperation,format,fonction_conversion,type)   \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(GENERE_TYPE_SETENV_____editer_les_variables_SETENV_universelles))                                      \
                         Bblock                                                                                                         \
                         DEFV(CHAR,INIT(POINTERc(GENERE_TYPE_SETENV_format)                                                             \
                                       ,chain_Aconcaten5(GENERE_TYPE_SETENV_INTRODUCTION                                                \
                                                        ,"%-*s"                                                                         \
                                                        ,CHOI(FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_SCALAIRES                          \
                                                             ,FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_VECTORIELLES                       \
                                                              )                                                                         \
                                                        ,format                                                                         \
                                                        ,"\n"                                                                           \
                                                         )                                                                              \
                                        )                                                                                               \
                              );                                                                                                        \
                                        /* Introduit le 20180313102545 pour permettre un 'CALZ_FreCC(...)'...                        */ \
                                                                                                                                        \
                         CAL3(Prme4(GENERE_TYPE_SETENV_format                                                                           \
                                   ,GENERE_TYPE_SETENV_TABULATION                                                                       \
                                   ,nom_de_la_variable_setenv                                                                           \
                                   ,type                                                                                                \
                                   ,fonction_conversion(variable_correspondante)                                                        \
                                    )                                                                                                   \
                              );                                                                                                        \
                                        /* Il s'agit vraiment des valeurs par defaut qui sont editees...                             */ \
                                        /*                                                                                           */ \
                                        /* La logique voudrait que l'on utilise 'FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_SCALAIRES',  */ \
                                        /* en fait 'FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_VECTORIELLES' est mieux si l'on souhaite  */ \
                                        /* respecter le format des editions "Parametres=VRAI". En fait tout cela provient de         */ \
                                        /* l'argument 'A_R' des fonctions de type 'Fconversion?(...)'. Cet argument est ensuite      */ \
                                        /* repris dans 'g1PROCESS_PARAMETRE(...)' grace a 'INDICATEUR_DE_TYPE_____A_R' qui est       */ \
                                        /* lui-meme exploite finalement par 'v $xcc/cpp$Z Indicateur_____A_R'. Pour les parametres   */ \
                                        /* de type scalaire, sans que l'on puisse lui attribuer un type 'A_R' quelconque, c'est      */ \
                                        /* 'v $xcc/cpp$Z InDiCaTeUr_____V' qui lui est attribue ; celui-ci rajoute donc deux         */ \
                                        /* espaces derriere le type 'type' ci-dessus, ce qui remplace par exemple :                  */ \
                                        /*                                                                                           */ \
                                        /*                  L ::                                                                     */ \
                                        /*                                                                                           */ \
                                        /* par :                                                                                     */ \
                                        /*                                                                                           */ \
                                        /*                  L   ::                                                                   */ \
                                        /*                                                                                           */ \
                                        /* (dans le cas 'TYPE_FORMAT_LOGI'). Cela revient donc a utiliser le format                  */ \
                                        /* 'FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_VECTORIELLES' qui possede deux espaces de plus    */ \
                                        /* que 'FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_SCALAIRES'...                                 */ \
                                        /*                                                                                           */ \
                                        /* Finalement, un 'CHOI(...)' a ete introduit le 20180313101900...                           */ \
                                                                                                                                        \
                         CALZ_FreCC(GENERE_TYPE_SETENV_format);                                                                         \
                                        /* Introduit le 20180313102545...                                                            */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         EGAL(variable_correspondante,fonction_recuperation(nom_de_la_variable_setenv,variable_correspondante));        \
                                        /* La recuperation n'a lieu que si l'edition n'est pas demandee car, en effet, sinon         */ \
                                        /* certaines variables (par exemple '$SETENV_CAL1') pourraient interrompre celle-ci...       */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock

#define   GENERE_C_SETENV(nom_de_la_variable_setenv,variable_correspondante)                                                            \
                    Bblock                                                                                                              \
                    GENERE_TYPE_SETENV(nom_de_la_variable_setenv                                                                        \
                                      ,variable_correspondante                                                                          \
                                      ,GvarDefaut                                                                                       \
                                      ,FORMAT_CHAI_EDITION                                                                              \
                                      ,NEUT                                                                                             \
                                      ,TYPE_FORMAT_CHAI                                                                                 \
                                       );                                                                                               \
                    Eblock
#define   GENERE_I_SETENV(nom_de_la_variable_setenv,variable_correspondante)                                                            \
                    Bblock                                                                                                              \
                    GENERE_TYPE_SETENV(nom_de_la_variable_setenv                                                                        \
                                      ,variable_correspondante                                                                          \
                                      ,GIntDefaut                                                                                       \
                                      ,FORMAT_INTE_EDITION                                                                              \
                                      ,INTE                                                                                             \
                                      ,TYPE_FORMAT_INTE                                                                                 \
                                       );                                                                                               \
                    Eblock
#define   GENERE_K_SETENV(nom_de_la_variable_setenv,variable_correspondante)                                                            \
                    Bblock                                                                                                              \
                    GENERE_TYPE_SETENV(nom_de_la_variable_setenv                                                                        \
                                      ,variable_correspondante                                                                          \
                                      ,GvarDefaut                                                                                       \
                                      ,FORMAT_CHAR_EDITION                                                                              \
                                      ,NEUT                                                                                             \
                                      ,TYPE_FORMAT_CHAR                                                                                 \
                                       );                                                                                               \
                    Eblock
#define   GENERE_L_SETENV(nom_de_la_variable_setenv,variable_correspondante)                                                            \
                    Bblock                                                                                                              \
                    GENERE_TYPE_SETENV(nom_de_la_variable_setenv                                                                        \
                                      ,variable_correspondante                                                                          \
                                      ,GLogDefaut                                                                                       \
                                      ,FORMAT_LOGI_EDITION                                                                              \
                                      ,ETAT_LOGIQUE                                                                                     \
                                      ,TYPE_FORMAT_LOGI                                                                                 \
                                       );                                                                                               \
                    Eblock
                                        /* Mise a jour eventuelle de la variable 'variable_correspondante' de type 'Int' ou de       */
                                        /* type 'Logical' dans le cas ou la variable '$nom_de_la_variable_setenv' existe dans        */
                                        /* l'environnement. Si elle n'existe pas dans l'environnement, elle conserve sa valeur       */
                                        /* anterieure (mis ici et sous cette forme le 20180218173415...).                            */
                                        /*                                                                                           */
                                        /* Les procedures 'GENERE_C_SETENV(...)' et 'GENERE_K_SETENV(...)' ont ete introduites       */
                                        /* le 20180219105636, mais sont inutiles a cette date...                                     */

DEFV(Common,DEFV(FonctionI,FgACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_APRES_GET_PARAMETRES()))
                                        /* Fonction introduite le 20180217182658 destinee a eviter la recompilation des '$K's        */
                                        /* dans le cas ou des actions nouvelles seraient introduites ici...                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
                                        /* On notera le 20180217184512 qu'ici on peut implementer des :                              */
                                        /*                                                                                           */
                                        /*                  EGAL(variable,GvalDefaut("NomVariableSETENV",variable));                 */
                                        /*                                                                                           */
                                        /* qui permettent de forcer tout a la fin de la recuperation de tous les parametres une ou   */
                                        /* plusieurs 'variable' dont la nouvelle valeur est donnee par '$NomVariableSETENV' qui      */
                                        /* est donc une variable d'environnement. On notera que si cette variable de type 'setenv'   */
                                        /* n'est pas definie, alors la variable conserve la valeur qu'elle avait avant l'execution   */
                                        /* de ce 'GvalDefaut(...)'. Ainsi, par exemple :                                             */
                                        /*                                                                                           */
                                        /*                  EGAL(CAL1_____executer,GvalDefaut("SETENV_CAL1",CAL1_____executer));     */
                                        /*                                                                                           */
                                        /* permettra de supprimer toutes les impressions de type 'CAL1(...)' grace a :               */
                                        /*                                                                                           */
                                        /*                  setenv    SETENV_CAL1         $NEXIST                                    */
                                        /*                                                                                           */
                                        /* Ainsi, grace a ce dispositif, on pourra bloquer, par exemple, tous les messages d'erreur  */
                                        /* des '$X's contenus dans un '$Z'...                                                        */

     Test(IL_FAUT(GENERE_TYPE_SETENV_____editer_les_variables_SETENV_universelles))
          Bblock
          CALS(Fsauts_de_lignes(DEUX));
               CAL3(Prme2("%s%s"
                    ,"Variables d'environnement 'universelles' disponibles et VALEUR PAR DEFAUT des indicateurs correspondants :\n"
                    ,"--------------------------------------------------------------------------------------------------------\n"
                          )
                    );
          CALS(Fsauts_de_lignes(DEUX));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     GENERE_L_SETENV_CAL1;
     GENERE_L_SETENV_CAL2;
     GENERE_L_SETENV_CAL3;
                                        /* Introduits le 20180218100655...                                                           */

     GENERE_L_SETENV_Alleger;
                                        /* Introduits le 20180218103006...                                                           */

     GENERE_L_SETENV_ATTENTION;
     GENERE_L_SETENV_ERREUR;
                                        /* Introduits le 20180218103006...                                                           */

     GENERE_L_SETENV_EnTetePrin;
     GENERE_L_SETENV_EnTetePrer;
     GENERE_L_SETENV_EnTetePrme;
                                        /* Introduits le 20180218103006...                                                           */

     GENERE_I_SETENV_ChiffresFlot;
                                        /* Introduits le 20180218190413...                                                           */

     Test(IL_FAUT(GENERE_TYPE_SETENV_____editer_les_variables_SETENV_universelles))
          Bblock
          CAL1(Prer0("\n\n"));
          PRINT_ATTENTION("cette option demandee provoque l'arret immediat de cette commande");
          CAL1(Prer0("(a savoir "));
          CAL1(Prer1("'UniverselleSetenv=%s'",C_VRAI____));
          CAL1(Prer0(")\n"));

          ABORT_Commande;
                                        /* Le 20180316103836, 'Exit(OK);' a ete remplace par 'ABORT_Commande' ce qui a l'avantage    */
                                        /* de permettre, si besoin est, les editions faites a cette occasion...                      */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

#undef    GENERE_L_SETENV
#undef    GENERE_K_SETENV
#undef    GENERE_I_SETENV
#undef    GENERE_C_SETENV

#undef    GENERE_TYPE_SETENV
#undef    GENERE_TYPE_SETENV_TABULATION
#undef    GENERE_TYPE_SETENV_INTRODUCTION

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P T M I S A T I O N   D E S   A C C E S   A U X   P A R A M E T R E S   D E S   C O M M A N D E S  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionL

DEFV(Common,DEFV(FonctionL,Fconversion_EditeValeur(c_est_le_premier_____titre_attendu_____dans_liste_titres_synonyme)))
                                        /* Fonction introduite le 20221029160630...                                                  */
DEFV(Argument,DEFV(Logical,c_est_le_premier_____titre_attendu_____dans_liste_titres_synonyme));
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(EditeValeur,LUNDEF));
     /*..............................................................................................................................*/
     EGAL(EditeValeur
         ,I3ET(IL_FAUT(editer_la_valeur_des_parametres_d_une_commande)
              ,I3OU(IFET(IL_FAUT(editer_les_synonymes_des_parametres_d_une_commande)
                        ,IL_NE_FAUT_PAS(grouper_les_synonymes_des_parametres_d_une_commande)
                         )
                   ,I3ET(IL_FAUT(editer_les_synonymes_des_parametres_d_une_commande)
                        ,IL_FAUT(grouper_les_synonymes_des_parametres_d_une_commande)
                        ,EST_VRAI(c_est_le_premier_____titre_attendu_____dans_liste_titres_synonyme)
                         )
                   ,IFET(IL_NE_FAUT_PAS(editer_les_synonymes_des_parametres_d_une_commande)
                        ,EST_FAUX(l_argument_possible_courant_est_un_synonyme_d_argument_anterieur)
                         )
                    )
              ,EST_VRAI(c_est_la_derniere_recherche_des_parametres)
               )
          );

     RETU(EditeValeur);
     Eblock

EFonctionL

BFonctionL

DEFV(Common,DEFV(FonctionL,Fconversion_NomEventuelValeur()))
                                        /* Fonction introduite le 20221029160630...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(NomEventuelValeur,LUNDEF));
     /*..............................................................................................................................*/
     EGAL(NomEventuelValeur
         ,I3ET(IL_FAUT(editer_la_valeur_des_parametres_d_une_commande)
              ,IL_FAUT(editer_le_nom_des_parametres_d_une_commande)
              ,EST_VRAI(c_est_la_derniere_recherche_des_parametres)
               )
          );

     RETU(NomEventuelValeur);
     Eblock

EFonctionL

BFonctionL

DEFV(Common,DEFV(FonctionL,Ftest_ENTREE_PAR_setenv()))
                                        /* Fonction introduite le 20221101101020...                                                  */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(test_ENTREE_PAR_setenv,LUNDEF));
     /*..............................................................................................................................*/
     EGAL(test_ENTREE_PAR_setenv
         ,I3ET(EST_VRAI(entrer_des_parametres_via_des_setenv)
              ,EST_FAUX(bloquer_provisoirement__entrer_des_parametres_via_des_setenv)
              ,IFOU(IFET(IFEQ(nombre_effectif_d_arguments,UN)
                        ,IFEQ(numero_d_argument_courant,NUMERO_ARGUMENT_COMMANDE)
                         )
                   ,IFET(IFGT(nombre_effectif_d_arguments,UN)
                        ,IFEQ(numero_d_argument_courant,NUMERO_PREMIER_ARGUMENT)
                         )
                    )
               )
          );

     RETU(test_ENTREE_PAR_setenv);
     Eblock

EFonctionL

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N E   V A R I A B L E   E N T I E R E  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(FconversionI__FconversionJ__FconversionX__FconversionY_____avertir_lors_de_l_entree_de_UNDEF,VRAI)));
                                        /* Doit-on avertir lorsqu'un entier valant 'UNDEF' est rencontre (introduit le               */
                                        /* 20070821130622) ?                                                                         */

DEFV(Common,DEFV(Logical,ZINT(FconversionJ__FconversionX__FconversionY_____confondre_les_types__J_X_Y__avec__le_type_I,FAUX)));
                                        /* Doit-on confondre les types {TYPE_FORMAT_JNTE,TYPE_FORMAT_XNTE,TYPE_FORMAT_YNTE} avec     */
                                        /* 'TYPE_FORMAT_INTE' (introduit le 20070422091209) ?                                        */

DEFV(Common,DEFV(Logical,ZINT(FconversionI__FconversionJ_____editer_les_valeurs_entieres_decimales_en_decimal,VRAI)));
                                        /* Doit-on editer en hexa-decimales les valeurs entieres entrees en decimal (parametre       */
                                        /* introduit le 20021204084514) ? Le 20070422091209, 'FconversionI__FconversionJ' a          */
                                        /* remplace 'FconversionI'...                                                                */
DEFV(Common,DEFV(Logical,ZINT(FconversionI__FconversionJ_____editer_les_valeurs_entieres_hexa_decimales_en_decimal,VRAI)));
                                        /* Doit-on editer en hexa-decimales les valeurs entieres entrees en hexa-decimal (parametre  */
                                        /* introduit le 20021204084514) ? Le 20070422091209, 'FconversionI__FconversionJ' a          */
                                        /* remplace 'FconversionI'...                                                                */

DEFV(Common,DEFV(Logical,ZINT(FconversionX__FconversionY_____editer_les_valeurs_entieres_decimales_en_decimal,FAUX)));
                                        /* Doit-on editer en hexa-decimales les valeurs entieres entrees en decimal (parametre       */
                                        /* introduit le 20070420182817) ? Le 20070422091209, 'FconversionX__FconversionY' a          */
                                        /* remplace 'FconversionX'...                                                                */
DEFV(Common,DEFV(Logical,ZINT(FconversionX__FconversionY_____editer_les_valeurs_entieres_hexa_decimales_en_decimal,FAUX)));
                                        /* Doit-on editer en hexa-decimales les valeurs entieres entrees en hexa-decimal (parametre  */
                                        /* introduit le 20070420182817) ? Le 20070422091209, 'FconversionX__FconversionY' a          */
                                        /* remplace 'FconversionX'...                                                                */

#define   VALEUR_VIDE_POUR_FconversionI                                                                                                 \
                    ZERO                                                                                                                \
                                        /* Valeur a donner a un nombre entier "vide"...                                              */
DEFV(Common,DEFV(Logical,ZINT(FconversionI__FconversionJ__FconversionX__FconversionY_____une_valeur_vide_doit_etre_forcee,VRAI)));
                                        /* Une valeur vide correspond-elle a la valeur par defaut ('FAUX') ou doit-elle etre forcee  */
                                        /* avec 'VALEUR_VIDE_POUR_FconversionI' ('VRAI') ? Ceci a ete introduit le 20120108101008... */

#define   GENERE__FonctionI_FconversionI(nom_et_arguments_de_la_fonction,Ed_10_10,Ed_16_10,TyPe)                                        \
                                        /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees       */ \
                                        /* a la recuperation automatique des fichiers d'arguments. Enfin, on notera que les noms des */ \
                                        /* Arguments ont ete raccourcis au maximum afin de faire tenir l'appel de cette procedure    */ \
                                        /* sur une ligne, et que ces noms sont choisis de facon a eviter au maximum des conflits     */ \
                                        /* avec des procedures pre-existantes (par exemple 'val(...)').                              */ \
                                        /*                                                                                           */ \
                                        /* Cette procedure fut introduite le 20070420182817...                                       */ \
                                        /*                                                                                           */ \
                                        /* Le 20070819142034 le parametre 'type' a ete remplace par 'TyPe' a cause du message        */ \
                                        /* introduit le 20070819135828 et qui contient le mot "type"...                              */ \
DEFV(FonctionI,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(CHAR,DTb0(chA)));                                                                                                    \
                                        /* Chaine Argument contenant la valeur d'une valeur entiere exprimee sous                    */ \
                                        /* forme d'une chaine alpha-numerique.                                                       */ \
DEFV(Argument,DEFV(CHAR,DTb0(ta)));                                                                                                     \
                                        /* "Titre", c'est-a-dire chaine de caracteres attendue devant la valeur                      */ \
                                        /* numerique proprement dit ; on aura ainsi par exemple :                                    */ \
                                        /*                                                                                           */ \
                                        /*                  chaineA       = "nombre=1000",                                           */ \
                                        /*                                                                                           */ \
                                        /* et :                                                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  titre_attendu = "nombre=".                                               */ \
                                        /*                                                                                           */ \
DEFV(Argument,DEFV(Int,vd));                                                                                                            \
                                        /* Valeur par defaut a renvoyer lorsque le "titre" attendu n'est pas trouve.                 */ \
DEFV(Argument,DEFV(Logical,ev));                                                                                                        \
                                        /* Indique s'il faut ('VRAI') ou pas ('FAUX') editer la valeur (qu'elle ait ete trouvee, ou  */ \
                                        /* qu'il s'agisse de la valeur par defaut...).                                               */ \
DEFV(Argument,DEFV(CHAR,DTb0(nm)));                                                                                                     \
                                        /* Donne eventuellement le nom de la valeur (introduit le 20011230080029).                   */ \
DEFV(Argument,DEFV(CHAR,DTb0(AR)));                                                                                                     \
                                        /* Donne eventuellement un indicateur du type "Argument" ou "Resultat" tres utile pour       */ \
                                        /* savoir, par exemple, si une image est un Argument ou un Resultat. Ceci fut introduit      */ \
                                        /* le 20060310093722).                                                                       */ \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     DEFV(Int,INIT(variable_entiere,vd));                                                                                               \
                                        /* Variable entiere intermediaire de conversion rendue necessaire par                        */ \
                                        /* 'ADRESSE' de 'SScan' ; elle est initialisee avec la 'valeur par defaut',                  */ \
                                        /* ce qui fait que si la recherche du "titre" echoue, on renvoie la 'valeur                  */ \
                                        /* par defaut'.                                                                              */ \
     DEFV(CHAR,INIT(POINTERc(titre_attendu_etendu),CHAINE_UNDEF));                                                                      \
                                        /* Afin de generer un titre "etendu" de recherche d'une eventuelle valeur hexa-decimale,     */ \
                                        /* puis de rendre la memoire allouee...                                                      */ \
     /*..............................................................................................................................*/ \
     EGAp(titre_attendu_etendu,chain_Aconcaten2(ta,SOUS_TITRE_D_UNE_VALEUR_HEXA_DECIMALE));                                             \
                                        /* Generation du format de la recherche d'une eventuelle valeur hexa-decimale.               */ \
     RECHERCHE_D_UNE_VALEUR(chA                                                                                                         \
                           ,titre_attendu_etendu                                                                                        \
                           ,ta                                                                                                          \
                           ,FORMAT_HEXA_DECIMAL                                                                                         \
                           ,FORMAT_HEXA_DECIMAL_EDITION                                                                                 \
                           ,ADRESSE(variable_entiere)                                                                                   \
                           ,NE_PAS_EDITER_LES_VALEURS_APRES_Fconversion                                                                 \
                           ,TYPE_FORMAT_CHAI                                                                                            \
                           ,nm                                                                                                          \
                           ,AR                                                                                                          \
                           ,CHAIN_aCOPIE_AVEC_CONVERSIONS_POSSIBLES_MAJUSCULES_MINUSCULES                                               \
                            );                                                                                                          \
                                        /* Conversion de l'alpha-numerique en hexa-decimal si le "titre" attendu "etendu" precede    */ \
                                        /* la valeur numerique. On notera 'NE_PAS_EDITER_LES_VALEURS_APRES_Fconversion' qui          */ \
                                        /* interdit systematiquement l'edition de la valeur afin que la valeur decimale, si elle     */ \
                                        /* presente soit editee ; au cas ou la valeur decimale ne serait pas presente la valeur      */ \
                                        /* hexa-decimale sera recuperee une deuxieme fois afin de l'editer eventuellement...         */ \
                                                                                                                                        \
     Test(PAS_PRESENT(valeur_recherchee))                                                                                               \
          Bblock                                                                                                                        \
                                        /* Lorsque la valeur attendue hexa-decimale n'a pas ete trouvee, une tentative decimale va   */ \
                                        /* etre faite. On notera que l'on teste dans l'ordre :                                       */ \
                                        /*                                                                                           */ \
                                        /*                  1-l'hexadecimal,                                                         */ \
                                        /*                  2-puis le decimal,                                                       */ \
                                        /*                  3-puis l'hexadecimal de nouveau,                                         */ \
                                        /*                                                                                           */ \
                                        /* car, en effet, sinon avec l'ordre inverse, une ecriture du type :                         */ \
                                        /*                                                                                           */ \
                                        /*                  argument=0x....                                                          */ \
                                        /*                                                                                           */ \
                                        /* donnerait a 'argument' la valeur 0 (qui est le premier caractere suivant 'titre_attendu'  */ \
                                        /* et qui par malheur est un caractere decimal...).                                          */ \
          RECHERCHE_D_UNE_VALEUR(chA                                                                                                    \
                                ,ta                                                                                                     \
                                ,ta                                                                                                     \
                                ,FORMAT_INTE                                                                                            \
                                ,COND(IL_FAUT(Ed_10_10)                                                                                 \
                                     ,ccCHAR(FORMAT_INTE_EDITION)                                                                       \
                                     ,ccCHAR(FORMAT_HEXA_DECIMAL_EDITION)                                                               \
                                      )                                                                                                 \
                                ,ADRESSE(variable_entiere)                                                                              \
                                ,ev                                                                                                     \
                                ,TyPe                                                                                                   \
                                ,nm                                                                                                     \
                                ,AR                                                                                                     \
                                ,CHAIN_aCOPIE_AVEC_CONVERSIONS_POSSIBLES_MAJUSCULES_MINUSCULES                                          \
                                 );                                                                                                     \
                                        /* Conversion de l'alpha-numerique en entier decimal si le "titre" attendu precede la        */ \
                                        /* valeur numerique.                                                                         */ \
                                                                                                                                        \
          Test(PRESENT(valeur_recherchee))                                                                                              \
                                        /* Cas ou la valeur a ete trouve : mais est-elle bien entiere ?                              */ \
               Bblock                                                                                                                   \
               DEFV(Float_SScan,INIT(variable_flottante,FLOT(vd)));                                                                     \
                                        /* Variable flottante intermediaire de conversion rendue necessaire pour valider la nature   */ \
                                        /* entiere de 'variable_entiere'.                                                            */ \
               RECHERCHE_D_UNE_VALEUR(chA                                                                                               \
                                     ,ta                                                                                                \
                                     ,ta                                                                                                \
                                     ,FORMAT_FLOT                                                                                       \
                                     ,FORMAT_FLOT_EDITION                                                                               \
                                     ,ADRESSE(variable_flottante)                                                                       \
                                     ,NE_PAS_EDITER_LES_VALEURS_APRES_Fconversion                                                       \
                                     ,TYPE_FORMAT_CHAI                                                                                  \
                                     ,nm                                                                                                \
                                     ,AR                                                                                                \
                                     ,CHAIN_aCOPIE_AVEC_CONVERSIONS_POSSIBLES_MAJUSCULES_MINUSCULES                                     \
                                      );                                                                                                \
                                        /* Cette validation a ete introduite le 20040301095143...                                    */ \
                                                                                                                                        \
               Test(IFNE(FLOT(variable_entiere),variable_flottante))                                                                    \
                    Bblock                                                                                                              \
                                        /* Cas ou la valeur n'est pas entiere :                                                      */ \
                    PRINT_ERREUR("un parametre qui devrait etre entier est en fait decimal");                                           \
                    CAL1(Prer3("(il s'agit de '%s', alors que seul '%s%" ## BFd ## " est possible, ",chA,ta,variable_entiere));         \
                    CAL1(Prer1("la valeur entiere vaut %d ",variable_entiere));                                                         \
                    CAL1(Prer1("alors que la valeur flottante vaut %.^^^)\n",variable_flottante));                                      \
                    Eblock                                                                                                              \
               ATes                                                                                                                     \
                    Bblock                                                                                                              \
                                        /* Cas ou la valeur est entiere...                                                           */ \
                    Eblock                                                                                                              \
               ETes                                                                                                                     \
               Eblock                                                                                                                   \
          ATes                                                                                                                          \
               Bblock                                                                                                                   \
               Eblock                                                                                                                   \
          ETes                                                                                                                          \
          Eblock                                                                                                                        \
     ATes                                                                                                                               \
          Bblock                                                                                                                        \
                                        /* Lorsque la valeur attendue hexa-decimale a ete trouvee, on est oblige de le refaire une   */ \
                                        /* deuxieme fois afin de permettre un eventuelle edition de sa valeur...                     */ \
          RECHERCHE_D_UNE_VALEUR(chA                                                                                                    \
                                ,titre_attendu_etendu                                                                                   \
                                ,ta                                                                                                     \
                                ,FORMAT_HEXA_DECIMAL                                                                                    \
                                ,COND(IL_FAUT(Ed_16_10)                                                                                 \
                                     ,ccCHAR(FORMAT_INTE_EDITION)                                                                       \
                                     ,ccCHAR(FORMAT_HEXA_DECIMAL_EDITION)                                                               \
                                      )                                                                                                 \
                                ,ADRESSE(variable_entiere)                                                                              \
                                ,ev                                                                                                     \
                                ,TyPe                                                                                                   \
                                ,nm                                                                                                     \
                                ,AR                                                                                                     \
                                ,CHAIN_aCOPIE_AVEC_CONVERSIONS_POSSIBLES_MAJUSCULES_MINUSCULES                                          \
                                 );                                                                                                     \
                                        /* Conversion de l'alpha-numerique en hexa-decimal si le "titre" attendu "etendu" precede    */ \
                                        /* la valeur numerique. On notera donc que lorsque la valeur decimale n'a pas ete recuperee  */ \
                                        /* on refait la recuperation de la valeur hexa-decimale afin de permettre son eventuelle     */ \
                                        /* edition...                                                                                */ \
          Eblock                                                                                                                        \
     ETes                                                                                                                               \
                                                                                                                                        \
     Test(PRESENT(valeur_recherchee))                                                                                                   \
          Bblock                                                                                                                        \
          Test(IFET(EST_VRAI(valeur_trouvee_et_vide)                                                                                    \
                   ,EST_VRAI(FconversionI__FconversionJ__FconversionX__FconversionY_____une_valeur_vide_doit_etre_forcee)               \
                    )                                                                                                                   \
               )                                                                                                                        \
               Bblock                                                                                                                   \
               EGAL(variable_entiere,VALEUR_VIDE_POUR_FconversionI);                                                                    \
                                        /* Cas des valeurs vides, ce traitement ayant ete mis en place le 19970507102431.            */ \
               Eblock                                                                                                                   \
          ATes                                                                                                                          \
               Bblock                                                                                                                   \
               Eblock                                                                                                                   \
          ETes                                                                                                                          \
                                                                                                                                        \
          Test(IL_FAUT(FconversionI__FconversionJ__FconversionX__FconversionY_____avertir_lors_de_l_entree_de_UNDEF))                   \
                                        /* Test introduit le 20070821130622...                                                       */ \
               Bblock                                                                                                                   \
               Test(IFEQ(variable_entiere,UNDEF))                                                                                       \
                                        /* Test introduit le 20070819135828 a cause de 'v $xig/fonct$vv$DEF GIT_ARGUMENT_I'...       */ \
                    Bblock                                                                                                              \
                    PRINT_ATTENTION("un parametre de type 'Int' a pour valeur 'UNDEF'");                                                \
                    CAL1(Prer1("(il s'agit de '%s')\n",chA));                                                                           \
                    Eblock                                                                                                              \
               ATes                                                                                                                     \
                    Bblock                                                                                                              \
                    Eblock                                                                                                              \
               ETes                                                                                                                     \
               Eblock                                                                                                                   \
          ATes                                                                                                                          \
               Bblock                                                                                                                   \
               Eblock                                                                                                                   \
          ETes                                                                                                                          \
          Eblock                                                                                                                        \
     ATes                                                                                                                               \
          Bblock                                                                                                                        \
          Test(EST_VRAI(valeur_trouvee_mais_avec_des_caracteres_parasites_en_queue))                                                    \
               Bblock                                                                                                                   \
               EGAL(variable_entiere,vd);                                                                                               \
                                        /* Ceci a ete introduit le 20051114124617, lors de la mise en place du detecteur de          */ \
                                        /* caracteres parasites rencontres eventuellement derriere la valeur d'un parametre.         */ \
                                        /* Ce n'est que dans le cas ou de tels caracteres parasites ont ete rencontres qu'il         */ \
                                        /* faut retablir la valeur par defaut (puisque le 'SSca2(...)' a bien eu lieu et que         */ \
                                        /* la valeur du parametre a bien ete mise dans 'variable_entiere' qu'il faut donc            */ \
                                        /* retablir a sa valeur par defaut 'valeur_par_defaut'...                                    */ \
               Eblock                                                                                                                   \
          ATes                                                                                                                          \
               Bblock                                                                                                                   \
               Eblock                                                                                                                   \
          ETes                                                                                                                          \
          Eblock                                                                                                                        \
     ETes                                                                                                                               \
                                                                                                                                        \
     CALZ_FreCC(titre_attendu_etendu);                                                                                                  \
                                        /* Liberation de l'espace contenant le titre "etendu".                                       */ \
                                                                                                                                        \
     RETU(variable_entiere);                                                                                                            \
                                        /* Et on renvoie la valeur entiere convertie ou la 'valeur par defaut'.                      */ \
     Eblock

#define   EIAA                                                                                                                          \
                    FconversionI__FconversionJ_____editer_les_valeurs_entieres_decimales_en_decimal
#define   EIGA                                                                                                                          \
                    FconversionI__FconversionJ_____editer_les_valeurs_entieres_hexa_decimales_en_decimal
                                        /* Afin de raccourcir les lignes qui suivent en notant les correspondances :                 */
                                        /*                                                                                           */
                                        /*                  A   -->   10                                                             */
                                        /*                  G   -->   16                                                             */
                                        /*                                                                                           */

BFonctionI

DEFV(Common,GENERE__FonctionI_FconversionI(FconversionI(chA,ta,vd,ev,nm,AR),EIAA,EIGA,TYPE_FORMAT_INTE)) /* Common,DEFV(Fonction,) : */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_FconversionI(FconversionJ(chA,ta,vd,ev,nm,AR),EIAA,EIGA,TYPE_FORMAT_JNTE)) /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* La fonction 'FconversionJ(...)' a ete introduite le 20070421181824...                     */

#undef    EIGA
#undef    EIAA

#define   EXAA                                                                                                                          \
                    FconversionX__FconversionY_____editer_les_valeurs_entieres_decimales_en_decimal
#define   EXGA                                                                                                                          \
                    FconversionX__FconversionY_____editer_les_valeurs_entieres_hexa_decimales_en_decimal
                                        /* Afin de raccourcir les lignes qui suivent en notant les correspondances :                 */
                                        /*                                                                                           */
                                        /*                  A   -->   10                                                             */
                                        /*                  G   -->   16                                                             */
                                        /*                                                                                           */

BFonctionI

DEFV(Common,GENERE__FonctionI_FconversionI(FconversionX(chA,ta,vd,ev,nm,AR),EXAA,EXGA,TYPE_FORMAT_XNTE)) /* Common,DEFV(Fonction,) : */

EFonctionI

BFonctionI

DEFV(Common,GENERE__FonctionI_FconversionI(FconversionY(chA,ta,vd,ev,nm,AR),EXAA,EXGA,TYPE_FORMAT_YNTE)) /* Common,DEFV(Fonction,) : */

EFonctionI

                                        /* La fonction 'FconversionX(...)' a ete introduite le 20070420182817 pour etre utilisee     */
                                        /* dans 'v $xcg/parallele.01$K GET_ARGUMENT_X'. Quant a la fonction 'FconversionY(...)'      */
                                        /* elle fut introduite le 20070421183438...                                                  */

#undef    EXGA
#undef    EXAA

#undef    GENERE__FonctionI_FconversionI

#undef    VALEUR_VIDE_POUR_FconversionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N E   V A R I A B L E   " P O I N T "  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,FconversionP(chaineA,titre_attendu,valeur_par_defaut,editer_la_valeur,nom_eventuel_de_la_valeur,A_R)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine Argument contenant la valeur d'une valeur "point" exprimee sous                    */
                                        /* forme d'une chaine alpha-numerique.                                                       */
DEFV(Argument,DEFV(CHAR,DTb0(titre_attendu)));
                                        /* "Titre", c'est-a-dire chaine de caracteres attendue devant la valeur                      */
                                        /* numerique proprement dit ; on aura ainsi par exemple :                                    */
                                        /*                                                                                           */
                                        /*                  chaineA       = "niveau=255",                                            */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  titre_attendu = "niveau=".                                               */
                                        /*                                                                                           */
DEFV(Argument,DEFV(genere_p,valeur_par_defaut));
                                        /* Valeur par defaut a renvoyer lorsque le "titre" attendu n'est pas trouve.                 */
DEFV(Argument,DEFV(Logical,editer_la_valeur));
                                        /* Indique s'il faut ('VRAI') ou pas ('FAUX') editer la valeur (qu'elle ait ete trouvee, ou  */
                                        /* qu'il s'agisse de la valeur par defaut...).                                               */
DEFV(Argument,DEFV(CHAR,DTb0(nom_eventuel_de_la_valeur)));
                                        /* Donne eventuellement le nom de la valeur (introduit le 20011230080029).                   */
DEFV(Argument,DEFV(CHAR,DTb0(A_R)));
                                        /* Donne eventuellement un indicateur du type "Argument" ou "Resultat" tres utile pour       */
                                        /* savoir, par exemple, si une image est un Argument ou un Resultat. Ceci fut introduit      */
                                        /* le 20060310093722).                                                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(valeur_point_en_entier
                  ,FconversionI(chaineA,titre_attendu,INTE(valeur_par_defaut),editer_la_valeur,nom_eventuel_de_la_valeur,A_R)
                   )
          );
                                        /* Variable entiere intermediaire destinee a permettre les tests de debordement...           */
     /*..............................................................................................................................*/
     Test(IFEXff(valeur_point_en_entier,INTE(NOIR),INTE(BLANC)))
          Bblock
          PRINT_ERREUR("la valeur demandee pour une variable 'point' est hors de [NOIR,BLANC] et va donc etre tronquee");
          CAL1(Prer1("valeur entiere recuperee = '%" ## BFd ## "'\n",valeur_point_en_entier));
          CAL1(Prer1("valeur 'point' tronquee. = '%" ## BFd ## "'\n",GENP(valeur_point_en_entier)));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU(GENP(valeur_point_en_entier));
                                        /* Et on renvoie la valeur "point" convertie si le "titre" attendu precede                   */
                                        /* la valeur numerique ou la 'valeur par defaut'.                                            */
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N E   V A R I A B L E   F L O T T A N T E   S I M P L E - P R E C I S I O N  :                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionF

DEFV(Common,DEFV(Logical,SINT(FconversionF_____avertir_lors_de_l_entree_de_FLOT__UNDEF,VRAI)));
                                        /* Doit-on avertir lorsqu'un flottant valant 'FLOT__UNDEF' est rencontre (introduit le       */
                                        /* 20070821130622) ?                                                                         */

#define   VALEUR_VIDE_POUR_FconversionF                                                                                                 \
                    FZERO                                                                                                               \
                                        /* Valeur a donner a un nombre flottant "vide"...                                            */
DEFV(Common,DEFV(Logical,SINT(FconversionF_____une_valeur_vide_doit_etre_forcee,VRAI)));
                                        /* Une valeur vide correspond-elle a la valeur par defaut ('FAUX') ou doit-elle etre forcee  */
                                        /* avec 'VALEUR_VIDE_POUR_FconversionF' ('VRAI') ? Ceci a ete introduit le 20120108101008... */

DEFV(Common,DEFV(FonctionF,FconversionF(chaineA,titre_attendu,valeur_par_defaut,editer_la_valeur,nom_eventuel_de_la_valeur,A_R)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine Argument contenant la valeur d'une valeur flottante exprimee sous                  */
                                        /* forme d'une chaine alpha-numerique.                                                       */
DEFV(Argument,DEFV(CHAR,DTb0(titre_attendu)));
                                        /* "Titre", c'est-a-dire chaine de caracteres attendue devant la valeur                      */
                                        /* numerique proprement dit ; on aura ainsi par exemple :                                    */
                                        /*                                                                                           */
                                        /*                  chaineA       = "seuil=3.14",                                            */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  titre_attendu = "seuil=".                                                */
                                        /*                                                                                           */
DEFV(Argument,DEFV(Float,valeur_par_defaut));
                                        /* Valeur par defaut a renvoyer lorsque le "titre" attendu n'est pas trouve.                 */
DEFV(Argument,DEFV(Logical,editer_la_valeur));
                                        /* Indique s'il faut ('VRAI') ou pas ('FAUX') editer la valeur (qu'elle ait ete trouvee, ou  */
                                        /* qu'il s'agisse de la valeur par defaut...).                                               */
DEFV(Argument,DEFV(CHAR,DTb0(nom_eventuel_de_la_valeur)));
                                        /* Donne eventuellement le nom de la valeur (introduit le 20011230080029).                   */
DEFV(Argument,DEFV(CHAR,DTb0(A_R)));
                                        /* Donne eventuellement un indicateur du type "Argument" ou "Resultat" tres utile pour       */
                                        /* savoir, par exemple, si une image est un Argument ou un Resultat. Ceci fut introduit      */
                                        /* le 20060310093722).                                                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Float_SScan,INIT(variable_flottante,valeur_par_defaut));
                                        /* Variable flottante intermediaire de conversion rendue necessaire par                      */
                                        /* 'ADRESSE' de 'SScan' ; elle est initialisee avec la 'valeur par defaut',                  */
                                        /* ce qui fait que si la recherche du "titre" echoue, on renvoie la 'valeur                  */
                                        /* par defaut'. On notera le 'Float_SScan' au cas ou 'SScan' ne connaitrait                  */
                                        /* que la simple precision...                                                                */
     /*..............................................................................................................................*/
     RECHERCHE_D_UNE_VALEUR(chaineA
                           ,titre_attendu
                           ,titre_attendu
                           ,FORMAT_FLOT
                           ,FORMAT_FLOT_EDITION
                           ,ADRESSE(variable_flottante)
                           ,editer_la_valeur
                           ,TYPE_FORMAT_FLOT
                           ,nom_eventuel_de_la_valeur
                           ,A_R
                           ,CHAIN_aCOPIE_AVEC_CONVERSIONS_POSSIBLES_MAJUSCULES_MINUSCULES
                            );
                                        /* Conversion de l'alpha-numerique en flottant si le "titre" attendu precede la              */
                                        /* valeur numerique.                                                                         */

     Test(PRESENT(valeur_recherchee))
          Bblock
          Test(IFET(EST_VRAI(valeur_trouvee_et_vide)
                   ,EST_VRAI(FconversionF_____une_valeur_vide_doit_etre_forcee)
                    )
               )
               Bblock
               EGAL(variable_flottante,VALEUR_VIDE_POUR_FconversionF);
                                        /* Cas des valeurs vides, ce traitement ayant ete mis en place le 19970507102431.            */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IL_FAUT(FconversionF_____avertir_lors_de_l_entree_de_FLOT__UNDEF))
                                        /* Test introduit le 20070821130622...                                                       */
               Bblock
               Test(IFEQ(variable_flottante,FLOT__UNDEF))
                                        /* Test introduit le 20070819135828 a cause de 'v $xig/fonct$vv$DEF GIT_ARGUMENT_F'...       */
                    Bblock
                    PRINT_ATTENTION("un parametre de type 'Flot' a pour valeur 'FLOT__UNDEF'");
                    CAL1(Prer1("(il s'agit de '%s')\n",chaineA));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Test(EST_VRAI(valeur_trouvee_mais_avec_des_caracteres_parasites_en_queue))
               Bblock
               EGAL(variable_flottante,valeur_par_defaut);
                                        /* Ceci a ete introduit le 20051114124617, lors de la mise en place du detecteur de          */
                                        /* caracteres parasites rencontres eventuellement derriere la valeur d'un parametre.         */
                                        /* Ce n'est que dans le cas ou de tels caracteres parasites ont ete rencontres qu'il         */
                                        /* faut retablir la valeur par defaut (puisque le 'SSca2(...)' a bien eu lieu et que         */
                                        /* la valeur du parametre a bien ete mise dans 'variable_flottante' qu'il faut donc          */
                                        /* retablir a sa valeur par defaut 'valeur_par_defaut'...                                    */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETes

     RETU(variable_flottante);
                                        /* Et on renvoie la valeur flottante convertie ou la 'valeur par defaut'.                    */
     Eblock

#undef    VALEUR_VIDE_POUR_FconversionF

EFonctionF

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N E   V A R I A B L E   C A R A C T E R E  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionC

#if       (         (defined(SYSTEME_APC_LinuxDebian_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxMandrake_GCC))                                                                            \
          ||        (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
           )
#    define    EDITER_LA_VALEUR_dans_FconversionK(editer_la_valeur,variable_caractere)                                                  \
                         IFET(editer_la_valeur,EST_FAUX(est_ce_un_code_de_controle(variable_caractere)))

#    undef     EDITER_LA_VALEUR_dans_FconversionK

#    define    EDITER_LA_VALEUR_dans_FconversionK(editer_la_valeur,variable_caractere)                                                  \
                         editer_la_valeur
                                        /* Faut-il editer 'variable_caractere' ?                                                     */
                                        /*                                                                                           */
                                        /* Le test de non code de controle de 'variable_caractere' est destine principalement a      */
                                        /* eliminer l'edition de 'signe_de_FORMAT_INTE_EDITION' et de 'signe_de_FORMAT_FLOT_EDITION' */
                                        /* car, en effet, sur 'SYSTEME_APC_Linux...' l'ecriture :                                    */
                                        /*                                                                                           */
                                        /*                  COMMANDE  Parametres=VRAI SigneInt="" SigneFlot="" |& $GRE ...           */
                                        /*                                                                                           */
                                        /* ou :                                                                                      */
                                        /*                                                                                           */
                                        /*                  COMMANDE  Parametres=VRAI SigneInt='' SigneFlot='' |& $GRE ...           */
                                        /*                                                                                           */
                                        /* donne le message :                                                                        */
                                        /*                                                                                           */
                                        /*                  Binary file (standard input) matches                                     */
                                        /*                                                                                           */
                                        /* qui vient de l'edition du parametre "SigneInt=" qui contient donc un 'K_NULL' faisant     */
                                        /* donc du fichier de sortie un fichier binaire...                                           */
                                        /*                                                                                           */
                                        /* Au passage, un test effectue sur '$LACT15' le 20061019151435 n'a pas montre ce probleme,  */
                                        /* ceci faisant suite a un commentaire de 'v $Falias_use 20061019151625'. Peut-etre ce       */
                                        /* probleme depend-il de la distribution de 'Linux'...                                       */
                                        /*                                                                                           */
                                        /* Le 20061019162748 remarquant ('v $Falias_use 20061019151625') que cela pouvait eliminer   */
                                        /* l'edition de certains parametres, je supprime cette definition conditionnelle, et fait    */
                                        /* en sorte que le format d'edition "standard" ('FORMAT_CHAR_EDITION') soit remplace par     */
                                        /* 'FORMAT_HEXA_DECIMAL_EDITION' lorsque la valeur de type "caractere" n'est pas editable... */
                                        /* Au passage, la definition anterieure de 'EDITER_LA_VALEUR_dans_FconversionK(...)' est     */
                                        /* conservee au cas ou, ainsi que cette structure conditionnelle relative au SYSTEME...      */
#Aif      (         (defined(SYSTEME_APC_LinuxDebian_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxMandrake_GCC))                                                                            \
          ||        (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
           )
#    define    EDITER_LA_VALEUR_dans_FconversionK(editer_la_valeur,variable_caractere)                                                  \
                         editer_la_valeur                                                                                               \
                                        /* Faut-il editer 'variable_caractere' ?                                                     */
#Eif      (         (defined(SYSTEME_APC_LinuxDebian_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxMandrake_GCC))                                                                            \
          ||        (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
           )

#define   VALEUR_VIDE_POUR_FconversionK                                                                                                 \
                    K_NULL                                                                                                              \
                                        /* Valeur a donner a un caractere "vide"...                                                  */
DEFV(Common,DEFV(Logical,SINT(FconversionK_____une_valeur_vide_doit_etre_forcee,VRAI)));
                                        /* Une valeur vide correspond-elle a la valeur par defaut ('FAUX') ou doit-elle etre forcee  */
                                        /* avec 'VALEUR_VIDE_POUR_FconversionK' ('VRAI') ? Ceci a ete introduit le 20120108101008... */

DEFV(Common,DEFV(FonctionC,FconversionK(chaineA,titre_attendu,valeur_par_defaut,editer_la_valeur,nom_eventuel_de_la_valeur,A_R)))
DEFV(Argument,DEFV(CHAR,DTb0(chaineA)));
                                        /* Chaine Argument contenant la valeur d'un caractere.                                       */
DEFV(Argument,DEFV(CHAR,DTb0(titre_attendu)));
                                        /* "Titre", c'est-a-dire chaine de caracteres attendue devant le caractere                   */
                                        /* proprement dit ; on aura ainsi par exemple :                                              */
                                        /*                                                                                           */
                                        /*                  chaineA       = "caract=A",                                              */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  titre_attendu = "caract=".                                               */
                                        /*                                                                                           */
DEFV(Argument,DEFV(CHAR,valeur_par_defaut));
                                        /* Valeur par defaut a renvoyer lorsque le "titre" attendu n'est pas trouve.                 */
DEFV(Argument,DEFV(Logical,editer_la_valeur));
                                        /* Indique s'il faut ('VRAI') ou pas ('FAUX') editer la valeur (qu'elle ait ete trouvee, ou  */
                                        /* qu'il s'agisse de la valeur par defaut...).                                               */
DEFV(Argument,DEFV(CHAR,DTb0(nom_eventuel_de_la_valeur)));
                                        /* Donne eventuellement le nom de la valeur (introduit le 20011230080029).                   */
DEFV(Argument,DEFV(CHAR,DTb0(A_R)));
                                        /* Donne eventuellement un indicateur du type "Argument" ou "Resultat" tres utile pour       */
                                        /* savoir, par exemple, si une image est un Argument ou un Resultat. Ceci fut introduit      */
                                        /* le 20060310093722).                                                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIT(variable_caractere,valeur_par_defaut));
                                        /* Variable caractere intermediaire de conversion rendue necessaire par                      */
                                        /* 'ADRESSE' de 'SScan' ; elle est initialisee avec la 'valeur par defaut',                  */
                                        /* ce qui fait que si la recherche du "titre" echoue, on renvoie la 'valeur                  */
                                        /* par defaut'.                                                                              */
     /*..............................................................................................................................*/
     RECHERCHE_D_UNE_VALEUR(chaineA
                           ,titre_attendu
                           ,titre_attendu
                           ,FORMAT_CHAR
                           ,COND(EST_FAUX(est_ce_un_code_de_controle(variable_caractere))
                                ,COND(IFNE(variable_caractere,K_VERITABLE_APOSTROPHE)
                                     ,ccCHAR(FORMAT_CHAR_EDITION)
                                     ,ccCHAR(FORMAT_CHAR_EDITION_BACKSLASHEE)
                                      )
                                ,ccCHAR(FORMAT_CHAR_HEXA_DECIMAL_EDITION)
                                 )
                           ,ADRESSE(variable_caractere)
                           ,EDITER_LA_VALEUR_dans_FconversionK(editer_la_valeur,variable_caractere)
                           ,TYPE_FORMAT_CHAR
                           ,nom_eventuel_de_la_valeur
                           ,A_R
                           ,CHAIN_aCOPIE_AVEC_CONVERSIONS_POSSIBLES_MAJUSCULES_MINUSCULES
                            );
                                        /* Conversion de l'alpha-numerique en caractere si le "titre" attendu precede la             */
                                        /* caractere.                                                                                */
                                        /*                                                                                           */
                                        /* Le 20061019162748, le format d'edition est devenu conditionnel afin de faire disparaitre  */
                                        /* l'anomalie de d'edition des parametres decrite en 'v $Falias_use 20061019151625'. Ainsi   */
                                        /* a compter de cette date, tous les parametres sont edites ce qui presente l'avantage       */
                                        /* supplementaire de garantir de bon fonctionnement de l'alternance d'edition des parametres */
                                        /* ('v $xig/fonct$vv$DEF ALTERNANCE_DES_PARAMETRES_DEBUT') qui, faisant un test de parite,   */
                                        /* ne donnait pas satisfaction dans le cas ou un nombre impair de parametres successifs      */
                                        /* n'etaient pas edites...                                                                   */
                                        /*                                                                                           */
                                        /* On notera de plus que lorsque 'variable_caractere' est testee pour choisir le format      */
                                        /* d'edition, c'est, dans le cas ou sa valeur fut introduite explicitement comme parametre,  */
                                        /* cette nouvelle valeur (et non pas 'valeur_par_defaut') qui est utilisee (ce qui est fort  */
                                        /* heureux...).                                                                              */
                                        /*                                                                                           */
                                        /* Le 20070228115711, fut introduit 'FORMAT_CHAR_EDITION_BACKSLASHE' pour permettre une      */
                                        /* edition correcte de 'K_APOSTROPHE'...                                                     */

     Test(PRESENT(valeur_recherchee))
          Bblock
          Test(IFET(EST_VRAI(valeur_trouvee_et_vide)
                   ,EST_VRAI(FconversionK_____une_valeur_vide_doit_etre_forcee)
                    )
               )
               Bblock
               EGAL(variable_caractere,VALEUR_VIDE_POUR_FconversionK);
                                        /* Cas des valeurs vides, ce traitement ayant ete mis en place le 19970507102431.            */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Test(EST_VRAI(valeur_trouvee_mais_avec_des_caracteres_parasites_en_queue))
               Bblock
               EGAL(variable_caractere,valeur_par_defaut);
                                        /* Ceci a ete introduit le 20051114124617, lors de la mise en place du detecteur de          */
                                        /* caracteres parasites rencontres eventuellement derriere la valeur d'un parametre.         */
                                        /* Ce n'est que dans le cas ou de tels caracteres parasites ont ete rencontres qu'il         */
                                        /* faut retablir la valeur par defaut (puisque le 'SSca2(...)' a bien eu lieu et que         */
                                        /* la valeur du parametre a bien ete mise dans 'variable_caractere' qu'il faut donc          */
                                        /* retablir a sa valeur par defaut 'valeur_par_defaut'...                                    */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETes

     RETU(variable_caractere);
                                        /* Et on renvoie la valeur caractere convertie ou la 'valeur par defaut'.                    */
     Eblock

#undef    VALEUR_VIDE_POUR_FconversionK

#if       (         (defined(SYSTEME_APC_LinuxDebian_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxMandrake_GCC))                                                                            \
          ||        (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
           )
#    undef     EDITER_LA_VALEUR_dans_FconversionK
#Aif      (         (defined(SYSTEME_APC_LinuxDebian_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxMandrake_GCC))                                                                            \
          ||        (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
           )
#    undef     EDITER_LA_VALEUR_dans_FconversionK
#Eif      (         (defined(SYSTEME_APC_LinuxDebian_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxMandrake_GCC))                                                                            \
          ||        (defined(SYSTEME_APC_LinuxRedHat_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUbuntu_ICC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_GCC))                                                                              \
          ||        (defined(SYSTEME_APC_LinuxUlmint_ICC))                                                                              \
           )

EFonctionC

#undef    CHAIN_aCOPIE_AVEC_CONVERSIONS_POSSIBLES_MAJUSCULES_MINUSCULES

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E C U P E R A T I O N   D ' U N E   S O U S - C H A I N E   D E   C A R A C T E R E S  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   VALEUR_VIDE_POUR_FconversionC                                                                                                 \
                    C_VIDE                                                                                                              \
                                        /* Valeur a donner a une chaine "vide"...                                                    */
DEFV(Common,DEFV(Logical,ZINT(FconversionC__FconversionCL__FconversionCN_____une_valeur_vide_doit_etre_forcee,VRAI)));
                                        /* Une valeur vide correspond-elle a la valeur par defaut ('FAUX') ou doit-elle etre forcee  */
                                        /* avec 'VALEUR_VIDE_POUR_FconversionC' ('VRAI') ? Ceci a ete introduit le 20120108101008... */

#pragma   xcg__gen_ext_Z__gen_Fonction_SE__GENERE__Fonction                     GENERE__FonctionC_FconversionC          POINTERc
                                        /* Introduit le 20040520120927.                                                              */
#define   GENERE__FonctionC_FconversionC(nom_et_arguments_de_la_fonction,type)                                                          \
                                        /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees       */ \
                                        /* a la recuperation automatique des fichiers d'arguments. Enfin, on notera que les noms des */ \
                                        /* Arguments ont ete raccourcis au maximum afin de faire tenir l'appel de cette procedure    */ \
                                        /* sur une ligne, et que ces noms sont choisis de facon a eviter au maximum des conflits     */ \
                                        /* avec des procedures pre-existantes (par exemple 'val(...)').                              */ \
DEFV(FonctionC,POINTERc(nom_et_arguments_de_la_fonction))                                                                               \
DEFV(Argument,DEFV(CHAR,DTb0(chA)));                                                                                                    \
                                        /* Chaine Argument contenant la sous-chaine a extraire.                                      */ \
DEFV(Argument,DEFV(CHAR,DTb0(ti_a)));                                                                                                   \
                                        /* "Titre", c'est-a-dire chaine de caracteres attendue devant la                             */ \
                                        /* sous-chaine proprement dit ; on aura ainsi par exemple :                                  */ \
                                        /*                                                                                           */ \
                                        /*                  chA  = "nom=IMAGE",                                                      */ \
                                        /*                                                                                           */ \
                                        /* et :                                                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  ti_a = "nom=".                                                           */ \
                                        /*                                                                                           */ \
DEFV(Argument,DEFV(CHAR,DTb0(ch_d)));                                                                                                   \
                                        /* Valeur par defaut a renvoyer lorsque le "titre" attendu n'est pas trouve.                 */ \
DEFV(Argument,DEFV(Logical,edit_v));                                                                                                    \
                                        /* Indique s'il faut ('VRAI') ou pas ('FAUX') editer la valeur (qu'elle ait ete trouvee, ou  */ \
                                        /* qu'il s'agisse de la valeur par defaut...).                                               */ \
DEFV(Argument,DEFV(CHAR,DTb0(nm)));                                                                                                     \
                                        /* Donne eventuellement le nom de la valeur (introduit le 20011230080029).                   */ \
DEFV(Argument,DEFV(CHAR,DTb0(A_R)));                                                                                                    \
                                        /* Donne eventuellement un indicateur du type "Argument" ou "Resultat" tres utile pour       */ \
                                        /* savoir, par exemple, si une image est un Argument ou un Resultat. Ceci fut introduit      */ \
                                        /* le 20060310093722).                                                                       */ \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     DEFV(Positive,INIT(taille_de_sous_chaine,UNDEF));                                                                                  \
     DEFV(CHAR,INIT(POINTERc(sous_chaine),CHAINE_UNDEF));                                                                               \
                                        /* Allocation memoire pour le chaine resultat ; on prend suffisamment de                     */ \
                                        /* place pour y mettre la 'chaine par defaut' ou la 'sous-chaine'.                           */ \
     /*..............................................................................................................................*/ \
     EGAL(taille_de_sous_chaine,MAX2(chain_taille(chA),chain_taille(ch_d)));                                                            \
     ckMalo(sous_chaine,taille_de_sous_chaine,GENERE__FonctionC_FconversionC_____compteur_des_kMalo);                                   \
                                        /* Le comptage des 'kMalo(s...)'s a ete introduit le 20180316131852...                       */ \
                                                                                                                                        \
     Test(IFOU(IFEQ(IDENTITE(ch_d),ADRESSE_NON_DEFINIE),IFEQ(IDENTITE(ch_d),ADRESSE_NON_ENCORE_DEFINIE)))                               \
          Bblock                                                                                                                        \
          PRINT_ATTENTION("la chaine 'par defaut' vaut 'ADRESSE_NON_DEFINIE/ADRESSE_NON_ENCORE_DEFINIE', la suite est imprevisible");   \
          Eblock                                                                                                                        \
     ATes                                                                                                                               \
          Bblock                                                                                                                        \
          Eblock                                                                                                                        \
     ETes                                                                                                                               \
                                                                                                                                        \
     CALS(chain_copie(sous_chaine,ch_d));                                                                                               \
                                        /* La 'sous-chaine' resultante est initialisee avec la 'valeur par defaut',                  */ \
                                        /* ce qui fait que si la recherche du "titre" echoue, on renvoie la 'chaine                  */ \
                                        /* par defaut'.                                                                              */ \
                                                                                                                                        \
     VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo(IFLE(chain_taille(sous_chaine),taille_de_sous_chaine)                         \
                                                         ,BLOC(Bblock                                                                   \
                                                               CAL1(Prer3("La chaine Resultante est %s%s%s.\n"                          \
                                                                         ,C_VERITABLE_QUOTE                                             \
                                                                         ,sous_chaine                                                   \
                                                                         ,C_VERITABLE_QUOTE                                             \
                                                                          )                                                             \
                                                                    );                                                                  \
                                        /* Le 20041024095621 je note qu'il est essentiel d'utiliser ici 'BASIQUE____Prer3(...)'      */ \
                                        /* alors qu'ici 'Prer3(...)' serait utilisable car, en effet, l'utilisation de cette         */ \
                                        /* derniere pourrait conduire a une suite infinie d'appels correspondant a un defaut         */ \
                                        /* dans l'allocation memoire via 'chain_Aconcaten2(...)' par exemple...                      */ \
                                                               Eblock                                                                   \
                                                               )                                                                        \
                                                          );                                                                            \
                                        /* Introduit le 20041023103513 suite au probleme 'v $xig/fonct$vv$FON 20041020113351'.       */ \
                                                                                                                                        \
     RECHERCHE_D_UNE_VALEUR(chA                                                                                                         \
                           ,ti_a                                                                                                        \
                           ,ti_a                                                                                                        \
                           ,FORMAT_CHAI                                                                                                 \
                           ,COND(IFEQ_chaine(type,TYPE_FORMAT_LOGI)                                                                     \
                                ,ccCHAR(FORMAT_LOGI_EDITION)                                                                            \
                                ,COND(IFEQ_chaine(type,TYPE_FORMAT_NOGI)                                                                \
                                     ,ccCHAR(FORMAT_NOGI_EDITION)                                                                       \
                                     ,ccCHAR(FORMAT_CHAI_EDITION)                                                                       \
                                      )                                                                                                 \
                                 )                                                                                                      \
                           ,sous_chaine                                                                                                 \
                           ,edit_v                                                                                                      \
                           ,type                                                                                                        \
                           ,nm                                                                                                          \
                           ,A_R                                                                                                         \
                           ,chain_Acopie_avec_conversions_possibles_majuscules_minuscules                                               \
                            );                                                                                                          \
                                        /* Extraction de la sous-chaine si le "titre" attendu la precede.                            */ \
                                                                                                                                        \
     Test(PRESENT(valeur_recherchee))                                                                                                   \
          Bblock                                                                                                                        \
          Test(IFET(EST_VRAI(valeur_trouvee_et_vide)                                                                                    \
                   ,EST_VRAI(FconversionC__FconversionCL__FconversionCN_____une_valeur_vide_doit_etre_forcee)                           \
                    )                                                                                                                   \
               )                                                                                                                        \
               Bblock                                                                                                                   \
               CALS(chain_copie(sous_chaine,VALEUR_VIDE_POUR_FconversionC));                                                            \
                                        /* Cas des valeurs vides, ce traitement ayant ete mis en place le 19970507102431.            */ \
               Eblock                                                                                                                   \
          ATes                                                                                                                          \
               Bblock                                                                                                                   \
               Eblock                                                                                                                   \
          ETes                                                                                                                          \
          Eblock                                                                                                                        \
     ATes                                                                                                                               \
          Bblock                                                                                                                        \
          Test(EST_VRAI(valeur_trouvee_mais_avec_des_caracteres_parasites_en_queue))                                                    \
               Bblock                                                                                                                   \
               CALS(chain_copie(sous_chaine,ch_d));                                                                                     \
                                        /* Ceci a ete introduit le 20051114124617, lors de la mise en place du detecteur de          */ \
                                        /* caracteres parasites rencontres eventuellement derriere la valeur d'un parametre.         */ \
                                        /* Ce n'est que dans le cas ou de tels caracteres parasites ont ete rencontres qu'il         */ \
                                        /* faut retablir la valeur par defaut (puisque le 'SSca2(...)' a bien eu lieu et que         */ \
                                        /* la valeur du parametre a bien ete mise dans 'sous_chaine' qu'il faut donc                 */ \
                                        /* retablir a sa valeur par defaut 'ch_d'...                                                 */ \
               Eblock                                                                                                                   \
          ATes                                                                                                                          \
               Bblock                                                                                                                   \
               Eblock                                                                                                                   \
          ETes                                                                                                                          \
          Eblock                                                                                                                        \
     ETes                                                                                                                               \
                                                                                                                                        \
     RETU(sous_chaine);                                                                                                                 \
                                        /* Et on renvoie la sous-chaine extraite ou la 'chaine par defaut'.                          */ \
     Eblock

BFonctionC

DEFV(Common,GENERE__FonctionC_FconversionC(FconversionC(chA,ti_a,ch_d,edit_v,nm,A_R),TYPE_FORMAT_CHAI))  /* Common,DEFV(Fonction,) : */

EFonctionC

BFonctionC

DEFV(Common,GENERE__FonctionC_FconversionC(FconversionCL(chA,ti_a,ch_d,edit_v,nm,A_R),TYPE_FORMAT_LOGI)) /* Common,DEFV(Fonction,) : */

EFonctionC

BFonctionC

DEFV(Common,GENERE__FonctionC_FconversionC(FconversionCN(chA,ti_a,ch_d,edit_v,nm,A_R),TYPE_FORMAT_NOGI)) /* Common,DEFV(Fonction,) : */

EFonctionC

#undef    GENERE__FonctionC_FconversionC

#undef    VALEUR_VIDE_POUR_FconversionC

#undef    VALIDATION_DE_L_USAGE_DE_LA_MEMOIRE_ALLOUEE_PAR_Malo

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O N V E R S I O N   D ' U N E   V A R I A B L E   L O G I Q U E  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   GENERE__FonctionL_FconversionLN(nom_et_arguments_de_la_fonction,fonction_de_conversion)                                       \
                                        /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees       */ \
                                        /* a la recuperation automatique des fichiers d'arguments. Enfin, on notera que les noms des */ \
                                        /* Arguments ont ete raccourcis au maximum afin de faire tenir l'appel de cette procedure    */ \
                                        /* sur une ligne, et que ces noms sont choisis de facon a eviter au maximum des conflits     */ \
                                        /* avec des procedures pre-existantes (par exemple 'val(...)').                              */ \
DEFV(FonctionL,nom_et_arguments_de_la_fonction)                                                                                         \
DEFV(Argument,DEFV(CHAR,DTb0(chA)));                                                                                                    \
                                        /* Chaine Argument contenant la valeur d'une valeur logique exprimee sous                    */ \
                                        /* forme d'une chaine alpha-numerique.                                                       */ \
DEFV(Argument,DEFV(CHAR,DTb0(titre)));                                                                                                  \
                                        /* "Titre", c'est-a-dire chaine de caracteres attendue devant la valeur                      */ \
                                        /* numerique proprement dit ; on aura ainsi par exemple :                                    */ \
                                        /*                                                                                           */ \
                                        /*                  chA           = "indicateur=VRAI",                                       */ \
                                        /*                                                                                           */ \
                                        /* et :                                                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  titre         = "indicateur=".                                           */ \
                                        /*                                                                                           */ \
DEFV(Argument,DEFV(Logical,defaut));                                                                                                    \
                                        /* Valeur par defaut a renvoyer lorsque le "titre" attendu n'est pas trouve.                 */ \
DEFV(Argument,DEFV(Logical,edite));                                                                                                     \
                                        /* Indique s'il faut ('VRAI') ou pas ('FAUX') editer la valeur (qu'elle ait ete trouvee, ou  */ \
                                        /* qu'il s'agisse de la valeur par defaut...).                                               */ \
DEFV(Argument,DEFV(CHAR,DTb0(nom)));                                                                                                    \
                                        /* Donne eventuellement le nom de la valeur (introduit le 20011230080029).                   */ \
DEFV(Argument,DEFV(CHAR,DTb0(A_R)));                                                                                                    \
                                        /* Donne eventuellement un indicateur du type "Argument" ou "Resultat" tres utile pour       */ \
                                        /* savoir, par exemple, si une image est un Argument ou un Resultat. Ceci fut introduit      */ \
                                        /* le 20060310093722).                                                                       */ \
/*-----------------------------------------------------------------------------------------------------------------------------------*/ \
     Bblock                                                                                                                             \
     DEFV(CHAR,INIT(POINTERc(chaine_logique)                                                                                            \
                   ,fonction_de_conversion(chA                                                                                          \
                                          ,titre                                                                                        \
                                          ,ETAT_LOGIQUE(defaut)                                                                         \
                                          ,edite                                                                                        \
                                          ,nom                                                                                          \
                                          ,A_R                                                                                          \
                                           )                                                                                            \
                    )                                                                                                                   \
          );                                                                                                                            \
                                        /* Pointeur vers la chaine logique presumee ("VRAI" ou "FAUX").                              */ \
     DEFV(CHAR,INIT(POINTERc(chaine_logique_en_majuscules),CHAINE_UNDEF));                                                              \
                                        /* Pointeur vers la chaine logique presumee ("VRAI" ou "FAUX") apres conversion des          */ \
                                        /* minuscules en majuscules...                                                               */ \
     DEFV(Logical,INIT(valeur_logique,LUNDEF));                                                                                         \
                                        /* Cette variable a ete introduite le 20180406134424 afin de pouvoir mettre en place         */ \
                                        /* un 'CALZ_FreCC(...)' avant le RETU(...)'...                                               */ \
     /*..............................................................................................................................*/ \
     EGAp(chaine_logique_en_majuscules                                                                                                  \
         ,chain_Acopie_avec_conversions_possibles_majuscules_minuscules(chaine_logique                                                  \
                                                                       ,NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES          \
                                                                       ,TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES                 \
                                                                       ,END_OF_CHAIN                                                    \
                                                                        )                                                               \
          );                                                                                                                            \
                                        /* Conversion des minuscules en majuscules afin d'autoriser "VrAi" ou encore "faux" (ce      */ \
                                        /* dispositif a ete introduit le 20030207093122)...                                          */ \
                                        /*                                                                                           */ \
                                        /* On notera le 20170721101512, qu'ici la chaine correspond bien a la chaine Argument,       */ \
                                        /* mais convertit en majuscules. Ainsi, par exemple :                                        */ \
                                        /*                                                                                           */ \
                                        /*                  Fc=InTeRdIt                                                              */ \
                                        /*                                                                                           */ \
                                        /* donne ici la chaine "INTERDIT"...                                                         */ \
                                                                                                                                        \
     Test(ETL10(IMNE_chaine(chaine_logique_en_majuscules,C_VRAI____,C_VRAI_____ABREGE)                                                  \
               ,IMNE_chaine(chaine_logique_en_majuscules,C_EXIST___,C_EXIST____ABREGE)                                                  \
               ,IMNE_chaine(chaine_logique_en_majuscules,C_ACTIF___,C_ACTIF____ABREGE)                                                  \
               ,IMNE_chaine(chaine_logique_en_majuscules,C_AUTORISE,C_AUTORISE_ABREGE)                                                  \
               ,IMNE_chaine(chaine_logique_en_majuscules,C_VALIDE__,C_VALIDE___ABREGE)                                                  \
               ,IMNE_chaine(chaine_logique_en_majuscules,C_FAUX____,C_FAUX_____ABREGE)                                                  \
               ,IMNE_chaine(chaine_logique_en_majuscules,C_NEXIST__,C_NEXIST___ABREGE)                                                  \
               ,IMNE_chaine(chaine_logique_en_majuscules,C_INACTIF_,C_INACTIF__ABREGE)                                                  \
               ,IMNE_chaine(chaine_logique_en_majuscules,C_INTERDIT,C_INTERDIT_ABREGE)                                                  \
               ,IMNE_chaine(chaine_logique_en_majuscules,C_INVALIDE,C_INVALIDE_ABREGE)                                                  \
                )                                                                                                                       \
          )                                                                                                                             \
          Bblock                                                                                                                        \
          PRINT_ERREUR("la valeur demandee pour une variable logique n'est ni 'VRAI', ni 'FAUX', ni ...");                              \
          CAL1(Prer1("chaine courante a convertir........................... = '%s'\n",chA));                                           \
          CAL1(Prer1("titre courant recherche............................... = '%s'\n",titre));                                         \
          CAL1(Prer1("valeur logique (recuperee ou par defaut).............. = '%s'\n",chaine_logique));                                \
          CAL1(Prer1("valeur logique en majuscules (recuperee ou par defaut) = '%s'\n\n",chaine_logique_en_majuscules));                \
          Eblock                                                                                                                        \
     ATes                                                                                                                               \
          Bblock                                                                                                                        \
          Eblock                                                                                                                        \
     ETes                                                                                                                               \
                                                                                                                                        \
     EGAL(valeur_logique                                                                                                                \
         ,CON10(IMEQ_chaine(chaine_logique_en_majuscules,C_VRAI____,C_VRAI_____ABREGE),VRAI                                             \
               ,IMEQ_chaine(chaine_logique_en_majuscules,C_EXIST___,C_EXIST____ABREGE),EXIST                                            \
               ,IMEQ_chaine(chaine_logique_en_majuscules,C_ACTIF___,C_ACTIF____ABREGE),ACTIF                                            \
               ,IMEQ_chaine(chaine_logique_en_majuscules,C_AUTORISE,C_AUTORISE_ABREGE),AUTORISE                                         \
               ,IMEQ_chaine(chaine_logique_en_majuscules,C_VALIDE__,C_VALIDE___ABREGE),VALIDE                                           \
               ,IMEQ_chaine(chaine_logique_en_majuscules,C_FAUX____,C_FAUX_____ABREGE),FAUX                                             \
               ,IMEQ_chaine(chaine_logique_en_majuscules,C_NEXIST__,C_NEXIST___ABREGE),NEXIST                                           \
               ,IMEQ_chaine(chaine_logique_en_majuscules,C_INACTIF_,C_INACTIF__ABREGE),INACTIF                                          \
               ,IMEQ_chaine(chaine_logique_en_majuscules,C_INTERDIT,C_INTERDIT_ABREGE),INTERDIT                                         \
               ,IMEQ_chaine(chaine_logique_en_majuscules,C_INVALIDE,C_INVALIDE_ABREGE),INVALIDE                                         \
                                                                                      ,defaut                                           \
                )                                                                                                                       \
          );                                                                                                                            \
                                        /* Et on calcule la valeur logique convertie ou la 'valeur par defaut'. La version           */ \
                                        /* abregee a ete introduite le 20050128220037...                                             */ \
                                                                                                                                        \
     CALZ_FreCC(chaine_logique_en_majuscules);                                                                                          \
     CALZ_FreCC(chaine_logique);                                                                                                        \
                                                                                                                                        \
     RETU(valeur_logique);                                                                                                              \
                                        /* Et on renvoie la valeur logique convertie ou la 'valeur par defaut'...                    */ \
     Eblock

BFonctionL

DEFV(Common,GENERE__FonctionL_FconversionLN(FconversionL(chA,titre,defaut,edite,nom,A_R),FconversionCL)) /* Common,DEFV(Fonction,) : */

EFonctionL

BFonctionL

DEFV(Common,GENERE__FonctionL_FconversionLN(FconversionN(chA,titre,defaut,edite,nom,A_R),FconversionCN)) /* Common,DEFV(Fonction,) : */

EFonctionL

                                        /* La fonction 'FconversionN(...)' a ete introduite le 20030213162947, ce qui a conduit      */
                                        /* a cette nouvelle programmation via 'GENERE__FonctionL_FconversionLN(...)'...              */

#undef    GENERE__FonctionL_FconversionLN

#undef    RECHERCHE_D_UNE_VALEUR
#undef    TITRE_ATTENDU_D_UNE_VALEUR
#undef    INTRODUCTION_DE_Type
#undef    NOMBRE_MAXIMAL_CARACTERES_PARASITES_TRAINANT_DERRIERE_VALEUR_PARAMETRE
#undef    LONGUEUR_MAXIMALE_VALEUR_INTERACTIVE_SOUS_FORME_ALPHANUMERIQUE

#undef    NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES
#undef    TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES
                                        /* Le 20050128222237, les 'undef's de 'TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES'      */
                                        /* et de 'NE_PAS_TENTER_LES_CONVERSIONS_MINUSCULES_EN_MAJUSCULES' ont ete mises ici          */
                                        /* loin en meme temps que la modification du 20050127100516...                               */

#undef    NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES
#undef    TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES
                                        /* Le 20050128222237, les 'undef's de 'TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES'      */
                                        /* et de 'NE_PAS_TENTER_LES_CONVERSIONS_MAJUSCULES_EN_MINUSCULES' ont ete mises ici          */
                                        /* en meme temps que la modification du 20050128220037...                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   D E S   " B U G S "   P R E S E N T S  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    BUG_SYSTEME_DPX_LC_PILE_1                                             /* Common,DEFV(Fonction,) : probleme de la pile...   */
DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_DPX_LC_PILE_1));
#Aifdef   BUG_SYSTEME_DPX_LC_PILE_1                                             /* Common,DEFV(Fonction,) : probleme de la pile...   */
#Eifdef   BUG_SYSTEME_DPX_LC_PILE_1                                             /* Common,DEFV(Fonction,) : probleme de la pile...   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R E V E N T I O N   D ' U N   P R O B L E M E   S U R   L A   G E S T I O N                                              */
/*        D E   L A   P I L E   D E   S A U V E G A R D E   E T   D ' A L L O C A T I O N                                            */
/*        D E S   V A R I A B L E S   D Y N A M I Q U E S  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    BUG_SYSTEME_DPX_LC_PILE_1                                             /* Common,DEFV(Fonction,) : probleme de la pile...   */

BFonctionI

DEFV(Common,DEFV(FonctionI,initialisation_de_la_pile_de_sauvegarde_et_d_allocation(longueur_de_la_pile)))
DEFV(Argument,DEFV(Positive,longueur_de_la_pile));
                                        /* Nombre de fois que 'initialisation_de_la_pile_de_sauvegarde_et_d_allocation(...)' doit    */
                                        /* encore s'appeler elle-meme...                                                             */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     Test(IZNE(longueur_de_la_pile))
          Bblock
          CALS(initialisation_de_la_pile_de_sauvegarde_et_d_allocation(SOUS(longueur_de_la_pile,I)));
                                        /* Tant que le compteur n'est pas nul, on itere recursivement ce qui a pour effet d'allouer  */
                                        /* des pages de memoire virtuelle pour la pile...                                            */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_ERROR;
     Eblock

EFonctionI

#Aifdef   BUG_SYSTEME_DPX_LC_PILE_1                                             /* Common,DEFV(Fonction,) : probleme de la pile...   */
#Eifdef   BUG_SYSTEME_DPX_LC_PILE_1                                             /* Common,DEFV(Fonction,) : probleme de la pile...   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O M P T A G E   D E S   A C C E S   A U X   F O N C T I O N S   D E   B A S E  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionV

#define   TABULATION_EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE                                                                \
                    QUATRE_VINGT

DEFV(Common,DEFV(Logical,ZINT(cumul_des_compteurs_d_acces_aux_fonctions_de_base,ZERO)));

#define   EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE(fonction,compteur)                                                        \
                    Bblock                                                                                                              \
                    CALS(Fedition_d_un_compteur_quelconque("# de '"                                                                     \
                                                          ,fonction                                                                     \
                                                          ,compteur                                                                     \
                                                          ,TABULATION_EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE               \
                                                           )                                                                            \
                         );                                                                                                             \
                                                                                                                                        \
                    INCR(cumul_des_compteurs_d_acces_aux_fonctions_de_base,compteur);                                                   \
                    Eblock

DEFV(Common,DEFV(Logical,SINT(FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ACCES_AUX_FONCTIONS_DE_BASE____activer,FAUX)));

DEFV(Common,DEFV(FonctionV,FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ACCES_AUX_FONCTIONS_DE_BASE()))
                                        /* Fonction introduite le 20180413103049 doit evidemment etre la derniere puisqu'elle        */
                                        /* reference les compteurs d'acces a toutes les fonctions de base !                          */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/

     Test(IL_FAUT(FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ACCES_AUX_FONCTIONS_DE_BASE____activer))
          Bblock
          PRINT_MESSAGE(C_VIDE,"EDITION DES COMPTEURS D'ACCES AUX FONCTIONS DE BASE");

          CALS(Fsauts_de_lignes(UN));

          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionCL",FconversionCL_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionCN",FconversionCN_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionC",FconversionC_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionF",FconversionF_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionI",FconversionI_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionJ",FconversionJ_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionK",FconversionK_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionL",FconversionL_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionN",FconversionN_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionP",FconversionP_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionX",FconversionX_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("FconversionY",FconversionY_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Fentree_double_precision"
                                                             ,Fentree_double_precision_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Fentree_entier",Fentree_entier_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Fentree_logique",Fentree_logique_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Fentree_simple_precision"
                                                             ,Fentree_simple_precision_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Finitialisation_d_une_constante_chaine_de_caracteres"
                                                             ,Finitialisation_d_une_constante_chaine_de_caracteres_____Fcompteur_DAppel
                                                              );
                                        /* On notera le 20221029105330 quelque chose d'amusant. Lors des test d'implementation de    */
                                        /* 'v $xil/defi_c1$vv$DEF 20221028181016' en utilisant le programme '$xcg/ADD2.01$X, le      */
                                        /* compteur precedent, contrairement aux autres, n'etait pas stable : il prenait les         */
                                        /* valeurs {2313,2314,2315,2316} au cours d'un petit laps de temps. Cela pourrait venir      */
                                        /* d'une manipulation de l'heure courante...                                                 */
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Fsortie_Float",Fsortie_Float_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Fsortie_double_precision"
                                                             ,Fsortie_double_precision_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Fsortie_entier",Fsortie_entier_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Fsortie_logique",Fsortie_logique_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Fsortie_simple_precision"
                                                             ,Fsortie_simple_precision_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("Ftraitement_des_formats_de_sortie"
                                                             ,Ftraitement_des_formats_de_sortie_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("_chain_numero",_chain_numero_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("allocation_memoire_avec_validation"
                                                             ,allocation_memoire_avec_validation_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_ANcopie",chain_ANcopie_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten10",chain_Aconcaten10_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten11",chain_Aconcaten11_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten12",chain_Aconcaten12_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten13",chain_Aconcaten13_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten14",chain_Aconcaten14_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten15",chain_Aconcaten15_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten16",chain_Aconcaten16_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten17",chain_Aconcaten17_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten18",chain_Aconcaten18_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten19",chain_Aconcaten19_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten1",chain_Aconcaten1_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten20",chain_Aconcaten20_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten21",chain_Aconcaten21_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten22",chain_Aconcaten22_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten2",chain_Aconcaten2_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten2_sauf_nom_pipe"
                                                             ,chain_Aconcaten2_sauf_nom_pipe_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten3",chain_Aconcaten3_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten3_sauf_nom_pipe"
                                                             ,chain_Aconcaten3_sauf_nom_pipe_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten4",chain_Aconcaten4_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten4_sauf_nom_pipe"
                                                             ,chain_Aconcaten4_sauf_nom_pipe_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten5",chain_Aconcaten5_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten6",chain_Aconcaten6_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten7",chain_Aconcaten7_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten8",chain_Aconcaten8_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aconcaten9",chain_Aconcaten9_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Acopie",chain_Acopie_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE
              ("chain_Acopie_avec_conversions_possibles_majuscules_minuscules"
              ,chain_Acopie_avec_conversions_possibles_majuscules_minuscules_____Fcompteur_DAppel
               );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE
              ("chain_Acopie_avec_gestion_des_formats_des_editions_entieres"
              ,chain_Acopie_avec_gestion_des_formats_des_editions_entieres_____Fcompteur_DAppel
               );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE
              ("chain_Acopie_avec_parametrage_des_formats_des_editions_flottantes"
              ,chain_Acopie_avec_parametrage_des_formats_des_editions_flottantes_____Fcompteur_DAppel
               );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE
              ("chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete"
              ,chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete_____Fcompteur_DAppel
               );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Acopie_avec_suppression_des_espaces"
                                                             ,chain_Acopie_avec_suppression_des_espaces_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Aentier",chain_Aentier_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Ncopie",chain_Ncopie_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_XNcopie",chain_XNcopie_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Xcopie",chain_Xcopie_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_Xtaille",chain_Xtaille_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_compare",chain_compare_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_comptage_des_occurences_d_un_caractere"
                                                             ,chain_comptage_des_occurences_d_un_caractere_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_concatene",chain_concatene_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_conversion_numerique"
                                                             ,chain_conversion_numerique_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_copie",chain_copie_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_recherche",chain_recherche_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_recherche_d_un_caractere"
                                                             ,chain_recherche_d_un_caractere_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_recherche_dernier_caractere"
                                                             ,chain_recherche_dernier_caractere_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_recherche_premier_caractere"
                                                             ,chain_recherche_premier_caractere_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("chain_taille",chain_taille_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE
              ("conversion_d_un_caractere_majuscule_en_un_caractere_minuscule"
              ,conversion_d_un_caractere_majuscule_en_un_caractere_minuscule_____Fcompteur_DAppel
               );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE
              ("conversion_d_un_caractere_minuscule_en_un_caractere_majuscule"
              ,conversion_d_un_caractere_minuscule_en_un_caractere_majuscule_____Fcompteur_DAppel
               );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("conversion_d_un_chiffre_decimal_en_caractere"
                                                             ,conversion_d_un_chiffre_decimal_en_caractere_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("est_ce_alpha_numerique"
                                                             ,est_ce_alpha_numerique_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("est_ce_un_code_de_controle"
                                                             ,est_ce_un_code_de_controle_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("format_FLOT_EDITION",format_FLOT_EDITION_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("format_INTE_EDITION",format_INTE_EDITION_____Fcompteur_DAppel);
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("generation_d_un_nom_absolu_dans_xT_temporaire"
                                                             ,generation_d_un_nom_absolu_dans_xT_temporaire_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("generation_d_un_nom_relatif_temporaire"
                                                             ,generation_d_un_nom_relatif_temporaire_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("gestion_de_la_liste_des_CODE_ERREUR_rencontres"
                                                             ,gestion_de_la_liste_des_CODE_ERREUR_rencontres_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE
              ("mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss"
              ,mise_de_la_date_courante_au_format_____AAAAMMJJhhmmss_____Fcompteur_DAppel
               );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("parametrage_des_formats_des_editions_flottantes"
                                                             ,parametrage_des_formats_des_editions_flottantes_____Fcompteur_DAppel
                                                              );
          EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE("print_defaut",print_defaut_____Fcompteur_DAppel);

          CALS(Fsauts_de_lignes(UN));

          CAL3(Prme2("Nombre total d'appels de fonctions de base%s%d\n"
                    ,SIGNE_EGAL
                    ,cumul_des_compteurs_d_acces_aux_fonctions_de_base
                     )
               );

          CALS(Fsauts_de_lignes(UN));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     RETU_VIDE;
     Eblock

#undef    EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE
#undef    TABULATION_EDITION_D_UN_COMPTEUR_D_ACCES_AUX_FONCTIONS_DE_BASE

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E - D E F I N I T I O N S   U T I L E S  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#undef    BASIQUE____Prer6
#undef    BASIQUE____Prer5
#undef    BASIQUE____Prer4
#undef    BASIQUE____Prer3
#undef    BASIQUE____Prer2
#undef    BASIQUE____Prer1
#undef    BASIQUE____Prer0
                                        /* Introduites le 20111122162534 et mises tout a la fin le 20111123112510 car, en effet,     */
                                        /* certaines de ces definitions servent meme apres la definition de 'print_defaut(...)'      */
                                        /* et ce pour des raisons de securite afin d'eviter d'eventuels bouclages sur defaut         */
                                        /* d'allocation memoire par exemple...                                                       */

#undef    BASICNU____Prer6
#undef    BASICNU____Prer5
#undef    BASICNU____Prer4
#undef    BASICNU____Prer3
#undef    BASICNU____Prer2
#undef    BASICNU____Prer1
#undef    BASICNU____Prer0
                                        /* Introduit le 20120119133419...                                                            */

#undef    BASIQUE____Prer
                                        /* Introduit le 20120113153636...                                                            */

#undef    BASIQUE____Prme9
#undef    BASIQUE____Prme8
#undef    BASIQUE____Prme7
#undef    BASIQUE____Prme6
#undef    BASIQUE____Prme5
#undef    BASIQUE____Prme4
#undef    BASIQUE____Prme3
#undef    BASIQUE____Prme2
#undef    BASIQUE____Prme1
#undef    BASIQUE____Prme0
                                        /* Introduites le 20111122162534 et mises tout a la fin le 20111123112510 par "symetrie"     */
                                        /* avec 'BASIQUE____Prer?(...)'.                                                             */

#undef    BASIQUE____Prin6
#undef    BASIQUE____Prin5
#undef    BASIQUE____Prin4
#undef    BASIQUE____Prin3
#undef    BASIQUE____Prin2
#undef    BASIQUE____Prin1
#undef    BASIQUE____Prin0
                                        /* Introduites le 20111122162534 et mises tout a la fin le 20111123112510 par "symetrie"     */
                                        /* avec 'BASIQUE____Prer?(...)'.                                                             */

#if       (PRECISION_DU_Int==SIMPLE_PRECISION)
#                   undef     BFd
                                        /* Introduit le 20120224091908...                                                            */
#Aif      (PRECISION_DU_Int==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Int==SIMPLE_PRECISION)

#if       (PRECISION_DU_Int==DOUBLE_PRECISION)
#                   undef     BFd
                                        /* Introduit le 20120224091908...                                                            */
#Aif      (PRECISION_DU_Int==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Int==DOUBLE_PRECISION)

_______________________________________________________________________________________________________________________________________



Copyright © Jean-François COLONNA, 2019-2025.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2025.