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