_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/* */
/* 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)
_______________________________________________________________________________________________________________________________________