/*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S 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 definitions de macros relatives */ /* aux 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$DEF' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19870000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 ) : */ /* */ /*************************************************************************************************************************************/ #define NOM_DE_LA_COMMANDE_COURANTE \ COND(IFEQ_chaine(nom_de_la_commande_courante,ADRESSE_NON_ENCORE_DEFINIE) \ ,nom_de_la_commande_courante_non_encore_definie \ ,nom_de_la_commande_courante \ ) \ /* Introduit le 20120201110309 et mis ici le 20170405153655 (apres transfert depuis */ \ /* 'v $xig/fonct$vv$FON'... */ #define NOM_DE_LA_COMMANDE_COURANTE_NON_ENCORE_DEFINIE \ "CommandeCouranteNonEncoreDefinie" \ /* Introduit le 20170405154858... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ /* 'VALEUR_PAR_DEFAUT_DE_MemorySizeMB' et 'VALEUR_PAR_DEFAUT_DE_PCMemorySizeMB' ont ete */ /* mises dans 'v $xil/defi_K2$vv$DEF MemorySizeMB' le 20170418102447... */ #define AMARGE_DE_SECURITE_POUR_ALLOCATION_MEMOIRE_AVEC_VALIDATION \ UN #define BMARGE_DE_SECURITE_POUR_ALLOCATION_MEMOIRE_AVEC_VALIDATION \ ZERO /* Introduit le 20051026160119 pour etre utilise dans 'v $xig/fonct$vv$DEF MargeMalo'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 20040303135217 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 : */ /* */ /* IFLT(a,b) */ /* */ /* mais : */ /* */ /* FfIFLT(a,b) */ /* */ /* dans les situations delicates. 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')... */ /* */ /* Le 20040308095027, j'ai decide d'etendre cela aux */ /* operations arithmetiques en plus des tests... */ /* */ /*************************************************************************************************************************************/ #define sfIZLE(x1) \ FfIZLE(FLOT(x1)) #define sfIZLT(x1) \ FfIZLT(FLOT(x1)) #define sfIZEQ(x1) \ FfIZEQ(FLOT(x1)) #define sfIZGE(x1) \ FfIZGE(FLOT(x1)) #define sfIZGT(x1) \ FfIZGT(FLOT(x1)) /* Tests de 'x1' par rapport a zero, le 's' etant la pour "Sur"... */ #define sfIFLE(x1,x2) \ FfIFLE(FLOT(x1),FLOT(x2)) #define sfIFLT(x1,x2) \ FfIFLT(FLOT(x1),FLOT(x2)) #define sfIFEQ(x1,x2) \ FfIFEQ(FLOT(x1),FLOT(x2)) #define sfIFNE(x1,x2) \ FfIFNE(FLOT(x1),FLOT(x2)) #define sfIFGE(x1,x2) \ FfIFGE(FLOT(x1),FLOT(x2)) #define sfIFGT(x1,x2) \ FfIFGT(FLOT(x1),FLOT(x2)) /* Tests de 'x1' par rapport a 'x2', le 's' etant la pour "Sur"... */ #define sfIFLc(x1,x2,le_test_est_strict) \ COND(EST_VRAI(le_test_est_strict),sfIFLT(x1,x2),sfIFLE(x1,x2)) #define sfIFGc(x1,x2,le_test_est_strict) \ COND(EST_VRAI(le_test_est_strict),sfIFGT(x1,x2),sfIFGE(x1,x2)) /* Tests conditionnels de 'x1' par rapport a 'x2', le 's' etant la pour "Sur". Ceci a ete */ /* introduit le 20040407163856 pour etre utilise dans 'v $ximd/operator.1$FON IFGc' si */ /* besoin est... */ #define sfDIVZ(x1,x2) \ FfDIVZ(FLOT(x1),FLOT(x2)) \ /* Operations arithmetiques a deux operandes, le 's' etant la pour "Sur". ATTENTION : on */ \ /* ne peut definir : */ \ /* */ \ /* #define sfREST(x1,x2) \ */ \ /* FfREST(FLOT(x1),FLOT(x2)) */ \ /* */ \ /* car, en effet, la procedure 'REST(...)' ne connait que des arguments entiers... */ \ /* */ \ /* Les quatre fonctions {sfADD2(...),sfSOUS(...),sfMUL2(...),sfDIVI(...)} ont ete mises */ \ /* dans 'v $xil/defi_c3$vv$DEF 20040423150108' le 20040423150454 afin que tout fonctionne */ \ /* correctement avec les operateurs derivables... */ #define sfADD3(x1,x2,x3) \ FfADD3(FLOT(x1),FLOT(x2),FLOT(x3)) #define sfMUL3(x1,x2,x3) \ FfMUL3(FLOT(x1),FLOT(x2),FLOT(x3)) /* Operations arithmetiques a trois operandes, le 's' etant la pour "Sur"... */ #define sfADD4(x1,x2,x3,x4) \ FfADD4(FLOT(x1),FLOT(x2),FLOT(x3),FLOT(x4)) #define sfMUL4(x1,x2,x3,x4) \ FfMUL4(FLOT(x1),FLOT(x2),FLOT(x3),FLOT(x4)) /* Operations arithmetiques a quatre operandes, le 's' etant la pour "Sur"... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S R E R E C H E R C H E D ' E X T R E M A D E D E U X , T R O I S O U Q U A T R E */ /* V A L E U R S T Y P E E S E T D E S T I N E E S A L I M I T E R L A C O M P L E X I T E D E */ /* C E R T A I N E S E X P R E S S I O N S O U E N C O R E A E V I T E R D E S P R O B L E M E S : */ /* */ /* */ /* Nota important : */ /* */ /* Il convient de bien noter que les */ /* procedures definies dans '$xil/definit$DEF' et dans */ /* les quatre fichiers equivalents '$xil/definit_*$DEF' */ /* du type 'MAX2(...)' presentent des effets */ /* de bord puisque l'un des arguments est */ /* evalue deux fois (il s'agit dans cet exemple */ /* du plus grand des arguments), alors que dans */ /* les fonctions definies dans '$xig/fonct$vv$FON' */ /* il n'y a plus d'effet de bord, chaque argument */ /* n'etant evalue qu'une seule fois. Ainsi, les */ /* couples de procedures du type 'MAX2(...)' et */ /* 'iMAX2(...)' ne sont pas strictement equivalents */ /* (ce ne sera le cas que si les arguments ne varient */ /* pas d'une evaluation a l'autre). De tels effets de */ /* bord peuvent se rencontrer, par exemple, avec des */ /* generateurs de nombres aleatoires... */ /* */ /*************************************************************************************************************************************/ #define iCOND(condition,n1,n2) \ FiCOND(LOGI(condition),INTE(n1),INTE(n2)) \ /* Selection d'un nombre entier parmi deux, suivant une condition logique. */ \ /* */ \ /* ATTENTION : on notera la difference entre : */ \ /* */ \ /* iCOND(condition_logique,argument1,argument2) */ \ /* */ \ /* et : */ \ /* */ \ /* COND(condition_logique,argument1,argument2) */ \ /* */ \ /* en effet, avec 'iCOND(...)' '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... */ #define fCOND(condition,x1,x2) \ FfCOND(LOGI(condition),FLOT(x1),FLOT(x2)) \ /* Selection d'un nombre flottant parmi deux, suivant une condition logique. */ \ /* */ \ /* NOTA : cette fonction est utilisee en particulier dans les programmes */ \ /* 'v $xrq/nucleon.L0$K' et 'v $xrq/nucleon.LX$I' pour eliminer le bug defini dans le */ \ /* fichier 'v $xiii/montagnes$DEF' et baptise 'BUG_SYSTEME_C_complexite_02'. */ \ /* et baptise 'BUG_SYSTEME_C_complexite_02'. */ \ /* */ \ /* ATTENTION : on notera la difference entre : */ \ /* */ \ /* fCOND(condition_logique,argument1,argument2) */ \ /* */ \ /* et : */ \ /* */ \ /* COND(condition_logique,argument1,argument2) */ \ /* */ \ /* en effet, avec 'fCOND(...)' '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... */ #define iMAX2(n1,n2) \ FiMAX2(INTE(n1),INTE(n2)) \ /* Recherche du maximum entier de deux nombres entiers. */ #define fMAX2(x1,x2) \ FfMAX2(FLOT(x1),FLOT(x2)) \ /* Recherche du maximum flottant de deux nombres flottants. */ \ /* NOTA : cette fonction est utilisee en particulier dans le fichier 'v $xiii/montagnes$DEF' */ \ /* pour eliminer le bug baptise 'BUG_SYSTEME_C_complexite_02'. */ #define iMAX3(n1,n2,n3) \ FiMAX3(INTE(n1),INTE(n2),INTE(n3)) \ /* Recherche du maximum entier de trois nombres entiers. */ #define fMAX3(x1,x2,x3) \ FfMAX3(FLOT(x1),FLOT(x2),FLOT(x3)) \ /* Recherche du maximum flottant de trois nombres flottants. */ #define iMAX4(n1,n2,n3,n4) \ FiMAX4(INTE(n1),INTE(n2),INTE(n3),INTE(n4)) \ /* Recherche du maximum entier de quatre nombres entiers. */ #define fMAX4(x1,x2,x3,x4) \ FfMAX4(FLOT(x1),FLOT(x2),FLOT(x3),FLOT(x4)) \ /* Recherche du maximum flottant de quatre nombres flottants. */ #define iMIN2(n1,n2) \ FiMIN2(INTE(n1),INTE(n2)) \ /* Recherche du minimum entier de deux nombres entiers. */ #define fMIN2(x1,x2) \ FfMIN2(FLOT(x1),FLOT(x2)) \ /* Recherche du minimum flottant de deux nombres flottants. */ #define iMIN3(n1,n2,n3) \ FiMIN3(INTE(n1),INTE(n2),INTE(n3)) \ /* Recherche du minimum entier de trois nombres entiers. */ #define fMIN3(x1,x2,x3) \ FfMIN3(FLOT(x1),FLOT(x2),FLOT(x3)) \ /* Recherche du minimum flottant de trois nombres flottants. */ #define iMIN4(n1,n2,n3,n4) \ FiMIN4(INTE(n1),INTE(n2),INTE(n3),INTE(n4)) \ /* Recherche du minimum entier de quatre nombres entiers. */ #define fMIN4(x1,x2,x3,x4) \ FfMIN4(FLOT(x1),FLOT(x2),FLOT(x3),FLOT(x4)) \ /* Recherche du minimum flottant de quatre nombres flottants. */ #define iDIVZ(dividende,diviseur) \ FiDIVZ(INTE(dividende),INTE(diviseur)) \ /* Division de deux nombres entiers avec test du diviseur. */ #define ffDIVZ(dividende,diviseur) \ FffDIVZ(FLOT(dividende),FLOT(diviseur)) \ /* Division de deux nombres flottants avec test du diviseur. */ #define ffDIVZ_a_peu_pres(dividende,diviseur) \ FffDIVZ_a_peu_pres(FLOT(dividende),FLOT(diviseur)) \ /* Division de deux nombres flottants avec test du diviseur a "epsilon pres". */ #define iMODU(n,origine,extremite) \ FiMODU(INTE(n),INTE(origine),INTE(extremite)) \ /* Calcul "modulo" d'un entier. */ #define fMODU(x,origine,extremite) \ FfMODU(FLOT(x),FLOT(origine),FLOT(extremite)) \ /* Calcul "modulo" d'un flottant. */ #define iMODS(n,origine,extremite) \ FiMODS(INTE(n),INTE(origine),INTE(extremite)) \ /* Calcul "modulo" d'un entier. */ #define fMODF(x,origine,extremite) \ FfMODF(FLOT(x),FLOT(origine),FLOT(extremite)) \ /* Calcul "modulo" d'un flottant. */ #define ffREST(x,y) \ FffREST(FLOT(x),FLOT(y)) \ /* Reste de la division de deux nombres flottants. */ #define iMULD(n,base) \ FiMULD(INTE(n),INTE(base)) \ /* Calcul d'un multiple proche par defaut d'un entier. */ #define ffMULD(x,base) \ FffMULD(FLOT(x),FLOT(base)) \ /* Calcul d'un multiple proche par defaut d'un flottant. */ #define iMULE(n,base) \ FiMULE(INTE(n),INTE(base)) \ /* Calcul d'un multiple proche par exces d'un entier. */ #define ffMULE(x,base) \ FffMULE(FLOT(x),FLOT(base)) \ /* Calcul d'un multiple proche par exces d'un flottant. */ #define ffARRI(x,epsilon) \ FffARRI(FLOT(x),FLOT(epsilon)) \ /* Calcul de l'arrondi generalise d'un nombre flottant. */ #define iSCAL(n,ancien_intervalle,nouvel_intervalle) \ FiSCAL(INTE(n),INTE(ancien_intervalle),INTE(nouvel_intervalle)) \ /* Calcul de la "regle de trois". */ #define fSCAL(x,ancien_intervalle,nouvel_intervalle) \ FfSCAL(FLOT(x),FLOT(ancien_intervalle),FLOT(nouvel_intervalle)) \ /* Calcul de la "regle de trois". */ #define iHOMO(n,origine1,extremite1,origine2,extremite2) \ FiHOMO(INTE(n),INTE(origine1),INTE(extremite1),INTE(origine2),INTE(extremite2)) \ /* Calcul de passage d'un intervalle a un autre. */ #define fHOMO(x,origine1,extremite1,origine2,extremite2) \ FfHOMO(FLOT(x),FLOT(origine1),FLOT(extremite1),FLOT(origine2),FLOT(extremite2)) \ /* Calcul de passage d'un intervalle a un autre. */ #define iHOMZ(n,origine1,extremite1,origine2,extremite2) \ FiHOMZ(INTE(n),INTE(origine1),INTE(extremite1),INTE(origine2),INTE(extremite2)) \ /* Calcul de passage d'un intervalle a un autre. */ #define fHOMZ(x,origine1,extremite1,origine2,extremite2) \ FfHOMZ(FLOT(x),FLOT(origine1),FLOT(extremite1),FLOT(origine2),FLOT(extremite2)) \ /* Calcul de passage d'un intervalle a un autre. */ #define iNORM(n,ancien_intervalle,nouvel_intervalle) \ FiNORM(INTE(n),INTE(ancien_intervalle),INTE(nouvel_intervalle)) \ /* Calcul de la normalisation. */ #define fNORM(x,ancien_intervalle,nouvel_intervalle) \ FfNORM(FLOT(x),FLOT(ancien_intervalle),FLOT(nouvel_intervalle)) \ /* Calcul de la normalisation. */ #define iNORZ(n,ancien_intervalle,nouvel_intervalle,exception) \ FiNORZ(INTE(n),INTE(ancien_intervalle),INTE(nouvel_intervalle),INTE(exception)) \ /* Calcul de la normalisation. */ #define fNORZ(x,ancien_intervalle,nouvel_intervalle,exception) \ FfNORZ(FLOT(x),FLOT(ancien_intervalle),FLOT(nouvel_intervalle),FLOT(exception)) \ /* Calcul de la normalisation. */ #define iTRON(n,origine,extremite) \ FiTRON(INTE(n),INTE(origine),INTE(extremite)) \ /* Calcul de troncation. */ #define fTRON(x,origine,extremite) \ FfTRON(FLOT(x),FLOT(origine),FLOT(extremite)) \ /* Calcul de troncation. */ #define iSPIRALE_X(index,saut) \ FiSPIRALE_X(INTE(index),INTE(saut)) #define iSPIRALE_Y(index,saut) \ FiSPIRALE_Y(INTE(index),INTE(saut)) /* Coordonnees entieres sur une spirale. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D O N N E S U T I L E S A U X 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 */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define _FZERO \ FZERO #define __FZERO \ FZERO #define ___FZERO \ FZERO #define _FU \ FU #define __FU \ FU #define ___FU \ FU /* Introduits le 20061025090128 afin d'ameliorer la presentation des definitions des */ /* ponderations correspondantes. Le 20101111094138 ceci fut installe ici a partir de */ /* 'v $xig/fonct$vv$FON 20101111094153'... */ #define RAISON_DES_CALCULS_ENTIERS_BRUTAUX_MODULO_AVEC_L_ARITHMETIQUE_ETENDUE \ DEUX \ /* Raison par defaut des congruences lorsque celles-ci sont demandees (introduite le */ \ /* 20111003113313). */ #define GENERATEUR__GENERE__FonctionF_UNI2_02(nom_et_arguments_de_la_fonction,nom_de_la_fonction,expression) \ DEFV(FonctionF,nom_et_arguments_de_la_fonction) \ DEFV(Argument,DEFV(Float,argument1)); \ DEFV(Argument,DEFV(Float,argument2)); \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ DEFV(Float,INIT(resultat,FLOT__UNDEF)); \ /* Valeur intermediaire introduite le 20090330112301 dans l'idee d'offrir la possibilite */ \ /* d'effectuer les calculs evidemment en 'Float' mais aussi en 'vrai_Float_de_base'... */ \ /*..............................................................................................................................*/ \ RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES(forcer_la_reinitialisation_des_fonctions_d_arithmetique_etendue); \ /* Introduit le 20080107090628 pour le plaisir. Cette restauration se fera grace au code */ \ /* suivant : */ \ /* */ \ /* EGAL(forcer_la_reinitialisation_des_fonctions_d_arithmetique_etendue,VRAI); */ \ /* CALS(FONCTION(FLOT__ARGUMENT_INUTILE,FLOT__ARGUMENT_INUTILE)); */ \ /* EGAL(forcer_la_reinitialisation_des_fonctions_d_arithmetique_etendue,FAUX); */ \ /* */ \ /* implante la ou 'FONCTION(...)' (de nom 'nom_de_la_fonction') est utile... */ \ \ Test(IFET(IL_FAUT(utiliser_evidemment_la_precision_Float_avec_l_arithmetique_etendue) \ ,IL_FAUT(nom_de_la_fonction ## utiliser_evidemment_la_precision_Float) \ ) \ ) \ /* Possibilite introduite le 20090330113257 et completee le 20090331084223 avec un */ \ /* indicateur de controle global... */ \ Bblock \ EGAL(resultat,expression(nom_de_la_fonction,NEUT,NEUT)); \ Eblock \ ATes \ Bblock \ EGAL(resultat,expression(nom_de_la_fonction,FLOT,vbFLOT)); \ /* Dispositif de calcul en 'vrai_Float_de_base' introduit le 20090330113257. */ \ /* */ \ /* Une application de ceci est, par exemple, de calculer l'ensemble de Mandelbrot en 64, */ \ /* puis en 32 bits avec respectivement : */ \ /* */ \ /* $xrc/mandel.01$X arithmetique_de_base_C=VRAI \ */ \ /* (...) */ \ /* */ \ /* puis : */ \ /* */ \ /* $xrc/mandel.01$X arithmetique_etendue_C=VRAI \ */ \ /* xFloat=FAUX \ */ \ /* (...) */ \ /* */ \ /* et le tour est joue... */ \ Eblock \ ETes \ \ Test(IL_FAUT(faire_des_calculs_entiers_brutaux_modulo_avec_l_arithmetique_etendue)) \ Bblock \ EGAL(resultat,FLOT(REST(INTE(resultat),raison_des_calculs_entiers_brutaux_modulo_avec_l_arithmetique_etendue))); \ /* Possibilite "brutale" (car on passe en 'Int' sans verifier que cela est possible...) */ \ /* introduite le 20111003104139. Elle permet donc de faire des calculs modulo... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INCK(nom_de_la_fonction ## compteur_de_reference); \ /* Introduit le 20130514122726 afin de permettre de compter (si besoin est) le nombre */ \ /* d'operations elementaires executees dans un programme... */ \ \ RETU(resultat); \ Eblock \ /* Cas des procedures 'Float' a deux arguments 'Float' (introduit le 20061024103437)... */ \ /* */ \ /* On notera que 'Xnom_de_la_procedure_de_base_a_etendre' ne peut etre ni de la forme */ \ /* 'FfxADD2' ni de la forme 'ADD2' (en prenant l'exemple de la definition de la fonction */ \ /* 'FfxADD2(...)') car dans un cas comme dans l'autre 'FfxADD2' et 'ADD2' sont des noms */ \ /* de procedures avec arguments et donc avec '(...)' ce qui pose evidemment un probleme */ \ /* apres la concatenation. On doit donc utiliser, dans cet exemple, le nom 'dans_FfxADD2' */ \ /* qui n'existe pas en tant que '#define' ('v $xig/fonct$vv$FON dans_FfxADD2'). */ \ /* */ \ /* Cette procedure a ete transferee depuis 'v $xig/fonct$vv$FON' le 20061024121646 afin */ \ /* de pouvoir etre utilisee dans 'v $xrv/UNI2.11$K GENERE__FonctionF_UNI2_02'... */ \ /* */ \ /* Le 20061024121646, de plus la procedure 'UNI2(...)' a ete supprimee car, en effet, sa */ \ /* mise a jour etait difficile : il convenait, si une nouvelle ponderation et une nouvelle */ \ /* procedures etaient ajoutees, de ne pas de tromper en l'inserant partout ou necessaire et */ \ /* exactement au bon endroit... */ \ /* */ \ /* Le 20061025132344 furent introduites 'MOYZSI(...)' et 'MOYQSI(...)'. */ \ /* */ \ /* Le 20080102133640 furent introduites 'IMINMAX(...)' et 'IMAXMIN(...)'. */ \ /* */ \ /* Le 20080104154112 fut introduite 'SPUIX(...)' ; cela a conduit a la modification */ \ /* 'v $xil/defi_K2$vv$DEF 20080104162535' car, sans elle, meme lorsque la ponderation */ \ /* de 'SPUIX(...)' etait nulle, le cas 'SPUIX(0,ValeurNegative)' donnait l'infini et a */ \ /* ce produit une valeur non nulle... */ \ /* */ \ /* Le 20080106103831 j'ai tente de remplacer 'LIN16(...)' par 'FfLIO16(...)' pour optimiser */ \ /* mais, malheureusement, la compilation de cette derniere fonction est trop "lourde" et */ \ /* j'ai donc du y renoncer... */ \ /* */ \ /* Le 20080106113404, j'ai du mettre en place une optimisation "locale" relative a */ \ /* 'SPUIX(...)' car, en effet, le risque est grand de generer des infinis comme on le */ \ /* voit avec l'exemple : */ \ /* */ \ /* $xcg/ADD3.01$X a=10 b=200 c=3000 */ \ /* */ \ /* qui donne "+nan", la fonction 'SPUIX(...)' etant evaluee meme si sa ponderation est nulle */ \ /* (ce qui est le cas par defaut...). */ \ /* */ \ /* Le 20080111092552, une optimisation "locale" relative a tous les operateurs a ete mise */ \ /* en place, mais cette fois-ci pour des raisons de performance... */ \ /* */ \ /* Le 20080111143534, toutes les optimisations locales ont pu etre supprimees grace a */ \ /* l'introduction de 'LIO16(...)' (suite a 'v $xil/defi_K2$vv$DEF 20080111142631' qui a */ \ /* enfin permis l'utilisation "raisonnable" 'LIO16(...)'...). */ \ /* */ \ /* ATTENTION : on notera le 20080117101020 que 'GENERE__FonctionF_UNI2_02(...)', lorsqu'elle */ \ /* est utilisee sur '$CMAP28', interdit l'optimisation. Voir a ce propos : */ \ /* */ \ /* v $xbg/fonction$K PRAGMA_CL_____MODULE_NON_OPTIMISABLE_CMAP28 */ \ /* v $xrv/UNI2.11$K PRAGMA_CL_____MODULE_NON_OPTIMISABLE_CMAP28 */ \ /* */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define EXPRESSION_GENERE__FonctionF_UNI2_02(nom_de_la_fonction,FConvR,FConvA) \ /* Procedure introduite le 20090330175547 pour simplifier 'GENERE__FonctionF_UNI2_02(...)'. */ \ FConvR(LIO25(FConvA(nom_de_la_fonction ## ponderation_de_ADD2) ,ADD2(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* x+y */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_SOUS) ,SOUS(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* x-y */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_SOUSnc) ,SOUS(FConvA(argument2),FConvA(argument1)) \ /* */ \ /* y-x */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MUL2) ,MUL2(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* x.y */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_DIVZ) ,DIVZ(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* x/y */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_DIVZnc) ,DIVZ(FConvA(argument2),FConvA(argument1)) \ /* */ \ /* y/x */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MIN2) ,MIN2(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* min(x,y) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MAX2) ,MAX2(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* max(x,y) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MINMAX) ,MINMAX(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* max(min(x,1-y),min(1-x,y)) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MAXMIN) ,MAXMIN(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* min(max(x,1-y),max(1-x,y)) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_IMINMAX) ,IMINMAX(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* max(min(x,1/y),min(1/x,y)) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_IMAXMIN) ,IMAXMIN(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* min(max(x,1/y),max(1/x,y)) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYE) ,MOYE(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* (x+y)/2 */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYZ) ,MOYZ(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* sqrt(|x|.|y|) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYZSI) ,MOYZSI(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* signe(x.y).sqrt(|x|.|y|) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYQ) ,MOYQ(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* sqrt(((x.x)+(y.y))/2) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYQSI) ,MOYQSI(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* signe(x.y).sqrt(((x.x)+(y.y))/2) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYH) ,MOYH(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* (2.x.y)/(x+y) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_SPUIX) ,SPUIX(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* signe(x.y).pow(|x|,y) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_SPUIXnc) ,SPUIX(FConvA(argument2),FConvA(argument1)) \ /* */ \ /* signe(y.x).pow(|y|,x) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_SE12) ,SE12(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* x */ \ /* */ \ /* On notera que : */ \ /* */ \ /* SE12nc = SE22 */ \ /* */ \ /* 'SE12nc' ("nc"="Non Commutatifs") n'existant pas pour cette raison... */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_SE22) ,SE22(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* y */ \ /* */ \ /* On notera que : */ \ /* */ \ /* SE22nc = SE12 */ \ /* */ \ /* 'SE22nc' ("nc"="Non Commutatifs") n'existant pas pour cette raison... */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_ATAN) ,ATAN(FConvA(argument2),FConvA(argument1)) \ /* */ \ /* atan(y,x) */ \ /* */ \ /* Au passage, faut-il utiliser 'atan(y,x)' (similaire a la definition de 'ATAN(...)' et */ \ /* ou donc les arguments 'argument1' et 'argument2' sont permutes), ou bien 'atan(x,y)' ? */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_ATANnc) ,ATAN(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* atan(x,y) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MULH24) ,MULH24(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* MULH24(x,y) */ \ /* */ \ ,FZERO \ ) \ ) \ /* Avec les notations evidentes suivantes : */ \ /* */ \ /* x = argument1 */ \ /* y = argument2 */ \ /* */ \ /* ATTENTION : jusqu'au 20070201092408, par erreur, la fonction 'MOYZSI(...)' etait */ \ /* utilisee a la place de 'MOYQSI(...)'... */ \ /* */ \ /* Le 20180821094203 ont ete introduits les operateurs 'SE12(...)' et 'SE22(...)' pour */ \ /* le plaisir... */ \ /* */ \ /* Le 20181009170109 a ete introduit l'operateur 'ATAN(...)' pour le plaisir... */ \ /* */ \ /* On notera le 20181010152837, qu'au lieu d'ecrire, par exemple : */ \ /* */ \ /* FConvA(nom_de_la_fonction ## ponderation_de_ADD2) */ \ /* */ \ /* on pourrait peut-etre parametrer un peu plus de la facon suivante : */ \ /* */ \ /* #define PONDERATION \ */ \ /* ponderation_de_ */ \ /* */ \ /* puis remplacer le 'FConvA(...)' ci-dessus par : */ \ /* */ \ /* FConvA(nom_de_la_fonction ## PONDERATION __@@QD "ADD2") */ \ /* */ \ /* (on remarquera l'encadrement de 'ADD2' par des '$K_QD's afin que l'operateur 'ADD2(...)' */ \ /* ne soit pas interprete). Mais tout ceci a-t-il une utilite ? La seule que je vois pour le */ \ /* moment est d'avoir trouve, lors de ces tests, le moyen de bloquer l'interpretation d'un */ \ /* operateur avec '__@@QD'... */ \ /* */ \ /* Le 20181203161212 fut introduit 'MULH24(...)'... */ \ /* */ \ /* C'est cette procedure qui la cause de 'v $xbii/tri_image$K 20181204173010' ainsi que je */ \ /* le note le 20181204174855... */ \ /* */ \ /* Le 20201004103629 furent introduits les versions "commutees" des operateurs dits */ \ /* "Non Commutatifs"... */ #define GENERE__FonctionF_UNI2_02(nom_et_arguments_de_la_fonction,nom_de_la_fonction) \ GENERATEUR__GENERE__FonctionF_UNI2_02(nom_et_arguments_de_la_fonction \ ,nom_de_la_fonction \ ,EXPRESSION_GENERE__FonctionF_UNI2_02 \ ) \ /* Introduit sous cette forme le 20201005123347... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T E U R S D E S F O N C T I O N S A L L E G E E S C O R R E S P O N D A N T A U X */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define EXPRESSION_GENERE__FonctionF_UNI2_02_ALLEGEE(nom_de_la_fonction,FConvR,FConvA) \ FConvR(LIO17(FConvA(nom_de_la_fonction ## ponderation_de_ADD2) ,ADD2(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* x+y */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_SOUS) ,SOUS(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* x-y */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MUL2) ,MUL2(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* x.y */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_DIVZ) ,DIVZ(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* x/y */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MIN2) ,MIN2(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* min(x,y) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MAX2) ,MAX2(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* max(x,y) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MINMAX) ,MINMAX(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* max(min(x,1-y),min(1-x,y)) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MAXMIN) ,MAXMIN(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* min(max(x,1-y),max(1-x,y)) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYE) ,MOYE(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* (x+y)/2 */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYZ) ,MOYZ(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* sqrt(|x|.|y|) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYZSI) ,MOYZSI(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* signe(x.y).sqrt(|x|.|y|) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYQ) ,MOYQ(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* sqrt(((x.x)+(y.y))/2) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYQSI) ,MOYQSI(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* signe(x.y).sqrt(((x.x)+(y.y))/2) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MOYH) ,MOYH(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* (2.x.y)/(x+y) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_SPUIX) ,SPUIX(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* signe(x.y).pow(|x|,y) */ \ /* */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_ATAN) ,ATAN(FConvA(argument2),FConvA(argument1)) \ /* */ \ /* atan(y,x) */ \ /* */ \ /* Au passage, faut-il utiliser 'atan(y,x)' (similaire a la definition de 'ATAN(...)' et */ \ /* ou donc les arguments 'argument1' et 'argument2' sont permutes), ou bien 'atan(x,y)' ? */ \ ,FConvA(nom_de_la_fonction ## ponderation_de_MULH24) ,MULH24(FConvA(argument1),FConvA(argument2)) \ /* */ \ /* MULH24(x,y) */ \ /* */ \ ,FZERO \ ) \ ) \ /* Avec les notations evidentes suivantes : */ \ /* */ \ /* x = argument1 */ \ /* y = argument2 */ \ /* */ #define GENERE__FonctionF_UNI2_02_ALLEGEE(nom_et_arguments_de_la_fonction,nom_de_la_fonction) \ GENERATEUR__GENERE__FonctionF_UNI2_02(nom_et_arguments_de_la_fonction \ ,nom_de_la_fonction \ ,EXPRESSION_GENERE__FonctionF_UNI2_02_ALLEGEE \ ) \ /* Introduit sous cette forme le 20201005123347. On notera que cette version dite "ALLEGEE" */ \ /* a ete introduite a cause de 'v $xbii/tri_image$K PRAGMA_CPP_____AUTORISER_LE_GooF' pour */ \ /* lequel le pre-processing depassait une heure... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D O N N E S U T I L E S A U X 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 */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define GENERATEUR__GENERE__FonctionF_UNI1_01(nom_et_arguments_fonction,nom_fonction,expression) \ /* Procedure introduite le 20220116120735... */ \ DEFV(FonctionF,nom_et_arguments_fonction) \ DEFV(Argument,DEFV(Float,argument)); \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ DEFV(Float,INIT(resultat,FLOT__UNDEF)); \ /*..............................................................................................................................*/ \ RESTAURATION_DE_LA_VALEUR_PAR_DEFAUT_DES_ARGUMENTS_IMPLICITES(forcer_la_reinitialisation_des_fonctions_d_arithmetique_etendue); \ /* Introduit le 20080107090628 pour le plaisir. Cette restauration se fera grace au code */ \ /* suivant : */ \ /* */ \ /* EGAL(forcer_la_reinitialisation_des_fonctions_d_arithmetique_etendue,VRAI); */ \ /* CALS(FONCTION(FLOT__ARGUMENT_INUTILE,FLOT__ARGUMENT_INUTILE)); */ \ /* EGAL(forcer_la_reinitialisation_des_fonctions_d_arithmetique_etendue,FAUX); */ \ /* */ \ /* implante la ou 'FONCTION(...)' (de nom 'nom_fonction') est utile... */ \ \ EGAL(resultat,expression(nom_fonction,NEUT,NEUT)); \ \ INCK(nom_fonction ## compteur_de_reference); \ \ RETU(resultat); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define EXPRESSION_GENERE__FonctionF_UNI1_01(nom_fonction,FCoR,FCoA) \ FCoR(LIO14(FCoA(nom_fonction ## ponderation_de_NEUT) ,NEUT(FCoA(argument)) \ /* */ \ /* y */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_COSX) ,COSX(FCoA(argument)) \ /* */ \ /* cos(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_SINX) ,SINX(FCoA(argument)) \ /* */ \ /* sin(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_TANX) ,TANX(FCoA(argument)) \ /* */ \ /* tan(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_ATAN) ,ATAN(FCoA(argument),FCoA(nom_fonction ## arg_x_ATAN)) \ /* */ \ /* atan(y,x) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_COHX) ,COHX(FCoA(argument)) \ /* */ \ /* ch(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_SIHX) ,SIHX(FCoA(argument)) \ /* */ \ /* sh(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_TAHX) ,TAHX(FCoA(argument)) \ /* */ \ /* th(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_CSHX) ,CSHX(FCoA(argument)) \ /* */ \ /* sec(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_SSHX) ,SSHX(FCoA(argument)) \ /* */ \ /* cosec(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_CTHX) ,CTHX(FCoA(argument)) \ /* */ \ /* coth(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_ATAH) ,ATAH(FCoA(argument)) \ /* */ \ /* ath(y) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_SLOGX) ,SLOGX(FCoA(argument)) \ /* */ \ /* signe(y).log(|y|+1) */ \ /* */ \ ,FCoA(nom_fonction ## ponderation_de_EXPX) ,EXPX(FCoA(argument)) \ /* */ \ /* exp(y) */ \ /* */ \ ,FZERO \ ) \ ) \ /* Avec les notations evidentes suivantes : */ \ /* */ \ /* y = argument */ \ /* */ #define GENERE__FonctionF_UNI1_01(nom_et_arguments_fonction,nom_fonction) \ GENERATEUR__GENERE__FonctionF_UNI1_01(nom_et_arguments_fonction \ ,nom_fonction \ ,EXPRESSION_GENERE__FonctionF_UNI1_01 \ ) \ /* Procedure introduite le 20220116120735... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 */ /* oublie il y a bien longtemps... */ #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_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) # pragma xcg__gen_ext_Z__gen_Fonction_SE__GENERE__Fonction GENERE__FonctionC_INIC POINTERc /* Introduit le 20040520120747. */ # define GENERE__FonctionC_INIC(nom_et_arguments_de_la_fonction) \ /* ATTENTION : le nom de la fonction est suivi de ses arguments pour des raisons liees */ \ /* a la recuperation automatique des fichiers d'arguments. */ \ DEFV(FonctionC,POINTERc(nom_et_arguments_de_la_fonction)) \ /* 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 placee dans une variable POINTERc... */ \ /* */ \ /* Jusqu'au 20071114142111, il y a eu ici en tete un 'DEFV(Common,'... */ \ DEFV(Argument,DEFV(CHAR,POINTERc(chaineA))); \ /* Argument. */ \ /*-----------------------------------------------------------------------------------------------------------------------------------*/ \ Bblock \ /*..............................................................................................................................*/ \ RETU(chaineA); \ /* Renvoi d'un pointeur sur la chaine Argument. */ \ Eblock #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_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) #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_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SGIND308_IRIX_CC)) \ || (defined(SYSTEME_SGIND324_IRIX_CC)) \ || (defined(SYSTEME_SGIND3GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND408_IRIX_CC)) \ || (defined(SYSTEME_SGIND424_IRIX_CC)) \ || (defined(SYSTEME_SGIND4GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND508_IRIX_CC)) \ || (defined(SYSTEME_SGIND524_IRIX_CC)) \ || (defined(SYSTEME_SGIND5GA_IRIX_CC)) \ || (defined(SYSTEME_SGIND808_IRIX_CC)) \ || (defined(SYSTEME_SGIND824_IRIX_CC)) \ || (defined(SYSTEME_SGIND8GA_IRIX_CC)) \ || (defined(SYSTEME_SGINDA08_IRIX_CC)) \ || (defined(SYSTEME_SGINDA24_IRIX_CC)) \ || (defined(SYSTEME_SGINDAGA_IRIX_CC)) \ || (defined(SYSTEME_SGO200A1_IRIX_CC)) \ || (defined(SYSTEME_SGO200A2_IRIX_CC)) \ || (defined(SYSTEME_SGO200A4_IRIX_CC)) \ || (defined(SYSTEME_SGO25224_IRIX_CC)) \ || (defined(SYSTEME_SGO252VA_IRIX_CC)) \ || (defined(SYSTEME_SGO252VN_IRIX_CC)) \ || (defined(SYSTEME_SGPCM801_IRIX_CC)) \ || (defined(SYSTEME_SGPCMA01_IRIX_CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_GCC)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 ? ) : */ /* */ /*************************************************************************************************************************************/ #define VALEUR_NUMERIQUE_D_UN_CARACTERE_NON_HEXADECIMAL \ MOINS_L_INFINI \ /* Afin de savoir si 'est_ce_alpha_numerique(...)' a detecte un chiffre hexa-decimal ou pas. */ \ /* */ \ /* Le 20081216112507, cette valeur est passee de 'UNDEF' a 'MOINS_L_INFINI' afin d'etre */ \ /* sur d'avoir ainsi une valeur impossible a rencontrer, en particulier parce qu'elle est */ \ /* negative. Au passage, avec 'UNDEF' le risque qu'un jour sa valeur devienne, par exemple, */ \ /* 'ZERO'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define k___NOMBRE_DE_CHIFFRES_DES_EDITIONS_FLOTTANTES \ SUCC(SUCC(SEIZE)) #TestADef NOMBRE_DE_CHIFFRES_DES_EDITIONS_FLOTTANTES \ k___NOMBRE_DE_CHIFFRES_DES_EDITIONS_FLOTTANTES /* A cause de 'v $xrv/histogram.01$K nombre_de_chiffres_des_editions_flottantes', cela fut */ /* introduit le 20180606154421... */ /* */ /* Le 20240122152020, 'k___NOMBRE_DE_CHIFFRES_DES_EDITIONS_FLOTTANTES' a ete introduit */ /* a cause de 'v $xtKg/Exec_X_CSH.01$K NOMBRE_DE_CHIFFRES_DES_EDITIONS_FLOTTANTES'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S C H A I N E S D E C A R A C T E R E S : */ /* */ /*************************************************************************************************************************************/ #define PREMIER_CARACTERE \ INDEX0 \ /* Premier caractere d'une chaine de caracteres. */ #define PREMIER_CARACTERE_ITb0(chaine) \ ITb0(chaine,INDX(PREMIER_CARACTERE,PREMIER_CARACTERE)) \ /* Recuperation du premier caractere d'une chaine de caracteres de type 'ITb0'. */ #define DERNIER_CARACTERE_ITb0(chaine) \ ITb0(chaine,INDX(LSTX(PREMIER_CARACTERE,chain_Xtaille(chaine)),PREMIER_CARACTERE)) \ /* Recuperation du dernier caractere d'une chaine de caracteres de type 'ITb0' (introduit */ \ /* le 20021207110134). */ #define PREMIER_CARACTERE_ITb1(chaine) \ ITb1(chaine,INDX(PREMIER_CARACTERE,PREMIER_CARACTERE)) \ /* Recuperation du premier caractere d'une chaine de caracteres de type 'ITb1'. */ #define DERNIER_CARACTERE_ITb1(chaine) \ ITb1(chaine,INDX(LSTX(PREMIER_CARACTERE,chain_Xtaille(chaine)),PREMIER_CARACTERE)) \ /* Recuperation du dernier caractere d'une chaine de caracteres de type 'ITb1' (introduit */ \ /* le 20021207110134). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S D E P L A C E M E N T S D E S C H A I N E S D E C A R A C T E R E S : */ /* */ /*************************************************************************************************************************************/ #define MOVE_CARACTERE_DEPLACE_TOUS_LES_CARACTERES \ Bblock \ EGAL(MOVE_CARACTERE_____ne_deplacer_que_les_caracteres_alpha_numeriques,FAUX); \ Eblock \ /* 'MOVE_CARACTERE(...)' deplace tous les caracteres (introduit le 19980420092917). */ #define MOVE_CARACTERE_NE_DEPLACE_QUE_LES_CARACTERES_ALPHA_NUMERIQUES \ Bblock \ EGAL(MOVE_CARACTERE_____ne_deplacer_que_les_caracteres_alpha_numeriques,VRAI); \ Eblock \ /* 'MOVE_CARACTERE(...)' ne deplace que les caracteres alpha-numeriques (introduit le */ \ /* 19980420092917). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N T R O L E D E S M E S S A G E S D A N S D ' E V E N T U E L L E S */ /* B R A N C H E S P A R A L L E L E S : */ /* */ /*************************************************************************************************************************************/ #define UNE_EDITION_PARALLELE_EST_POSSIBLE \ IFOU(IFEQ_chaine(identifiant_de_branches_paralleles,C_VIDE) \ ,IFEQ_chaine(identifiant_de_branches_paralleles,CHOY(c_ROUGE,c_VERTE,c_BLEUE)) \ ) \ /* Introduit le 20210425075357... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define MESSAGES_DES_FICHIERS(fonction_d_impression,editer_les_messages_d_erreur) \ Bblock \ Test(IL_NE_FAUT_PAS(bloquer_tous_les_messages_d_erreur_des_fichiers)) \ Bblock \ Test(IL_FAUT(editer_les_messages_d_erreur)) \ Bblock \ PRINT_ATTENTION("probleme de gestion de fichiers"); \ CAL1(Prer0("Symptome(s) et/ou action(s) entreprise(s) : ")); \ CAL1(fonction_d_impression); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure d'edition conditionnelle des messages d'erreur de la gestion de fichier. */ \ /* */ \ /* Cette procedure fut deplacee depuis 'v $xig/fonct$vv$FON 20080916144658' jusqu'ici */ \ /* le 20080916144600 pour 'v $xiii/files$FON MESSAGES_DES_FICHIERS'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S N O M S D E F I C H I E R S : */ /* */ /*************************************************************************************************************************************/ #define LONGUEUR_MAXIMALE_D_UN_NOM_ABSOLU_DE_FICHIER \ GvalDefaut("LONGUEUR_PATH",CENT_VINGT_HUIT) \ /* Longueur maximale d'un nom de fichier absolu (y compris le "path" d'acces). */ \ /* */ \ /* ATTENTION : la variable 'LONGUEUR_MAXIMALE_D_UN_NOM_ABSOLU_DE_FICHIER' n'est pas */ \ /* soumise a un '#ifdef SYSTEME_...', car en effet, si l'on souhaite */ \ /* que les logiciels soient portables, il faut que les noms de fichiers */ \ /* le soit aussi ; pour 'LONGUEUR_MAXIMALE_D_UN_NOM_ABSOLU_DE_FICHIER', il */ \ /* faut donc utiliser la valeur minimale sur l'ensemble des 'SYSTEME's... */ \ /* */ \ /* L'option 'GvalDefaut(...)' a ete introduite le 19990204085559 a cause des commandes du */ \ /* type 'v $xiim_LACT29/../...' qui peuvent engendrer des "paths" tres longs... */ #define LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER \ GvalDefaut("LONGUEUR_NOMS",14) \ /* Longueur maximale d'un nom de fichier relatif (non compris le "path" d'acces). */ \ /* */ \ /* ATTENTION : la variable 'LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER' n'est pas */ \ /* soumise a un '#ifdef SYSTEME_...', car en effet, si l'on souhaite */ \ /* que les logiciels soient portables, il faut que les noms de fichiers */ \ /* le soit aussi ; pour 'LONGUEUR_MAXIMALE_D_UN_NOM_RELATIF_DE_FICHIER', il */ \ /* faut donc utiliser la valeur minimale sur l'ensemble des 'SYSTEME's... */ \ /* */ \ /* A cause de 'v $xcg/remote.01$K shell' l'option 'GvalDefaut(...)' a ete introduite */ \ /* le 19971021162819. */ #define SEPARATEUR_DES_DIRECTORIES_D_UN_NOM_DE_FICHIER \ K_SLASH #define cSEPARATEUR_DES_DIRECTORIES_D_UN_NOM_DE_FICHIER \ C_SLASH /* Caractere separant les differents noms de directories qui composent un nom. La chaine */ /* correspondante a ete introduite le 20160511100943... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R I S E E N C O M P T E D E S N O M S D E F I C H I E R S */ /* Q U I S O N T E N F A I T D E S V A L E U R S N U M E R I Q U E S : */ /* */ /*************************************************************************************************************************************/ #define gLOAD_FICHIER_AVEC_CONVERSION(No,Co,type,fonction_de_conversion,sequence_initialisation,le_nom_du_fichier_a_ete_converti) \ Bblock \ Test(EST_VRAI(Co)) \ /* Cas ou l'on s'autorise a essayer de convertir le nom 'No' du fichier argument en une */ \ /* valeur numerique... */ \ Bblock \ DEFV(type,INIT(valeur_du_nom,gUNDEF)); \ /* Valeur que l'on donnera aux elements du fichier si le nom correspond strictement a une */ \ /* valeur numerique du type 'type_fichier' sans rien derriere. ATTENTION, on notera que */ \ /* l'on ne peut pas faire mieux qu'utiliser 'UNDEF' pour initialiser 'valeur_du_nom'... */ \ /* ATTENTION, le 19971118091526, je suis passe de 'UNDEF' a 'gUNDEF' afin d'eviter */ \ /* les messages : */ \ /* */ \ /* warning(1069): integer conversion resulted in truncation */ \ /* char valeur_du_nom=57072; */ \ /* */ \ /* sur 'SYSTEME_SGO200A1_IRIX_CC'... */ \ DEFV(Logical,INIT(la_valeur_brute_du_nom_deborde,FAUX)); \ DEFV(Float,INIT(valeur_brute_du_nom,FLOT__UNDEF)); \ /* Valeur "brute", c'est-a-dire avant une eventuelle conversion de type comme c'est le cas */ \ /* dans 'v $xiii/Images$DEF Conversion_generale_genp' (introduit le 20051122085934)... */ \ /* */ \ /* On notera (le 20070710091808) que l'on utilise le type 'Float' avoir de disposer de */ \ /* l'amplitude numerique maximale lors de cette recuperation... */ \ DEFV(Char,INIT(POINTERc(chaine_residuelle),CHAINE_UNDEF)); \ /* Afin de pouvoir regarder ce qui traine derriere la valeur numerique que definit le nom */ \ /* du fichier ; bien entendu, si tout s'est bien passe, 'chaine_residuelle' doit etre vide. */ \ /* */ \ /* Le 20071121134543 a cause de 'SYSTEME_APC_LinuxUbuntu_GCC' sur '$LACT18' et pour eviter */ \ /* le message : */ \ /* */ \ /* warning: passing argument 2 of 'strtod' from incompatible pointer type */ \ /* */ \ /* le 'CHAR' ci-dessus est devenu un 'Char'... */ \ \ EGAL(valeur_du_nom,Conversion_generale`fonction_de_conversion(No,chaine_residuelle)); \ /* On tente de convertir le nom 'No' du fichier argument en une valeur numerique... */ \ EGAL(valeur_brute_du_nom,Conversion_generale_flot(No,chaine_residuelle)); \ /* Et de meme sans aucune conversion de type avec la precision et l'amplitude maximales... */ \ \ Test(EST_UN_BON_Float_FINI(valeur_brute_du_nom)) \ /* Ce test a ete introduit le 20130221082814... */ \ Bblock \ \ &define TestType`type(ArgumentObligatoireParDefinitionDesTypes)&&& \ \ &ifdef TestType`genere_p(ArgumentObligatoireParDefinitionDesTypes)&&& \ Test(IFEXff(valeur_brute_du_nom,FLOT__NOIR,FLOT__BLANC)) \ /* Ce test a ete introduit le 20051122085934... */ \ Bblock \ PRINT_ERREUR("un nom de fichier converti en valeur numerique 'caractere' deborde"); \ CAL1(Prer5("(le nom est '%s' -nom residuel='%s'- et sa valeur %f n'est pas dans [%d,%d])\n" \ ,No \ ,chaine_residuelle \ ,valeur_brute_du_nom \ ,NOIR,BLANC \ ) \ ); \ /* On notera (le 20070710091808) que l'on utilise le type 'Float' pour 'valeur_brute_du_nom' */ \ /* afin de disposer de l'amplitude numerique maximale lors de la recuperation de la "valeur" */ \ /* du nom... */ \ /* */ \ /* Le 20130221081327 l'edition de 'No' et de 'chaine_residuelle' a ete introduite... */ \ \ EGAL(la_valeur_brute_du_nom_deborde,VRAI); \ /* La conversion est alors refusee... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ &Aifdef TestType`genere_p(ArgumentObligatoireParDefinitionDesTypes)&&& \ &Eifdef TestType`genere_p(ArgumentObligatoireParDefinitionDesTypes)&&& \ \ &ifdef TestType`genere_Int(ArgumentObligatoireParDefinitionDesTypes)&&& \ Test(IFEXff(valeur_brute_du_nom,FLOT(MOINS_L_INFINI),FLOT(INFINI))) \ /* Ce test a ete introduit le 20051122132506... */ \ Bblock \ PRINT_ERREUR("un nom de fichier converti en valeur numerique 'entiere' deborde"); \ CAL1(Prer5("(le nom est '%s' -nom residuel='%s'- et sa valeur %f n'est pas dans [%d,%d])\n" \ ,No \ ,chaine_residuelle \ ,valeur_brute_du_nom \ ,MOINS_L_INFINI,INFINI \ ) \ ); \ /* On notera (le 20070710091808) que l'on utilise le type 'Float' pour 'valeur_brute_du_nom' */ \ /* afin de disposer de l'amplitude numerique maximale lors de la recuperation de la "valeur" */ \ /* du nom... */ \ /* */ \ /* Le 20130221081327 l'edition de 'No' et de 'chaine_residuelle' a ete introduite... */ \ \ EGAL(la_valeur_brute_du_nom_deborde,VRAI); \ /* La conversion est alors refusee... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ &Aifdef TestType`genere_Int(ArgumentObligatoireParDefinitionDesTypes)&&& \ &Eifdef TestType`genere_Int(ArgumentObligatoireParDefinitionDesTypes)&&& \ \ &undef TestType`type(ArgumentObligatoireParDefinitionDesTypes)&&& \ \ Test(IFET(IFEQ_chaine(chaine_residuelle,C_VIDE),EST_FAUX(la_valeur_brute_du_nom_deborde))) \ /* Cas ou le nom 'No' du fichier argument est une bonne valeur numerique, c'est-a-dire */ \ /* ou rien ne traine derriere... */ \ Bblock \ BLOC(sequence_initialisation); \ /* Initialisation du fichier sans lecture... */ \ EGAL(le_nom_du_fichier_a_ete_converti,VRAI); \ /* Et ainsi, on sait qu'il n'y a pas de fichier a lire... */ \ Eblock \ ATes \ /* Cas ou le nom 'No' du fichier argument n'est pas une bonne valeur numerique, */ \ /* c'est-a-dire ou il traine quelque chose derriere, ou bien ou il s'agit tout simplement */ \ /* d'un "bon nom" : 'le_nom_du_fichier_a_ete_converti' est 'FAUX'. */ \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ /* Ce cas s'est rencontre le 20130221082814 en voulant visualiser (via 'v') l'image */ \ /* 'v $xiirs/INFL.11' en ne mettant pas le directory '$xiirs' : le nom commence par 'INF' */ \ /* interprete comme etant 'inf' soit 'infinity'... */ \ Eblock \ ETes \ Eblock \ ATes \ /* Cas ou l'on n'a pas le droit de convertir le nom 'No' du fichier argument en une */ \ /* valeur numerique : 'le_nom_du_fichier_a_ete_converti' est 'FAUX'. */ \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure generale utilisee dans 'v $xiii/files$FON ILOAD_FICHIER_AVEC_CONVERSION' et */ \ /* dans 'v $xig/fonct$vv$FON GENERE__FonctionI_Fload'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T A I L L E D ' U N F I C H I E R : */ /* */ /*************************************************************************************************************************************/ #define TAILLE_EN_NOMBRE_DE_CARACTERES_D_UN_FICHIER_INEXISTANT \ NEGA(UN) #define TAILLE_EN_NOMBRE_DE_LIGNES_D_UN_FICHIER_INEXISTANT \ TAILLE_EN_NOMBRE_DE_CARACTERES_D_UN_FICHIER_INEXISTANT /* Taille d'un fichier inexistant (introduit le 20061122182508). On notera que cette */ /* valeur est negative et donc ne peut correspondre a la taille d'un fichier en faisant */ /* bien attention d'utiliser 'Int' et non pas 'Positive'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E S M E S S A G E S D ' E R R E U R : */ /* */ /*************************************************************************************************************************************/ #define BLOQUER_TOUS_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ VRAI \ /* Indicateur a utiliser pour bloquer TOUS les messages d'erreur. */ #define NE_PAS_BLOQUER_TOUS_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ NOTL(BLOQUER_TOUS_LES_MESSAGES_D_ERREUR_DES_FICHIERS) \ /* Indicateur a utiliser pour ne pas bloquer TOUS les messages d'erreur. */ #define VALIDER_LA_LONGUEUR_DES_NOMS_ABSOLUS_DE_FICHIERS \ VRAI \ /* Indicateur a utiliser pour bloquer la validation de la longueur des noms absolus */ \ /* des fichiers. */ #define NE_PAS_VALIDER_LA_LONGUEUR_DES_NOMS_ABSOLUS_DE_FICHIERS \ NOTL(VALIDER_LA_LONGUEUR_DES_NOMS_ABSOLUS_DE_FICHIERS) \ /* Indicateur a utiliser pour ne pas bloquer la validation de la longueur des noms absolus */ \ /* des fichiers. */ #define VALIDER_LA_LONGUEUR_DES_NOMS_RELATIFS_DE_FICHIERS \ VRAI \ /* Indicateur a utiliser pour bloquer la validation de la longueur des noms relatifs */ \ /* des fichiers. */ #define NE_PAS_VALIDER_LA_LONGUEUR_DES_NOMS_RELATIFS_DE_FICHIERS \ NOTL(VALIDER_LA_LONGUEUR_DES_NOMS_RELATIFS_DE_FICHIERS) \ /* Indicateur a utiliser pour ne pas bloquer la validation de la longueur des noms relatifs */ \ /* des fichiers. */ #define EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ VRAI \ /* Indicateur a utiliser pour editer certains messages d'erreur. */ #define NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ NOTL(EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS) \ /* Indicateur a utiliser pour ne pas editer certains messages d'erreur. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Q U E L Q U E S M O D E S D ' U N F I C H I E R */ /* D A N S 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 : */ /* */ /*************************************************************************************************************************************/ #define Ftest_fichier_____MODE_r__ \ 0x00008100 #define Ftest_fichier_____MODE_r_x \ 0x00008140 #define Ftest_fichier_____MODE_rw_ \ 0x00008180 /* Quelques modes possibles introduits le 20070420153739... */ /* */ /* On notera que l'on retrouve ces modes dans 'v $Falias_catalf_1 0x00008100'... */ /* */ /* On notera le 20150119145603 l'introduction de 'v $xcg/List_mode$vv$Z' destine a faire */ /* un inventaire de tous les cas possibles... */ #define Ftest_fichier_____MODE_rwx \ 0x000081c0 /* Et completes le 20070424085111... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C L E F D ' U N F I C H I E R D A N S 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 : */ /* */ /*************************************************************************************************************************************/ #define Ftest_fichier_____CLEF_NON_DEFINIE \ UNDEF \ /* Valeur a donner a la clef d'un fichier lorsque celle-ci n'est pas calculee, par exemple, */ \ /* lorsque le fichier est trop gros. On notera que la valeur 'ZERO' serait peut-etre plus */ \ /* logique (cette constante a ete introduite le 20030808133508). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E L ' A T T E N T E S U R L E S F I C H I E R S I N E X I S T A N T S : */ /* */ /*************************************************************************************************************************************/ #define ATTENDRE_UN_FICHIER_INEXISTANT_OU_NON_CONFORME \ VRAI \ /* Indicateur a utiliser pour attendre un fichier inexistant ou dont les caracteristiques */ \ /* ne sont pas conformes a ce que l'on attend... */ #define NE_PAS_ATTENDRE_UN_FICHIER_INEXISTANT_OU_NON_CONFORME \ NOTL(ATTENDRE_UN_FICHIER_INEXISTANT_OU_NON_CONFORME) \ /* Indicateur a utiliser pour ne pas attendre un fichier inexistant ou dont les */ \ /* caracteristiques ne sont pas conformes a ce que l'on attend. Il y a alors sortie */ \ /* en erreur... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O M P T A G E D E S L I G N E S D ' U N F I C H I E R : */ /* */ /*************************************************************************************************************************************/ #define COMPTER_LES_LIGNES_DANS_Fsize_fichier \ VRAI \ /* Indicateur a utiliser pour compter les lignes dans 'Fsize_fichier(...)'. */ #define NE_PAS_COMPTER_LES_LIGNES_DANS_Fsize_fichier \ NOTL(COMPTER_LES_LIGNES_DANS_Fsize_fichier) \ /* Indicateur a utiliser pour ne pas compter les lignes dans 'Fsize_fichier(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N F I C H I E R F O R M A T T E : */ /* */ /*************************************************************************************************************************************/ #define LE_NOM_DU_FICHIER_EST_CONVERTISSABLE_EN_UNE_VALEUR_NUMERIQUE \ VRAI \ /* Valeur de l'argument 'Co' des fonctions 'Fload_fichier_formatte_int(...)' et */ \ /* 'Fload_fichier_formatte_flot(...)' lorsque le nom du fichier peut etre considere */ \ /* comme une valeur numerique... */ #define LE_NOM_DU_FICHIER_N_EST_PAS_CONVERTISSABLE_EN_UNE_VALEUR_NUMERIQUE \ NOTL(LE_NOM_DU_FICHIER_EST_CONVERTISSABLE_EN_UNE_VALEUR_NUMERIQUE) \ /* Valeur de l'argument 'Co' des fonctions 'Fload_fichier_formatte_int(...)' et */ \ /* 'Fload_fichier_formatte_flot(...)' lorsque le nom du fichier ne peut pas etre considere */ \ /* comme une valeur numerique... */ #define PREMIER_ELEMENT_D_UN_FICHIER \ INDEX0 \ /* Index du premier element d'un fichier. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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... */ /* */ /*************************************************************************************************************************************/ #define ELEMENT_UNDEF \ ADRESSE(liste_indefinie) \ /* Permet de mettre a l'etat "UNDEF" un element d'une liste. */ #define LISTE_UNDEF \ ELEMENT_UNDEF \ /* Permet de mettre a l'etat "UNDEF" la tete d'une liste. */ #define ELEMENT_VIDE \ C_VIDE \ /* Un element vide contiendra la chaine vide... */ #define CLEF_VALIDATION_LISTE \ PARE(0x31415926) \ /* Clef de validation d'un element quelconque d'une liste. */ #define VALIDATION_LISTE(courant_element,action_si_valide,action_si_invalide) \ Bblock \ Test(IFNE(courant_element,ELEMENT_UNDEF)) \ Bblock \ Test(IFEQ(CLEF_VALIDATION_LISTE,UNDEF)) \ Bblock \ PRINT_ATTENTION("la validation d'un element de liste ne peut se faire correctement"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFEQ(ASI2(courant_element,header,clef_validation),CLEF_VALIDATION_LISTE)) \ Bblock \ BLOC(action_si_valide); \ Eblock \ ATes \ Bblock \ BLOC(action_si_invalide); \ PRINT_ERREUR("la clef de validation de l'element courant de liste est invalide"); \ CAL1(Prer2(" l'adresse de l'element est %08X et sa clef %08X\n" \ ,courant_element \ ,ASI2(courant_element,header,clef_validation) \ ) \ ); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ BLOC(action_si_invalide); \ PRINT_ERREUR("l'adresse de l'element courant de liste est indefinie"); \ Eblock \ ETes \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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); */ /* */ /* ou : */ /* */ /* CALS(Fpush(descripteur_de_pile,informations)); */ /* EGAL(informations,Fpull(descripteur_de_pile)); */ /* */ /*************************************************************************************************************************************/ #define PILE_UNDEF \ ADRESSE(pile_indefinie) \ /* Permet de mettre a l'etat "UNDEF" le descripteur d'une pile. */ #define CREATION_PILE(descripteur_de_pile) \ Bblock \ EGAL(descripteur_de_pile,Flist_creation()); \ Eblock #define VALIDATION_PILE(descripteur_de_pile,action_si_pile_valide,action_si_pile_invalide) \ Bblock \ Test(IFNE(descripteur_de_pile,PILE_UNDEF)) \ Bblock \ BLOC(action_si_pile_valide); \ Eblock \ ATes \ Bblock \ BLOC(action_si_pile_invalide); \ Eblock \ ETes \ Eblock \ /* Primitive de validation d'une pile et d'execution de l'une des */ \ /* deux alternatives. */ #define PUSH(descripteur_de_pile,informations) \ Bblock \ VALIDATION_PILE(descripteur_de_pile \ ,BLOC(Flist_GQelement(descripteur_de_pile,informations); \ ) \ ,BLOC(PRINT_ERREUR("lors d'un 'PUSH' l'adresse du descripteur_de_pile est invalide"); \ CAL1(Prer1(" Son adresse est %08X\n",descripteur_de_pile)); \ ) \ ); \ Eblock #define PULL(descripteur_de_pile,informations) \ /* ATTENTION : 'Flist_SQelement()' alloue de la memoire pour 'informations' ; cet espace */ \ /* doit imperativement etre rendu quelque part !!! */ \ Bblock \ VALIDATION_PILE(descripteur_de_pile \ ,BLOC(EGAL(informations,Flist_SQelement(descripteur_de_pile)); \ Test(IFEQ_chaine(informations,ELEMENT_VIDE)) \ Bblock \ PRINT_ERREUR("la pile est vide"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ ) \ ,BLOC(PRINT_ERREUR("lors d'un 'PULL' l'adresse du descripteur_de_pile est invalide"); \ CAL1(Prer1(" Son adresse est %08X\n",descripteur_de_pile)); \ EGAL(informations,CHAINE_UNDEF); \ /* Et on invalide l'information... */ \ ) \ ); \ Eblock #define DESTRUCTION_PILE(descripteur_de_pile) \ Bblock \ Test(IL_Y_A_ERREUR(Flist_Delement(descripteur_de_pile))) \ Bblock \ PRINT_ERREUR("'DESTRUCTION_PILE' : 'Flist_Delement' s'est mal passe (pile non vide ou inexistante)"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N D E S C H A I N E S N U M E R I Q U E S : */ /* */ /*************************************************************************************************************************************/ #define chain_numero(numero,nombre_de_chiffres) \ _chain_numero(numero,POSI(nombre_de_chiffres)) \ /* Conversion d'une nombre entier en une chaine numerique. Cette fonction intermediaire */ \ /* a ete ajoute en particulier pour permettre une generation "propre" des fichiers */ \ /* "bootstrappables" (en particulier le '$c' issu de 'v $xbg/fonction$K'). Ceci fut */ \ /* introduit le 1995072500 a la suite d'un rechargement du SYSTEME sur '$LACT28'... */ #define ChaineNumero(numero,nombre_de_chiffres) \ chain_numero(numero,MIN2(nombre_de_chiffres,ChaineNumero_____nombre_maximal_de_chiffres)) \ /* Introduit le 20080602111607 afin 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... */ #define chain_numero_exact(numero) \ chain_numero(numero,NOMBRE_DE_CHIFFRES_DECIMAUX(numero)) \ /* Conversion d'une nombre entier en une chaine numerique comportant EXACTement le nombre */ \ /* de chiffres decimaux utiles (introduite le 20120214103507). */ #define chain_numero_avec_separateur(numero,nombre_de_chiffres) \ chain_Aconcaten2(cSEPARATEUR_DES_COMPOSANTES_D_UN_NOM \ ,EGAs(chain_numero(numero,nombre_de_chiffres)) \ ) \ /* Conversion d'une nombre entier en une chaine numerique precede d'un separateur */ \ /* (introduite le 20151021182143). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O R M A T D E C O N V E R S I O N D E S C H A I N E S N U M E R I Q U E S : */ /* */ /*************************************************************************************************************************************/ #define INTRODUCTION_FORMAT \ C_POUR_CENT \ /* Introduit le 20180320140359... */ #define TAILLE_MOT_ALPHA_NUMERIQUE \ bMUL(bDIV(NBITOC,NBITHX),NOCMO) \ /* Nombre d'octets occupes par un mot converti en alpha-numerique */ \ /* de type hexa-decimal. */ #define NOMBRE_CHIFFRES_MOT_ALPHA_NUMERIQUE \ NOMBRE_DE_CHIFFRES_DECIMAUX(TAILLE_MOT_ALPHA_NUMERIQUE) \ /* Nombre de chiffres necessaires pour exprimer la longueur de la chaine resultant de la */ \ /* conversion d'un mot... */ \ /* */ \ /* La procedure 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)' fut introduite le 20051210181752... */ #define LONGUEUR_CHAINE_DOUBLE_MOT \ bADD(DOUB(TAILLE_MOT_ALPHA_NUMERIQUE),SIZC(C_VIDE)) \ /* Nombre d'octets necessaires pour une chaine representant un double-mot. */ #define TYPE_FORMAT_INTE \ C_I #define TYPE_FORMAT_JNTE \ COND(IL_FAUT(FconversionJ__FconversionX__FconversionY_____confondre_les_types__J_X_Y__avec__le_type_I) \ ,ccCHAR(TYPE_FORMAT_INTE) \ ,ccCHAR(C_J) \ ) #define TYPE_FORMAT_XNTE \ COND(IL_FAUT(FconversionJ__FconversionX__FconversionY_____confondre_les_types__J_X_Y__avec__le_type_I) \ ,ccCHAR(TYPE_FORMAT_INTE) \ ,ccCHAR(C_X) \ ) #define TYPE_FORMAT_YNTE \ COND(IL_FAUT(FconversionJ__FconversionX__FconversionY_____confondre_les_types__J_X_Y__avec__le_type_I) \ ,ccCHAR(TYPE_FORMAT_INTE) \ ,ccCHAR(C_Y) \ ) /* Les formats 'TYPE_FORMAT_JNTE' et 'TYPE_FORMAT_XNTE' furent introduits le 20070421181919. */ /* Le format 'TYPE_FORMAT_YNTE' fut lui introduit le 20070421183016. Je note au passage */ /* que pour revenir a la situation anterieure, il suffirait de definir : */ /* */ /* #define TYPE_FORMAT_JNTE \ */ /* TYPE_FORMAT_INTE */ /* #define TYPE_FORMAT_XNTE \ */ /* TYPE_FORMAT_INTE */ /* #define TYPE_FORMAT_YNTE \ */ /* TYPE_FORMAT_INTE */ /* */ /* et c'est tout. Cette remarque a entraine l'introduction d'un nouvel indicateur controlant */ /* cela ('FconversionJ__FconversionX__FconversionY_____confondre_les_types__J_X_Y__...'). */ #if (PRECISION_DU_Int==SIMPLE_PRECISION) # define __FORMAT_INTE \ "d" # define __FORMAT_HEXA_DECIMAL \ GvarDefaut("FORMAT_x_X","x") /* Introduits le 20100321185224... */ /* */ /* ATTENTION : le 20241106141709, j'ai essaye de permettre le remplacement de "x" par */ /* "X" via une variable de controle : */ /* */ /* COND(EST_VRAI(utiliser_x_plutot_que_X),"x",C_HEXA_DECIMAL) */ /* */ /* Mais cela ne marche pas car, AVANT l'execution de l'intruction "associee" : */ /* */ /* GET_ARGUMENT_L("x_plutot_que_X=""xX=",utiliser_x_plutot_que_X); */ /* */ /* l'allocation memoire ('v $xil/defi_c1$vv$DEF allocation_memoire_et_generation_des_for.') */ /* s'execute or c'est elle qui genere les formats hexa-decimaux avec "x" qui ne sont donc */ /* ensuite plus modifiable... */ /* */ /* Le 20241106170654 fut introduite la variable d'environnement '$FORMAT_x_X' pour permettre */ /* malgre tout de remplacer "x" par "X"... */ # define C_HEXA_DECIMAL \ "X" \ /* Pour generer les formats de conversion hexa-decimaux. */ #Aif (PRECISION_DU_Int==SIMPLE_PRECISION) #Eif (PRECISION_DU_Int==SIMPLE_PRECISION) #if (PRECISION_DU_Int==DOUBLE_PRECISION) # define __FORMAT_INTE \ "ld" # define __FORMAT_HEXA_DECIMAL \ GvarDefaut("FORMAT_x_X","lx") /* Introduits le 20100321185224... */ /* */ /* ATTENTION : le 20241106141709, j'ai essaye de permettre le remplacement de "x" par */ /* "X" via une variable de controle : */ /* */ /* COND(EST_VRAI(utiliser_x_plutot_que_X),"x",C_HEXA_DECIMAL) */ /* */ /* Mais cela ne marche pas car, AVANT l'execution de l'intruction "associee" : */ /* */ /* GET_ARGUMENT_L("x_plutot_que_X=""xX=",utiliser_x_plutot_que_X); */ /* */ /* l'allocation memoire ('v $xil/defi_c1$vv$DEF allocation_memoire_et_generation_des_for.') */ /* s'execute or c'est elle qui genere les formats hexa-decimaux avec "x" qui ne sont donc */ /* ensuite plus modifiable... */ /* */ /* Le 20241106170654 fut introduite la variable d'environnement '$FORMAT_x_X' pour permettre */ /* malgre tout de remplacer "x" par "X"... */ # define C_HEXA_DECIMAL \ "lX" \ /* Pour generer les formats de conversion hexa-decimaux (introduit le 20110418122921). */ #Aif (PRECISION_DU_Int==DOUBLE_PRECISION) #Eif (PRECISION_DU_Int==DOUBLE_PRECISION) #define _FORMAT_INTE_EDITION \ COND(IFEQ_chaine(ccCHAR(signe_de_FORMAT_INTE_EDITION),ccCHAR(C_VIDE)) \ ,FORMAT_INTE \ ,chain_Aconcaten3(INTRODUCTION_FORMAT,ccCHAR(signe_de_FORMAT_INTE_EDITION),__FORMAT_INTE) \ ) #define _FORMAT_INTE_EDITION__NON_SIGNE \ FORMAT_INTE #define cFORMAT_INTE \ chain_Aconcaten2(INTRODUCTION_FORMAT,__FORMAT_INTE) #define cFORMAT_INTE_EDITION \ format_INTE_EDITION() #define cFORMAT_INTE_EDITION__NON_SIGNE \ format_INTE_EDITION__NON_SIGNE() /* Format de conversion "Int", en entree et en sortie. */ #define SOUS_TITRE_D_UNE_VALEUR_HEXA_DECIMALE \ "0x" \ /* "Sous-titre" a utiliser pour detecter les valeurs hexadecimales (cette definition a ete */ \ /* deplacee de 'v $xig/fonct$vv$FON' a 'v $xig/fonct$vv$DEF' le 20021204174322). */ \ /* */ \ /* Nota : on ne peut utiliser ici (note le 20241107113653) : */ \ /* */ \ /* GvarDefaut("FORMAT_0x","0x") */ \ /* */ \ /* car, en effet, si la variable '$FORMAT_0x' prend une autre valeur, cela a des */ \ /* consequences eventuellement sur l'entree des constantes decimales qui peuvent alors */ \ /* etre interpretees comme etant hexa-decimales... */ #define POUR_CENT_0_D_UNE_VALEUR_HEXA_DECIMALE \ "%0" \ /* Le 20241106172005, la variable d'environnement '$FORMAT_pc0' a ete introduite... */ \ /* */ \ /* Je note le 20241108094532 que la variable '$FORMAT_pc0' n'a aucun interet et est meme */ \ /* dangereuse (avec "%", elle introduit des espaces entre "0x" et la valeur). Donc : */ \ /* */ \ /* GvarDefaut("FORMAT_pc0","%0") */ \ /* */ \ /* est supprime a cette date... */ #define cFORMAT_HEXA_DECIMAL \ chain_Aconcaten2(INTRODUCTION_FORMAT,__FORMAT_HEXA_DECIMAL) #define cFORMAT_HEXA_DECIMAL_SANS_0_EDITION \ chain_Aconcaten2(SOUS_TITRE_D_UNE_VALEUR_HEXA_DECIMALE \ ,cFORMAT_HEXA_DECIMAL \ ) #define cFORMAT_HEXA_DECIMAL_EDITION_1 \ chain_numero(NCHXMO,NOMBRE_DE_CHIFFRES_DECIMAUX(NCHXMO)) #define cFORMAT_HEXA_DECIMAL_EDITION \ chain_Aconcaten4(SOUS_TITRE_D_UNE_VALEUR_HEXA_DECIMALE \ ,POUR_CENT_0_D_UNE_VALEUR_HEXA_DECIMALE \ ,cFORMAT_HEXA_DECIMAL_EDITION_1 \ ,__FORMAT_HEXA_DECIMAL \ ) #define cFORMAT_CHAR_HEXA_DECIMAL_EDITION_1 \ chain_numero(NCHXOC,NOMBRE_DE_CHIFFRES_DECIMAUX(NCHXOC)) #define cFORMAT_CHAR_HEXA_DECIMAL_EDITION \ chain_Aconcaten4(SOUS_TITRE_D_UNE_VALEUR_HEXA_DECIMALE \ ,POUR_CENT_0_D_UNE_VALEUR_HEXA_DECIMALE \ ,cFORMAT_CHAR_HEXA_DECIMAL_EDITION_1 \ ,__FORMAT_HEXA_DECIMAL \ ) /* Format de conversion "Int" mais utilisant la notation hexadecimale "0x...", en entree */ /* et en sortie. La sortie sur 'NCHXMO' chiffres fut introduite le 20051210180444... */ /* */ /* La procedure 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)' fut introduite le 20051210181752... */ /* */ /* La definition 'FORMAT_HEXA_DECIMAL_CARACTERE_EDITION' a ete introduite le 20120329135755. */ /* */ /* Le 20190905135010, 'nombre_de_chiffres_des_editions_hexa_decimales' a remplace 'NCHXMO' */ /* provisoirement, mais cela ne marche pas ('v $xig/fonct$vv$FON 20190905134645'...). */ /* */ /* Le 20190906114010 fut introduit 'cFORMAT_HEXA_DECIMAL_SANS_0_EDITION'... */ #define TYPE_FORMAT_FLOT \ C_F #if (PRECISION_DU_Float==SIMPLE_PRECISION) # define _FORMAT_FLOT_EDITION \ COND(IFEQ_chaine(ccCHAR(signe_de_FORMAT_FLOT_EDITION),ccCHAR(C_VIDE)) \ ,chain_Aconcaten3(INTRODUCTION_FORMAT,".^^",ccCHAR(mode_fg_de_FORMAT_FLOT_EDITION)) \ ,chain_Aconcaten4(INTRODUCTION_FORMAT \ ,ccCHAR(signe_de_FORMAT_FLOT_EDITION) \ ,".^^" \ ,ccCHAR(mode_fg_de_FORMAT_FLOT_EDITION) \ ) \ ) # define _FORMAT_FLOT_EDITION__NON_SIGNE \ chain_Aconcaten3(INTRODUCTION_FORMAT,".^^",ccCHAR(mode_fg_de_FORMAT_FLOT_EDITION)) # define FORMAT_FLOT_PRECISION \ C_VIDE # define cFORMAT_FLOT \ chain_Aconcaten3(INTRODUCTION_FORMAT,FORMAT_FLOT_PRECISION,ccCHAR(mode_fg_de_FORMAT_FLOT_EDITION)) /* Format de conversion "flottant" (simple precision), en entree et en sortie. */ /* */ /* A cause de 'v $xig/edite$vv$FON FORMAT_FLOT_EDITION__NON_SIGNE', le 20190929104420 */ /* fut introduit explicitement 'FORMAT_FLOT_EDITION__NON_SIGNE'... On notera simultanement */ /* qu'il ne faut surtout pas introduire ".^^" dans la definition de 'cFORMAT_FLOT' et ce */ /* a cause de l'usage qui est en fait dans 'v $xig/fonct$vv$FON 20040301095143'... */ /* */ /* Pour 'v $xig/allocation$vv$FON FORMAT_FLOT_PRECISION', 'FORMAT_FLOT_PRECISION' a ete */ /* introduit le 20210925142522... */ #Aif (PRECISION_DU_Float==SIMPLE_PRECISION) #Eif (PRECISION_DU_Float==SIMPLE_PRECISION) #if (PRECISION_DU_Float==DOUBLE_PRECISION) # define _FORMAT_FLOT_EDITION \ COND(IFEQ_chaine(ccCHAR(signe_de_FORMAT_FLOT_EDITION),ccCHAR(C_VIDE)) \ ,chain_Aconcaten3(INTRODUCTION_FORMAT,".^^l",ccCHAR(mode_fg_de_FORMAT_FLOT_EDITION)) \ ,chain_Aconcaten4(INTRODUCTION_FORMAT \ ,ccCHAR(signe_de_FORMAT_FLOT_EDITION) \ ,".^^l" \ ,ccCHAR(mode_fg_de_FORMAT_FLOT_EDITION) \ ) \ ) # define _FORMAT_FLOT_EDITION__NON_SIGNE \ chain_Aconcaten3(INTRODUCTION_FORMAT,".^^l",ccCHAR(mode_fg_de_FORMAT_FLOT_EDITION)) # define FORMAT_FLOT_PRECISION \ C_l # define cFORMAT_FLOT \ chain_Aconcaten3(INTRODUCTION_FORMAT,FORMAT_FLOT_PRECISION,ccCHAR(mode_fg_de_FORMAT_FLOT_EDITION)) /* Format de conversion "flottant" (double precision), en entree et en sortie. */ /* */ /* A cause de 'v $xig/edite$vv$FON FORMAT_FLOT_EDITION__NON_SIGNE', le 20190929104420 */ /* fut introduit explicitement 'FORMAT_FLOT_EDITION__NON_SIGNE'... On notera simultanement */ /* qu'il ne faut surtout pas introduire ".^^" dans la definition de 'cFORMAT_FLOT' et ce */ /* a cause de l'usage qui est en fait dans 'v $xig/fonct$vv$FON 20040301095143'... */ /* */ /* Pour 'v $xig/allocation$vv$FON FORMAT_FLOT_PRECISION', 'FORMAT_FLOT_PRECISION' a ete */ /* introduit le 20210925142522... */ #Aif (PRECISION_DU_Float==DOUBLE_PRECISION) #Eif (PRECISION_DU_Float==DOUBLE_PRECISION) #define cFORMAT_FLOT_EDITION \ format_FLOT_EDITION() \ /* Format de conversion "flottant" en sortie. */ #define cFORMAT_FLOT_EDITION__NON_SIGNE \ format_FLOT_EDITION__NON_SIGNE() \ /* Format de conversion "flottant" en sortie non signe (introduit le 20190929105235). */ \ /* Voir 'v $xig/edite$vv$FON 20190929095039' qui justifie son introduction... */ #define TYPE_FORMAT_CHAI \ C_C #define TYPE_FORMAT_GENERAL_CHAI \ C_s /* Introduit le 20210925124252 pour 'v $xig/allocation$vv$FON TYPE_FORMAT_GENERAL_CHAI'... */ #define TYPE_FORMAT_LOGI \ C_L #define TYPE_FORMAT_NOGI \ C_N #define FORMAT_CHAI_1 \ INTRODUCTION_FORMAT #define cFORMAT_CHAI_2 \ chain_Aconcaten11("[][" \ ,Gvar("K_BLANC") \ ,",.;:+=><{}()*?!/\\|" \ ,C_VERITABLE_ANTI_QUOTE \ ,"#@" \ ,"^$%&" \ ,"_0-9A-Za-z" \ ,"\n\t" \ ,C_VERITABLE_APOSTROPHE \ ,C_VERITABLE_QUOTE \ ,"-]" \ ) #define cFORMAT_CHAI \ chain_Aconcaten2(FORMAT_CHAI_1 \ ,FORMAT_CHAI_2 \ ) /* Format de recuperation de chaines de caracteres ; on notera que l'on n'utilise */ /* pas "%s", car alors le caractere 'ESPACE' ne serait pas reconnu comme faisant */ /* partie des chaines de caracteres, meme entre quotes. ATTENTION, il y avait autrefois : */ /* */ /* "%[ ,.;:+-=<>()/#$%&_0-9A-Za-z]" */ /* */ /* mais alors "+-=" s'interpretait comme le segment [+=] ; il est imperatif que "-" soit en */ /* tete de la liste pour perdre ce sens de definition de segment. Il y a donc eu ensuite : */ /* */ /* "%[- ,.;:+=<>()/#$%&_0-9A-Za-z]" */ /* */ /* mais malheureusement, par exemple, dans 'v $xci/genere$K' cela posait des problemes, car */ /* en effet, ce programme recoit comme argument 'C=...' une commande type a generer pour le */ /* 'C-Shell' ; or celle-ci peut contenir un "pipe". Enfin, la chaine "<>" correspondant a */ /* '$PASSE_A', elle ne doit pas apparaitre dans cet ordre (d'ou "><"...). */ /* */ /* En ce qui concerne le caractere "\", il faudra le doubler dans la chaine Argument, si on */ /* veut le voir apparaitre dans la chaine Resultat... */ /* */ /* Le 1995031300, j'ai du rajouter les quotes simples et doubles, et ce afin de generer */ /* avec '$xci/genere$X' des appels a '$xci/disk_video_P$Z' qui contiennent donc la chaine */ /* de formatage des images : */ /* */ /* "$formatI" */ /* */ /* explicitement. On notera que l'on ecrit : */ /* */ /* "%[- ,.;:+=><()* /\\|#$%&_0-9A-Za-z]""K_QS""K_QD" */ /* . */ /* /|\ */ /* | ATTENTION a l'espace entre "*" et "/" */ /* et non pas : ============ destine a eviter dans ce commentaire une */ /* | confusion avec une fin de commentaire... */ /* \|/ */ /* ` */ /* "%[- ,.;:+=><()* /\\|#$%&_0-9A-Za-z]\'\"" */ /* */ /* ou : */ /* */ /* "%[- \'\",.;:+=><()* /\\|#$%&_0-9A-Za-z]" */ /* */ /* . */ /* /|\ */ /* | */ /* */ /* a cause du caractere ";" qui suit les quotes simples et doubles, et qui etant donnee la */ /* programmation de '$xcp/decoupage$K' pourrait provoquer un decoupage des occurences des */ /* chaines 'FORMAT_CHAI' derriere ce caractere ";". On notera enfin que, malheureusement, */ /* on fait ainsi de l'allocation memoire jamais releasee... */ /* */ /* Le 1995041900, j'ai introduit le caractere '!' a cause de la commande '$xci/genere$K' */ /* qui peut generer des redirections qui l'utilisent. Au passage, je l'ai place entre '*' */ /* et '/' pour regler le probleme des faux commentaires. On notera un point important ; a */ /* cause du role particulier du caractere '!' au niveau interactif, lors de son utilisation */ /* avec '$xci/genere$K', il devra etre "backslashe" : */ /* */ /* $xci/genere$X ... commande='... >>\! ...' */ /* */ /* sinon, il sera interprete par le 'C-Shell'... */ /* */ /* Le 1995100600, j'ai introduit le caractere '?' a cause de la commande '$xci/genere$K' */ /* qui peut avoir a l'utiliser... */ /* */ /* Le 1995111600, j'ai introduit le caractere '@' a cause de la necessite de pouvoir des */ /* calculs arithmetiques sur les variables du 'C-Shell' (qui sont introduits par "@"). */ /* */ /* Le 1996012200, j'ai introduit les caracteres '[' et ']' ce qui m'a contraint a placer */ /* '-' en dernier (alors qu'il etait autrefois le premier de la liste, afin que ']' puisse */ /* etre mis en premier. Il y avait donc avant : */ /* */ /* chain_Aconcaten5("%[" */ /* ,"- ,.;:+=><()*?!/\\|`#@$%&_0-9A-Za-z" */ /* ,Gvar("K_QS") */ /* ,Gvar("K_QD") */ /* ,"]" */ /* ) */ /* */ /* on ne sait jamais... */ /* */ /* Le 19961017091611, j'ai introduit les caracteres '{}' car la commande '$xci/genere$K' */ /* qui peut avoir a l'utiliser ('v $xiirv/$Fnota AW'). */ /* */ /* Le 19961128095347, j'ai introduit le caractere "\n" ("new-line") afin de pouvoir */ /* l'utiliser comme argument du programme '$xcp/substitue.01$K'. On notera le 20040630125510 */ /* que cela presente alors un gros inconvenient : celui de ne pas pouvoir entrer en tant */ /* que chaine a rechercher ou a substituer (dans '$xcp/substitue.01$X') la chaine faite */ /* des deux caracteres "\n" (soit "\" et "n" concatenes) puisque "\n" est automatiquement */ /* remplace par "\012". Il en est de meme de "\t" evidemment... */ /* */ /* Le 19961220090446, j'ai introduit le caractere "^" afin de pouvoir l'utiliser comme */ /* argument du programme '$xcp/substitue.01$K'. */ /* */ /* Le 19970313155741, la variable '$K_BLANC' a ete introduite a la place de " " afin de */ /* garantir la presence de " " dans 'FORMAT_CHAI'... */ /* */ /* Le 20010725092518, j'ai introduit "\t" qui depuis l'introduction de la fonction */ /* 'v $xig/fonct$vv$FON chain_Acopie_avec_conversions_possibles_majuscules_minuscules' */ /* dans l'appel des fonctions 'v $xig/fonct$vv$DEF FCon.argument_courant' */ /* (introduit le 20010621143912) est devenu indispensable. */ /* */ /* Le 20020112101614, le "@" a ete mis a part a cause d'une modification introduite le */ /* 20020111100021 dans 'v $xcc/cpp$Z 20020111100021', "@" servant de marqueur '$MaRqUeUr'. */ /* */ /* Le 20051117175706, pour 'v $xig/fonct$vv$FON 20051117174126' a ete introduit le */ /* decoupage {FORMAT_CHAI_1,FORMAT_CHAI_2}. */ /* */ /* Le 20061225141132 a ete introduit 'C_VERITABLE_ANTI_QUOTE' car, en effet, le "`" etait */ /* avant cette date mal interprete a cause de 'v $xcc/cpp$Z S_UNDERSCORE'... */ /* */ /* Le 20241120130837 je note que '~' manque et je l'ai alors introduit dans la chaine : */ /* */ /* "^$%&~" */ /* */ /* mais en fait cela ne sert a rien. Le 20241120151612 je supprime donc '~' car, on ne sait */ /* jamais... */ #define cFORMAT_CHAI_EDITION \ chain_Aconcaten3(FORMAT_CHAI_EDITION_____caractere_d_encadrement \ ,"%s" \ ,FORMAT_CHAI_EDITION_____caractere_d_encadrement \ ) /* Format d'edition de chaines de caracteres ; en effet, contrairement aux valeurs */ /* numeriques (entieres, flottantes,...) pour lesquelles le meme format sert aussi bien */ /* a la recherche qu'a l'edition, pour les chaines de caracteres, le format 'FORMAT_CHAI' */ /* ne peut etre utilise pour la sortie... */ /* */ /* Le 20070227185323, fut introduit 'FORMAT_CHAI_EDITION_____caractere_d_encadrement'... */ #define FORMAT_LOGI_EDITION \ "%s" #define FORMAT_NOGI_EDITION \ FORMAT_LOGI_EDITION /* Format d'edition des variables logiques (introduit le 20000203120732 en ce qui concerne */ /* 'FORMAT_NOGI_EDITION' et le 20030213162851 pour 'FORMAT_NOGI_EDITION'). */ #define TYPE_FORMAT_CHAR \ C_K #define FORMAT_CHAR \ "%c" #define cFORMAT_CHAR_EDITION \ chain_Aconcaten3(FORMAT_CHAR_EDITION_____caractere_d_encadrement \ ,"%c" \ ,FORMAT_CHAR_EDITION_____caractere_d_encadrement \ ) #define cFORMAT_CHAR_EDITION_BACKSLASHEE \ chain_Aconcaten3(FORMAT_CHAR_EDITION_____caractere_d_encadrement \ ,"\\%c" \ ,FORMAT_CHAR_EDITION_____caractere_d_encadrement \ ) /* Format de recuperation d'un caractere, en entree et en sortie. */ /* */ /* Le 20070227185323, fut introduit 'FORMAT_CHAR_EDITION_____caractere_d_encadrement'... */ /* */ /* Le 20070228115321, fut introduit 'FORMAT_CHAR_EDITION_BACKSLASHE' pour permettre une */ /* edition correcte du caractere 'K_APOSTROPHE'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M I S E A U P L U R I E L D ' U N N O M : */ /* */ /*************************************************************************************************************************************/ #define PLURIEL_S(nom_au_singulier,nombre_de) \ COND(IFGT(ABSO(nombre_de),UN) \ ,EGAs(chain_Aconcaten2(ccCHAR(nom_au_singulier),ccCHAR("s"))) \ ,ccCHAR(nom_au_singulier) \ ) #define PLURIEL_EXCEPTION(nom_au_singulier,nom_au_pluriel,nombre_de) \ COND(IFGT(ABSO(nombre_de),UN) \ ,nom_au_pluriel \ ,nom_au_singulier \ ) /* Mise au pluriel d'un nom au singulier sous la forme la plus courante (ajouter un "s") */ /* et sous la forme d'exception ("un cheval", "des chevaux"). Ceci a ete introduit le */ /* 20030709091919. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Z O N E S 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 ) : */ /* */ /*************************************************************************************************************************************/ Dunion_05(NUM_MULTIPLEX ,Dstruct01(NOM_VIDE ,DEFV(Logical,valeur) /* Stockage d'une valeur logique. */ ,logique ) ,Dstruct01(NOM_VIDE ,DEFV(Int,valeur) /* Stockage d'une valeur entiere. */ ,entier ) ,Dstruct01(NOM_VIDE ,DEFV(Float,valeur) /* Stockage d'une valeur flottante simple-precision. */ ,simple_precision ) ,Dstruct01(NOM_VIDE ,DEFV(Double,valeur) /* Stockage d'une valeur flottante double-precision. */ ,double_precision ) ,Dstruct03(NOM_VIDE ,DEFV(Positive,premiere_partie) ,DEFV(Positive,deuxieme_partie) /* Zone virtuelle de transfert sous forme de deux mots non signes. */ ,DEFV(CHAR,DTb1(chaine_alpha_numerique,LONGUEUR_CHAINE_DOUBLE_MOT)) /* Zone destinee a recevoir la version codees en alpha-numerique des */ /* deux zones precedentes ; le 'DOUB' est la a cause des flottants en */ /* double-precision. */ ,binaire_equivalent ) ,NOM_VIDE ); Typedef(num_multiplex,UNIO(NUM_MULTIPLEX)) TypedefS(A___num_multiplex,num_multiplex) TypedefS(E___num_multiplex,num_multiplex) /* Definition d'une zone de multiplexage "Int"/"Float"/"Double". */ #define FORMAT_DOUBLE \ Bblock \ Test(IFEQ(format_double,CHAINE_UNDEF)) \ /* La premiere fois, on initialise le format de conversion... */ \ Bblock \ DEFV(CHAR,INIT(POINTERc(format_double_numero) \ ,chain_numero(TAILLE_MOT_ALPHA_NUMERIQUE \ ,bADD(NOMBRE_CHIFFRES_MOT_ALPHA_NUMERIQUE \ ,SIZC(C_VIDE) \ ) \ ) \ ) \ ); \ \ EGAp(format_double \ ,chain_Aconcaten8(C_POUR_CENT \ ,C_0 \ ,format_double_numero \ ,C_HEXA_DECIMAL \ ,C_POUR_CENT \ ,C_0 \ ,format_double_numero \ ,C_HEXA_DECIMAL \ ) \ ); \ \ CALZ_FreCC(format_double_numero); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Definition du format necessaire pour convertir deux mots non signes */ \ /* en hexa-decimal par la fonction 'SPrint'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Q U E L Q U E S A R G U M E N T S S T A N D A R D S P O U R L E S C O M M A N D E S : */ /* */ /*************************************************************************************************************************************/ #define __NOM_UNDEF_VIDE \ C_VIDE \ /* Destine a definir un nom vide... */ #define __ARGUMENT_PIPE \ C_EGAL \ /* Destine a preciser qu'un certain fichier sera accede via un "pipe". */ #define __ARGUMENT_PAR_DEFAUT \ C_POINT \ /* Destine a forcer une valeur par defaut pour un argument. */ #if ( (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_VAX8600_ULTRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_CC)) \ ) # define NOM_UNDEF_VIDE \ nom_UNDEF_vide \ /* Destine a definir un nom vide... */ # define ARGUMENT_PIPE \ argument_pipe \ /* Destine a preciser qu'un certain fichier sera accede via un "pipe". */ # define ARGUMENT_PAR_DEFAUT \ argument_par_defaut \ /* Destine a forcer une valeur par defaut pour un argument. */ #Aif ( (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_VAX8600_ULTRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_CC)) \ ) # define NOM_UNDEF_VIDE \ __NOM_UNDEF_VIDE \ /* Destine a definir un nom vide... */ # define ARGUMENT_PIPE \ __ARGUMENT_PIPE \ /* Destine a preciser qu'un certain fichier sera accede via un "pipe". */ # define ARGUMENT_PAR_DEFAUT \ __ARGUMENT_PAR_DEFAUT \ /* Destine a forcer une valeur par defaut pour un argument. */ #Eif ( (defined(SYSTEME_DECALPHA340_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA350_OSF1_CC)) \ || (defined(SYSTEME_DECALPHA464_OSF1_CC)) \ || (defined(SYSTEME_VAX8600_ULTRIX_CC)) \ || (defined(SYSTEME_VAX9000_ULTRIX_CC)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 ' : */ /* */ /*************************************************************************************************************************************/ #define PERMETTRE_L_ENTREE_DES_PARAMETRES_VIA_DES_setenv \ VRAI #define NE_PAS_PERMETTRE_L_ENTREE_DES_PARAMETRES_VIA_DES_setenv \ NOTL(PERMETTRE_L_ENTREE_DES_PARAMETRES_VIA_DES_setenv) /* Valeurs possibles de 'entrer_des_parametres_via_des_setenv' (le 19980420092917). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define TESTER_LA_DOUBLE_DEFINITION_DES_PARAMETRES \ VRAI #define NE_PAS_TESTER_LA_DOUBLE_DEFINITION_DES_PARAMETRES \ NOTL(TESTER_LA_DOUBLE_DEFINITION_DES_PARAMETRES) /* Valeurs possibles de 'tester_la_double_definition_des_parametres'... */ #define EDITER_LES_COMMANDES_AVANT_EXECUTION \ VRAI #define NE_PAS_EDITER_LES_COMMANDES_AVANT_EXECUTION \ NOTL(EDITER_LES_COMMANDES_AVANT_EXECUTION) /* Valeurs possibles de 'editer_les_commandes_avant_execution'... */ #define PERMETTRE_L_ACCES_AU_SOURCE_DU_PROGRAMME \ VRAI #define NE_PAS_PERMETTRE_L_ACCES_AU_SOURCE_DU_PROGRAMME \ NOTL(PERMETTRE_L_ACCES_AU_SOURCE_DU_PROGRAMME) /* Valeurs possibles de 'permettre_l_acces_au_source_du_programme'... */ #define PERMETTRE_L_ACCES_A_LA_LISTE_DES_FONCTIONS_REFERENCEES_PAR_LE_PROGRAMME \ VRAI #define NE_PAS_PERMETTRE_L_ACCES_A_LA_LISTE_DES_FONCTIONS_REFERENCEES_PAR_LE_PROGRAMME \ NOTL(PERMETTRE_L_ACCES_A_LA_LISTE_DES_FONCTIONS_REFERENCEES_PAR_LE_PROGRAMME) /* Valeurs de 'permettre_l_acces_a_la_liste_des_fonctions_referencees_par_le_programme' */ /* possibles (introduites le 20120626104316). */ #define EDITER_LE_NOM_SYNTHETIQUE_DE_LA_COMMANDE_COURANTE \ VRAI #define NE_PAS_EDITER_LE_NOM_SYNTHETIQUE_DE_LA_COMMANDE_COURANTE \ NOTL(EDITER_LE_NOM_SYNTHETIQUE_DE_LA_COMMANDE_COURANTE) /* Valeurs possibles de 'editer_le_NOM_SYNTHETIQUE_de_la_commande_courante'... */ #define EDITER_LE_NOM_ABSOLU_DU_SOURCE_c_DE_LA_COMMANDE_COURANTE \ VRAI #define NE_PAS_EDITER_LE_NOM_ABSOLU_DU_SOURCE_c_DE_LA_COMMANDE_COURANTE \ NOTL(EDITER_LE_NOM_ABSOLU_DU_SOURCE_c_DE_LA_COMMANDE_COURANTE) /* Valeurs possibles de 'editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante' */ /* (introduit le 20240104111119)... */ #define EDITER_LES_DIFFERENTES_VARIABLES_D_ENVIRONNEMENT_UTILES \ VRAI #define NE_PAS_EDITER_EDITER_LES_DIFFERENTES_VARIABLES_D_ENVIRONNEMENT_UTILES \ NOTL(EDITER_LES_DIFFERENTES_VARIABLES_D_ENVIRONNEMENT_UTILES) /* Valeurs possibles de 'editer_les_differentes_variables_d_environnement_utiles' (introduit */ /* le 20091114113908). */ #define EDITER_LES_DIFFERENTES_VARIABLES_D_ENVIRONNEMENT_UTILES_DANS_LES_LIBRAIRIES_DYNAMIQUES \ VRAI #define NE_PAS_EDITER_EDITER_LES_DIFFERENTES_VARIABLES_D_ENVIRONNEMENT_UTILES_DANS_LES_LIBRAIRIES_DYNAMIQUES \ NOTL(EDITER_LES_DIFFERENTES_VARIABLES_D_ENVIRONNEMENT_UTILES_DANS_LES_LIBRAIRIES_DYNAMIQUES) /* Pour 'editer_les_differentes_variables_d_environnement_utiles_dans_les_librairies' et */ /* lui donner sa valeur (introduit le 20091114113908). */ #define EDITER_LES_DIFFERENTES_VERSIONS_DU_PROGRAMME \ VRAI #define NE_PAS_EDITER_LES_DIFFERENTES_VERSIONS_DU_PROGRAMME \ NOTL(EDITER_LES_DIFFERENTES_VERSIONS_DU_PROGRAMME) /* Valeurs possibles de 'editer_les_differentes_versions_du_programme'... */ #define EDITER_LES_DIFFERENTES_VERSIONS_DU_PROGRAMME_DANS_LES_LIBRAIRIES_DYNAMIQUES \ VRAI #define NE_PAS_EDITER_LES_DIFFERENTES_VERSIONS_DU_PROGRAMME_DANS_LES_LIBRAIRIES_DYNAMIQUES \ NOTL(EDITER_LES_DIFFERENTES_VERSIONS_DU_PROGRAMME_DANS_LES_LIBRAIRIES_DYNAMIQUES) /* Pour 'editer_les_differentes_versions_du_programme_dans_les_librairies' et */ /* lui donner sa valeur (introduit le 20091114113908). */ #define EDITER_LA_LISTE_DES_LIBRAIRIES_DYNAMIQUES_UTILISEES \ VRAI #define NE_PAS_EDITER_LA_LISTE_DES_LIBRAIRIES_DYNAMIQUES_UTILISEES \ NOTL(EDITER_LA_LISTE_DES_LIBRAIRIES_DYNAMIQUES_UTILISEES) /* Pour 'EDITER_LA_LISTE_DES_LIBRAIRIES_DYNAMIQUES_UTILISEES' et lui donner sa valeur */ /* (introduit le 20220824180116). */ #define EDITER_LES_DIFFERENTS_BUGS_RECONNUS \ VRAI #define NE_PAS_EDITER_LES_DIFFERENTS_BUGS_RECONNUS \ NOTL(EDITER_LES_DIFFERENTS_BUGS_RECONNUS) /* Valeurs possibles de 'editer_les_differents_bugs_reconnus'... */ #define EDITER_LES_DIFFERENTS_INCLUDES_DU_PROGRAMME \ VRAI #define NE_PAS_EDITER_LES_DIFFERENTS_INCLUDES_DU_PROGRAMME \ NOTL(EDITER_LES_DIFFERENTS_INCLUDES_DU_PROGRAMME) /* Valeurs possibles de 'editer_les_differents_includes_du_programme'... */ #define LISTER_TOUS_LES_MESSAGES_POSSIBLES \ VRAI #define NE_PAS_LISTER_TOUS_LES_MESSAGES_POSSIBLES \ NOTL(LISTER_TOUS_LES_MESSAGES_POSSIBLES) /* Valeurs possibles de 'lister_tous_les_messages_possibles' (introduit le 20000524180053). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V E R S I O N S D E S P R O C E D U R E S S T A N D A R D S D E C O N V E R S I O N : */ /* */ /*************************************************************************************************************************************/ #nodefine gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_01 \ /* Dans cette version, les parametres ne peuvent pas etre entres via des 'setenv'... */ #define gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_02 \ /* Dans cette version, les parametres peuvent etre entres via des 'setenv'... */ #nodefine gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01 \ /* Dans cette version, des vecteurs de longueur connue et de tout '__ParaTyp' peuvent */ \ /* etre edites. */ #define gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02 \ /* Dans cette version, seuls des vecteurs de longueur connue et de type 'TYPE_FORMAT_FLOT' */ \ /* peuvent etre edites... */ #nodefine gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01 \ /* Dans cette version, des vecteurs de longueur inconnue et de tout '__ParaTyp' peuvent */ \ /* etre edites. */ #define gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02 \ /* Dans cette version, seuls des vecteurs de longueur inconnue et de type 'TYPE_FORMAT_FLOT' */ \ /* peuvent etre edites... */ /* ATTENTION : 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_0?' doivent */ /* etre definis ici (et non pas dans 'v $xiii/Images$DEF') car, en effet, leur existence */ /* est testee ci-apres, alors que '$xiii/Images$DEF' est inclus apres '$xig/fonct$vv$DEF'... */ #nodefine INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_01 \ /* Cette facon d'initialiser le format des images utilise le mode 'Std'. */ #nodefine INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_02 \ /* Cette facon d'initialiser le format des images utilise le mode 'Pal' (introduit le */ \ /* 20020122102707). */ #nodefine INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_03 \ /* Cette facon d'initialiser le format des images utilise les variables d'environnement */ \ /* {{$Xmin,$Xmax},{$Ymin,$Ymax}} lorsqu'elles existent, ou le mode 'Pal' dans le cas */ \ /* contraire (introduit le 20020126150829). */ #define INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_04 \ /* Cette facon d'initialiser le format des images utilise les variables d'environnement */ \ /* {{$Xmin,$Xmax},{$Ymin,$Ymax},{$Zmin,$Zmax}} lorsqu'elles existent, ou le mode 'Pal' */ \ /* (en ce qui concerne {X,Y}) et le mode par defaut (pour 'Z') dans le cas contraire */ \ /* (introduit le 20020126150829). J'ai immediatement note (le 20020212160210) que cela */ \ /* introduisait une difference importante d'initialisation car, en effet, avant cette */ \ /* date, la valeur par defaut de 'Zmax' etait : */ \ /* */ \ /* Zmax=511 ('v $xiii/Images$STR k___Zmax') */ \ /* */ \ /* alors qu'apres cette date, elle devient : */ \ /* */ \ /* Zmax=127 ('v $Fimages setenv...Zmax') */ \ /* */ \ /* A priori, cela ne devrait pas avoir de consequences. Au passage, cela devrait etre */ \ /* plutot benefique en reduisant la taille des eventuels albums dans le programme courant... */ \ /* */ \ /* Le 20020304182857, j'ai retabli : */ \ /* */ \ /* Zmax=511 ('v $Fimages dimension_formatZ') */ \ /* */ \ /* et ce a cause du programme 'v $xci/accumule.02$K derniere_tranche_verticale' afin que */ \ /* 'DERNIERE_TRANCHE_VERTICALE' (qui vaut la valeur de la variable 'Zmax') et la variable */ \ /* 'Zmax' apres 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi' (qui vaut '$Zmax') */ \ /* aient la meme valeur afin que '_____lNORMALISE_OZ(...)' fonctionne correctement... */ \ /* */ \ /* Pour revenir en arriere, il suffirait soit de reactiver l'option de version */ \ /* 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_03' ci-dessus, */ \ /* soit de supprimer les {setenv,unset} de definition de {$Zmin,$Zmax} dans le fichier */ \ /* 'v $Fimages setenv...Zmax'. */ #nodefine INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_05 \ /* Identique a 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_03', mais */ \ /* avec validation des axes (introduit le 20020213100517). */ \ /* */ \ /* ATTENTION, j'ai decouvert le 20020912142305 qu'il ne fallait surtout pas utiliser la */ \ /* validation des axes a ce moment de l'entree des parametres ('valider_les_axes_OX_OY_OZ' */ \ /* n'ayant pas encore ete defini) et ce a cause d'utilisations tres particuliere du type */ \ /* de 'v $xcg/transparents$Z xci/minimum' ou les dimensions des axes sont a priori tout a */ \ /* fait quelconque... */ #nodefine INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_06 \ /* Identique a 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_04', mais */ \ /* avec validation des axes (introduit le 20020213100517). */ \ /* */ \ /* ATTENTION, j'ai decouvert le 20020912142305 qu'il ne fallait surtout pas utiliser la */ \ /* validation des axes a ce moment de l'entree des parametres ('valider_les_axes_OX_OY_OZ' */ \ /* n'ayant pas encore ete defini) et ce a cause d'utilisations tres particuliere du type */ \ /* de 'v $xcg/transparents$Z xci/minimum' ou les dimensions des axes sont a priori tout a */ \ /* fait quelconque. A cette date, je suis donc repasse a la version */ \ /* 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_04'... */ /* ATTENTION : 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_0?' doivent */ /* etre definis ici (et non pas dans 'v $xiii/Images$DEF') car, en effet, leur existence */ /* est testee ci-apres, alors que '$xiii/Images$DEF' est inclus apres '$xig/fonct$vv$DEF'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O C E D U R E S S T A N D A R D S D E C O N V E R S I O N : */ /* */ /* */ /* Definition : */ /* */ /* les procedures suivantes permettent */ /* de definir "recursivement" la valeur */ /* d'un parametre ; cela signifie que */ /* si celui-ci est absent, il conserve */ /* sa valeur initiale (dite "par defaut"). */ /* On notera, qu'un meme parametre peut */ /* etre recupere plusieurs fois avec des */ /* titres differents (mais synonymes...). */ /* */ /* */ /* Utilisation : */ /* */ /* GET_PARAMETRE_K(liste_des_arguments,titre_attendu,parametre_K,valeur_K_par_defaut); */ /* GET_PARAMETRE_C(liste_des_arguments,titre_attendu,parametre_C,valeur_C_par_defaut); */ /* GET_PARAMETRE_L(liste_des_arguments,titre_attendu,parametre_L,valeur_L_par_defaut); */ /* GET_PARAMETRE_N(liste_des_arguments,titre_attendu,parametre_L,valeur_L_par_defaut); */ /* GET_PARAMETRE_I(liste_des_arguments,titre_attendu,parametre_I,valeur_I_par_defaut); */ /* GET_PARAMETRE_X(liste_des_arguments,titre_attendu,parametre_X,valeur_X_par_defaut); */ /* GET_PARAMETRE_F(liste_des_arguments,titre_attendu,parametre_F,valeur_F_par_defaut); */ /* GET_PARAMETRE_P(liste_des_arguments,titre_attendu,parametre_P,valeur_P_par_defaut); */ /* */ /* */ /* Hierarchie : */ /* */ /* g1PROCESS_PARAMETRE(...) */ /* gPROCESS_PARAMETRE(...) */ /* PROCESS_PARAMETRE(...) */ /* GET_PARAMETRE(...) */ /* GET_PARAMETRE_K(...) */ /* GIT_ARGUMENT_K(...) */ /* GET_ARGUMENT_K(...) */ /* GET_ARGUMENTS2_K(...) */ /* GET_ARGUMENTS3_K(...) */ /* GET_ARGUMENTS4_K(...) */ /* GET_PARAMETRE_C(...) */ /* GIT_ARGUMENT_C(...) */ /* GET_ARGUMENT_C(...) */ /* GET_ARGUMENTS2_C(...) */ /* GET_ARGUMENTS3_C(...) */ /* GET_ARGUMENTS4_C(...) */ /* GET_PARAMETRE_L(...) */ /* GET_PARAMETRE_N(...) */ /* GIT_ARGUMENT_N(...) */ /* GET_ARGUMENT_N(...) */ /* GET_ARGUMENTS2_N(...) */ /* GET_ARGUMENTS3_N(...) */ /* GET_ARGUMENTS4_N(...) */ /* GET_ARGUMENTS5_N(...) */ /* GET_ARGUMENTS6_N(...) */ /* GET_ARGUMENTS7_N(...) */ /* GET_ARGUMENTS8_N(...) */ /* GET_ARGUMENTS9_N(...) */ /* GET_ARGUMENTSa_N(...) */ /* GIT_ARGUMENT_L(...) */ /* GET_ARGUMENT_M(...) */ /* GET_ARGUMENT_L(...) */ /* GET_ARGUMENTS2_L(...) */ /* GET_ARGUMENTS3_L(...) */ /* GET_ARGUMENTS4_L(...) */ /* GET_ARGUMENTS5_L(...) */ /* GET_ARGUMENTS6_L(...) */ /* GET_ARGUMENTS7_L(...) */ /* GET_ARGUMENTS8_L(...) */ /* GET_ARGUMENTS9_L(...) */ /* GET_ARGUMENTSa_L(...) */ /* GET_PARAMETRE_I(...) */ /* GIT_ARGUMENT_I(...) */ /* GET_ARGUMENT_E(...) */ /* GET_ARGUMENT_I(...) */ /* GET_ARGUMENTS2_I(...) */ /* GET_ARGUMENTS2g_I(...) */ /* GET_ARGUMENTS3_I(...) */ /* GET_ARGUMENTS3g_I(...) */ /* GET_ARGUMENTS4_I(...) */ /* GET_ARGUMENT_J(...) */ /* GET_PARAMETRE_X(...) */ /* GET_ARGUMENT_X(...) */ /* GET_ARGUMENTS2_X(...) */ /* GET_ARGUMENTS3_X(...) */ /* GET_ARGUMENTS4_X(...) */ /* GET_ARGUMENT_Y(...) */ /* GET_PARAMETRE_F(...) */ /* GIT_ARGUMENT_F(...) */ /* GET_ARGUMENT_F(...) */ /* GET_ARGUMENTS2_F(...) */ /* GET_ARGUMENTS2g_F(...) */ /* GET_ARGUMENTS3_F(...) */ /* GET_ARGUMENTS3g_F(...) */ /* GET_ARGUMENTS4_F(...) */ /* GET_ARGUMENT_G(...) */ /* GET_PARAMETRE_P(...) */ /* GIT_ARGUMENT_P(...) */ /* GET_ARGUMENT_P(...) */ /* GET_ARGUMENTS2_P(...) */ /* GET_ARGUMENTS3_P(...) */ /* GET_ARGUMENTS4_P(...) */ /* PROKESS_PARAMETRE_K(...) */ /* PROKISS_ARGUMENT_K(...) */ /* PROKESS_ARGUMENT_K(...) */ /* PROCESS_PARAMETRE_K(...) */ /* PROCISS_ARGUMENT_K(...) */ /* PROCESS_ARGUMENT_K(...) */ /* PROCESS_ARGUMENTS2_K(...) */ /* PROKESS_PARAMETRE_C(...) */ /* PROKISS_ARGUMENT_C(...) */ /* PROKESS_ARGUMENT_C(...) */ /* PROCESS_PARAMETRE_C(...) */ /* PROCISS_ARGUMENT_C(...) */ /* PROCESS_ARGUMENT_C(...) */ /* PROCESS_ARGUMENT_FICHIER(...) */ /* PROCESS_ARGUMENTS2_C(...) */ /* PROKESS_PARAMETRE_L(...) */ /* PROKESS_PARAMETRE_N(...) */ /* PROKISS_ARGUMENT_N(...) */ /* PROKESS_ARGUMENT_N(...) */ /* PROCESS_PARAMETRE_N(...) */ /* PROCISS_ARGUMENT_N(...) */ /* PROCESS_ARGUMENT_N(...) */ /* PROCESS_ARGUMENTS2_N(...) */ /* PROKISS_ARGUMENT_L(...) */ /* PROKESS_ARGUMENT_L(...) */ /* PROCESS_PARAMETRE_L(...) */ /* PROCISS_ARGUMENT_L(...) */ /* PROCESS_ARGUMENT_L(...) */ /* PROCESS_ARGUMENTS2_L(...) */ /* PROKESS_PARAMETRE_I(...) */ /* PROKISS_ARGUMENT_I(...) */ /* PROKESS_ARGUMENT_I(...) */ /* PROCESS_PARAMETRE_I(...) */ /* PROCISS_ARGUMENT_I(...) */ /* PROCESS_ARGUMENT_I(...) */ /* PROCESS_ARGUMENTS2_I(...) */ /* PROKESS_PARAMETRE_J(...) */ /* PROCESS_PARAMETRE_J(...) */ /* PROCESS_ARGUMENT_J(...) */ /* PROKESS_PARAMETRE_X(...) */ /* PROKISS_ARGUMENT_X(...) */ /* PROKESS_ARGUMENT_X(...) */ /* PROCESS_PARAMETRE_X(...) */ /* PROCISS_ARGUMENT_X(...) */ /* PROCESS_ARGUMENT_X(...) */ /* PROCESS_ARGUMENTS2_X(...) */ /* PROKESS_PARAMETRE_Y(...) */ /* PROCESS_PARAMETRE_Y(...) */ /* PROCESS_ARGUMENT_Y(...) */ /* PROKESS_PARAMETRE_F(...) */ /* PROKISS_ARGUMENT_F(...) */ /* PROKESS_ARGUMENT_F(...) */ /* PROCESS_PARAMETRE_F(...) */ /* PROCISS_ARGUMENT_F(...) */ /* PROCESS_ARGUMENT_F(...) */ /* PROCESS_ARGUMENTS2_F(...) */ /* PROKESS_PARAMETRE_P(...) */ /* PROKISS_ARGUMENT_P(...) */ /* PROKESS_ARGUMENT_P(...) */ /* PROCESS_PARAMETRE_P(...) */ /* PROCISS_ARGUMENT_P(...) */ /* PROCESS_ARGUMENT_P(...) */ /* PROCESS_ARGUMENTS2_P(...) */ /* PROCESF_ARGUMENT_C(...) */ /* PROCESF_ARGUMENT_FICHIER(...) */ /* PROKESF_ARGUMENT_C(...) */ /* PROKESF_ARGUMENT_FICHIER(...) */ /* */ /* */ /* ATTENTION : */ /* */ /* Ajouter de nouvelles procedures ici (par */ /* exemple 'PROCESF_ARGUMENT_C(...)' peut exiger */ /* la modification de 'v $xcg/Voptions$Z' et de */ /* 'v $xcg/Voptions$D/get_argument$sed'. */ /* */ /* */ /* ATTENTION : */ /* */ /* Je note le 20190806104105 (bien tardivement) */ /* que les procedures 'GET_ARGUMENTS?_?(...)' ne */ /* donnent pas pleinement satisfaction lors de */ /* l'usage de : */ /* */ /* Parametres=VRAI */ /* */ /* si tous les parametres a positionner n'ont pas */ /* la meme valeur par defaut ; c'est alors le premier */ /* qui est edite. Cela s'est vu a cette date avec */ /* 'v $xiii/di_image$FON _____rapport_critique' et */ /* 'v $xci/jeu_vie.01$K' qui ne donnait que la valeur */ /* */ /* rc=+0.375 (=3/8) */ /* */ /* alors que la valeur +0.4444444444444444 (=4/9) */ /* n'apparaissait pas. C'est cela qui a conduit a */ /* l'introduction de 'v $xci/jeu_vie.01$K rapport_critique_variable='. */ /* en plus de 'v $xci/jeu_vie.01$K rapport_critique=' : */ /* */ /* GET_ARGUMENT_F("rapport_critique=""rc=",Ijeu_de_la_vie_generalise_____rapport_critique); */ /* GET_ARGUMENT_F("rapport_critique_variable=""rcv=",Ijeu_de_la_vie_generalise_variable_____rapport_critique); */ /* */ /* a la place de : */ /* */ /* GET_ARGUMENTS2_F("rapport_critique=""rc=" */ /* ,Ijeu_de_la_vie_generalise_____rapport_critique */ /* ,Ijeu_de_la_vie_generalise_variable_____rapport_critique */ /* ); */ /* */ /* qui ne donnait donc pas satisfaction... */ /* */ /* Cela a conduit le 20190806132343 a la mise en place de */ /* la validation 'GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(...)'. */ /* On notera a ce propos le traitement specifique (et unique...) de */ /* 'v $xig/fonct$vv$DEF .DepthCueingMinimal=dcm=.' destine a garantir */ /* simplement la compatibilite anterieure... */ /* */ /* */ /* ATTENTION : */ /* */ /* Les 'PROCESS_PARAMETRE_...(...)' qui suivent */ /* peuvent impliquer des contraintes dans l'ordre */ /* de presentation des parametres (voir par exemple */ /* le module 'v $xrq/nucleon.Lb.2$I$INUTILE'). */ /* */ /* PROKESS_PARAMETRE_K(liste_des_arguments,titre_attendu,parametre_K,valeur_K_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKESS_PARAMETRE_C(liste_des_arguments,titre_attendu,parametre_C,valeur_C_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKESS_PARAMETRE_L(liste_des_arguments,titre_attendu,parametre_L,valeur_L_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKESS_PARAMETRE_N(liste_des_arguments,titre_attendu,parametre_L,valeur_L_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKESS_PARAMETRE_I(liste_des_arguments,titre_attendu,parametre_I,valeur_I_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKESS_PARAMETRE_X(liste_des_arguments,titre_attendu,parametre_I,valeur_I_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKESS_PARAMETRE_F(liste_des_arguments,titre_attendu,parametre_F,valeur_F_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKESS_PARAMETRE_P(liste_des_arguments,titre_attendu,parametre_P,valeur_P_par_defaut,seq1,seqI,seqC,seqN); */ /* */ /* PROCESS_PARAMETRE_K(liste_des_arguments,titre_attendu,parametre_K,valeur_K_par_defaut,sequenceI,sequenceC); */ /* PROCESS_PARAMETRE_C(liste_des_arguments,titre_attendu,parametre_C,valeur_C_par_defaut,sequenceI,sequenceC); */ /* PROCESS_PARAMETRE_L(liste_des_arguments,titre_attendu,parametre_L,valeur_L_par_defaut,sequenceI,sequenceC); */ /* PROCESS_PARAMETRE_N(liste_des_arguments,titre_attendu,parametre_L,valeur_L_par_defaut,sequenceI,sequenceC); */ /* PROCESS_PARAMETRE_I(liste_des_arguments,titre_attendu,parametre_I,valeur_I_par_defaut,sequenceI,sequenceC); */ /* PROCESS_PARAMETRE_X(liste_des_arguments,titre_attendu,parametre_I,valeur_I_par_defaut,sequenceI,sequenceC); */ /* PROCESS_PARAMETRE_F(liste_des_arguments,titre_attendu,parametre_F,valeur_F_par_defaut,sequenceI,sequenceC); */ /* PROCESS_PARAMETRE_P(liste_des_arguments,titre_attendu,parametre_P,valeur_P_par_defaut,sequenceI,sequenceC); */ /* */ /* (ou 'seqI,seqC' designe 'sequence_inconditionnelle,sequence_conditionnelle') */ /* */ /* GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom,La,BLOC(liste_recup_1),BLOC(action_intermediaire),BLOC(liste_recup_2)); */ /* */ /* */ /* GIT_ARGUMENT_K(titre_attendu,parametre_K,valeur_K_par_defaut); */ /* GIT_ARGUMENT_C(titre_attendu,parametre_C,valeur_C_par_defaut); */ /* GIT_ARGUMENT_L(titre_attendu,parametre_L,valeur_L_par_defaut); */ /* GIT_ARGUMENT_N(titre_attendu,parametre_L,valeur_L_par_defaut); */ /* GIT_ARGUMENT_I(titre_attendu,parametre_I,valeur_I_par_defaut); */ /* GIT_ARGUMENT_F(titre_attendu,parametre_F,valeur_F_par_defaut); */ /* GIT_ARGUMENT_P(titre_attendu,parametre_P,valeur_P_par_defaut); */ /* */ /* */ /* ATTENTION : */ /* */ /* Les 'PROCISS_ARGUMENT_...(...)' qui suivent */ /* peuvent impliquer des contraintes dans l'ordre */ /* de presentation des arguments (voir par exemple */ /* le module 'v $xrq/nucleon.Lb.2$I$INUTILE'). */ /* */ /* PROKISS_ARGUMENT_K(titre_attendu,parametre_K,valeur_K_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKISS_ARGUMENT_C(titre_attendu,parametre_C,valeur_C_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKISS_ARGUMENT_L(titre_attendu,parametre_L,valeur_L_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKISS_ARGUMENT_N(titre_attendu,parametre_L,valeur_L_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKISS_ARGUMENT_I(titre_attendu,parametre_I,valeur_I_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKISS_ARGUMENT_X(titre_attendu,parametre_I,valeur_I_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKISS_ARGUMENT_F(titre_attendu,parametre_F,valeur_F_par_defaut,seq1,seqI,seqC,seqN); */ /* PROKISS_ARGUMENT_P(titre_attendu,parametre_P,valeur_P_par_defaut,seq1,seqI,seqC,seqN); */ /* */ /* PROCISS_ARGUMENT_K(titre_attendu,parametre_K,valeur_K_par_defaut,sequenceI,sequenceC); */ /* PROCISS_ARGUMENT_C(titre_attendu,parametre_C,valeur_C_par_defaut,sequenceI,sequenceC); */ /* PROCISS_ARGUMENT_L(titre_attendu,parametre_L,valeur_L_par_defaut,sequenceI,sequenceC); */ /* PROCISS_ARGUMENT_N(titre_attendu,parametre_L,valeur_L_par_defaut,sequenceI,sequenceC); */ /* PROCISS_ARGUMENT_I(titre_attendu,parametre_I,valeur_I_par_defaut,sequenceI,sequenceC); */ /* PROCISS_ARGUMENT_X(titre_attendu,parametre_I,valeur_I_par_defaut,sequenceI,sequenceC); */ /* PROCISS_ARGUMENT_F(titre_attendu,parametre_F,valeur_F_par_defaut,sequenceI,sequenceC); */ /* PROCISS_ARGUMENT_P(titre_attendu,parametre_P,valeur_P_par_defaut,sequenceI,sequenceC); */ /* */ /* (ou 'seqI,seqC' designe 'sequence_inconditionnelle,sequence_conditionnelle') */ /* */ /* GET_ARGUMENT_K(titre_attendu,parametre_K); */ /* GET_ARGUMENT_C(titre_attendu,parametre_C); */ /* GET_ARGUMENT_L(titre_attendu,parametre_L); */ /* GET_ARGUMENT_N(titre_attendu,parametre_L); */ /* GET_ARGUMENT_I(titre_attendu,parametre_I); */ /* GET_ARGUMENT_X(titre_attendu,parametre_X); */ /* GET_ARGUMENT_J(titre_attendu,parametre_I); */ /* GET_ARGUMENT_Y(titre_attendu,parametre_I); */ /* GET_ARGUMENT_F(titre_attendu,parametre_F); */ /* GET_ARGUMENT_G(titre_attendu,parametre_G); */ /* GET_ARGUMENT_P(titre_attendu,parametre_P); */ /* */ /* */ /* ATTENTION : */ /* */ /* Les 'PROCESS_ARGUMENT_...(...)' qui suivent */ /* peuvent impliquer des contraintes dans l'ordre */ /* de presentation des arguments (voir par exemple */ /* le module 'v $xrq/nucleon.Lb.2$I$INUTILE'). */ /* */ /* PROKESS_ARGUMENT_K(titre_attendu,parametre_K,seq1,seqI,seqC,seqN); */ /* PROKESS_ARGUMENT_C(titre_attendu,parametre_C,seq1,seqI,seqC,seqN); */ /* PROKESF_ARGUMENT_C(titre_attendu,parametre_C,seq1,seqI,seqC,seqN); */ /* PROKESS_ARGUMENT_L(titre_attendu,parametre_L,seq1,seqI,seqC,seqN); */ /* PROKESS_ARGUMENT_N(titre_attendu,parametre_L,seq1,seqI,seqC,seqN); */ /* PROKESS_ARGUMENT_I(titre_attendu,parametre_I,seq1,seqI,seqC,seqN); */ /* PROKESS_ARGUMENT_X(titre_attendu,parametre_I,seq1,seqI,seqC,seqN); */ /* PROKESS_ARGUMENT_F(titre_attendu,parametre_F,seq1,seqI,seqC,seqN); */ /* PROKESS_ARGUMENT_P(titre_attendu,parametre_P,seq1,seqI,seqC,seqN); */ /* */ /* PROCESS_ARGUMENT_K(titre_attendu,parametre_K,sequenceI,sequenceC); */ /* PROCESS_ARGUMENT_C(titre_attendu,parametre_C,sequenceI,sequenceC); */ /* PROCESF_ARGUMENT_C(titre_attendu,parametre_C,sequenceI,sequenceC); */ /* PROCESS_ARGUMENT_L(titre_attendu,parametre_L,sequenceI,sequenceC); */ /* PROCESS_ARGUMENT_N(titre_attendu,parametre_L,sequenceI,sequenceC); */ /* PROCESS_ARGUMENT_I(titre_attendu,parametre_I,sequenceI,sequenceC); */ /* PROCESS_ARGUMENT_X(titre_attendu,parametre_I,sequenceI,sequenceC); */ /* PROCESS_ARGUMENT_F(titre_attendu,parametre_F,sequenceI,sequenceC); */ /* PROCESS_ARGUMENT_P(titre_attendu,parametre_P,sequenceI,sequenceC); */ /* */ /* */ /* ATTENTION : */ /* */ /* Les 'GET_ARGUMENTS?(...)' qui suivent exigent */ /* au minimum les includes suivants : */ /* */ /* #include "DEFINITIONS.I" */ /* #include INCLUDES_MINI */ /* */ /* a cause de la variable 'editer_la_valeur_des_parametres_d_une_commande, */ /* qui est definie dans 'v $xig/fonct$vv$FON' et qu'elles utilisent... */ /* */ /* */ /* GET_ARGUMENTS_(nombre_d_arguments_y_compris_le_nom,BLOC(liste_de_recuperation)); */ /* GET_ARGUMENTSi(nombre_d_arguments_y_compris_le_nom,BLOC(liste_de_recuperation)); */ /* GET_ARGUMENTSv(nombre_d_arguments_y_compris_le_nom,BLOC(liste_de_recuperation)); */ /* GET_ARGUMENTSg(nombre_d_arguments_y_compris_le_nom,BLOC(liste_de_recuperation)); */ /* */ /* */ /* Voici les imbrications des definitions */ /* de ces procedures : */ /* */ /* */ /* GET_ARGUMENTS_(...) */ /* | */ /* -------> GET_PARAMETRES(...) */ /* */ /* GET_ARGUMENTSf(...) */ /* | */ /* -------> GET_PARAMETRES(...) */ /* */ /* GET_ARGUMENTSi(...) */ /* | */ /* -------> GET_PARAMETRES(...) */ /* */ /* GET_ARGUMENTSv(...) */ /* | */ /* -------> GET_ARGUMENTSi(...) */ /* | */ /* -------> GET_PARAMETRES(...) */ /* */ /* GET_ARGUMENTSg(...) */ /* | */ /* -------> GET_ARGUMENTSv(...) */ /* | */ /* -------> GET_ARGUMENTSi(...) */ /* | */ /* -------> GET_PARAMETRES(...) */ /* */ /* */ /* Le principe des 'GET_ARGUMENTS?(...)' est */ /* d'imbriquer deux boucles. La plus exterieure */ /* consiste a prendre les uns apres les autres */ /* les parametres effectifs d'appel. La plus */ /* interieure consiste a comparer chacun d'eux */ /* a l'ensemble de tous les parametres possibles. */ /* Soit : */ /* */ /* */ /* foreach ParametreCourant (ListeParametresCourants) */ /* { */ /* foreach ParametrePossible (ListeParametresPossibles) */ /* { */ /* if (ParametreCourant == ParametrePossible) */ /* { */ /* TRAITER(ParametreCourant); */ /* } */ /* else */ /* { */ /* } */ /* endif */ /* */ /* if (ParametreCourant == DERNIER(ListeParametresCourants) */ /* { */ /* EDITER(ParametrePossible); */ /* } */ /* else */ /* { */ /* } */ /* endif */ /* } */ /* end */ /* } */ /* end */ /* */ /* */ /* On notera donc bien que c'est lors du traitement */ /* du dernier 'ParametreCourant' de la liste */ /* 'ListeParametresCourants' que sont edites */ /* (optionnellement) les 'ParametrePossible's... */ /* */ /* */ /* ATTENTION : */ /* */ /* Les 'GET_ARGUMENTS?(...)' qui precedent exigent */ /* au minimum les includes suivants : */ /* */ /* #include "DEFINITIONS.I" */ /* #include INCLUDES_MINI */ /* */ /* a cause de la variable 'editer_la_valeur_des_parametres_d_une_commande' */ /* qui est definie dans 'v $xig/fonct$vv$FON' et qu'elles utilisent ; de meme */ /* a cause de la variable 'bloquer_tous_les_messages_d_erreur_des_fichiers' */ /* qui vient d'etre definie dans 'v $xig/fonct$vv$FON' a laquelle on ajoutera */ /* 'attendre_un_fichier_inexistant_ou_non_conforme'. */ /* */ /* */ /* Pseudo-procedures : */ /* */ /* Il existe actuellement trois "pseudo-procedures" */ /* c'est-a-dire des procedures qui ne sont pas definies */ /* dans '$xil', mais uniquement utilisees par '$xcc/cpp$Z' */ /* de facon a ce qu'il puisse faire certaine choses sur */ /* le source '$c' genere. Il s'agit de : */ /* */ /* D_STATIK(...) ('v $xiii/Images$DEF') */ /* G_STATIK() ('v $xig/fonct$vv$DEF') */ /* G_LISTER_TOUS_LES_MESSAGES_POSSIBLES() ('v $xig/fonct$vv$DEF') */ /* */ /* ou l'on indique les fichiers ou elles sont referencees. */ /* Donc, seul le nom de ces "pseudo-procedures" compte... */ /* */ /* */ /* Note sur l'entree des PARAMETRES via des 'setenv' : */ /* */ /* Je rappelle le 20190110094426 qu'il est */ /* possibles de communiquer les parametres */ /* d'une commande via des 'setenv' et ce a */ /* condition d'activer cette fonctionnalite */ /* via le parametre "Environnement=VRAI". */ /* Ainsi, par exemple : */ /* */ /* $xcg/ADD2.01$X a=1200 b=34 */ /* */ /* donnera comme resultat '+1234', tout comme : */ /* */ /* setenv P__a 1200 */ /* setenv P__b 34 */ /* $xcg/ADD2.01$X Environnement=VRAI */ /* */ /* ou encore de facon plus "specifique" a cette */ /* commande : */ /* */ /* unsetenv P__ */ /* setenv P__xcg_ADD2_01__a 1200 */ /* setenv P__xcg_ADD2_01__b 34 */ /* $xcg/ADD2.01$X Environnement=VRAI */ /* */ /*************************************************************************************************************************************/ #define SEQUENCE_D_ECHAPPEMENT_VT100_DEBUT_1 \ K_ESC #define SEQUENCE_D_ECHAPPEMENT_VT100_DEBUT_2 \ K_CG /* Debut des sequences d'echappement 'VT100' (introduit le 20060610100931)... */ /* */ /* Le 20060612134834, je note que tout cela peut se "mettre en serie" a condition de */ /* separer les differentes sequences par un ";". Ainsi, par exemple : */ /* */ /* E[33;7m */ /* */ /* (ou "E" represente 'K_ESC') provoque des caracteres jaunes ("33") inverses ("7"), ce qui */ /* donne donc des caracteres noirs sur fond jaune... */ /* */ /* Je note le 20080212153757 que cela peut aussi s'utiliser directement sous '$CSH'. Ainsi, */ /* par exemple : */ /* */ /* echo "A""$CoDe_1b""[33;7m""B""$CoDe_1b""[0m""C" */ /* */ /* \______________/ \___________/ */ /* */ /* jaune inverse normal */ /* */ /* a condition de disposer de '$CoDe_1b' (defini via 'CodexB', 'v $xE/.alias.1$vv$Y CodexB') */ /* donnera un "A" normal, suivi d'un "B" jaune inverse et suivi enfin d'un "C" normal... */ #define SEQUENCE_D_ECHAPPEMENT_VT100_INITIALISATION_GENERALE \ C_0 #define SEQUENCE_D_ECHAPPEMENT_VT100_LUMINANCE_FORTE \ C_1 #define SEQUENCE_D_ECHAPPEMENT_VT100_LUMINANCE_FAIBLE \ C_2 #define SEQUENCE_D_ECHAPPEMENT_VT100_SOULIGNAGE \ C_4 #define SEQUENCE_D_ECHAPPEMENT_VT100_CLIGNOTEMENT \ C_5 #define SEQUENCE_D_ECHAPPEMENT_VT100_INVERSION \ C_7 #define SEQUENCE_D_ECHAPPEMENT_VT100_INVISIBLE \ C_8 /* Sequences d'echappement 'VT100' generales (introduit le 20060610100931)... */ #define SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES \ C_3 #define SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________NOIR \ SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES ## C_0 #define SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________ROUGE \ SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES ## C_1 #define SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________VERT \ SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES ## C_2 #define SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________JAUNE \ SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES ## C_3 #define SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________BLEU \ SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES ## C_4 #define SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________MAGENTA \ SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES ## C_5 #define SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________CYAN \ SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES ## C_6 #define SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES__________BLANC \ SEQUENCE_D_ECHAPPEMENT_VT100_CARACTERES ## C_7 /* Sequences d'echappement 'VT100' pour les caracteres (introduit le 20060610100931)... */ /* */ /* Voici la liste des possibilites : */ /* */ /* 30 : caracteres NOIR */ /* 31 : caracteres ROUGE */ /* 32 : caracteres VERT */ /* 33 : caracteres JAUNE */ /* 34 : caracteres BLEU */ /* 35 : caracteres MAGENTA */ /* 36 : caracteres CYAN */ /* 37 : caracteres BLANC */ /* */ #define SEQUENCE_D_ECHAPPEMENT_VT100_FOND \ C_4 #define SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________NOIR \ SEQUENCE_D_ECHAPPEMENT_VT100_FOND ## C_0 #define SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________ROUGE \ SEQUENCE_D_ECHAPPEMENT_VT100_FOND ## C_1 #define SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________VERT \ SEQUENCE_D_ECHAPPEMENT_VT100_FOND ## C_2 #define SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________JAUNE \ SEQUENCE_D_ECHAPPEMENT_VT100_FOND ## C_3 #define SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________BLEU \ SEQUENCE_D_ECHAPPEMENT_VT100_FOND ## C_4 #define SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________MAGENTA \ SEQUENCE_D_ECHAPPEMENT_VT100_FOND ## C_5 #define SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________CYAN \ SEQUENCE_D_ECHAPPEMENT_VT100_FOND ## C_6 #define SEQUENCE_D_ECHAPPEMENT_VT100_FOND__________BLANC \ SEQUENCE_D_ECHAPPEMENT_VT100_FOND ## C_7 /* Sequences d'echappement 'VT100' pour les fonds (introduit le 20060610100931)... */ /* */ /* Voici la liste des possibilites : */ /* */ /* 40 : fond NOIR */ /* 41 : fond ROUGE */ /* 42 : fond VERT */ /* 43 : fond JAUNE */ /* 44 : fond BLEU */ /* 45 : fond MAGENTA */ /* 46 : fond CYAN */ /* 47 : fond BLANC */ /* */ #define SEQUENCE_D_ECHAPPEMENT_VT100_FIN \ K_m \ /* Fin des sequences d'echappement 'VT100' (introduit le 20060610100931)... */ #define PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ UN \ /* Valeur a donner initialement a 'NUMERO_UNIQUE_de_l_argument_possible_courant'... */ #define NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES \ GRO12(CENT) \ /* Afin de generer les listes utiles... */ \ /* */ \ /* A cause de 'v $xrv/o_homographique.81$K GET_ARGUMENTS_', le 20220605095701 la valeur */ \ /* 'MILLE' a ete remplacee par 'GRO12(CENT)'... */ #define NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES \ NOMBRE_DE_CHIFFRES_DECIMAUX(NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES) \ /* Afin d'editer les listes utiles... */ \ /* */ \ /* La procedure 'NOMBRE_DE_CHIFFRES_DECIMAUX(...)' fut introduite le 20051210181752... */ #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_1 \ chain_numero(niveau_des_gPROCESS_PARAMETRE,UN) #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre \ chain_Aconcaten3("Parametre.",FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_1,".") /* Le 20060208101231, la definition anterieure "Parametre..." a evoluee de facon a integrer */ /* le dispositif distinguant les appels aux procedures de type 'GET_ARGUMENT_?(...)' et */ /* 'PROCESS_ARGUMENT_?(...)' qui ont lieu directement et ceux qui ont lieu via une autre */ /* procedure... */ #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_Synonyme \ "............" #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_ligne_suite_Vecteur \ " " #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Numero_Parametre \ " %0*d/%0*d : " #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Numero_Parametre_ligne_suite_Vecteur \ " %*s " #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_1 \ chain_Aconcaten2(COND(IFET(IL_FAUT(sauter_une_ligne_pour_chaque_nouveau_Parametre) \ ,IL_NE_FAUT_PAS(alterner_les_parametres_pour_plus_de_lisibilite) \ ) \ ,C_LF \ ,C_VIDE \ ) \ ,ccCHAR(FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre) \ ) #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_2 \ chain_Aconcaten2(COND(IFET(IL_FAUT(sauter_une_ligne_pour_chaque_nouveau_Parametre) \ ,IL_NE_FAUT_PAS(alterner_les_parametres_pour_plus_de_lisibilite) \ ) \ ,C_LF \ ,C_VIDE \ ) \ ,ccCHAR(FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_Synonyme) \ ) #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES \ chain_Aconcaten2(COND(EST_FAUX(l_argument_possible_courant_est_un_synonyme_d_argument_anterieur) \ ,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_1 \ ,COND(IFEQ(IDENTITE_de_l_argument_possible_courant \ ,IDENTITE_de_l_argument_possible_precedent_precedent \ ) \ ,ccCHAR(FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_Synonyme) \ ,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_2 \ ) \ ) \ ,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Numero_Parametre \ ) \ /* Format d'edition des identites UNIQUEs des parametres possibles (le 20000202084613). */ \ /* La discrimination entre "non synonyme" et "synonyme" a ete introduite le 20030214093316 */ \ /* et on notera que l'on laisse '%0*d' pour les "synonyme"s afin d'une part de garantir la */ \ /* tabulation et d'autre part de permettre aux synonymes d'un parametre de ne pas etre */ \ /* necessairement contigus ('NUMERO_UNIQUE_de_l_argument_possible_courant', leur numero */ \ /* commun, permettant alors de les "regrouper"...). */ \ /* */ \ /* Le test relatif a 'IDENTITE_de_l_argument_possible_precedent_precedent' a ete introduit */ \ /* le 20060316170930 pour prendre en compte les cas des parametres synonymes "disperses" */ \ /* comme c'est par exemple le cas de 'v $xci/interpole.03$K imageA1:A='. On notera avec */ \ /* attention le commentaire relatif a 'IDENTITE_de_l_argument_possible_precedent_precedent' */ \ /* dans 'v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_IDENTITE'... */ \ /* */ \ /* Le test relatif a 'alterner_les_parametres_pour_plus_de_lisibilite' a ete introduit le */ \ /* 20060622135953 car, en effet, il y a incompatibilite entre les sauts de ligne et la */ \ /* notion d'alternance : les sauts de ligne introduisent alors une 'C_LF' entre la sequence */ \ /* d'alternance 'ALTERNANCE_DES_PARAMETRES_DEBUT' et la premiere ligne des parametres qui */ \ /* suit, ce qui a pour effet de marquer cette ligne jusqu'a l'extremite droite de la fenetre */ \ /* et non pas jusqu'a son 'K_LF'... */ \ /* */ \ /* Le 20081113173427, j'ai tente d'editer le nombre maximal de parametres. Cela impliquait */ \ /* les mofifications suivantes : */ \ /* */ \ /* #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Numero_Parametre \ */ \ /* " %0*d/%0*d : " */ \ /* #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Numero_Parametre_ligne_suite_... \ */ \ /* " %*s " */ \ /* */ \ /* mais j'y ai renonce le 20081115105359 ('v $xig/fonct$vv$FON 20081113173432')... */ \ /* */ \ /* Finalement, cela a pu etre retabli grace a 'v $xcc/cpp$Z 20081116112629'... */ #define FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_SUITE_POUR_LES_VECTEURS \ chain_Aconcaten2(FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Parametre_ligne_suite_Vecteur \ ,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Numero_Parametre_ligne_suite_Vecteur \ ) \ /* Identique a 'FORMAT_D_EDITION_DES_IDENTITES_UNIQUES' mais destine a editer les lignes */ \ /* "suite" pour l'edition des vecteurs (introduit le 20030627131610). */ \ /* */ \ /* Pour 'FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_Numero_Parametre_ligne_suite_Vecteur', je */ \ /* note le 20051117171925 que le format : */ \ /* */ \ /* " %*s " */ \ /* */ \ /* est utilise avec comme arguments : */ \ /* */ \ /* NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES */ \ /* C_VIDE */ \ /* */ \ /* ce qui demande d'imprimer la chaine vide ('C_VIDE') sur une longueur egale exactement */ \ /* a 'NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES', ce qui */ \ /* revient donc a tabuler d'une quantite egale a ce nombre (puisque la chaine est vide...). */ #define FORMAT_D_EDITION_DES_TITRES \ "%-*s" \ /* Format d'edition des titres afin de tabuler les titres, et leurs valeurs affectees... */ \ /* Ce parametre a ete deplace de '$xig/fonct$vv$FON' a '$xig/fonct$vv$DEF' le 20000125095156 */ \ /* apres l'introduction des variables de type '__Para...'. */ #define EN_TETE_DE_LA_LISTE_DES_PREMIERES_VALEURS_D_UN_VECTEUR \ "------------------------------valeur " \ /* Pour introduire la liste des premieres valeurs d'un parametre de type "vecteur". */ #define FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_SCALAIRES \ "%s :: " \ /* Format d'edition des valeurs des parametres (valeurs scalaires). */ \ /* */ \ /* Avant le 20060316163851, ce symbole etait 'FORMAT_D_EDITION_DES_VALEURS_SCALAIRES' et */ \ /* avant le 20060316160021, c'etait 'FORMAT_D_EDITION_DES_VALEURS' qui etait utilise aussi */ \ /* bien pour les valeurs scalaires que pour les valeurs vectorielles... */ #define FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_VECTORIELLES \ "%s :: " \ /* Format d'edition des valeurs des parametres (valeurs vectorielles) introduit le */ \ /* 20060316162827, suite a l'introduction de 'INDICATEUR_DE_TYPE_____A_R'... */ \ /* */ \ /* Avant le 20060316163851, ce symbole etait 'FORMAT_D_EDITION_DES_VALEURS_VECTORIELLES'... */ #define INDICATEUR_DE_TYPE_____A_R \ "Indicateur_____A_R" \ /* Chaine introduite le 20060310101333... */ #define FORMAT_D_EDITION_DU_NOM_DES_VALEURS \ "%s" \ /* Format d'edition de l'eventuel nom des parametres introduit le 20011230075829. */ #define NOM_DES_VALEURS_PREMIER_SYNONYME(parametre) \ "[[[[parametre]]]]" #define NOM_DES_VALEURS_SYNONYMES_SUIVANTS \ "=" /* Pour l'edition du noms des valeurs... */ #define TABULATION_DES_VALEURS_AFFECTEES_AUX_TITRES \ ADD2(SOIXANTE_DIX,CINQ) \ /* Tabulation (arbitraire) des valeurs affectees aux titres. Cela facilite la lecture ; pour */ \ /* faciliter l'association "titre-valeur", il suffira d'inverser la video de la ligne en */ \ /* cliquant trois fois avec la souris. Le 20000124161142, ayant constate des titres tres */ \ /* longs ('v $xrk/rdn_walk.52$K LISTE_TRANSLATION_VITESSE_OX2_REFRACTION_REFLEXION'), la */ \ /* valeur 'QUARANTE' a ete remplacee par 'SOIXANTE'. */ \ /* */ \ /* Ce parametre a ete deplace de '$xig/fonct$vv$FON' a '$xig/fonct$vv$DEF' le 20000125095156 */ \ /* apres l'introduction des variables de type '__Para...'. */ \ /* */ \ /* Le 20000202084613, la valeur a ete augmentee de 'DEUX' afin de compenser l'edition de */ \ /* 'NUMERO_UNIQUE_de_l_argument_possible_courant', puis le 20000203100529, apres avoir */ \ /* supprime l'edition de 'IDENTITE_de_l_argument_possible_courant', la valeur 'DEUX' a ete */ \ /* remplacee par 'TREIZE'. Le 20000531111959, je suis passe de 'TREIZE' a 'VINGT' apres */ \ /* avoir ajoute "Parametre"... */ \ /* */ \ /* Le 20011230095027, apres l'introduction de l'option "TabulationParametres=", ce parametre */ \ /* a ete reduit de 'ADD2(SOIXANTE,VINGT)' a 'SOIXANTE' de facon a ce que, lorsque les noms */ \ /* des parametres sont edites, les lignes ne soient pas trop longues et donc ne se replient */ \ /* pas... */ \ /* */ \ /* Le 20081113173427, j'ai tente d'editer le nombre maximal de parametres. Cela impliquait */ \ /* les mofifications suivantes : */ \ /* */ \ /* #define TABULATION_DES_VALEURS_AFFECTEES_AUX_TITRES \ */ \ /* SOUS(SOIXANTE,CINQ) */ \ /* */ \ /* mais j'y ai renonce le 20081115105359 ('v $xig/fonct$vv$FON 20081113173432')... */ \ /* */ \ /* Finalement, cela a pu etre retabli grace a 'v $xcc/cpp$Z 20081116112629', en notant que */ \ /* finalement la tabulation n'a pas changee (malgre le 'ADD2(...,ZERO)' afin de conserver */ \ /* la mise en page precedente... */ \ /* */ \ /* Le 20101005095320, je suis passe de 'ADD2(SOIXANTE,ZERO)' a 'ADD2(SOIXANTE,CINQ)' a cause */ \ /* de "generation_d_un_nom_relatif_temporaire_compatibilite_20061226="... */ \ /* */ \ /* Le 20121025184449, je suis passe de 'ADD2(SOIXANTE,CINQ)' a 'ADD2(SOIXANTE_DIX,CINQ) a */ \ /* cause de "Fmise_a_jour_du_systeme_de_gestion_de_fichiers_compatibilite_20121025="... */ #define EN_TETE_COMPLETE_DE_titre_attendu_LORS_DES_ENTREES_VIA_DES_SETENV \ EGAs(chain_Aconcaten3("P__",NOM_SYNTHETIQUE_DU_FICHIER_COURANT,"__")) #define EN_TETE_DE_titre_attendu_LORS_DES_ENTREES_VIA_DES_SETENV \ GvarDefaut("P__",EN_TETE_COMPLETE_DE_titre_attendu_LORS_DES_ENTREES_VIA_DES_SETENV) /* Les variables d'environnement ('setenv') permettant de definir certains parametres d'une */ /* commande doivent commencer par une chaine specifique afin d'eviter des "collisions" avec */ /* des variables pre-existantes. Par exemple, a "Xmin=" on associera '$P__Xmin'. Ceci a ete */ /* introduit le 19980420092917. Le 20000628104614 a ete introduit une nouvelle possibilite. */ /* Si la variable d'environnement '$P__' existe, c'est elle qui fixe l'en-tete des noms des */ /* variables d'entree des parametres. Par contre si elle n'existe pas, la concatenation de */ /* "P__" et du nom synthetique du programme qui est utilise ' ce nom synthetique est, par */ /* exemple, "xrk_rdn_walk_52' pour '$xrk/rdn_walk.52$K' ; ainsi, pour acceder au parametre */ /* de nom "PARAMETRE" et de valeur "VALEUR" on utilisera : */ /* */ /* setenv P__PARAMETRE VALEUR */ /* */ /* ou : */ /* */ /* unsetenv P__ */ /* setenv P__xrk_rdn_walk_52__PARAMETRE VALEUR */ /* */ /* suivant que la variable d'environnement ('setenv') '$P__' existe (avec pour valeur */ /* "P__" dans cet exemple) ou n'existe pas... */ /* */ /* Le 20190110102120 fut introduite 'EN_TETE_COMPLETE_DE_titre_attendu_LORS_DES_ENTREES...'. */ /* En fait, l'idee etait alors de concatener une nouvelle variable d'environnement */ /* specifique a chaque '$K' et qui contiendrait un certain nombre de definitions de */ /* valeurs de parametres destinees a etre concatenees a la suite des arguments d'appel */ /* de ces '$K's. Or cela serait une chaine de caracteres, alors que la suite des arguments */ /* d'appel d'un '$K' est un tableau de telles chaines ('v $xil/defi_c1$vv$DEF BCommande'), */ /* d'ou l'incompatibilite et le renoncement a implementer ce dispositif... */ #define FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE \ VRAI #define NE_PAS_FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE \ NOTL(FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE) /* Pour definir le parametre 'fC' de 'gPROCESS_PARAMETRE(...)' introduit le 20000207110651. */ /* Les definitions suivantes sont destinees a "compactifier" les sources '$c'. On trouve */ /* deux sortes de definition : */ /* */ /* @define wMN \ */ /* VARIABLE_EXTERNE */ /* #define VARIABLE_EXTERNE \ */ /* wMN */ /* */ /* pour les variables externes, et : */ /* */ /* #define VARIABLE_LOCALE \ */ /* wMN */ /* */ /* pour les variables locales (ou "M" et "N" designent en general un chiffre quelconque...). */ #define Selection_FORMAT(format1,format2) \ SE22(format1,format2) \ /* Introduit le 20180330113803 afin de passer a une version plus economique des allocations */ \ /* memoire le 20180330114416... */ #define FORMAT_CHAI_2 \ Selection_FORMAT(cFORMAT_CHAI_2,format_EGAr____FORMAT_CHAI_2) #define FORMAT_CHAI \ Selection_FORMAT(cFORMAT_CHAI,format_EGAr____FORMAT_CHAI) #define FORMAT_CHAI_EDITION \ Selection_FORMAT(cFORMAT_CHAI_EDITION,format_EGAr____FORMAT_CHAI_EDITION) #define FORMAT_CHAR_EDITION \ Selection_FORMAT(cFORMAT_CHAR_EDITION,format_EGAr____FORMAT_CHAR_EDITION) #define FORMAT_CHAR_EDITION_BACKSLASHEE \ Selection_FORMAT(cFORMAT_CHAR_EDITION_BACKSLASHEE,format_EGAr____FORMAT_CHAR_EDITION_BACKSLASHEE) #define FORMAT_CHAR_HEXA_DECIMAL_EDITION_1 \ Selection_FORMAT(cFORMAT_CHAR_HEXA_DECIMAL_EDITION_1,format_EGAr____FORMAT_CHAR_HEXA_DECIMAL_EDITION_1) #define FORMAT_CHAR_HEXA_DECIMAL_EDITION \ Selection_FORMAT(cFORMAT_CHAR_HEXA_DECIMAL_EDITION,format_EGAr____FORMAT_CHAR_HEXA_DECIMAL_EDITION) #define FORMAT_FLOT \ Selection_FORMAT(cFORMAT_FLOT,format_EGAr____FORMAT_FLOT) #define FORMAT_FLOT_EDITION \ Selection_FORMAT(cFORMAT_FLOT_EDITION,format_EGAr____FORMAT_FLOT_EDITION) #define FORMAT_FLOT_EDITION__NON_SIGNE \ Selection_FORMAT(cFORMAT_FLOT_EDITION__NON_SIGNE,format_EGAr____FORMAT_FLOT_EDITION__NON_SIGNE) #define FORMAT_HEXA_DECIMAL \ Selection_FORMAT(cFORMAT_HEXA_DECIMAL,format_EGAr____FORMAT_HEXA_DECIMAL) #define FORMAT_HEXA_DECIMAL_SANS_0_EDITION \ Selection_FORMAT(cFORMAT_HEXA_DECIMAL_SANS_0_EDITION,format_EGAr____FORMAT_HEXA_DECIMAL_SANS_0_EDITION) #define FORMAT_HEXA_DECIMAL_EDITION_1 \ Selection_FORMAT(cFORMAT_HEXA_DECIMAL_EDITION_1,format_EGAr____FORMAT_HEXA_DECIMAL_EDITION_1) #define FORMAT_HEXA_DECIMAL_EDITION \ Selection_FORMAT(cFORMAT_HEXA_DECIMAL_EDITION,format_EGAr____FORMAT_HEXA_DECIMAL_EDITION) #define FORMAT_INTE \ Selection_FORMAT(cFORMAT_INTE,format_EGAr____FORMAT_INTE) #define FORMAT_INTE_EDITION \ Selection_FORMAT(cFORMAT_INTE_EDITION,format_EGAr____FORMAT_INTE_EDITION) #define FORMAT_INTE_EDITION__NON_SIGNE \ Selection_FORMAT(cFORMAT_INTE_EDITION__NON_SIGNE,format_EGAr____FORMAT_INTE_EDITION__NON_SIGNE) /* Introduit le 20180330101517 dans le but a venir de reduire le nombre d'allocations */ /* memoire... */ #define INCR_INDEX_DES_ARGUMENTS_POSSIBLES(index_a_incrementer,message_d_erreur) \ Bblock \ DEFV(Int,INIT(valeur_maximale_de_l_index_a_incrementer \ ,LSTX(PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ,NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ); \ \ Test(IFLT(index_a_incrementer,valeur_maximale_de_l_index_a_incrementer)) \ Bblock \ INCR(index_a_incrementer,I); \ /* Cas ou il ne reste plus de place dans les listes... */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR(message_d_erreur); \ CALS(FPrer2II("(l'index courant vaut %d alors qu'il ne peut exceder %d)\n" \ ,index_a_incrementer \ ,valeur_maximale_de_l_index_a_incrementer \ ) \ ); \ /* Le 20221124120306, 'CAL1(Prer2(...))' a ete remplace par 'CALS(FPrer2(...))' afin de */ \ /* reduire la taille des '$xc's et des '$X's ('v $xtc/xcg_ADD2.01.20221124111411$c' qui */ \ /* a permis de mettre en evidence la necessite de cette optimisation, ce qui a ete ensuite */ \ /* verifie avec 'v $xtc/xcg_ADD2.01.20221124124248$c'...). */ \ /* */ \ /* Le 20221125112912, le nom 'FPrer2' a ete change en 'FPrer2II' afin de rappeler le */ \ /* type des deux arguments... */ \ Eblock \ ETes \ Eblock \ /* Gestion des debordements de liste (introduit le 20070820163243...). */ #define gPROCESS_PARAMETRE_IDENTITE(ityp) \ /* L'argument 'styp' a ete introduit le 20061121094424 (voir a ce propos les explications */ \ /* donnees dans 'v $xig/fonct$vv$FON 20061121091238'). Le nom 'styp' a ete change en */ \ /* 'ityp' le 20061123175305 car, en effet, 'styp' contient une ambiguite intrinseque */ \ /* puisqu'il s'agit d'une taille et que, par exemple, 'Int' et 'Logical' ont la meme */ \ /* taille sans etre synonymes... */ \ Bblock \ EGAL(IDENTITE_de_l_argument_possible_courant \ ,bSOU(pointeurC_parametre,pointeurC_parametre_fictif_IDENTITE_des_arguments) \ ); \ /* Memorisation de l'identite du parametre possible courant. */ \ \ Test(IFET(EST_VRAI(c_est_la_derniere_recherche_des_parametres) \ ,IFGE(numero_d_argument_courant,NUMERO_PREMIER_ARGUMENT) \ ) \ ) \ /* Je note le 20111219175904 que le test : */ \ /* */ \ /* IFGE(numero_d_argument_courant,NUMERO_PREMIER_ARGUMENT) */ \ /* */ \ /* est toujours 'FAUX' lorsque 'IL_FAUT(editer_la_valeur_des_parametres_d_une_commande)'. */ \ /* En consequence, 'NUMERO_UNIQUE_de_l_argument_possible_courant' n'a donc une valeur */ \ /* significative que dans ce cas et dans 'gPROCESS_PARAMETRE_VALIDATION_DU_TYPE(...)' il */ \ /* n'est donc pas possible d'editer 'NUMERO_UNIQUE_de_l_argument_possible_courant'... */ \ Bblock \ EGAL(l_argument_possible_courant_est_un_synonyme_d_argument_anterieur,FAUX); \ /* Pour permettre de ne pas editer les synonymes (introduit le 20010420140719)... */ \ \ Test(Ftest_IDENTITE_de_l_argument_possible()) \ Bblock \ EGAL(NUMERO_UNIQUE_de_l_argument_possible_courant \ ,PRED(NUMERO_de_l_argument_possible_courant) \ ); \ /* En effet, il y a eu un 'INCR(...)' de trop lorsqu'au "tour" precedent l'argument */ \ /* 'IDENTITE_de_l_argument_possible_courant' ('IDENTITE_de_l_argument_possible_precedent' */ \ /* actuel) etait different de celui qui le precedait... */ \ Eblock \ ATes \ Bblock \ EGAL(NUMERO_UNIQUE_de_l_argument_possible_courant \ ,NEUT(NUMERO_de_l_argument_possible_courant) \ ); \ /* A priori (quitte a changer cela plus loin...). */ \ Eblock \ ETes \ \ EGAL(NUMERO_UNIQUE_maximal_de_l_argument_possible_courant \ ,MAX2(NUMERO_UNIQUE_maximal_de_l_argument_possible_courant \ ,NUMERO_UNIQUE_de_l_argument_possible_courant \ ) \ ); \ /* Introduit le 20081117092814 afin de valider 'nombre_d_arguments_possibles_regroupes_...'. */ \ /* */ \ /* On notera bien que 'NUMERO_UNIQUE_maximal_de_l_argument_possible_courant' ne peut pas */ \ /* remplacer 'nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes' car, en effet, */ \ /* c'est lorsque 'EST_VRAI(c_est_la_derniere_recherche_des_parametres)' qu'a lieu l'edition */ \ /* des parametres : cela demande que le nombre maximal d'arguments soit connu avant toute */ \ /* edition, or 'NUMERO_UNIQUE_maximal_de_l_argument_possible_courant' evolue en permanence */ \ /* et est evalue en meme temps ('EST_VRAI(c_est_la_derniere_recherche_des_parametres)'), */ \ /* alors que 'v $xcc/cpp$Z nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes' */ \ /* est "pre-calcule"... */ \ \ Test(EST_VRAI(c_est_le_premier_argument_possible_courant)) \ Bblock \ EGAL(c_est_le_premier_argument_possible_courant,FAUX); \ /* Pour le premier parametre possible, le numero initial est conserve. */ \ EGAL(ITb1(IDENTITE_des_arguments_possibles \ ,INDX(NUMERO_de_l_argument_possible_courant \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ,IDENTITE_de_l_argument_possible_courant \ ); \ EGAL(ITb1(ITYP_des_arguments_possibles \ ,INDX(NUMERO_de_l_argument_possible_courant \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ,ityp \ ); \ /* Initialisation du processus de gestion des synonymes... */ \ /* */ \ /* ATTENTION : jusqu'au 20070819174619, c'etait 'IDENTITE_des_arguments_possibles' qui */ \ /* figurait ci-dessus au-lieu de 'ITYP_des_arguments_possibles' par erreur ! */ \ \ INCR_INDEX_DES_ARGUMENTS_POSSIBLES(NUMERO_de_l_argument_possible_courant \ ,"debordement de la liste des arguments possibles (2)" \ ); \ /* Lorsqu'il reste de la place dans la liste, on memorise l'argument courant qui n'avait */ \ /* donc pas de synonyme... */ \ Eblock \ ATes \ Bblock \ DEFV(Int,INIT(NUMERO_des_arguments_possibles_precedents \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ); \ DEFV(Logical,INIT(continuer_a_chercher_un_synonyme,VRAI)); \ /* Donnees pour la recherche des synonymes. */ \ \ Tant(IL_FAUT(continuer_a_chercher_un_synonyme)) \ Bblock \ Test(IFET(IFEQ(ITb1(IDENTITE_des_arguments_possibles \ ,INDX(NUMERO_des_arguments_possibles_precedents \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ,IDENTITE_de_l_argument_possible_courant \ ) \ ,IFEQ(ITb1(ITYP_des_arguments_possibles \ ,INDX(NUMERO_des_arguments_possibles_precedents \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ,ityp \ ) \ ) \ ) \ Bblock \ EGAL(l_argument_possible_courant_est_un_synonyme_d_argument_anterieur,VRAI); \ /* Pour permettre de ne pas editer les synonymes (introduit le 20010420140719)... */ \ \ EGAL(NUMERO_UNIQUE_de_l_argument_possible_courant,NUMERO_des_arguments_possibles_precedents); \ EGAL(continuer_a_chercher_un_synonyme,FAUX); \ /* Cas ou l'argument courant possede un synonyme deja rencontre ; on arrete donc ici la */ \ /* recherche... */ \ Eblock \ ATes \ Bblock \ /* Cas ou l'on n'a pas encore trouve de synonyme pour l'argument courant : */ \ Test(IFET(IFLT(NUMERO_des_arguments_possibles_precedents \ ,NUMERO_de_l_argument_possible_courant \ ) \ ,IFLT(NUMERO_des_arguments_possibles_precedents \ ,LSTX(PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ,NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ) \ ) \ Bblock \ INCR(NUMERO_des_arguments_possibles_precedents,I); \ /* Cas ou il y a encore des arguments precedents non utilises pour cette recherche de */ \ /* synonyme : on continue... */ \ Eblock \ ATes \ Bblock \ /* Lorsque l'on a explore tous les arguments precedents sans succes, cela signifie que */ \ /* l'argument courant n'a pas de synonyme. */ \ Test(IFLE(NUMERO_de_l_argument_possible_courant \ ,LSTX(PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ,NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ) \ Bblock \ EGAL(ITb1(IDENTITE_des_arguments_possibles \ ,INDX(NUMERO_de_l_argument_possible_courant \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ,IDENTITE_de_l_argument_possible_courant \ ); \ EGAL(ITb1(ITYP_des_arguments_possibles \ ,INDX(NUMERO_de_l_argument_possible_courant \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ,ityp \ ); \ \ INCR(NUMERO_de_l_argument_possible_courant,I); \ /* Lorsqu'il reste de la place dans la liste, on memorise l'argument courant qui n'avait */ \ /* donc pas de synonyme... */ \ Eblock \ ATes \ Bblock \ /* Lorsqu'il n'y a plus de place dans la liste, on se contente du processus simpliste qui */ \ /* se contente de comparer les arguments strictement consecutifs... */ \ PRINT_ERREUR("debordement de la liste des arguments possibles (1)"); \ \ Test(IFEQ(IDENTITE_de_l_argument_possible_courant \ ,IDENTITE_de_l_argument_possible_precedent \ ) \ ) \ Bblock \ Eblock \ ATes \ Bblock \ INCR(NUMERO_de_l_argument_possible_courant,I); \ /* Pour les parametres possibles suivants, le numero est incremente si le parametre */ \ /* possible est different du precedent. On notera que ce dispositif ne fonctionne bien */ \ /* pour identifier les synonymes que si ceux-ci sont definis les uns a la suite des autres, */ \ /* sans imbrications d'autres parametres entre-eux... */ \ /* */ \ /* ATTENTION : detail amusant, le parametre : */ \ /* */ \ /* "Parametres=" */ \ /* */ \ /* qui est le premier ('v $xig/fonct$vv$DEF GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE') */ \ /* n'est jamais edite (lorsqu'il vaut 'VRAI') puisqu'au moment de son traitement, l'option */ \ /* 'editer_la_valeur_des_parametres_d_une_commande' n'est pas encore active. Ainsi, le */ \ /* premier parametre a edite alors a donc le numero 2 (c'est-a-dire le suivant de 1...). */ \ /* L'origine de ce probleme a enfin ete comprise le 20030710112150 lors de la mise en tete */ \ /* de 'MARQUEUR________DebutParametresGeneraux' dans la procedure de recuperation generale */ \ /* 'GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE' ('v $xig/fonct$vv$DEF 20030710112150'). */ \ Eblock \ ETes \ Eblock \ ETes \ \ EGAL(continuer_a_chercher_un_synonyme,FAUX); \ /* Et evidemment, il faut arreter la recherche... */ \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ ETan \ Eblock \ ETes \ \ EGAL(IDENTITE_de_l_argument_possible_precedent_precedent,IDENTITE_de_l_argument_possible_precedent); \ EGAL(IDENTITE_de_l_argument_possible_precedent,IDENTITE_de_l_argument_possible_courant); \ /* ATTENTION : on notera que a la sortie de cette procedure, et tant qu'elle n'est pas */ \ /* reutilisee, on : */ \ /* */ \ /* 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'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Gestion de l'identite des parametres destinee princiaplement a identifier les synonymes. */ #define gPROCESS_PARAMETRE_VALIDATION_DU_TYPE(titre_attendu,taille_du_type_attendu,taille_courante) \ Bblock \ Test(EST_VRAI(c_est_la_derniere_recherche_des_parametres)) \ /* Ces tests ont ete introduits le 20010330100201 a la suite de celui qui a ete introduit */ \ /* dans 'v $xig/fonct$vv$FON 20010329144054'. */ \ Bblock \ Test(I3OU(IFOU(IFEQ(taille_du_type_attendu,styp_K) \ ,IFEQ(taille_du_type_attendu,styp_C) \ ) \ ,IFOU(IFEQ(taille_du_type_attendu,styp_L) \ ,IFEQ(taille_du_type_attendu,styp_N) \ ) \ ,I3OU(IFEQ(taille_du_type_attendu,styp_I) \ ,IFEQ(taille_du_type_attendu,styp_F) \ ,IFEQ(taille_du_type_attendu,styp_P) \ ) \ ) \ ) \ /* Validation introduite le 20111118183450... */ \ /* */ \ /* On notera que j'ai voulu ecrire ici : */ \ /* */ \ /* Choi(taille_du_type_attendu) */ \ /* Bblock */ \ /* Ca7e(styp_K,styp_C,styp_L,styp_N,styp_I,styp_F,styp_P) */ \ /* Bblock */ \ /* (...) */ \ /* Eblock */ \ /* ECa7 */ \ /* */ \ /* Defo */ \ /* Bblock */ \ /* (...) */ \ /* Eblock */ \ /* EDef */ \ /* */ \ /* Mais que cela provoque les messages : */ \ /* */ \ /* error: duplicate case value */ \ /* error: previously used here */ \ /* */ \ /* car, en effet, plusieurs 'styp_?' ont la meme valeur ('styp_L' et 'styp_N' par exemple). */ \ Bblock \ Test(IFNE(taille_du_type_attendu,NE_PAS_VALIDER_UN_styp)) \ Bblock \ Test(IFNE(taille_courante,taille_du_type_attendu)) \ Bblock \ PRINT_ERREUR("il y a surement un conflit de typage d'un Parametre (2)"); \ CAL1(Prer1("(il s'agit du Parametre introduit par '%s', " \ ,titre_attendu \ ) \ ); \ /* Le message a ete mis entre parentheses le 20051213142228... */ \ /* */ \ /* Le 20111219175904 je note que la valeur de 'NUMERO_UNIQUE_de_l_argument_possible_courant' */ \ /* ne peut etre editee ici a cause de 'v $xig/fonct$vv$DEF 20111219175904', cette valeur */ \ /* n'etant pas d'un usage systematique... */ \ CAL1(Prer2("sa longueur courante vaut %d alors qu'elle devrait valoir %d)\n" \ ,taille_courante \ ,taille_du_type_attendu \ ) \ ); \ /* Ce message complementaire a ete introduit le 20111112083810... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la taille du type attendu n'est pas reconnue"); \ CAL1(Prer1("(il s'agit du Parametre introduit par '%s', " \ ,titre_attendu \ ) \ ); \ /* Message introduit le 20111219164123... */ \ /* */ \ /* Le 20111219175904 je note que la valeur de 'NUMERO_UNIQUE_de_l_argument_possible_courant' */ \ /* ne peut etre editee ici a cause de 'v $xig/fonct$vv$DEF 20111219175904', cette valeur */ \ /* n'etant pas d'un usage systematique... */ \ CAL1(Prer1("cette taille vaut %d)\n",taille_du_type_attendu)); \ /* Messages introduits le 20111118183450... */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Validation eventuelle du type du parametre courant... */ #define gPROCESS_PARAMETRE_DEBUT(titre_attendu,taille_du_type_attendu,taille_courante,identite_du_type_attendu) \ /* L'argument 'identite_du_type_attendu' a ete introduit le 20061123175305... */ \ Bblock \ CALS(FgPROCESS_PARAMETRE_IDENTITE(identite_du_type_attendu)); \ /* Gestion de l'identite des parametres destinee principalement a identifier les synonymes. */ \ \ CALS(FgPROCESS_PARAMETRE_TITRAGE()); \ /* Edition eventuelle du titre des "Parametres" apres que la variable */ \ /* 'NUMERO_UNIQUE_de_l_argument_possible_courant' ait ete mise a jour... */ \ \ CALS(FgPROCESS_PARAMETRE_VALIDATION_DU_TYPE(titre_attendu,taille_du_type_attendu,taille_courante)); \ /* Validation eventuelle du type du parametre courant... */ \ Eblock \ /* 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... */ #ifdef gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_01 # define gPROCESS_PARAMETRE_ENTREE_PAR_setenv(titre_attendu,parametre,va_defaut,FCon) \ Bblock \ Eblock #Aifdef gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_01 #Eifdef gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_01 #ifdef gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_02 # define gPROCESS_PARAMETRE_ENTREE_PAR_setenv(titre_attendu,parametre,va_defaut,FCon) \ Bblock \ Test(Ftest_ENTREE_PAR_setenv()) \ /* L'entree via une variable 'setenv' n'est fait que lors du premier parcours de la */ \ /* 'liste_de_traitement' car, en effet, contrairement au traitement de 'liste_des_arguments' */ \ /* il ne faut le faire qu'une seule fois. En particulier, cela permet de garantir que pour */ \ /* un argument defini a la fois par variable 'setenv' et par un parametre d'appel, c'est ce */ \ /* dernier qui l'emportera... */ \ /* */ \ /* ATTENTION, ce test par rapport a 'NUMERO_PREMIER_ARGUMENT' fait que la declaration : */ \ /* */ \ /* Environnement=VRAI */ \ /* */ \ /* ou l'equivalence : */ \ /* */ \ /* setenv=VRAI */ \ /* */ \ /* doit etre le premier des parametres d'une commande. Au-dela elle sera ineffective... */ \ /* */ \ /* Le test sur 'bloquer_provisoirement__entrer_des_parametres_via_des_setenv' a ete */ \ /* introduit le 20090422091211... */ \ /* */ \ /* Le 20090422110711 a ete mis en place l'entree via une variable 'setenv' y compris dans */ \ /* le cas ou la commande n'a pas de parametres (ce qui n'etait pas possible avant cette */ \ /* date...). Le test ci-dessus a donc ete modifie en consequences, mais de facon apparemment */ \ /* complique. En fait : */ \ /* */ \ /* IFET(IFGT(nombre_effectif_d_arguments,UN) */ \ /* ,IFEQ(numero_d_argument_courant,NUMERO_PREMIER_ARGUMENT) */ \ /* ) */ \ /* */ \ /* correspond au test anterieur (ou l'entree via des 'setenv's se faisait lors du traitement */ \ /* du premier argument -de numero 'NUMERO_PREMIER_ARGUMENT'-). Alors que : */ \ /* */ \ /* IFEQ(nombre_effectif_d_arguments,UN) */ \ /* */ \ /* traite le cas ou il n'y a aucun argument (l'entree via des 'setenv's se fait alors lors */ \ /* du traitement du nom de la commande -de numero 'NOM_DE_LA_COMMANDE'-). Il semblerait */ \ /* qu'en fait ce dernier test suffise et que les entrees via des 'setenv's puissent toute */ \ /* avoir lieu lors du traitement du nom de la commande, qu'il y ait ou pas des arguemnts. */ \ /* Mais, on ne sait jamais car cela marchait tres bien avant... */ \ Bblock \ DEFV(CHAR,INIT(POINTERc(nom_variable_d_environnement_associee_au_titre_attendu),CHAINE_UNDEF)); \ DEFV(CHAR,INIT(POINTERc(valeur_variable_d_environnement_associee_au_titre_attendu),CHAINE_UNDEF)); \ /* Definition de la variable d'environnement associee au 'titre_attendu'. */ \ \ MOVE_CARACTERE_NE_DEPLACE_QUE_LES_CARACTERES_ALPHA_NUMERIQUES; \ EGAp(nom_variable_d_environnement_associee_au_titre_attendu \ ,chain_Aconcaten2(EN_TETE_DE_titre_attendu_LORS_DES_ENTREES_VIA_DES_SETENV \ ,titre_attendu \ ) \ ); \ MOVE_CARACTERE_DEPLACE_TOUS_LES_CARACTERES; \ /* Generation du nom de la variable d'environnement associee au 'titre_attendu' en */ \ /* eliminant tous les codes non alpha-numeriques... */ \ \ EGAp(valeur_variable_d_environnement_associee_au_titre_attendu \ ,Gvar(nom_variable_d_environnement_associee_au_titre_attendu) \ ); \ /* Recuperation de la valeur de la variable d'environnement associee au 'titre_attendu' */ \ /* si elle existe... */ \ \ Test(IFNE_chaine(valeur_variable_d_environnement_associee_au_titre_attendu,VALEUR_D_UNE_VARIABLE_UNDEF)) \ Bblock \ /* Cas ou la variable d'environnement associee au 'titre_attendu' existe : */ \ begin_nouveau_block \ Bblock \ DEFV(CHAR,INIC(POINTERc(format_EGAq____gPROCESS_PARAMETRE_ENTREE_PAR_setenv) \ ,chain_Aconcaten2(titre_attendu \ ,valeur_variable_d_environnement_associee_au_titre_attendu \ ) \ ) \ ); \ \ EGAp(parametre \ ,FCon(format_EGAq____gPROCESS_PARAMETRE_ENTREE_PAR_setenv \ ,titre_attendu \ ,va_defaut \ ,NE_PAS_EDITER_LES_VALEURS_APRES_Fconversion \ ,C_VIDE \ ,INDICATEUR_DE_TYPE_____A_R \ ) \ ); \ /* Entree eventuelle d'un parametre via un 'setenv' (introduit le 19980420092917). */ \ /* */ \ /* La chaine 'INDICATEUR_DE_TYPE_____A_R' a ete introduite le 20060310095832 suite a la */ \ /* modification 'v $xig/fonct$vv$FON 20060310093722' relative a l'introduction du nouvel */ \ /* argument 'A_R' des fonctions 'Fconversion?(...)'. */ \ \ CALZ_FreCC(format_EGAq____gPROCESS_PARAMETRE_ENTREE_PAR_setenv); \ Eblock \ end_nouveau_block \ \ EGAL(valeur_recherchee_dans_un_setenv,valeur_recherchee); \ /* Memorisation du compte-rendu... */ \ Eblock \ ATes \ Bblock \ /* Cas ou la variable d'environnement associee au 'titre_attendu' n'existe pas... */ \ Eblock \ ETes \ \ CALZ_FreCC(nom_variable_d_environnement_associee_au_titre_attendu); \ /* Ce nettoyage a ete introduit le 20030707092751 car il manquait. On notera qu'il ne */ \ /* faut pas faire de : */ \ /* */ \ /* CALS(Free(valeur_variable_d_environnement_associee_au_titre_attendu)); */ \ /* */ \ /* car, en effet, le pointeur renvoye par 'Gvar(...)' n'est pas du tout de meme nature que */ \ /* celui qui est renvoye par 'Malo(...)'. Il semble que 'Gvar(...)' renvoit directement un */ \ /* pointeur sur l'environnement, alors que 'Malo(...)', comme son nom l'indique, fait de */ \ /* l'allocation dynamique dans la pile... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Validation eventuelle du type du parametre courant. Cette procedure a ete introduite */ \ /* le 20020104095016 afin d'offrir la possibilite de mettre ce dispositif en tant que */ \ /* 'VERSION' car, en effet, il est pratiquement pas utilise... */ #Aifdef gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_02 #Eifdef gPROCESS_PARAMETRE_ENTREE_PAR_setenv_VERSION_02 #define gPROCESS_PARAMETRE_RECUPERATION_ET_TRANSFORMATION(liste_des_arguments,numero_d_argument_courant,abr) \ Bblock \ DEFV(CHAR,INIT(POINTERc(argument_courant),CHAINE_UNDEF)); \ /* Argument courant... */ \ DEFV(CHAR,INIT(POINTERc(debut_de_l_argument_courant),CHAINE_UNDEF)); \ /* Debut de l'argument courant pour voir s'il n'est pas deja prefixe (introduit le */ \ /* 20030705121308). */ \ \ EGAp(argument_courant \ ,chain_Acopie(ITb1(liste_des_arguments \ ,INDX(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ) \ ) \ ); \ /* Argument courant... */ \ \ Test(EST_VRAI(abr)) \ Bblock \ /* Cas ou le parametre courant peut etre abrege (on verra a ce propos avec profit les */ \ /* commentaires 'v $xig/fonct$vv$DEF PROCESS_ARGUMENT_C..PreFixeParametres=.' pour */ \ /* une definition et des exemples d'usage) : */ \ Test(EST_VRAI(c_est_la_derniere_recherche_des_parametres)) \ /* Afin de ne compter qu'une seule fois les parametres abregeables... */ \ Bblock \ INCR(nombre_de_parametres_supportant_PreFixeParametres,I); \ /* Comptage introduit le 20030708094336 des parametres supportant le prefixage... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAp(debut_de_l_argument_courant \ ,chain_ANcopie(argument_courant \ ,chain_Xtaille(prefixe_destine_a_abreger_certains_Parametres_qui_suivent) \ ) \ ); \ /* Debut de l'argument courant sur une longueur egale a l'eventuel prefixe (introduit le */ \ /* 20030705121308). Ainsi, on va pouvoir tester si l'argument courant ne serait pas deja */ \ /* prefixe par 'prefixe_destine_a_abreger_certains_Parametres_qui_suivent'... */ \ Eblock \ ATes \ Bblock \ /* Cas ou le parametre courant ne peut pas etre abrege... */ \ Eblock \ ETes \ \ begin_nouveau_block \ Bblock \ DEFV(CHAR,INIC(POINTERc(format_EGAq____gPROCESS_PARAMETRE_RECUPERATION_ET_TRANSFORMATION) \ ,chain_Aconcaten2 \ (COND(IFET(EST_VRAI(abr) \ ,EST_FAUX(chain_compare \ (debut_de_l_argument_courant \ ,prefixe_destine_a_abreger_certains_Parametres_qui_suivent \ ) \ ) \ ) \ ,prefixe_destine_a_abreger_certains_Parametres_qui_suivent \ ,ccCHAR(C_VIDE) \ ) \ ,argument_courant \ ) \ ) \ ); \ \ EGAp(argument_courant_apres_conversions_majuscules_minuscules_et_prefixage_eventuels_2 \ ,chain_Acopie_avec_conversions_possibles_majuscules_minuscules \ (format_EGAq____gPROCESS_PARAMETRE_RECUPERATION_ET_TRANSFORMATION \ ,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 \ ) \ ); \ /* Argument courant apres les eventuelles conversions majuscules-minuscules et inversement */ \ /* (introduit le 20010621143912). La possibilite d'abreger une partie des parametres a ete */ \ /* introduite le 20030704090902. Le 20030704142017, les abreviations ont ete rendues */ \ /* optionnelles (via l'argument 'abr'). A compter du 20030705121308 le prefixe d'abreviation */ \ /* (s'il peut etre utilise via l'argument 'abr') n'est applique que s'il ne prefixe pas */ \ /* deja l'argument courant. */ \ /* */ \ /* Ce 'argument_courant_apres_conversions_majuscules_minuscules_et_prefixage_eventuels_2' */ \ /* n'est pas celui qui est defini ci-apres dans 'gPROCESS_PARAMETRE(...)', mais celui de la */ \ /* fonction 'v $xig/fonct$vv$FON FgPROCESS_PARAMETRE_RECUPERATION_ET_TRANSFORMATION'. Cela */ \ /* fut note le 20051024140750 ; au passage, ils representent tous les deux la meme chose, */ \ /* donc la confusion est, semble-t-il, sans importance. Malgre tout, le 20051025153049, */ \ /* j'ai introduit les postfixes "_1" et "_2" pour les distinguer, cela ameliorera la */ \ /* lisibilite... */ \ \ CALZ_FreCC(format_EGAq____gPROCESS_PARAMETRE_RECUPERATION_ET_TRANSFORMATION); \ Eblock \ end_nouveau_block \ \ Test(EST_VRAI(abr)) \ Bblock \ CALZ_FreCC(debut_de_l_argument_courant); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CALZ_FreCC(argument_courant); \ Eblock \ /* Recuperation du parametre courant et transformation eventuelle. Ceci a ete introduit le */ \ /* 20030706112345 afin de reduire le code genere par 'gPROCESS_PARAMETRE(...)'. A titre */ \ /* d'exemple, voici les tailles avant et apres concernant 'v $xrv/SysLin_2D.01$K' : */ \ /* */ \ /* SysLin_2D.01$c : 373177 --> 332092 */ \ /* SysLin_2D.01$X : 112929 --> 104744 */ \ /* */ \ /* et pour 'v $xrv/variation.01$K' : */ \ /* */ \ /* variation.01$c : 1076938 --> 935758 */ \ /* variation.01$X : 384471 --> 335356 */ \ /* */ \ /* ce qui n'est pas negligeable... */ #define ENVOI_D_UNE_SEQUENCE_D_ECHAPPEMENT_VT100(sequence_specifique) \ Bblock \ CAL3(Prme4("%c%c%s%c" \ ,SEQUENCE_D_ECHAPPEMENT_VT100_DEBUT_1 \ ,SEQUENCE_D_ECHAPPEMENT_VT100_DEBUT_2 \ ,sequence_specifique \ ,SEQUENCE_D_ECHAPPEMENT_VT100_FIN \ ) \ ); \ Eblock \ /* Envoi d'une sequence d'echappement de type 'VT100' (introduit le 20060610104417). Voir */ \ /* 'v $xtc/InvVideo.01$c' a ce propos... */ #define ALTERNANCE_DES_PARAMETRES_DEBUT \ Bblock \ Test(IL_FAUT(alterner_les_parametres_pour_plus_de_lisibilite)) \ Bblock \ Test(EST_PAIR(NUMERO_UNIQUE_de_l_argument_possible_courant)) \ Bblock \ ENVOI_D_UNE_SEQUENCE_D_ECHAPPEMENT_VT100(sequence_d_echappement_VT100_alternance_des_parametres); \ /* Inversion d'un parametre sur deux (introduit le 20060610102859)... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Debut de l'inversion d'un parametre sur deux (introduit le 20060610112912). */ #define ALTERNANCE_DES_PARAMETRES_FIN \ Bblock \ Test(IL_FAUT(alterner_les_parametres_pour_plus_de_lisibilite)) \ Bblock \ ENVOI_D_UNE_SEQUENCE_D_ECHAPPEMENT_VT100(SEQUENCE_D_ECHAPPEMENT_VT100_INITIALISATION_GENERALE); \ /* Inversion d'un parametre sur deux (introduit le 20060610102859). Cette sequence de */ \ /* reinitialisation est faite systematiquement afin d'eviter d'eventuels problemes... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Debut de l'inversion d'un parametre sur deux (introduit le 20060610112912). */ #define gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT(__ParaTyp,__ParaLon) \ Bblock \ DEFV(CHAR,INIT(POINTERc(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT_1) \ ,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_SUITE_POUR_LES_VECTEURS \ ) \ ); \ DEFV(CHAR,INIT(POINTERc(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT),CHAINE_UNDEF)); \ EGAp(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT \ ,chain_Aconcaten4(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT_1 \ ,FORMAT_D_EDITION_DES_TITRES \ ,FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_VECTORIELLES \ ,"{" \ ) \ ); \ /* Introduit le 20180318104427 pour economiser la memoire... */ \ \ ALTERNANCE_DES_PARAMETRES_DEBUT; \ /* Inversion d'un parametre sur deux (introduit le 20060610112912)... */ \ \ begin_nouveau_block \ Bblock \ DEFV(CHAR,INIC(POINTERc(format_EGAq_1__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT) \ ,chain_numero_exact(__ParaLon) \ ) \ ); \ DEFV(CHAR,INIC(POINTERc(format_EGAq_2__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT),CHAINE_UNDEF)); \ DEFV(CHAR,INIC(POINTERc(format_EGAq_3__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT),CHAINE_UNDEF)); \ EGAp(format_EGAq_2__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT \ ,chain_Aconcaten3("des " \ ,format_EGAq_1__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT \ ," elements=" \ ) \ ); \ EGAp(format_EGAq_3__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT \ ,chain_Aconcaten2(EN_TETE_DE_LA_LISTE_DES_PREMIERES_VALEURS_D_UN_VECTEUR \ ,COND(IFEQ(__ParaLon,ZERO) \ ,ccCHAR("(vide)=") \ ,COND(IFEQ(__ParaLon,UN) \ ,ccCHAR("de l'unique element=") \ ,format_EGAq_2__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT \ ) \ ) \ ) \ ); \ \ CAL3(Prme5(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT \ ,NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES \ ,C_VIDE \ ,tabulation_des_valeurs_affectees_aux_titres \ ,format_EGAq_3__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT \ /* Le 20010831094043 a ete introduit l'edition de la longueur courante '__ParaLon' du */ \ /* vecteur... */ \ /* */ \ /* Avant le 20060104162159, on trouvait ici : */ \ /* */ \ /* chain_numero(__ParaLon,TRPU(POSI(LO1X(__ParaLon)))) */ \ /* */ \ ,__ParaTyp \ ) \ ); \ /* Debut de l'edition du vecteur '__ParaVal'. */ \ \ CALZ_FreCC(format_EGAq_3__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT); \ CALZ_FreCC(format_EGAq_2__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT); \ CALZ_FreCC(format_EGAq_1__gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT); \ Eblock \ end_nouveau_block \ \ CALZ_FreCC(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT); \ CALZ_FreCC(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT_1); \ Eblock \ /* Debut de l'edition des vecteurs de longueur variable et connue. */ #define gPROCESS_PARAMETRE_EDITION_VECTEUR_N(__ParaTyp,__ParaLon,__ParaFor,__ParaVal) \ Bblock \ DEFV(Int,INIT(premier__ParaVal,PREMIER_ELEMENT_D_UN_FICHIER)); \ DEFV(Int,INIT(dernier__ParaVal \ ,LSTX(PREMIER_ELEMENT_D_UN_FICHIER \ ,MIN2(__ParaLon \ ,editer_la_valeur_des_parametres_d_une_commande_____longueur_maximale_des_vecteurs \ ) \ ) \ ) \ ); \ /* Premier et dernier elements du vecteur '__ParaVal' a editer. */ \ \ CALS(FgPROCESS_PARAMETRE_EDITION_VECTEUR_N_DEBUT(__ParaTyp,__ParaLon)); \ /* Debut de l'edition des vecteurs de longueur variable et connue. */ \ \ IDoIn(index__ParaVal,premier__ParaVal,dernier__ParaVal,I) \ /* On notera que '__ParaLon' peut etre nul par defaut ('v $xrv/ARITHMET.11$I __ParaLon') */ \ /* et faire donc que le 'DoIn(...)' qui precede ne soit pas execute et ne provoque donc */ \ /* d'edition de valeurs, d'ou la sortie d'un "{}" vide. */ \ /* */ \ /* Le 20060603175225, 'IDoIn(...)' a remplace 'DoIn(...)'... */ \ Bblock \ CAL3(Prme1(__ParaFor \ ,IdTb1(__ParaVal,index__ParaVal,__ParaLon) \ ) \ ); \ /* Edition de l'element courant du vecteur '__ParaVal'. */ \ \ Test(IFNE(index__ParaVal,dernier__ParaVal)) \ Bblock \ CALS(FPrme0(",")); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EIDoI \ \ CALS(FgPROCESS_PARAMETRE_EDITION_VECTEUR_N_FIN(__ParaLon,premier__ParaVal,dernier__ParaVal)); \ /* Fin de l'edition des vecteurs de longueur variable et connue. */ \ Eblock \ /* Edition des vecteurs de longueur variable et connue. */ #ifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01 # define vgPROCESS_PARAMETRE_EDITION_VECTEUR_N(__ParaTyp,__ParaInd,__ParaFor,__ParaVal) \ Bblock \ gPROCESS_PARAMETRE_EDITION_VECTEUR_N(__ParaTyp,__ParaInd,__ParaFor,__ParaVal); \ Eblock \ /* Edition des vecteurs de longueur variable et connue. */ #Aifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01 #Eifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01 #ifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02 # define vgPROCESS_PARAMETRE_EDITION_VECTEUR_N(__ParaTyp,__ParaInd,__ParaFor,__ParaVal) \ Bblock \ CALS(FgPROCESS_PARAMETRE_EDITION_VECTEUR_N_Float(__ParaTyp,__ParaInd,__ParaFor,__ParaVal)); \ Eblock \ /* Edition des vecteurs de longueur variable et connue. */ #Aifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02 #Eifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_02 #define gPROCESS_PARAMETRE_EDITION_VECTEUR_N_FIN(__ParaLon,premier__ParaVal,dernier__ParaVal) \ Bblock \ Test(IFLT(NBRE(premier__ParaVal,dernier__ParaVal),__ParaLon)) \ /* Cas ou le vecteur '__ParaVal' n'est pas edite en entier (premiers elements seulement...). */ \ Bblock \ Test(IZGT(NBRE(premier__ParaVal,dernier__ParaVal))) \ Bblock \ CALS(FPrme0(",")); \ /* Cas ou au moins le premier element a ete edite... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CALS(FPrme0("...")); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CALS(FPrme0("}")); \ /* Fin de l'edition du vecteur '__ParaVal'. */ \ 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)); \ /* Fin de l'edition du vecteur '__ParaVal'. */ \ Eblock \ /* Fin de l'edition des vecteurs de longueur variable et connue. */ #define gPROCESS_PARAMETRE_EDITION_VECTEUR(__ParaTyp,__ParaInd,__ParaFor,__ParaVal) \ Bblock \ DEFV(CHAR,INIT(POINTERc(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_1) \ ,FORMAT_D_EDITION_DES_IDENTITES_UNIQUES_SUITE_POUR_LES_VECTEURS \ ) \ ); \ DEFV(CHAR,INIT(POINTERc(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR),CHAINE_UNDEF)); \ EGAp(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR \ ,chain_Aconcaten11(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_1 \ ,FORMAT_D_EDITION_DES_TITRES \ ,FORMAT_D_EDITION_DES_TYPES_DES_VALEURS_VECTORIELLES \ ,"{" \ ,__ParaFor \ ,"," \ ,__ParaFor \ ,"," \ ,__ParaFor \ ,",...}" \ ,"\n" \ ) \ ); \ /* Introduit le 20180318104427 pour economiser la memoire... */ \ \ begin_nouveau_block \ Bblock \ DEFV(CHAR,INIC(POINTERc(format_EGAq____gPROCESS_PARAMETRE_EDITION_VECTEUR) \ ,chain_Aconcaten2(EN_TETE_DE_LA_LISTE_DES_PREMIERES_VALEURS_D_UN_VECTEUR \ ,"des elements (de nombre inconnu)=" \ ) \ ) \ ); \ \ CAL3(Prme8(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR \ /* On notera qu'avant le 20000529170948, il y avait ici : */ \ /* */ \ /* chain_Aconcaten7("%s : {",...) */ \ /* */ \ /* malheureusement, l'espace situe devant "{" disparaissait lors du pre-processing par */ \ /* 'v $xcc/cpp$D/compacte.1$sed', d'ou la nouvelle ecriture avec 'chain_Aconcaten8(...)'. */ \ /* De plus et simultanement, 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_SUITE_POUR_LES_VECTEURS' contient "%0*d : " ; */ \ /* ainsi on peut faire la difference ente ":" et "::". */ \ ,NOMBRE_DE_CHIFFRES_POUR_EDITER_LES_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES \ ,C_VIDE \ ,tabulation_des_valeurs_affectees_aux_titres \ ,format_EGAq____gPROCESS_PARAMETRE_EDITION_VECTEUR \ /* Le 20010831094043 a ete introduit l'edition de la longueur courante '__ParaLon' du */ \ /* vecteur qui, malheureusement n'est pas defini ici (cas 'Aifdef' ci-dessus)... */ \ ,__ParaTyp \ ,IdTb1(__ParaVal,__ParaInd,UNDEF) \ ,IdTb1(__ParaVal,__ParaInd,UNDEF) \ ,IdTb1(__ParaVal,__ParaInd,UNDEF) \ ) \ ); \ \ CALZ_FreCC(format_EGAq____gPROCESS_PARAMETRE_EDITION_VECTEUR); \ Eblock \ end_nouveau_block \ \ CALZ_FreCC(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR); \ CALZ_FreCC(format_d_edition_de_gPROCESS_PARAMETRE_EDITION_VECTEUR_1); \ Eblock \ /* Edition des vecteurs de longueur inconnue. */ #ifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01 # define vgPROCESS_PARAMETRE_EDITION_VECTEUR(__ParaTyp,__ParaInd,__ParaFor,__ParaVal) \ Bblock \ gPROCESS_PARAMETRE_EDITION_VECTEUR(__ParaTyp,__ParaInd,__ParaFor,__ParaVal); \ Eblock \ /* Edition des vecteurs de longueur inconnue. */ #Aifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01 #Eifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01 #ifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02 # define vgPROCESS_PARAMETRE_EDITION_VECTEUR(__ParaTyp,__ParaInd,__ParaFor,__ParaVal) \ Bblock \ CALS(FgPROCESS_PARAMETRE_EDITION_VECTEUR_Float(__ParaTyp,__ParaInd,__ParaFor,__ParaVal)); \ Eblock \ /* Edition des vecteurs de longueur inconnue. */ #Aifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02 #Eifdef gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_02 #define gPROCESS_PARAMETRE_COMPTAGE(valeur_recherchee_dans_la_liste_des_arguments) \ Bblock \ Test(PRESENT(valeur_recherchee_dans_la_liste_des_arguments)) \ /* ATTENTION, les validations qui suivent n'ont evidemment de sens que si la valeur a */ \ /* ete trouvee dans la liste des arguments... */ \ Bblock \ EGAL(IdTb1(IDENTITE_des_arguments_presents \ ,INDX(numero_d_argument_courant,NUMERO_ARGUMENT_COMMANDE) \ ,nombre_d_arguments_y_compris_le_nom \ ) \ ,IDENTITE_de_l_argument_possible_courant \ ); \ /* Memorisation de l'identite de l'argument courant. On notera la relativisation de */ \ /* l'identite de 'parametre' par rapport a 'parametre_fictif_IDENTITE_des_arguments' */ \ /* destinee uniquement a eviter le message : */ \ /* */ \ /* illegal combination of pointer and integer */ \ /* */ \ /* au cas ou l'on utilise que 'aIDENTITE(parametre)'... */ \ INCK(IdTb1(compteur_reconnaissance_des_arguments_presents \ ,INDX(numero_d_argument_courant,NUMERO_ARGUMENT_COMMANDE) \ ,nombre_d_arguments_y_compris_le_nom \ ) \ ); \ /* Comptage de reconnaissance de l'argument courant... */ \ INCR(nombre_d_arguments_recuperes,I); \ /* Et enfin comptage des arguments recuperes. Autre fois, avant d'introduire 'seqI' et */ \ /* 'seqC', il y avait : */ \ /* */ \ /* INCR(nombre_d_arguments_recuperes */ \ /* ,COND(PRESENT(valeur_recherchee),I,ZERO) */ \ /* ); */ \ /* */ \ /* 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). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Comptage des parametres... */ #define PERMETTRE_LES_ABREVIATIONS_DANS_gPROCESS_PARAMETRE \ VRAI #define NE_PAS_PERMETTRE_LES_ABREVIATIONS_DANS_gPROCESS_PARAMETRE \ NOTL(PERMETTRE_LES_ABREVIATIONS_DANS_gPROCESS_PARAMETRE) /* Pour definir l'argument 'abr' de 'gPROCESS_PARAMETRE(...)' introduit le 20030704142017. */ #define DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____PRIMAIRES \ BblockV \ __PLUS1__A__ #define FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____PRIMAIRES \ __MOINS1__A__ \ EblockV /* Introduit le 20060208122411 par "symetrie" avec ce qui a ete fait le 20060208101231... */ /* */ /* Le passage de {VIDE,VIDE} a {__PLUS1__A__,__MOINS1__A__} a eu lieu le 20061018153006. */ /* Grace a cela, seuls les parametres apparaissant explicitement dans un '$K' sont edites */ /* sous la forme : */ /* */ /* Parametre.1. */ /* */ /* alors que tous ceux qui apparaissent via une procedure seront edites avec un numero */ /* superieur a 1... */ #define DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES \ BblockV \ __PLUS1__A__ #define FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES \ __MOINS1__A__ \ EblockV /* Introduit le 20060208101231 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'). */ #define CARACTERE_DE_SEPARATION_DES_COUPLES_____NOM_VALEUR_____DES_PARAMETRES \ K_EGAL \ /* Introduit le 20070221101510... */ #define gPROCESS_PARAMETRE_SYNONYME_COURANT(titre_attendu,titre_attendu_unique,premier_caractere_de_____titre_attendu) \ Bblock \ DEFV(Int,INIT(EnTete_de_sauvegardM ## chain_copie_____index_du_premier_caractere_d_une_chaineA \ ,chain_copie_____index_du_premier_caractere_d_une_chaineA \ ) \ ); \ DEFV(CHAR,INIT(EnTete_de_sauvegardM ## chain_copie_____caractere_d_arret_secondaire \ ,chain_copie_____caractere_d_arret_secondaire \ ) \ ); \ /* Sauvegardes (introduites le 20070221101510)... */ \ \ EGAL(chain_copie_____index_du_premier_caractere_d_une_chaineA,premier_caractere_de_____titre_attendu); \ EGAL(chain_copie_____caractere_d_arret_secondaire \ ,CARACTERE_DE_SEPARATION_DES_COUPLES_____NOM_VALEUR_____DES_PARAMETRES \ ); \ /* Afin de recuperer le titre courant dans la liste eventuelle des synonymes... */ \ \ EGAp(titre_attendu_unique,chain_Acopie(titre_attendu)); \ /* Recuperation du titre attendu unique (introduit le 20070221093034) parmi la liste */ \ /* eventuelle des synonymes... */ \ \ EGAL(chain_copie_____caractere_d_arret_secondaire \ ,EnTete_de_sauvegardM ## chain_copie_____caractere_d_arret_secondaire \ ); \ EGAL(chain_copie_____index_du_premier_caractere_d_une_chaineA \ ,EnTete_de_sauvegardM ## chain_copie_____index_du_premier_caractere_d_une_chaineA \ ); \ /* Restaurations (introduites le 20070221101510)... */ \ Eblock \ /* Procedure introduite le 20070228083133 pour extraire le synonyme courant... */ #nodefine liste_des_____titre_attendu_____etendu(parametre,titre_attendu) \ "parametre="titre_attendu #define liste_des_____titre_attendu_____etendu(parametre,titre_attendu) \ titre_attendu /* Le 20080321134343, j'ai fait des experiences consistant a tenter d'etendre la liste des */ /* titres attendus avec le nom du parametre et ce a des fins mnemotechniques. Ainsi, par */ /* exemple l'appel suivant : */ /* */ /* GET_ARGUMENT_L("standard=",les_images_sont_standards); */ /* */ /* serait automatiquement remplace par : */ /* */ /* GET_ARGUMENT_L("les_images_sont_standards=""standard=",les_images_sont_standards); */ /* */ /* ce qui serait bien pratique au niveau mnemotechnique, par exemple, lors de l'usage de la */ /* commande 'use'... */ /* */ /* Cela a conduit a la modification 'v $xcc/cpp$Z 20080321134527' car, en effet, le nom du */ /* parametre (dans '"parametre="') se trouve suivi par plusieurs espaces avant le "=". */ /* Au passage, ces espaces viennent de l'appel des procedures ; soit par exemple : */ /* */ /* #define PROCEDURE(parametre) "parametre=" */ /* */ /* L'appel : */ /* */ /* PROCEDURE(x) */ /* */ /* donnera : */ /* */ /* "x=" */ /* */ /* alors que : */ /* */ /* PROCEDURE(x */ /* ) */ /* */ /* \___10___/ */ /* */ /* donnera : */ /* */ /* "x =" */ /* */ /* \__10+1___/ */ /* */ /* soit autant d'espaces non desires qu'il y a en devant ")" (soit ici 10), plus un (qui */ /* correspond certainement au changement de ligne...). */ /* */ /* Provisoirement, le dispositif est inhibe car, en effet, il y a des parametres qui sont, */ /* non pas des variables "simples", mais des elements de structure ou autre (par exemple */ /* 'v $xig/fonct$vv$DEF PREMIER_CARACTERE_ITb0.FORMAT_CHAI_EDITION_____caractere_d_en...'), */ /* or il est choquant d'avoir des parentheses dans une chaine d'introduction d'un parametre, */ /* sachant de plus que '$CSH' n'aime pas beaucoup cela... */ /* */ /* D'ailleurs le 20080323163537, je note un autre probleme (redhibitoire ?). Ainsi, par */ /* exemple : */ /* */ /* GET_ARGUMENT_L("ADD2_SOUS=",FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS); */ /* GET_ARGUMENT_N("SOUS_SOUS=",FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS); */ /* */ /* (voir ci-apres 'v $xig/fonct$vv$DEF FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS') */ /* vont ainsi tous les deux donner grace a 'liste_des_____titre_attendu_____etendu(...)' : */ /* */ /* GET_ARGUMENT_L("FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS=""ADD2_SOUS=" */ /* ,FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS */ /* ); */ /* GET_ARGUMENT_N("FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS=""SOUS_SOUS=" */ /* ,FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS */ /* ); */ /* */ /* ce qui est evidemment mauvais puisque on est alors en presence d'une meme chaine */ /* ("FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS=") introduisant deux procedures */ /* ('GET_ARGUMENT_L(...)' et 'GET_ARGUMENT_N(...)') differentes ! */ /* */ /* Finalement, je note le 20080323165548 que tout cela est bien inutile car, en effet, il */ /* existe un dispositif controle par 'IL_FAUT(editer_le_nom_des_parametres_d_une_commande)' */ /* qui fait deja cela tres bien. Je laisse tout ce qui precede, cela pouvant donner des */ /* idees plus tard... */ #define gPROCESS_PARAMETRE__EDITION_PARAMETRES_NON_GENERES(titre_attendu) \ Bblock \ Test(EST_VRAI(c_est_la_derniere_recherche_des_parametres)) \ Bblock \ /* Jusqu'au 20180312135920, il y avait ici : */ \ /* */ \ /* Test(IL_FAUT(editer_la_valeur_des_parametres_d_une_commande)) */ \ /* Bblock */ \ /* */ \ /* mais en fait, on peut vouloir n'editer que les parametres non generes... */ \ Test(IL_FAUT(editer_le_nom_des_parametres_non_generes_d_une_commande)) \ Bblock \ CAL3(Prme5("%s%s : %s%s%s\n" \ ,"# " \ ,"Parametre(s) non genere(s)" \ ,C_QUOTE \ ,titre_attendu \ ,C_QUOTE \ ) \ ); \ /* Edition introduite le 20180228101858... */ \ /* */ \ /* Le 20180228130923 a ete introduite a part la chaine d'espaces fin de garantir sa bonne */ \ /* utilisation car, sinon elle risque d'etre "compressee" par 'v $xcc/cpp$Z'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit le 20180301034510 afin de reduire le volume du code genere... */ #define gPROCESS_PARAMETRE(liste_des_arguments,titre_attendu,parametre,va_defaut,FCon,FCast,sq1,sqI,fC,sqC,sqN,styp,abr,ityp,sqA,sqP) \ /* A compter du 20070221110204, 'titre_attendu' peut etre une liste de synonymes qui */ \ /* s'ecrira : */ \ /* */ \ /* "SYNONYME1=""SYNONYME2=""SYNONYME3=""..." */ \ /* */ \ /* (qui est la forme hautement conseillee car, en effet, elle facilite, par exemple, les */ \ /* recherches, tout en "symetrisant" les differents synonymes) ou encore : */ \ /* */ \ /* "SYNONYME1=SYNONYME2=SYNONYME3=..." */ \ /* */ \ /* qui est plutot deconseillee, puisqu'elle "dissymetrise" les differents synonymes... */ \ /* */ \ /* On notera que cela a conduit a supprimer ci-apres le parametre '"=="' qui etait relatif */ \ /* a 'FPrin_____supprimer_les_K_BLANCs_autour_des_K_EGAL' a cette date. Le 20070226134221 */ \ /* parametre '"=="' fut retabli grace a 'v $xig/fonct$vv$FON 20070226134226'... */ \ /* */ \ /* Les sequences "Anterieure" et "Posterieure" ont ete introduites le 20070305110736 pour */ \ /* permettre le traitement correct de 'GET_PARAMETRE_N(...)' apres l'introduction de la */ \ /* gestion des synonymes... */ \ \ &ifdef NePasGenerer_PARAMETRE____`parametre&&& \ /* Introduit le 20170627150252 afin de pouvoir ne pas generer le parametre de nom */ \ /* 'parametre'... */ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ Bblock \ CALS(FgPROCESS_PARAMETRE__EDITION_PARAMETRES_NON_GENERES(titre_attendu)); \ Eblock \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ _____FORCER_UN_CHANGEMENT_DE_LIGNE_EN_PASSE_2_____ \ &Aifdef NePasGenerer_PARAMETRE____`parametre&&& \ Bblock \ DEFV(Int,INIT(premier_caractere_de_____titre_attendu,PREMIER_CARACTERE)); \ DEFV(Int,INIT(compteur_des_synonymes_de_____titre_attendu,ZERO)); \ DEFV(Logical,INIT(c_est_le_premier_____titre_attendu_____dans_liste_titres_synonyme,VRAI)); \ /* Afin d'identifier le premier synonyme de la liste (introduit le 20070330145617). */ \ DEFV(Logical,INIT(tous_____titre_attendu_____ont_ete_recupere_dans_liste_titres_synonymes,FAUX)); \ /* Afin de recuperer tous les synonymes de la liste (introduit le 20070221110204). */ \ DEFV(Logical,INIT(au_moins_un_titre_synonyme_a_ete_reconnu_parmi_la_liste_des_titres_synonymes,FAUX)); \ /* Afin de savoir si au moins un synonyme a ete reconnu (introduit le 20070323154106). */ \ \ EGAp(liste_des_____titre_attendu_____synonymes \ ,chain_Acopie(liste_des_____titre_attendu_____etendu(parametre,titre_attendu)) \ ); \ /* Liste des titres attendus synonymes (introduit le 20070325172306) afin de pouvoir etre */ \ /* utilise dans 'DETECTION_DE_PRESENCE_D_UN_ARGUMENT_OBLIGATOIRE'. */ \ /* */ \ /* ATTENTION : je note le 20070325181942 que 'liste_des_____titre_attendu_____synonymes' */ \ /* ne peut etre utilise ci-apres a la place de 'titre_attendu' et ce a cause, semble-t-il, */ \ /* de 'v $xcc/cpp$Z w52' qui recherche les parametres doublement definis. Il convient donc */ \ /* de laisser 'titre_attendu' et 'liste_des_____titre_attendu_____synonymes' tels qu'ils */ \ /* sont utilises actuellement... */ \ /* */ \ /* Le 20070330091147 cette chaine est devenue globale afin de simplifier l'implantation */ \ /* de 'grouper_les_synonymes_des_parametres_d_une_commande'... */ \ \ Tant(EST_FAUX(tous_____titre_attendu_____ont_ete_recupere_dans_liste_titres_synonymes)) \ Bblock \ DEFV(CHAR,INIT(POINTERc(titre_attendu_unique_parmi_une_liste_de_titres_synonymes),CHAINE_UNDEF)); \ /* Titre attendu unique (introduit le 20070221093034). */ \ \ INCK(compteur_des_synonymes_de_____titre_attendu); \ /* Comptage des synonymes (introduit le 20070325174643) afin de pouvoir adapter le message */ \ /* edite dans 'DETECTION_DE_PRESENCE_D_UN_ARGUMENT_OBLIGATOIRE'... */ \ \ EGAp(titre_attendu_unique_parmi_une_liste_de_titres_synonymes \ ,FgPROCESS_PARAMETRE_SYNONYME_COURANT(liste_des_____titre_attendu_____etendu(parametre,titre_attendu) \ ,premier_caractere_de_____titre_attendu \ ) \ ); \ \ EGAL(premier_caractere_de_____titre_attendu \ ,chain_copie_____successeur_de_l_index_du_dernier_caractere_d_une_chaineA \ ); \ /* Pour preparer le 'chain_Acopie(...)' eventuel suivant... */ \ \ Test(EST_VRAI(chain_copie_____la_chaineA_a_ete_copiee_jusqu_au_END_OF_CHAIN)) \ Bblock \ EGAL(tous_____titre_attendu_____ont_ete_recupere_dans_liste_titres_synonymes,VRAI); \ /* Tous les synonymes ont apparemment ete recuperes (introduit le 20070221110204...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ begin_nouveau_block \ Bblock \ BLOC(sqA); \ /* Introduit le 20070305110736... */ \ \ g1PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu_unique_parmi_une_liste_de_titres_synonymes \ ,parametre \ ,va_defaut \ ,FCon \ ,FCast \ ,sq1 \ ,sqI \ ,fC \ ,sqC \ ,sqN \ ,styp \ ,abr \ ,ityp \ ); \ \ BLOC(sqP); \ /* Introduit le 20070305110736... */ \ Eblock \ end_nouveau_block \ \ CALZ_FreCC(titre_attendu_unique_parmi_une_liste_de_titres_synonymes); \ /* Nettoyage... */ \ \ EGAL(c_est_le_premier_____titre_attendu_____dans_liste_titres_synonyme,FAUX); \ /* Systematiquement, on n'est plus sur le premier (et eventuellement seul) synonyme... */ \ Eblock \ ETan \ \ CALZ_FreCC(liste_des_____titre_attendu_____synonymes); \ /* Introduit le 20070325172306... */ \ \ /* Le 20081113173427, j'ai tente d'introduire ici : */ \ /* */ \ /* Test(EST_VRAI(c_est_la_premiere_recherche_des_parametres)) */ \ /* Bblock */ \ /* INCR(nombre_d_arguments_possibles_regroupes_par_classe...,I); */ \ /* Eblock */ \ /* ATes */ \ /* Bblock */ \ /* Eblock */ \ /* ETes */ \ /* */ \ /* Mais, le 20081115105359 j'ai du y renoncer ('v $xig/fonct$vv$FON 20081113173432')... */ \ \ INCR_INDEX_DES_ARGUMENTS_POSSIBLES(numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes \ ,"debordement de la liste des arguments possibles (3)" \ ); \ /* Numero de l'argument possible suivant (introduit le 20070820101714)... */ \ Eblock \ &Eifdef NePasGenerer_PARAMETRE____`parametre&&& \ \ /* Procedure de recuperation d'un parametre quelconque avec mise en place prealable de sa */ \ /* valeur par defaut, puis comptage des occurences valides, et enfin, execution d'une */ \ /* sequence specifique d'actions (qui seront en general fonction du parametre...) avec */ \ /* la possibilite de forcer l'execution de 'sqC' au "dernier tour". La procedure */ \ /* intermediaire 'g1PROCESS_PARAMETRE(...)' a ete introduite le 20070221090349 dans le */ \ /* but futur (a cette date...) de simplifier la definition des synonymes. On notera au */ \ /* passage qu'en fait 'g1PROCESS_PARAMETRE(...)' est l'ancienne 'gPROCESS_PARAMETRE(...)'. */ \ /* La gestion des titres synonymes fut finalement introduite le 20070221110204... */ #define g1PROCESS_PARAMETRE(liste_des_arguments,titre_attendu,parametre,va_defaut,FCon,FCast,seq1,seqI,fC,seqC,seqN,styp,abr,ityp) \ /* ATTENTION, le parametre 'valeur_par_defaut' a change de nom le 20010330100201 (en */ \ /* devenant partout 'va_par_defaut') afin de raccourcir la longueur des '#define' qui */ \ /* l'utilisaient, et ce a cause de l'introduction du nouveau parametre 'styp' (qui avec */ \ /* un peu plus de place aurait du s'appeler 'size_type'...). De meme, le 20030704142017 */ \ /* 'va_par_defaut' a change de nom (devenant partout 'va_defaut') pour la meme raison */ \ /* (introduction de l'argument 'abr' ci-dessus...). */ \ /* */ \ /* La signification des quatre sequences est la suivante : */ \ /* */ \ /* 'seq1' : AVANT la toute premiere tentative de recuperation de 'parametre', */ \ /* 'seqI' : APRES chaque tentative de recuperation de 'parametre', qu'elle soit */ \ /* fructueuse ou pas, */ \ /* 'seqC' : APRES chaque recuperation fructueuse de 'parametre', */ \ /* 'seqN' : APRES la toute derniere tentative de recuperation de 'parametre'. */ \ /* */ \ /* sachant que 'seq1' et 'seqN' ont ete introduite ici (et partout ailleurs ou cela etait */ \ /* necessaire...) le 20060214094954... */ \ /* */ \ /* On notera qu'avant le 20070221090349 la procedure ''g1PROCESS_PARAMETRE(...)' s'appelait */ \ /* en fait 'gPROCESS_PARAMETRE(...)'. Ce changement de nom fut destine a simplifier la mise */ \ /* en place de la gestion simplifiee des synonymes... */ \ /* */ \ /* ATTENTION, 'au_moins_un_titre_synonyme_a_ete_reconnu_parmi_la_liste_des_titres_synonymes' */ \ /* fait que 'g1PROCESS_PARAMETRE(...)' doit etre utilise via 'gPROCESS_PARAMETRE(...)' */ \ /* uniquement (introduit le 20070323154106)... */ \ /* */ \ /* Le 20100320104703 fut introduit l'argument 'FCast' destine a caster la fonction de */ \ /* conversion 'FCon' dans un futur plus ou moins lointain... */ \ Bblock \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ DEFV(Logical,INIT(valeur_recherchee_dans_un_setenv,FAUX)); \ DEFV(Logical,INIT(valeur_recherchee_dans_la_liste_des_arguments,FAUX)); \ /* Afin de savoir si l'on a trouve la valeur cherchee soit dans un 'setenv', soit dans la */ \ /* liste des arguments 'liste_des_arguments'. */ \ \ DEFV(CHAR,INIT(POINTERc(argument_courant_apres_conversions_majuscules_minuscules_et_prefixage_eventuels_1) \ ,CHAINE_UNDEF \ ) \ ); \ /* Argument courant apres les eventuelles conversions majuscules-minuscules et inversement. */ \ DEFV(CHAR,INIT(POINTERc(titre_attendu_apres_conversions_eventuelles_majuscules_minuscules),CHAINE_UNDEF)); \ /* Titre attendu apres les eventuelles conversions majuscules-minuscules et inversement. */ \ \ EGAL(niveau_des_gPROCESS_PARAMETRE,__COMPTEUR__A__); \ /* Introduit le 20060208101231 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'). */ \ \ EGAL(pointeurV_parametre,aIDENTITE(parametre)); \ EGAL(pointeurC_parametre,pointeurV_parametre); \ /* Tout ceci afin de mettre l'identite du parametre dans une unite commune... */ \ /* */ \ /* Le 20040324112253 je remarque un defaut de cette methode qui grace a la liste */ \ /* 'IDENTITE_des_arguments_possibles' permet de detecter les synonymes. En effet, */ \ /* comme c'est le cas avec 'v $xcg/FloatHexa$vv$K nombre_flottant_en_Float' (pour les */ \ /* parametres {"x=","xd=","i2="}, lorsque des variables sont definies avec des types du */ \ /* type 'FloatInt', des composantes differentes de la structure peuvent correspondre a */ \ /* la meme adresse en memoire ; ainsi, pour 'FloatInt', les elements 'VersionFlottante' */ \ /* et 'VersionInt_1' ont necessairement la meme adresse memoire, d'ou la declaration de */ \ /* synonymie des parametres {"x=","xd=","i2="} (pour 'SYSTEME_APC_Linux' ; en ce qui */ \ /* concerne les autres SYSTEMEs, il s'agira de {"x=","xd=","i1="}). On notera qu'a cette */ \ /* date, seul 'v $xcg/FloatHexa$vv$K' semble concerne. Une solution pourrait etre de */ \ /* memoriser pour chaque 'parametre' l'adresse de 'FCon(...)' utilisee... */ \ /* Le 20040324131607, je note que cette solution n'est pas la bonne a cause des deux */ \ /* fonctions 'FconversionL(...)' et 'FconversionN(...)' qui sont destinees a declarer des */ \ /* "synonymes complementaires -logiquement-" et qui sont evidemment deux fonctions */ \ /* differentes et donc d'adresses differentes. La solution consistant a memoriser la */ \ /* taille du type (parametre 'styp' de 'gPROCESS_PARAMETRE(...)') n'est pas bonne non plus */ \ /* car plusieurs types ont la meme taille. En fait, il conviendrait peut-etre d'ajouter */ \ /* une information actuellement manquante... */ \ \ CALS(FgPROCESS_PARAMETRE_DEBUT(titre_attendu,styp,SIZE_GENERAL(parametre),ityp)); \ /* 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 */ \ /* eventuelle du type du parametre courant... */ \ \ gPROCESS_PARAMETRE_ENTREE_PAR_setenv(titre_attendu,parametre,va_defaut,FCon); \ /* Entree eventuelle des parametres via des 'setenv'... */ \ \ EGAp(titre_attendu_apres_conversions_eventuelles_majuscules_minuscules \ ,chain_Acopie_avec_conversions_possibles_majuscules_minuscules_pour_un_titre_attendu(titre_attendu) \ ); \ /* Titre attendu apres les eventuelles conversions majuscules-minuscules et inversement */ \ /* (introduit le 20010621143912). */ \ /* */ \ /* ATTENTION : cet 'EGAL(...)' est utilise dans 'v $xcc/cpp$Z TiTrE_AtTeNdU' afin de */ \ /* detecter les parametres multiplement definis. En effet, l'ensemble de ces 'EGAL(...)'s */ \ /* dans un '$K' donne l'ensemble des 'titre_attendu's qui y sont definis... */ \ /* */ \ /* Optimise avec 'v $xig/fonct$vv$FON 20221030171351' le 20221030171346, ce qui reduit les */ \ /* '$c's et les '$X's (ainsi '$xcg/ADD2.01$X' est passe de 1389944 a 1381992 sur '$LACT1B" */ \ /* et '$xrv/load_image$c de 3252384 a 3196709...). */ \ \ EGAL(argument_courant_apres_conversions_majuscules_minuscules_et_prefixage_eventuels_1 \ ,FgPROCESS_PARAMETRE_RECUPERATION_ET_TRANSFORMATION(liste_des_arguments,numero_d_argument_courant,abr) \ ); \ \ _____SEQ_EFFACABLE_01_gPROCESS_PARAMETRE_(Test(EST_VRAI(c_est_la_premiere_recherche_des_parametres)) \ Bblock \ BLOC(seq1); \ /* Execution inconditionnelle, avant la premiere tentative de recuperation du parametre */ \ /* (introduit le 20060214094954). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ )_SEQ_EFFACABLE_01_gPROCESS_PARAMETRE_____ \ \ /* ATTENTION : depuis l'introduction de 'format_EGAq____...' et jusqu'au 20180326211416, */ \ /* il y avait ici : */ \ /* */ \ /* begin_nouveau_block */ \ /* Bblock */ \ /* DEFV(CHAR,INIC(POINTERc(format_EGAq____g1PROCESS_PARAMETRE) */ \ /* (...) */ \ /* ); */ \ /* */ \ /* mais cela perturbait 'v $xcc/cpp$Z 20060203140334' puisqu'alors les lignes contenant */ \ /* une 'FconversionL/(...)' ne contenait pas au debut un "{". D'ou ce deplacement... */ \ \ begin_nouveau_block \ Bblock \ DEFV(CHAR,INIC(POINTERc(format_EGAq____g1PROCESS_PARAMETRE) \ ,chain_Aconcaten2 \ (COND(EST_FAUX(l_argument_possible_courant_est_un_synonyme_d_argument_anterieur) \ ,ccCHAR(NOM_DES_VALEURS_PREMIER_SYNONYME(parametre)) \ ,ccCHAR(C_VIDE) \ ) \ ,NOM_DES_VALEURS_SYNONYMES_SUIVANTS \ ) \ ) \ ); \ \ begin_nouveau_block \ Bblock \ /* A cause de 'v $xcc/cpp$Z 20060203140334', il est imperatif d'imbriquer deux */ \ /* 'begin_nouveau_block's afin que les lignes contenant une 'Fconversion?/(...)' */ \ /* contiennent au debut un "{"... */ \ EGAL(parametre \ ,FCast \ (FCon(argument_courant_apres_conversions_majuscules_minuscules_et_prefixage_eventuels_1 \ ,titre_attendu_apres_conversions_eventuelles_majuscules_minuscules \ ,va_defaut \ ,Fconversion_EditeValeur(c_est_le_premier_____titre_attendu_____dans_liste_titres_synonyme) \ /* Mis sous cette forme "compacte" le 20221029160723 afin de reduire la longueur des '$c's */ \ /* et des '$X's (ainsi '$xcg/ADD2.01$X' est passe de 1410176 a 1389944 sur '$LACT1B" et */ \ /* '$xrv/load_image$c de 3390549 a 3252384...). */ \ ,COND(EST_VRAI(Fconversion_NomEventuelValeur()) \ /* Mis sous cette forme "compacte" le 20221029160723 afin de reduire la longueur des '$c's */ \ /* et des '$X's (ainsi '$xcg/ADD2.01$X' est passe de 1410176 a 1389944 sur '$LACT1B" et */ \ /* '$xrv/load_image$c de 3390549 a 3252384...). */ \ ,format_EGAq____g1PROCESS_PARAMETRE \ ,ccCHAR(C_VIDE) \ ) \ /* Edition eventuelle du nom du parametre encadre par des quadruples '[...]'. Ceci est du */ \ /* au fait que '$xcp/cpp$X' introduit des espaces au bout de la chaine "parametre" ; ceci */ \ /* permet de les eliminer facilement ('v $xcc/cpp$Z BlancParametres', ce dernier etant */ \ /* aussi responsable de la mise en place de "vv ':parametre:'")... */ \ ,INDICATEUR_DE_TYPE_____A_R \ /* La chaine 'INDICATEUR_DE_TYPE_____A_R' a ete introduite le 20060310095832 suite a la */ \ /* modification 'v $xig/fonct$vv$FON 20060310093722' relative a l'introduction du nouvel */ \ /* argument 'A_R' des fonctions 'Fconversion?(...)'. */ \ /* */ \ /* On notera que cet indicateur est en fait gere par 'v $xcc/cpp$Z Indicateur_____A_R'... */ \ ) \ ) \ ); \ Eblock \ end_nouveau_block \ /* A cause de 'v $xcc/cpp$Z 20060203140334', il est imperatif d'imbriquer deux */ \ /* 'begin_nouveau_block's afin que les lignes contenant une 'Fconversion?/(...)' */ \ /* contiennent au debut un "{"... */ \ \ CALZ_FreCC(format_EGAq____g1PROCESS_PARAMETRE); \ /* ATTENTION : depuis l'introduction de 'format_EGAq____...' la liberation de */ \ /* 'format_EGAq____g1PROCESS_PARAMETRE' a du etre mise ici et ce a cause de */ \ /* 'v $xcc/cpp$Z 20060203140334' puisqu'alors les lignes contenant une 'FconversionL/(...)' */ \ /* ne contenait pas au debut un "{". D'ou cette localisation... */ \ Eblock \ end_nouveau_block \ /* On notera que l'on pourrait etendre cette notion en transmettant une partie des */ \ /* parametres d'une commande via des variables 'setenv'. Il suffirait donc d'ajouter */ \ /* ici un code du type : */ \ /* */ \ /* FCon(Gvar(titre_attendu),...) */ \ /* */ \ /* malheureusement l'impossiblite de definir des variables 'setenv' dont le nom se */ \ /* termine par un signe "=" ('v $FCshrc PROCESS_PARAMETRE') fait que cela n'est pas */ \ /* implemente (provisoirement ?) le 19980417162204. Mais, le 19980420092917, j'avais une */ \ /* solution satisfaisante, d'ou le code qui precede... */ \ \ /* ATTENTION : depuis l'introduction de 'format_EGAq____...' et jusqu'au 20180326211416, */ \ /* il y avait ici : */ \ /* */ \ /* Eblock */ \ /* end_nouveau_block */ \ /* */ \ /* mais cela perturbait 'v $xcc/cpp$Z 20060203140334' puisqu'alors les lignes contenant */ \ /* une 'Fconversion?(...)' ne contenait pas au debut un "{". D'ou ce deplacement... */ \ \ EGAL(valeur_recherchee_dans_la_liste_des_arguments,valeur_recherchee); \ /* Memorisation du compte-rendu... */ \ \ CALZ_FreCC(argument_courant_apres_conversions_majuscules_minuscules_et_prefixage_eventuels_1); \ /* Le 20051024130450, je note que ce 'FreCC(...)' serait le responsable du probleme decrit */ \ /* dans 'v $xig/fonct$vv$FON 20051019113924'. Mais a cette date, je ne comprends pas la */ \ /* cause du probleme. En tout cas, en le supprimant ou en le rendant conditionnel (afin */ \ /* de ne pas trop toucher au code), le probleme disparait (ou reapparait a volonte lors */ \ /* d'une implementation conditionnelle) ; a titre d'exemple, j'ai utilise : */ \ /* */ \ /* IFEQ(tabulation_des_valeurs_affectees_aux_titres */ \ /* ,TABULATION_DES_VALEURS_AFFECTEES_AUX_TITRES */ \ /* ) */ \ /* */ \ /* ce qui permettait d'activer ou de desactiver le 'FreCC(...)' via "TabulationParametres=". */ \ CALZ_FreCC(titre_attendu_apres_conversions_eventuelles_majuscules_minuscules); \ /* Nettoyages (introduits le 20030705121308). */ \ \ Test(IFOU(PRESENT(valeur_recherchee_dans_un_setenv) \ ,PRESENT(valeur_recherchee_dans_la_liste_des_arguments) \ ) \ ) \ /* Le test de 'valeur_recherchee_dans_un_setenv' a ete introduit le 20080918131207 car, */ \ /* en effet, il manquait... */ \ Bblock \ EGAL(au_moins_un_titre_synonyme_a_ete_reconnu_parmi_la_liste_des_titres_synonymes,VRAI); \ /* Introduit le 20070323154106... */ \ INCR(ITb1(UTILISATION_des_arguments_possibles \ ,INDX(numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ,I \ ); \ /* Comptage d'utilisation (ou "reference") de l'argument possible courant (introduit */ \ /* le 20070820113014). */ \ /* */ \ /* C'est 'numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes' */ \ /* qui indexe et non pas 'NUMERO_de_l_argument_possible_courant' car, en effet, ce dernier */ \ /* n'est incremente que si 'EST_VRAI(c_est_la_derniere_recherche_des_parametres' */ \ /* semble-t-il... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ BLOC(seqI); \ /* Execution inconditionnelle, apres recuperation du parametre, d'une sequence specifique */ \ /* de post-traitement. Cette execution a donc lieu meme si le parametre n'est pas recupere. */ \ \ _____SEQ_EFFACABLE_01_gPROCESS_PARAMETRE_(Test(I3OU(PRESENT(valeur_recherchee_dans_un_setenv) \ ,PRESENT(valeur_recherchee_dans_la_liste_des_arguments) \ ,I3ET(EST_VRAI(c_est_la_derniere_recherche_des_parametres) \ ,IFET(ABSENT(valeur_recherchee_dans_un_setenv) \ ,ABSENT(valeur_recherchee_dans_la_liste_des_arguments) \ ) \ ,EST_VRAI(fC) \ ) \ ) \ ) \ /* La derniere condition liee a 'fC' a ete introduite le 20000207110651. Elle est expliquee */ \ /* dans 'v $xrv/ARITHMET.11$I 20000207110651'. */ \ Bblock \ BLOC(seqC); \ /* Execution conditionnelle, apres recuperation du parametre, d'une sequence specifique */ \ /* de post-traitement. Cette execution n'a donc lieu que si le parametre a ete recupere. */ \ /* ATTENTION, dans le cas ou la valeur a ete trouvee dans un 'setenv', le fonctionnement */ \ /* de 'BLOC(seqC)' peut etre incorrect si par malheur cette sequence utilise des */ \ /* parametres non encore introduits ; c'est par exemple le cas des lectures de fichiers */ \ /* telle celle de 'v $xrv/permute.11$K PROCESS_ARGUMENT_C' ou le nombre d'elements des */ \ /* fichiers ne peut etre defini en tant qu'argument preliminaire car, en effet, l'argument */ \ /* 'setenv=VRAI' doit etre le premier ('NUMERO_PREMIER_ARGUMENT') ; la seule solution dans */ \ /* ce cas est que ce nombre (appele ici "ne=") soit lui-aussi une variable d'environnement */ \ /* (definie par 'setenv'). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ )_SEQ_EFFACABLE_01_gPROCESS_PARAMETRE_____ \ /* Le dispositif 'SEQ_EFFACABLE_01_gPROCESS_PARAMETRE' a ete introduit le */ \ /* 20000704165110 ; il a permis un gain appreciable dans la taille des fichiers '$c' */ \ /* (ainsi, par exemple, '$xrv/variation.01$c' est passe de 458626 a 428991 octets...). */ \ /* En effet, la plupart du temps, la sequence 'seqC' est vide ; il est alors */ \ /* evident que le 'Test(...)' devient inutile. La forme a changee le 20000719120627 par */ \ /* suppression d'un caractere ":" qui precedait puis suivait la chaine correspondante. */ \ /* En effet, cela perturbait le fonctionnement de 'v $xcc/cpp$Z Mode_cpp_sub'... */ \ \ _____SEQ_EFFACABLE_01_gPROCESS_PARAMETRE_(Test(EST_VRAI(c_est_la_derniere_recherche_des_parametres)) \ Bblock \ BLOC(seqN); \ /* Execution inconditionnelle, apres la derniere tentative de recuperation du parametre */ \ /* (introduit le 20060214094954). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ )_SEQ_EFFACABLE_01_gPROCESS_PARAMETRE_____ \ \ &ifdef __ParaVal&&& \ /* On notera que le 20000719161303, toutes les structures : */ \ /* */ \ /* &DIRECTIVE SYMBOLE& */ \ /* */ \ /* ont ete remplacees par : */ \ /* */ \ /* &DIRECTIVE SYMBOLE&&& */ \ /* */ \ /* a cause de 'v $xcc/cpp$D/PASSE_4.Par1$sub PASSE_4' car, en effet, pour ce fichier, */ \ /* etant donne que '$xcp/substitue.01$X' fait des recherches a cheval sur plusieurs lignes, */ \ /* il traitait par exemple des structures du type : */ \ /* */ \ /* &define SYMBOLE */ \ /* (...) */ \ /* &define SYMBOLE */ \ /* */ \ /* en manipulant tout ce qui se trouvait entre les deux caracteres "&". Enfin, on ne peut */ \ /* utiliser '&&' (et donc il faut prendre '&&&') a cause de l'operateur '&&' du langage C... */ \ Test(IFET(IL_FAUT(editer_la_valeur_des_parametres_d_une_commande) \ ,EST_VRAI(c_est_la_derniere_recherche_des_parametres) \ ) \ ) \ Bblock \ \ & ifdef __ParaTyp&&& \ \ & ifdef __ParaFor&&& \ \ & ifdef __ParaInd&&& \ \ & ifdef __ParaLon&&& \ /* On notera que '__ParaLon' peut etre nul par defaut ('v $xrv/ARITHMET.11$I __ParaLon') */ \ /* et faire donc que le 'DoIn(...)' qui va suivre ne soit pas execute et ne provoque donc */ \ /* d'edition de valeurs, d'ou la sortie d'un "{}" vide. */ \ \ vgPROCESS_PARAMETRE_EDITION_VECTEUR_N(__ParaTyp,__ParaLon,__ParaFor,__ParaVal); \ /* Edition des vecteurs de longueur variable et connue. */ \ /* */ \ /* ATTENTION : l'argument '__ParaVal' 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. Dans ce cas un message d'erreur sera edite et il est alors suggerer de revenir */ \ /* a 'gPROCESS_PARAMETRE_EDITION_VECTEUR_N_VERSION_01', solution qui n'est pas typee... */ \ \ & undef __ParaLon&&& \ \ & Aifdef __ParaLon&&& \ vgPROCESS_PARAMETRE_EDITION_VECTEUR(__ParaTyp,__ParaInd,__ParaFor,__ParaVal); \ /* Edition des vecteurs de longueur inconnue. */ \ /* */ \ /* ATTENTION : l'argument '__ParaVal' 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. Dans ce cas un message d'erreur sera edite et il est alors suggerer de revenir */ \ /* a 'gPROCESS_PARAMETRE_EDITION_VECTEUR_VERSION_01', solution qui n'est pas typee... */ \ & Eifdef __ParaLon&&& \ \ & undef __ParaInd&&& \ \ & Aifdef __ParaInd&&& \ PRINT_ERREUR("une utilisation anormale des variables '__Para...' est faite (1 : 'Ind')"); \ & Eifdef __ParaInd&&& \ \ & undef __ParaFor&&& \ \ & Aifdef __ParaFor&&& \ PRINT_ERREUR("une utilisation anormale des variables '__Para...' est faite (2 : 'For')"); \ & Eifdef __ParaFor&&& \ \ & undef __ParaTyp&&& \ \ & Aifdef __ParaTyp&&& \ PRINT_ERREUR("une utilisation anormale des variables '__Para...' est faite (3 : 'Typ')"); \ & Eifdef __ParaTyp&&& \ \ /* Edition d'une valeur complementaire definie par {__ParaFor,__ParaVal,__ParaInd}, triplet */ \ /* (puis quadruplet...) defini ailleurs (apres l'appel a 'Fload_fichier_formatte_Float(...)' */ \ /* en general). Il s'agit en general d'un vecteur qui est le contenu en memoire d'un fichier */ \ /* dont le nom est en cours de traitement tres certainement. Ce dispositif a ete ajoute le */ \ /* 20000125095156, car il est fort utile ; il a ete complete le 20000201164705 par */ \ /* '__ParaTyp' (d'ou l'appellation "quadruplet"). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ & undef __ParaVal&&& \ \ &Aifdef __ParaVal&&& \ &Eifdef __ParaVal&&& \ \ CALS(FgPROCESS_PARAMETRE_COMPTAGE(valeur_recherchee_dans_la_liste_des_arguments)); \ /* Comptage des parametres... */ \ \ INCR_INDEX_DES_ARGUMENTS_POSSIBLES(numero_de_l_argument_possible_courant__en_ne_tenant_pas_compte_des_synonymes \ ,"debordement de la liste des arguments possibles (4)" \ ); \ /* Numero de l'argument possible suivant (introduit le 20070820101714)... */ \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ Eblock \ /* Procedure de recuperation d'un parametre quelconque avec mise en place prealable de sa */ \ /* valeur par defaut, puis comptage des occurences valides, et enfin, execution d'une */ \ /* sequence specifique d'actions (qui seront en general fonction du parametre...) avec */ \ /* la possibilite de forcer l'execution de 'seqC' au "dernier tour" (introduit le */ \ /* 20000207110651). */ \ /* */ \ /* A la fin de 202210, des modifications importantes ont ete mises en oeuvre concernant */ \ /* cette procedure 'g1PROCESS_PARAMETRE(...)' et destinees a reduire la taille des '$c's */ \ /* et des '$X's generes : */ \ /* */ \ /* v '$xil/defi_c1$vv$DEF 20221028181016' */ \ /* */ \ /* v '$xig/fonct$vv$DEF 20221029160723' */ \ /* v '$xig/fonct$vv$DEF 20221030171346' */ \ /* */ \ /* v '$xig/fonct$vv$FON 20221028135041' */ \ /* v '$xig/fonct$vv$FON 20221028173819' */ \ /* v '$xig/fonct$vv$FON 20221028182436' */ \ /* v '$xig/fonct$vv$FON 20221029160630' */ \ /* v '$xig/fonct$vv$FON 20221030171351' */ \ /* v '$xig/fonct$vv$FON 20221101101020' */ \ /* v '$xig/fonct$vv$FON 20221101102938' */ \ /* */ \ /* Ainsi, le 20221031101214 je note sur '$LACT1B' que la taille de '$xrv/particule.10$X' */ \ /* est passee de 2862760 a 2727784 octets, soit un gain de 134976 octets (soit ~5%)... */ \ /* En ce qui concerne la taille de '$xcg/MOYE.01$X' (plus petite que ''$xrv/particule.10$X') */ \ /* est passee de 1458600 a 1381992 octets, soit un gain de 76608 octets (soit ~5%)... ) */ \ /* */ \ /* Le 20221101103441, la taille de '$xrv/particule.10$X' est passee a 2645912 octets, */ \ /* soit au total un gain de 216848 octets (soit ~8%) et celle de '$xcg/MOYE.01$X' est */ \ /* passee a 1365856 octets, soit au total un gain de 92744 octets (soit ~6%)... */ \ /* */ \ /* On consultera avec profit 'v $xig/$Fnota .xcc.RecompileAll.Z.20221101111630' pour */ \ /* voir l'ensemble des gains sur '$CMAP28' (ex "republique")... */ #define PROCESS_PARAMETRE(liste_des_arguments,titre_attendu,parametre,va_defaut,FCon,FCast,seq1,seqI,seqC,seqN,styp,ityp,seqA,seqP) \ /* Les sequences "Anterieure" et "Posterieure" ont ete introduites le 20070305110736 pour */ \ /* permettre le traitement correct de 'GET_PARAMETRE_N(...)' apres l'introduction de la */ \ /* gestion des synonymes... */ \ /* */ \ /* La signification des six sequences est la suivante : */ \ /* */ \ /* 'seq1' : AVANT la toute premiere tentative de recuperation de 'parametre', */ \ /* 'seqA' : AVANT chaque tentative de recuperation de 'parametre', qu'elle soit */ \ /* fructueuse ou pas, */ \ /* 'seqP' : APRES chaque tentative de recuperation de 'parametre', qu'elle soit */ \ /* fructueuse ou pas, */ \ /* 'seqI' : APRES chaque tentative de recuperation de 'parametre', qu'elle soit */ \ /* fructueuse ou pas, */ \ /* 'seqC' : APRES chaque recuperation fructueuse de 'parametre', */ \ /* 'seqN' : APRES la toute derniere tentative de recuperation de 'parametre'. */ \ /* */ \ /* On notera donc, semble-t-il, la redondance entre 'seqP' et 'seqI'... */ \ Bblock \ gPROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre \ ,va_defaut \ ,FCon \ ,FCast \ ,seq1 \ ,seqI \ ,NE_PAS_FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE \ ,seqC \ ,seqN \ ,styp \ ,NE_PAS_PERMETTRE_LES_ABREVIATIONS_DANS_gPROCESS_PARAMETRE \ ,ityp \ ,seqA \ ,seqP \ ); \ Eblock \ /* Procedure de recuperation d'un parametre quelconque avec mise en place prealable de sa */ \ /* valeur par defaut, puis comptage des occurences valides, et enfin, execution d'une */ \ /* sequence specifique d'actions (qui seront en general fonction du parametre...). */ \ /* */ \ /* Le 20030704142017, les abreviations ont ete interdites dans la definition de */ \ /* de 'PROCESS_PARAMETRE(...)' et autorisees pour 'PROCESF_ARGUMENT_C(...)' uniquement... */ #define GET_PARAMETRE(liste_des_arguments,titre_attendu,parametre,va_defaut,FCon,FCast,styp,ityp) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre \ ,va_defaut \ ,FCon \ ,FCast \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,styp \ ,ityp \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Procedure de recuperation d'un parametre quelconque avec mise en place prealable de sa */ \ /* valeur par defaut, puis comptage des occurences valides. */ #define NE_PAS_VALIDER_UN_styp \ ZERO \ /* Afin de ne pas faire certaines validations de 'styp_?' ; on choisit une valeur negative */ \ /* qui est donc impossible pour une taille quelconque... */ \ /* */ \ /* Le 20111112092959, la valeur negative anterieure 'NEGA(UNITE)' a ete remplace par une */ \ /* valeur tout aussi impossible ('ZERO'). Cela fut rendu necessaire brutalement sur */ \ /* '$LACT19' a cette date, en etant lie visiblement a un probleme de conversion entre 'Int' */ \ /* et 'vrai_Int_de_base'. Le parametre 'NE_PAS_VALIDER_UN_styp' avait alors la valeur */ \ /* 4294967295 qui n'etait donc pas negative. Cela doit etre du a un "upgrade" du systeme */ \ /* entre la derniere recompilation ('v $Dhistory/LACT19$D/20111102142038 20111031153918') */ \ /* et le 20111112092959 ('v $Dhistory/LACT19$D/20111102165540.root apt-get.upgrade' tres */ \ /* certainement...). */ #define styp_K \ size_CHAR #define styp_C \ NE_PAS_VALIDER_UN_styp #define styp_L \ size_Logical #define styp_N \ styp_L #define styp_I \ size_Int #define styp_F \ size_Float #define styp_P \ size_p /* Definitions destinees a limiter la longueur des appels a 'PROCESS_PARAMETRE(...)' et a */ /* 'GET_PARAMETRE(...)'. */ #define ityp_K \ SUCC(ZERO) #define ityp_C \ SUCC(ityp_K) #define ityp_L \ SUCC(ityp_C) #define ityp_N \ NEUT(ityp_L) #define ityp_I \ SUCC(ityp_N) #define ityp_F \ SUCC(ityp_I) #define ityp_P \ SUCC(ityp_F) /* Definitions destinees a connaitre de facon sure le type d'un parametre (cela fut */ /* introduit le 20061123174709 pour 'v $xig/fonct$vv$FON ITYP_des_arguments_possibles'). */ /* */ /* ATTENTION : on notera que 'ityp_L' et 'ityp_N' sont evidemment identiques... */ #define GET_PARAMETRE_K(liste_des_arguments,titre_attendu,parametre_K,valeur_K_par_defaut) \ Bblock \ GET_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_K \ ,valeur_K_par_defaut \ ,FconversionK \ ,NEUT \ ,styp_K \ ,ityp_K \ ); \ Eblock \ /* Recuperation d'un parametre "CHAR" ("caractere unique"). */ #define GET_PARAMETRE_C(liste_des_arguments,titre_attendu,parametre_C,valeur_C_par_defaut) \ Bblock \ GET_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_C \ ,valeur_C_par_defaut \ ,FconversionC \ ,NEUT \ ,styp_C \ ,ityp_C \ ); \ Eblock \ /* Recuperation d'un parametre "CHAR" ("chaine de caracteres"). */ #define GET_PARAMETRE_L(liste_des_arguments,titre_attendu,parametre_L,valeur_L_par_defaut) \ Bblock \ GET_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_L \ ,valeur_L_par_defaut \ ,FconversionL \ ,NEUT \ ,styp_L \ ,ityp_L \ ); \ Eblock \ /* Recuperation d'un parametre "Logical". */ #define GET_PARAMETRE_N(liste_des_arguments,titre_attendu,parametre_N,valeur_N_par_defaut) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_N \ ,valeur_N_par_defaut_inversee \ ,FconversionN \ ,NEUT \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,styp_N \ ,ityp_N \ ,BLOC(DEFV(Logical,INIT(valeur_N_par_defaut_inversee,NOTL(valeur_N_par_defaut))); \ EGAL(parametre_N,valeur_N_par_defaut_inversee); \ ) \ ,BLOC(EGAL(parametre_N,NOTL(parametre_N)); \ ) \ ); \ /* 'PROCESS_PARAMETRE(...)' a remplace 'GET_PARAMETRE(...)' le 20070305110736 afin de */ \ /* permettre la gestion correcte de 'valeur_N_par_defaut_inversee', un probleme lie a */ \ /* la gestion des synonymes etant apparu a cette occasion. En effet, la "manoeuvre" */ \ /* effectuee sur 'valeur_N_par_defaut' (c'est-a-dire le 'NOTL(...)') doit etre effectuee */ \ /* individuellement pour chaque parametre synonyme et non pas globalement. Cela s'est */ \ /* vu a cette date avec 'v $xcg/ShufBytes.01$K GET_ARGUMENT_N..inverse=.' qui faisait */ \ /* que l'indicateur 'c_est_l_operation_directe' etait 'VRAI' alors que la valeur 'FAUX' */ \ /* etait demandee dans 'v $Falias_fdecrypte decrypter=VRAI' (et donc inversee via */ \ /* 'GET_ARGUMENT_N(...)') sur '$CMAP28'... */ \ \ /* Le 20081113173427, j'ai tente d'introduire ici : */ \ /* */ \ /* Test(EST_VRAI(c_est_la_premiere_recherche_des_parametres)) */ \ /* Bblock */ \ /* DECR(nombre_d_arguments_possibles_regroupes_par_classe...,I); */ \ /* Eblock */ \ /* ATes */ \ /* Bblock */ \ /* Eblock */ \ /* ETes */ \ /* */ \ /* Mais, le 20081115105359 j'ai du y renoncer ('v $xig/fonct$vv$FON 20081113173432')... */ \ Eblock \ /* Recuperation d'un parametre "Logical" inverse (ou "Negate") introduit le 20020710092802. */ \ /* */ \ /* Avant le 20030213155839, la programmation etait: */ \ /* */ \ /* Bblock */ \ /* DEFV(Logical,INIT(parametre_N,NOTL(valeur_L_par_defaut))); */ \ /* GET_PARAMETRE_L(liste_des_arguments */ \ /* ,titre_attendu */ \ /* ,parametre_N */ \ /* ,NOTL(valeur_L_par_defaut) */ \ /* ); */ \ /* EGAL(parametre_L,NOTL(parametre_N)); */ \ /* Eblock */ \ /* */ \ /* Cette solution avait un gros inconvenient : le 'parametre_N' etait local et donc */ \ /* considere comme unique lors de la detection des synonymes. D'ou cette nouvelle solution */ \ /* qui a demande l'introduction de 'valeur_N_par_defaut_inversee' du aux cas ou les deux */ \ /* parametres 'parametre_N' et 'valeur_N_par_defaut' (comme c'est le cas dans la definition */ \ /* de 'GET_ARGUMENT_N(...)'). */ #define GET_PARAMETRE_I(liste_des_arguments,titre_attendu,parametre_I,valeur_I_par_defaut) \ Bblock \ GET_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_I \ ,valeur_I_par_defaut \ ,FconversionI \ ,NEUT \ ,styp_I \ ,ityp_I \ ); \ Eblock \ /* Recuperation d'un parametre "Int". */ #define GET_PARAMETRE_X(liste_des_arguments,titre_attendu,parametre_X,valeur_X_par_defaut) \ Bblock \ GET_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_X \ ,valeur_X_par_defaut \ ,FconversionX \ ,NEUT \ ,styp_I \ ,ityp_I \ ); \ Eblock \ /* Recuperation d'un parametre "Int" a editer en hexa-decimal (cela fut introduit le */ \ /* 20070420190059). */ #define GET_PARAMETRE_F(liste_des_arguments,titre_attendu,parametre_F,valeur_F_par_defaut) \ Bblock \ GET_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_F \ ,valeur_F_par_defaut \ ,FconversionF \ ,NEUT \ ,styp_F \ ,ityp_F \ ); \ Eblock \ /* Recuperation d'un parametre "Float". */ #define GET_PARAMETRE_P(liste_des_arguments,titre_attendu,parametre_P,valeur_P_par_defaut) \ Bblock \ GET_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_P \ ,valeur_P_par_defaut \ ,FconversionP \ ,NEUT \ ,styp_P \ ,ityp_P \ ); \ Eblock \ /* Recuperation d'un parametre "genere_p". */ #define PROKESS_PARAMETRE_K(liste_des_arguments,titre_attendu,parametre_K,valeur_K_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_K \ ,valeur_K_par_defaut \ ,FconversionK \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_K \ ,ityp_K \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "CHAR" ("caractere unique") avec execution d'un */ \ /* post-traitement. */ #define PROKESS_PARAMETRE_C(liste_des_arguments,titre_attendu,parametre_C,valeur_C_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_C \ ,valeur_C_par_defaut \ ,FconversionC \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_C \ ,ityp_C \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "CHAR" ("chaine de caracteres") avec execution d'un */ \ /* post-traitement. */ #define PROKESS_PARAMETRE_L(liste_des_arguments,titre_attendu,parametre_L,valeur_L_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_L \ ,valeur_L_par_defaut \ ,FconversionL \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_L \ ,ityp_L \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Logical" avec execution d'un post-traitement. */ #define PROKESS_PARAMETRE_N(liste_des_arguments,titre_attendu,parametre_N,valeur_N_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_N \ ,valeur_N_par_defaut_inversee \ ,FconversionN \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_N \ ,ityp_N \ ,BLOC(DEFV(Logical,INIT(valeur_N_par_defaut_inversee,NOTL(valeur_N_par_defaut))); \ EGAL(parametre_N,valeur_N_par_defaut_inversee); \ ) \ ,BLOC(EGAL(parametre_N,NOTL(parametre_N)); \ ) \ ); \ Eblock \ /* Recuperation d'un parametre "Logical" inverse (ou "Negate") avec execution d'un */ \ /* post-traitement introduit le 20020710092802. */ \ /* */ \ /* Avant le 20051216140825, la programmation etait: */ \ /* */ \ /* Bblock */ \ /* DEFV(Logical,INIT(parametre_N,NOTL(valeur_L_par_defaut))); */ \ /* PROCESS_PARAMETRE_L(liste_des_arguments */ \ /* ,titre_attendu */ \ /* ,parametre_N */ \ /* ,NOTL(valeur_L_par_defaut) */ \ /* ,seq1 */ \ /* ,seqI */ \ /* ,seqC */ \ /* ,seqN */ \ /* ); */ \ /* EGAL(parametre_L,NOTL(parametre_N)); */ \ /* Eblock */ \ /* */ \ /* Cette solution avait un gros inconvenient : le 'parametre_N' etait local et donc */ \ /* considere comme unique lors de la detection des synonymes. D'ou cette nouvelle solution */ \ /* qui a demande l'introduction de 'valeur_N_par_defaut_inversee' du aux cas ou les deux */ \ /* parametres 'parametre_N' et 'valeur_N_par_defaut' (comme c'est le cas dans la definition */ \ /* de 'GET_PARAMETRE_N(...)'). */ #define PROKESS_PARAMETRE_I(liste_des_arguments,titre_attendu,parametre_I,valeur_I_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_I \ ,valeur_I_par_defaut \ ,FconversionI \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_I \ ,ityp_I \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Int" avec execution d'un post-traitement. */ #define PROKESS_PARAMETRE_J(liste_des_arguments,titre_attendu,parametre_J,valeur_J_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_J \ ,valeur_J_par_defaut \ ,FconversionJ \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_I \ ,ityp_I \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Int" avec execution d'un post-traitement (introduit le */ \ /* 20111213132424). */ #define PROKESS_PARAMETRE_X(liste_des_arguments,titre_attendu,parametre_X,valeur_X_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_X \ ,valeur_X_par_defaut \ ,FconversionX \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_I \ ,ityp_I \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Int" avec execution d'un post-traitement avec edition */ \ /* hexa-decimale (introduit le 20070421093557). */ #define PROKESS_PARAMETRE_Y(liste_des_arguments,titre_attendu,parametre_Y,valeur_Y_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_Y \ ,valeur_Y_par_defaut \ ,FconversionY \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_I \ ,ityp_I \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Int" avec execution d'un post-traitement avec edition */ \ /* hexa-decimale (introduit le 20111213132424). */ #define PROKESS_PARAMETRE_F(liste_des_arguments,titre_attendu,parametre_F,valeur_F_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_F \ ,valeur_F_par_defaut \ ,FconversionF \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_F \ ,ityp_F \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Float" avec execution d'un post-traitement. */ #define PROKESS_PARAMETRE_P(liste_des_arguments,titre_attendu,parametre_P,valeur_P_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROCESS_PARAMETRE(liste_des_arguments \ ,titre_attendu \ ,parametre_P \ ,valeur_P_par_defaut \ ,FconversionP \ ,NEUT \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ,styp_P \ ,ityp_P \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "genere_p" avec execution d'un post-traitement. */ #define PROCESS_PARAMETRE_K(liste_des_arguments,titre_attendu,parametre_K,valeur_K_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_K(liste_des_arguments \ ,titre_attendu \ ,parametre_K \ ,valeur_K_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "CHAR" ("caractere unique") avec execution d'un */ \ /* post-traitement. */ #define PROCESS_PARAMETRE_C(liste_des_arguments,titre_attendu,parametre_C,valeur_C_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_C(liste_des_arguments \ ,titre_attendu \ ,parametre_C \ ,valeur_C_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "CHAR" ("chaine de caracteres") avec execution d'un */ \ /* post-traitement. */ #define PROCESS_PARAMETRE_L(liste_des_arguments,titre_attendu,parametre_L,valeur_L_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_L(liste_des_arguments \ ,titre_attendu \ ,parametre_L \ ,valeur_L_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Logical" avec execution d'un post-traitement. */ #define PROCESS_PARAMETRE_N(liste_des_arguments,titre_attendu,parametre_N,valeur_N_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_N(liste_des_arguments \ ,titre_attendu \ ,parametre_N \ ,valeur_N_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Logical" inverse (ou "Negate") avec execution d'un */ \ /* post-traitement introduit le 20020710092802. */ #define PROCESS_PARAMETRE_I(liste_des_arguments,titre_attendu,parametre_I,valeur_I_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_I(liste_des_arguments \ ,titre_attendu \ ,parametre_I \ ,valeur_I_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Int" avec execution d'un post-traitement. */ #define PROCESS_PARAMETRE_J(liste_des_arguments,titre_attendu,parametre_J,valeur_J_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_J(liste_des_arguments \ ,titre_attendu \ ,parametre_J \ ,valeur_J_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Int" avec execution d'un post-traitement (introduit le */ \ /* 20111213132424). */ #define PROCESS_PARAMETRE_X(liste_des_arguments,titre_attendu,parametre_X,valeur_X_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_X(liste_des_arguments \ ,titre_attendu \ ,parametre_X \ ,valeur_X_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Int" avec execution d'un post-traitement avec edition */ \ /* hexa-decimale (introduit le 20070421093557). */ #define PROCESS_PARAMETRE_Y(liste_des_arguments,titre_attendu,parametre_Y,valeur_Y_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_Y(liste_des_arguments \ ,titre_attendu \ ,parametre_Y \ ,valeur_Y_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Int" avec execution d'un post-traitement avec edition */ \ /* hexa-decimale (introduit le 20111213132424). */ #define PROCESS_PARAMETRE_F(liste_des_arguments,titre_attendu,parametre_F,valeur_F_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_F(liste_des_arguments \ ,titre_attendu \ ,parametre_F \ ,valeur_F_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "Float" avec execution d'un post-traitement. */ #define PROCESS_PARAMETRE_P(liste_des_arguments,titre_attendu,parametre_P,valeur_P_par_defaut,seqI,seqC) \ Bblock \ PROKESS_PARAMETRE_P(liste_des_arguments \ ,titre_attendu \ ,parametre_P \ ,valeur_P_par_defaut \ ,BLOC(VIDE;) \ ,seqI \ ,seqC \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un parametre "genere_p" avec execution d'un post-traitement. */ #define gINITIALISATION_DE_LA_LISTE_DES_UTILISATIONS_DES_ARGUMENTS_POSSIBLES \ Bblock \ DEFV(Int,INIT(index_d_initialisation_de_UTILISATION_des_arguments_possibles,UNDEF)); \ \ DoIn(index_d_initialisation_de_UTILISATION_des_arguments_possibles \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ,LSTX(PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ,NOMBRE_MAXIMAL_DE_NUMEROS_UNIQUES_DES_ARGUMENTS_POSSIBLES \ ) \ ,I \ ) \ Bblock \ CLIR(ITb1(UTILISATION_des_arguments_possibles \ ,INDX(index_d_initialisation_de_UTILISATION_des_arguments_possibles \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ); \ Eblock \ EDoI \ Eblock \ /* Procedure permettant d'initialiser 'UTILISATION_des_arguments_possibles'. Elle fut */ \ /* introduite le 20070821091849 pour le probleme 'v $xcc/cpp$Z 20070820203242'... */ #define gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_effectif_d_arguments_gPARCOURS,liste_de_traitement) \ Bblock \ CALS(FgINITIALISATION_DE_LA_LISTE_DES_UTILISATIONS_DES_ARGUMENTS_POSSIBLES()); \ /* Initialisation du dispositif de detection de l'utilisation (ou "reference") des */ \ /* arguments possibles (introduit le 20070820113014). On notera que cela a donc lieu */ \ /* a chaque fois que l'on rentre dans 'gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(...)' or, par */ \ /* exemple 'GET_ARGUMENTSi(...)', via 'GET_PARAMETRES(...)' execute deux fois de suite */ \ /* 'PARCOURS_DE_LA_LISTE_DES_ARGUMENTS(...)' pour 'liste_de_recuperation_1', puis pour */ \ /* 'liste_de_recuperation_2'. Les cumuls dans 'UTILISATION_des_arguments_possibles' sont */ \ /* donc "locaux" a une occurence de 'gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(...)' et non pas */ \ /* globaux au '$K' courant. Cela a ete note le 20070820164448... */ \ \ EGAL(numero_d_argument_courant,NUMERO_ARGUMENT_COMMANDE); \ /* (re-)initialisation du numero de l'argument courant. */ \ \ Komp(compteur_des_arguments,nombre_effectif_d_arguments_gPARCOURS) \ Bblock \ EGAL(numero_de_l_argument_possible_courant__en_ne_tenant_pas_compte_des_synonymes \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ); \ EGAL(numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ); \ /* Numero de l'argument possible courant (introduit le 20070820101714) sans tenir compte */ \ /* des synonymes, puis en en tenant compte (le premier doit donc etre superieur ou egal au */ \ /* second...). */ \ /* */ \ /* ATTENTION : on notera le 20070820161759 qu'a chaque fois que l'on rentre ici, ces deux */ \ /* numeros sont reinitialises. On verra aussi ce qui est dit ci-dessus et qui concerne */ \ /* la (re-)initialisation de 'UTILISATION_des_arguments_possibles'... */ \ \ BLOC(liste_de_traitement); \ /* Traitement specifique de chaque argument... */ \ \ Test(IFLT(numero_de_l_argument_possible_courant__en_ne_tenant_pas_compte_des_synonymes \ ,numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes \ ) \ ) \ Bblock \ PRINT_ERREUR("le decompte des arguments possibles est incorrect"); \ CAL1(Prer3("(il y a %d arguments possibles differents et %d (>%d) si les synonymes sont regroupes)\n" \ ,numero_de_l_argument_possible_courant__en_ne_tenant_pas_compte_des_synonymes \ ,numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes \ ,numero_de_l_argument_possible_courant__en_ne_tenant_pas_compte_des_synonymes \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INCR(numero_d_argument_courant,I); \ /* Passage a l'argument suivant (s'il existe)... */ \ Eblock \ EKom \ Eblock \ /* Boucle de parcours de l'ensemble des arguments effectifs (c'est-a-dire en excluant le */ \ /* nom de la commande elle-meme...) et execution d'un traitement pour chaque argument... */ \ /* */ \ /* Il s'agit ici de la boucle "fondamentale". Chaque argument d'appel d'un '$X' (cette */ \ /* liste pouvant etre vide) est compare successivement a tous les arguments possibles, */ \ /* dont la liste correspond a 'liste_de_traitement'. Il y a donc en quelque sorte deux */ \ /* boucles imbriquees : */ \ /* */ \ /* Bouc(ListeArgumentsAppel) */ \ /* Bblock */ \ /* Bouc(ListeTousArgumentsPossibles) */ \ /* Bblock */ \ /* (...) */ \ /* Eblock */ \ /* EBou */ \ /* Eblock */ \ /* EBou */ \ /* */ \ /* On notera que ci-apres 'c_est_la_derniere_recherche_des_parametres' concerne donc la */ \ /* recuperation du dernier argument d'appel : */ \ /* */ \ /* Commande$X Argument1 Argument2 (...) ArgumentN */ \ /* --------- */ \ /* */ \ /* avec : */ \ /* */ \ /* ListeArgumentsAppel={Argument1,Argument2,...,ArgumentN} */ \ /* */ \ /* cette liste pouvant etre vide... */ #define PARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_effectif_d_arguments_PARCOURS,liste_de_recuperation) \ Bblock \ gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_effectif_d_arguments_PARCOURS \ ,BLOC(EGAL(c_est_la_premiere_recherche_des_parametres \ ,EST_VRAI(IFEQ(compteur_des_arguments \ ,PREMIERE_ITERATION_D_UN_Komp \ ) \ ) \ ); \ /* Ceci fut introduit "preventivement" le 20060213120055... */ \ EGAL(c_est_la_derniere_recherche_des_parametres \ ,EST_VRAI(IFEQ(compteur_des_arguments \ ,nombre_effectif_d_arguments_PARCOURS \ ) \ ) \ ); \ /* Et ce afin d'editer eventuellement la valeur reellement utilisee pour les parametres */ \ /* d'une commande... */ \ \ BLOC(liste_de_recuperation); \ /* Recuperation de la liste de parametres... */ \ /* */ \ /* ATTENTION, il est tres important de mettre 'liste_de_recuperation' apres l'entree de */ \ /* '$formatI' car, en effet, certaines valeurs initiales de parametres peuvent en dependre */ \ /* via 'GIT_ARGUMENT_?(...)'... */ \ ) \ ); \ Eblock \ /* Boucle de parcours de l'ensemble des arguments effectifs (c'est-a-dire en excluant le */ \ /* nom de la commande elle-meme...) et recuperation de chacun d'eux... */ @ifdef PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES @ define EXECUTER_LE_listverSO \ FAUX @ define MESSAGE_PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES \ "Les LIBRAIRIES DYNAMIQUES '$SO' de '$xb' ne peuvent pas etre utilisees avec ce programme." /* Jusqu'au 20030217155308, le message etait : */ /* */ /* Les librairies dynamiques '$SO' de '$xb' ne sont pas utilisables. */ /* */ @Aifdef PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES @ define EXECUTER_LE_listverSO \ VRAI @ define MESSAGE_PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES \ "Les LIBRAIRIES DYNAMIQUES '$SO' de '$xb' peuvent etre utilisees avec ce programme, si le contexte le permet." /* Jusqu'au 20030217155308, le message etait : */ /* */ /* Les librairies dynamiques '$SO' de '$xb' sont peut-etre utilisables. */ /* */ @Eifdef PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES @define EXECUTER_LE_listenvSO \ EXECUTER_LE_listverSO /* Definition introduite le 20091114113908... */ @ifdef PRAGMA_CL_____MODULE_NON_OPTIMISABLE @ define MESSAGE_PRAGMA_CL_____MODULE_NON_OPTIMISABLE \ "L'OPTIMISATION n'est pas possible avec ce programme." /* Jusqu'au 20030217155308, le message etait : */ /* */ /* Programme non optimise. */ /* */ @Aifdef PRAGMA_CL_____MODULE_NON_OPTIMISABLE @ define MESSAGE_PRAGMA_CL_____MODULE_NON_OPTIMISABLE \ "L'OPTIMISATION est possible avec ce programme, mais, en fonction du contexte, peut ne pas etre faite." /* Jusqu'au 20030217155308, le message etait : */ /* */ /* Programme peut-etre optimise. */ /* */ @Eifdef PRAGMA_CL_____MODULE_NON_OPTIMISABLE /* Jusqu'au 20050102163032, se trouvaient ici les definitions : */ /* */ /* LANCEMENT_D_UNE_COMMANDE_SOUS_CSH */ /* PERMETTRE_UN_USAGE_NORMAL_DE_Mor */ /* */ /* qui ont ete deplacees a cette date dans 'v $xil/defi_c1$vv$DEF 20050102162501'... */ #ifdef PRAGMA_CPP_____AUTORISER_LE_GooF # define EDITER_L_ETAT_DU_MODE_GooF \ Bblock \ CALS(FPrme0("Le mode 'GooF' est activable sans prejuger du mode 'GooF' des librairies utilisees.\n\n")); \ Eblock \ /* Le mot "autorise" a ete remplace par "activable" le 20051130094632... */ #Aifdef PRAGMA_CPP_____AUTORISER_LE_GooF # define EDITER_L_ETAT_DU_MODE_GooF \ Bblock \ CALS(FPrme0("Le mode 'GooF' est inhibe sans prejuger du mode 'GooF' des librairies utilisees.\n\n")); \ Eblock #Eifdef PRAGMA_CPP_____AUTORISER_LE_GooF /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O C E D U R E G E N E R A L E ' GET_PARAMETRES(...) ' : */ /* */ /*************************************************************************************************************************************/ #define GET_PARAMETRES_____tester_la_double_definition_des_parametres(nombre_d_arguments_y_compris_le_nom,La) \ Bblock \ Test(IL_FAUT(tester_la_double_definition_des_parametres)) \ Bblock \ gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_effectif_d_arguments \ ,BLOC(Test(IFET(IFNE(numero_d_argument_courant,NUMERO_ARGUMENT_COMMANDE) \ ,IFNE(IdTb1(IDENTITE_des_arguments_presents \ ,INDX(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ,nombre_d_arguments_y_compris_le_nom \ ) \ ,ADRESSE_NON_ENCORE_DEFINIE \ ) \ ) \ ) \ Bblock \ /* 'numero_d_argument_courant' donne en permanence le numero de l'argument courant. */ \ DEFV(Int,INIT(numero_d_argument_avant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ); \ /* 'numero_d_argument_avant' donnera, lorsque le test suivant sera VRAI, le numero d'un */ \ /* argument precedant l'argument courant dans la liste des arguments 'La'. */ \ Komp(compteur_des_arguments_avant,nombre_effectif_d_arguments) \ Bblock \ Test(I3ET(IFNE(numero_d_argument_avant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ,IFNE(IdTb1(IDENTITE_des_arguments_presents \ ,INDX(numero_d_argument_avant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ,nombre_d_arguments_y_compris_le_nom \ ) \ ,ADRESSE_NON_ENCORE_DEFINIE \ ) \ ,IFLT(numero_d_argument_avant \ ,numero_d_argument_courant \ ) \ ) \ ) \ Bblock \ /* Cas ou l'on est en presence d'un argument valide precedant l'argument courant. */ \ Test(IFEQ(IdTb1(IDENTITE_des_arguments_presents \ ,INDX(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ,nombre_d_arguments_y_compris_le_nom \ ) \ ,IdTb1(IDENTITE_des_arguments_presents \ ,INDX(numero_d_argument_avant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ,nombre_d_arguments_y_compris_le_nom \ ) \ ) \ ) \ Bblock \ /* Cas ou un argument precedant l'argument courant et ce dernier modifient le meme */ \ /* parametre, meme si les "titres" sont differents (cas des synonymes du type "imageR=" */ \ /* et "R=") : */ \ PRINT_ATTENTION("risque de double definition"); \ /* On notera qu'il y a un grave danger avec une double definition uniquement si les */ \ /* valeurs introduites different. Dans le contraire c'est juste quelque peu illogique */ \ /* (et en general une erreur...). */ \ CAL1(Prer2("avec les parametres '%s' et '%s'\n" \ ,ITb1(La \ ,INDX(numero_d_argument_avant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ) \ ,ITb1(La \ ,INDX(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INCR(numero_d_argument_avant,I); \ /* Passage a l'argument suivant (s'il existe)... */ \ Eblock \ EKom \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____editer_les_differentes_variables_d_environnement_utiles \ Bblock \ Test(IL_FAUT(editer_les_differentes_variables_d_environnement_utiles)) \ /* Test (et sequence suivante) introduit le 20091114113908... */ \ Bblock \ CALS(Fsauts_de_lignes(DEUX)); \ CAL3(Prme2("%s%s" \ ,"Variables d'environnement de la commande courante, certaines pouvant ne pas etre utilisees :\n" \ ,"------------------------------------------------------------------------------------------\n" \ ) \ ); \ CALS(Fsauts_de_lignes(DEUX)); \ \ CALS(FPrme0("PAS DE VARIABLES D'ENVIRONNEMENT RECENSEES POUR CE PROGRAMME")); \ /* ATTENTION, ce message peut etre modifie dynamiquement par 'v $xcc/cpp$Z PasDeVariables'. */ \ \ Test(EST_VRAI(editer_les_differentes_variables_d_environnement_utiles_dans_les_librairies_dynamiques)) \ Bblock \ CAL3(Prme1("\n%s",MESSAGE_PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES)); \ \ Test(EST_VRAI(EXECUTER_LE_listenvSO)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ CALS(FPrme0("Pour l'ENSEMBLE des LIBRAIRIES DYNAMIQUES '$SO' de '$xb', ")); \ CALS(FPrme0("la commande 'listenvSO' donne :")); \ /* ATTENTION : la commande 'listenvSO' examine l'ensemble des librairies dynamiques, alors */ \ /* que 'PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES*' ne concerne que les librairies */ \ /* dynamiques de '$xb'... */ \ CALS(Fsauts_de_lignes(UN)); \ \ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH("'listenvSO $NEXIST'"); \ /* ATTENTION, l'appel de '$CSH' provoque l'interpretation de '$FCshrc' (via '$Fcshrc'), */ \ /* d'ou un certain "delai" avant l'edition des librairies dynamiques... */ \ \ CALS(Fsauts_de_lignes(DEUX)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____editer_les_differentes_versions_du_programme \ Bblock \ Test(IL_FAUT(editer_les_differentes_versions_du_programme)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ \ Test(PAS_D_ERREUR(Ftest_fichier(nom_de_la_commande_courante \ ,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ ) \ ) \ ) \ /* On notera qu'a priori, on ne sait pas si 'nom_de_la_commande_courante' donne un nom */ \ /* relatif ou absolu, ce qui explique que ce test puisse etre faux alors qu'evidemment la */ \ /* commande existe, puisque l'on est en train de l'executer... */ \ Bblock \ DEFV(Int,INIT(taille_de_la_composante_statique_de_la_commande_courante,UNDEF)); \ CALS(Fsize_fichier(nom_de_la_commande_courante \ ,ADRESSE(taille_de_la_composante_statique_de_la_commande_courante) \ ,EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ ) \ ); \ /* Determination de la taille de la composante "statique" de la commande courante... */ \ \ CAL3(Prme4("%s%d%s%s" \ ,"Taille de la commande courante (composante 'statique') : " \ ,taille_de_la_composante_statique_de_la_commande_courante \ ," octets\n" \ ,"------------------------------------------------------\n" \ ) \ ); \ /* Ceci a ete introduit le 20061010095148... */ \ Eblock \ ATes \ Bblock \ PRINT_ATTENTION("la taille d'une commande n'est editable qu'a partir de son directory ou en absolu"); \ Eblock \ ETes \ \ CALS(Fsauts_de_lignes(DEUX)); \ CAL3(Prme2("%s%s" \ ,"Versions de la commande courante, certaines pouvant ne pas etre utilisees :\n" \ ,"-------------------------------------------------------------------------\n" \ ) \ ); \ CALS(Fsauts_de_lignes(DEUX)); \ \ CAL3(Prme1("\n%s",MESSAGE_PRAGMA_CL_____MODULE_NON_OPTIMISABLE)); \ CALS(Fsauts_de_lignes(UN)); \ \ EDITER_L_ETAT_DU_MODE_GooF; \ /* Ceci a ete introduit le 20040421102109... */ \ \ CALS(FPrme0("PAS DE VERSIONS RECENSEES POUR CE PROGRAMME")); \ /* ATTENTION, ce message peut etre modifie dynamiquement par 'v $xcc/cpp$Z PasDeVersions' ; */ \ /* d'autre part il convient de noter que si des "VERSION"s sont editees, elles ne */ \ /* concernent que le programme lui-meme et non pas les librairies de '$xb' qu'il utilise... */ \ \ Test(EST_VRAI(editer_les_differentes_versions_du_programme_dans_les_librairies_dynamiques)) \ Bblock \ Test(EST_VRAI(EXECUTER_LE_listverSO)) \ /* Ce test a ete introduit le 20051211074854... */ \ Bblock \ PRINT_ATTENTION("les 'VERSION's des librairies dynamiques '$SO' de '$xb' peuvent etre differentes"); \ CALS(Fsauts_de_lignes(UN)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CAL3(Prme1("\n%s",MESSAGE_PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES)); \ \ Test(EST_VRAI(EXECUTER_LE_listverSO)) \ /* Ce test a ete introduit le 20051211074854... */ \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ CALS(FPrme0("Pour l'ENSEMBLE des LIBRAIRIES DYNAMIQUES '$SO' de '$xb', ")); \ CALS(FPrme0("la commande 'listverSO' donne :")); \ /* ATTENTION : la commande 'listverSO' examine l'ensemble des librairies dynamiques, alors */ \ /* que 'PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES*' ne concerne que les librairies */ \ /* dynamiques de '$xb'... */ \ CALS(Fsauts_de_lignes(UN)); \ \ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH("'listverSO $NEXIST'"); \ /* ATTENTION, l'appel de '$CSH' provoque l'interpretation de '$FCshrc' (via '$Fcshrc'), */ \ /* d'ou un certain "delai" avant l'edition des librairies dynamiques... */ \ /* */ \ /* Le 20031005190503 un argument a ete introduit pour 'listverSO' depuis la modification */ \ /* 'v $xE/.alias.2$vv$Y 20031005114000'. Cela a contraint a mettre la commande 'listverSO' */ \ /* et son argument entre quotes afin que ce dernier soit pris en compte. A la date du */ \ /* 20031005190503, la valeur choisie pour l'argument est '$NEXIST' afin de ne sortir que */ \ /* les VERSIONs essentielles (la valeur '$EXIST' permettant la sortie exhaustive...). */ \ \ CALS(Fsauts_de_lignes(DEUX)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ /* Edition de quelques messages relatifs aux PRAGMAs. On notera qu'etant donne la structure */ \ /* de ceux-ci, les editions precedentes ne font qu'indiquer des comportements generaux. */ \ /* Les cas specifiques : */ \ /* */ \ /* PRAGMA_CL_____MODULE_NON_OPTIMISABLE_$SYSTEME */ \ /* PRAGMA_CL_____MODULE_NON_OPTIMISABLE_$sHOTE */ \ /* */ \ /* et : */ \ /* */ \ /* PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES_$SYSTEME */ \ /* PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES_$sHOTE */ \ /* */ \ /* ne peuvent etre traites ici simplement et exhaustivement... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____editer_la_liste_des_librairies_dynamiques_utilisees \ Bblock \ Test(IL_FAUT(editer_la_liste_des_librairies_dynamiques_utilisees)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ CAL3(Prme2("%s%s" \ ,"Listes des librairies dynamiques utilisees :\n" \ ,"------------------------------------------\n" \ ) \ ); \ CALS(Fsauts_de_lignes(DEUX)); \ \ CALS(FPrme0("Pour l'ENSEMBLE des LIBRAIRIES DYNAMIQUES '$SO' de '$xb', la commande 'LibDynam' donne :")); \ \ CALS(Fsauts_de_lignes(DEUX)); \ \ EXECUTION_D_UNE_COMMANDE_AVEC_ARGUMENTS_SOUS_CSH(chain_Aconcaten5("LibDynam" \ ,C_BLANC \ ,NOM_DE_LA_COMMANDE \ ,C_BLANC \ ,"$EXIST" \ ) \ ); \ /* ATTENTION, l'appel de '$CSH' provoque l'interpretation de '$FCshrc' (via '$Fcshrc'). */ \ /* */ \ /* Je note le 20221111110731 que cela permet de savoir si lorsqu'une librairie est modifiee */ \ /* un '$X' doit etre recompile. Ainsi : */ \ /* */ \ /* $xcg/ADD2.01$X ---> */ \ /* libc.so.6 */ \ /* libm.so.6 */ \ /* ==> doit etre recompile... */ \ /* */ \ /* */ \ /* $xcg/ADD3.01$X ---> */ \ /* $xbg/allocation$SO */ \ /* $xbg/common$SO */ \ /* $xbg/fonction$SO */ \ /* $xbmf/trigoc$SO */ \ /* */ \ /* libc.so.6 */ \ /* libm.so.6 */ \ /* ==> n'a pas a etre recompile... */ \ /* */ \ /* */ \ /* Le 20221111123806 fut ajoutee l'edition de suggestions concernant une eventuelle */ \ /* recompilation de cette commande... */ \ /* */ \ CALS(Fsauts_de_lignes(DEUX)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____editer_les_differents_bugs_reconnus \ Bblock \ Test(IL_FAUT(editer_les_differents_bugs_reconnus)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ CAL3(Prme2("%s%s" \ ,"Bugs reconnus (certains pouvant ne pas etre rencontres par la commande courante \n" \ ,"--------------------------------------------------------------------------------\n" \ ) \ ); \ CALS(Fsauts_de_lignes(DEUX)); \ \ CALS(FPrme0("PAS DE BUGS RECENSES POUR CE PROGRAMME")); \ /* ATTENTION, ce message peut etre modifie dynamiquement par 'v $xcc/cpp$Z PasDeBugs' ; */ \ /* d'autre part il convient de noter que si des "BUG"s sont edites, ils ne */ \ /* concernent que le programme lui-meme et non pas les librairies de '$xb' qu'il utilise... */ \ /* Ceci a ete introduit le 20030303133123. */ \ PRINT_ATTENTION("les 'BUG's des librairies dynamiques '$SO' de '$xb' peuvent etre differents"); \ CALS(Fsauts_de_lignes(UN)); \ CALS(FPrme0("Pour l'ENSEMBLE des LIBRAIRIES DYNAMIQUES '$SO' de '$xb', la commande 'listbugSO' donne :")); \ \ CALS(Fsauts_de_lignes(UN)); \ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_CSH("listbugSO"); \ /* ATTENTION, l'appel de '$CSH' provoque l'interpretation de '$FCshrc' (via '$Fcshrc'). */ \ CALS(Fsauts_de_lignes(DEUX)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____editer_les_differents_includes_du_programme \ Bblock \ Test(IL_FAUT(editer_les_differents_includes_du_programme)) \ Bblock \ CAL3(Prme2("%s%s" \ ,"\n\nPrincipaux includes de la commande courante :\n" \ ,"-------------------------------------------\n" \ ) \ ); \ /* Versions : */ \ /* */ \ /* 20000713113601 : seuls sont edites les includes '$EXT', */ \ /* 20000718114444 : tous les includes sont edites sauf {$ARG,$DEF,$PASSE_5}, */ \ /* */ \ /* ('v $xcc/cpp$Z 20000713113601'). */ \ CALS(Fsauts_de_lignes(DEUX)); \ \ CALS(FPrme0("PAS D'INCLUDES RECENSES POUR CE PROGRAMME")); \ /* ATTENTION, ce message peut etre modifie dynamiquement par 'v $xcc/cpp$Z PasDIncludes'. */ \ \ CALS(Fsauts_de_lignes(DEUX)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____permettre_l_acces_au_source_du_programme \ Bblock \ Test(IL_FAUT(permettre_l_acces_au_source_du_programme)) \ Bblock \ Test(IL_FAUT(autoriser_l_acces_au_source_du_programme)) \ /* ATTENTION : 'autoriser_l_acces_au_source_du_programme' est une fausse variable introduite */ \ /* le 20050110155508 destinee a bloquer l'acces au source lorsque celui-ci est crypte grace */ \ /* a 'v $xcc/cpp$Z autoriser_l_acces_au_source_du_programme' ; elle prend alors la valeur */ \ /* '$NEXIST' ou '$EXIST' suivant que le source '$K' est ou n'est pas crypte... */ \ Bblock \ DEFV(CHAR,INIC(POINTERc(format_EGAq____GET_PARAMETRES) \ ,chain_Aconcaten5(Gvar("VI") \ ,C_BLANC \ ,HOME_DIRECTORY \ ,cSEPARATEUR_DES_PATHS \ ,PROGRAMME_COURANT_RELATIF_A_x \ ) \ ) \ ); \ \ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(format_EGAq____GET_PARAMETRES); \ /* Execution de la commande utile a l'acces au source du programme. On notera l'utilisation */ \ /* de '$x/PROGRAMME_COURANT_RELATIF_A_x' afin que les programmes de type "bootstrappables" */ \ /* (dans '$xcp') aient des sources '$c' qui soient independants des implementations... */ \ /* */ \ /* ATTENTION : on notera le 20050110154220 que ce source peut apparaitre "brouille" dans */ \ /* le cas ou le programme est crypte ('v $xcg/ShufBytes.01$K'). Je ne sais pas tres bien */ \ /* quoi faire pour eviter cela ; au moins cela montre que le fichier est crypte. La */ \ /* solution est apparue le 20050110155508 avec 'autoriser_l_acces_au_source_du_programme'. */ \ \ CALZ_FreCC(format_EGAq____GET_PARAMETRES); \ Eblock \ ATes \ Bblock \ PRINT_ATTENTION("ce source est crypte, il est donc inaccessible"); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____permettre_l_acces_a_la_liste_des_fonctions_referencees \ Bblock \ Test(IL_FAUT(permettre_l_acces_a_la_liste_des_fonctions_referencees_par_le_programme)) \ Bblock \ DEFV(CHAR,INIC(POINTERc(liste_fonctions_referencees_par_le_programme) \ ,chain_Aconcaten3(HOME_DIRECTORY \ ,cSEPARATEUR_DES_PATHS \ ,LISTE_FONCTIONS_PROGRAMME_COURANT_RELATIF_A_x \ ) \ ) \ ); \ \ Test(PAS_D_ERREUR(Ftest_fichier(liste_fonctions_referencees_par_le_programme \ ,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ ) \ ) \ ) \ Bblock \ DEFV(CHAR,INIC(POINTERc(format_EGAq____GET_PARAMETRES) \ ,chain_Aconcaten3(Gvar("VI") \ ,C_BLANC \ ,liste_fonctions_referencees_par_le_programme \ ) \ ) \ ); \ \ EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(format_EGAq____GET_PARAMETRES); \ /* Execution de la commande utile a l'acces a liste des fonctions referencees par le */ \ /* programme (introduit le 20120626104316). */ \ \ CALZ_FreCC(format_EGAq____GET_PARAMETRES); \ Eblock \ ATes \ Bblock \ PRINT_ATTENTION("la liste '$MAP' de toutes les fonctions referencees par cette commande n'existe plus"); \ /* ATTENTION : on notera que depuis le 'v $xcc/cpp$Z 20120625125712' les fichiers '$MAP' */ \ /* n'existent plus, sauf pour le librairies de '$xb'... */ \ /* */ \ /* Aux environs du 'v $xcc/cpp$Z 20170410100311' ils ont ete retablis et regeneres pour */ \ /* tous les '$K's ('v $Dhistory/LACT1A$D/20170410083214 20170409213235') directement, sans */ \ /* passer par 'v $xcc/cpp$Z .xcc.LFonctionR.vv.Z'... */ \ Eblock \ ETes \ \ CALZ_FreCC(liste_fonctions_referencees_par_le_programme); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____editer_le_NOM_SYNTHETIQUE_de_la_commande_courante \ Bblock \ Test(IL_FAUT(editer_le_NOM_SYNTHETIQUE_de_la_commande_courante)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ CAL3(Prme2("%s%s" \ ,"Nom 'synthetique' de la commande courante puis en-tete des variables d'environnement :\n" \ ,"------------------------------------------------------------------------------------\n" \ ) \ ); \ CALS(Fsauts_de_lignes(DEUX)); \ /* Par "symetrie" avec les autres editions, le 20060613165004, il y a eu passage de "\n" */ \ /* a "\n\n"... */ \ \ CAL3(Prme1("%s\n",NOM_SYNTHETIQUE_DU_FICHIER_COURANT)); \ CAL3(Prme1("%s\n",EN_TETE_DE_titre_attendu_LORS_DES_ENTREES_VIA_DES_SETENV)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante \ Bblock \ Test(IL_FAUT(editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ CAL3(Prme2("%s%s" \ ,"Nom absolu du source '$c' de la commande courante :\n" \ ,"-------------------------------------------------\n" \ ) \ ); \ CALS(Fsauts_de_lignes(DEUX)); \ CAL3(Prme1("%s\n",FICHIER_COURANT_ABSOLU)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit le 20240104111119... */ #define GET_PARAMETRES_____VALIDATION_DES_CLASSES_DE_SYNONYMES_D_ARGUMENTS \ Bblock \ Test(IZGT(nombre_d_arguments_non_compris_le_nom)) \ /* En effet, 'NUMERO_UNIQUE_maximal_de_l_argument_possible_courant' n'a une valeur */ \ /* significative que si il y a au moins un argument. Alors, dans ces conditions, la */ \ /* procedure 'gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(...)' est executee et les differentes */ \ /* variables ('NUMERO_UNIQUE_maximal_de_l_argument_possible_courant' en particulier) */ \ /* sont evaluees... */ \ Bblock \ DEFV(Positive,INIT(validation_de_____nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes \ ,NBRE(PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ,NUMERO_UNIQUE_maximal_de_l_argument_possible_courant \ ) \ ) \ ); \ \ Test(IFNE(nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes \ ,validation_de_____nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes \ ) \ ) \ /* Test introduit le 20081117092814... */ \ Bblock \ PRINT_ERREUR("le calcul du nombre maximal d'arguments regroupes en classe de synonymes est mauvais"); \ CAL1(Prer2("(ce nombre maximal vaut %d alors qu'il devrait valoir %d)\n" \ ,nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes \ ,validation_de_____nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes \ ) \ ); \ /* Notons que 'nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes' est */ \ /* calcule via 'v $xcc/cpp$Z NoMbRe_PaRaMeTrEs...CA..fichier_ListePc....WCl' (rappel */ \ /* fait le 20201013111746 suite a 'v $xrs/surfaces.13$I 20201012170616'). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* A cause de 'v $xi/INCLUDES_min$I VALIDATION_DES_CLASSES_DE_SYNONYMES_D_ARGUMENTS' */ \ /* cette procedure fut introduite le 20210924120633... */ #define GET_PARAMETRES_____lister_les_parametres_non_parfaitement_reconnus \ Bblock \ Test(IFET(IL_FAUT(lister_les_parametres_non_parfaitement_reconnus) \ ,IFNE(nombre_d_arguments_recuperes,PRED(nombre_effectif_d_arguments)) \ ) \ ) \ /* Le 'PRED(...)' est destine au fait que le 1996062700 le nom de la commande a ete */ \ /* reintroduit dans la liste des arguments explores afin de lutter contre le probleme */ \ /* des commandes sans arguments utilisant 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)'. */ \ /* */ \ /* Le 20150530100009 a ete introduite la possibilite d'inhiber la sortie des messages */ \ /* suivants.... */ \ Bblock \ PRINT_ERREUR("un ou plusieurs arguments non reconnus sont presents dans cet appel"); \ CAL1(Prer4("(il y avait %d %s, dont %d %s)\n" \ ,nombre_d_arguments_non_compris_le_nom \ ,PLURIEL_S("argument",nombre_d_arguments_non_compris_le_nom) \ ,nombre_d_arguments_recuperes \ ,PLURIEL_S("reconnu",nombre_d_arguments_recuperes) \ ) \ ); \ PRINT_ERREUR("ou bien, des caracteres parasites se trouvent apres les valeurs d'arguments reconnus"); \ /* Ceci fut introduit le 20051114160351... */ \ PRINT_ERREUR("ou plus rare, un ou plusieurs noms d'arguments sont doublement definis dans cette commande"); \ /* Au passage, cela n'est plus tellement possible a cause d'un nouveau dispositif */ \ /* introduit dans 'v $xcc/cpp$Z 20050623092735' et qui detecte a la compilation */ \ /* l'integralite des eventuelles doubles definitions d'options, mais on ne sait jamais... */ \ PRINT_ERREUR("ou enfin, les valeurs de certains arguments ne respectent pas leur format et/ou leurs bornes"); \ /* Ceci fut introduit le 20051117110846... */ \ \ Test(EST_VRAI(IL_PEUT_Y_AVOIR_CONFUSION_ENTRE_DEUX_COMMANDES_DE_MEME_NOM_DANS_xcg_ET_xci)) \ /* L'indicateur 'IL_PEUT_Y_AVOIR_CONFUSION_ENTRE_DEUX_COMMANDES_DE_MEME_NOM_DANS_xcg_ET_xci' */ \ /* n'existe pas reellement et est uniquement destine a inhiber ou a autoriser la sequence */ \ /* suivante via 'v $xcc/cpp$Z IL_PEUT_Y_AVOIR_CONFUSION_ENTRE_DEUX_COMMANDES_DE_MEME_NOM.'. */ \ /* Ceci a ete introduit le 20050905163907 a cause des programmes suivants (a cette date) : */ \ /* */ \ /* COHX.01$K */ \ /* COSX.01$K */ \ /* RACX.01$K */ \ /* SIHX.01$K */ \ /* SINX.01$K */ \ /* TAHX.01$K */ \ /* TANX.01$K */ \ /* XY_RT$K */ \ /* scale$K */ \ /* */ \ /* qui existent simultanement dans '$xcg' et dans '$xci'. On notera au passage qu'il existe */ \ /* pour l'un d'eux un dispositif specifique ('v $xcg/scale$K 20020606141416'). */ \ /* */ \ /* On notera enfin que l'on ne teste que '$xcg' et '$xci' parce qu'ils sont declares dans */ \ /* '$PATH'. Ce n'est pas le cas, par exemple, de '$xrv' qui n'est donc pas teste... Ainsi, */ \ /* seuls les directories de '$PATH' sont testes ; pour ceux qui ne figurent pas dans */ \ /* '$PATH' ils ne sont pas testes, mais cela est sans importance car il n'est pas possible */ \ /* d'appeler une commande hors de son directory d'appartenance si son nom n'est pas absolu, */ \ /* il n'y a donc pas du tout les memes risques de confusion qu'avec les commandes qui */ \ /* appartiennent aux directories figurant dans '$PATH'... */ \ Bblock \ Test(IFET(PAS_D_ERREUR(Ftest_fichier("NOM_DE_LA_COMMANDE_DANS_xcg" \ ,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ ) \ ) \ ,PAS_D_ERREUR(Ftest_fichier("NOM_DE_LA_COMMANDE_DANS_xci" \ ,NE_PAS_EDITER_LES_MESSAGES_D_ERREUR_DES_FICHIERS \ ) \ ) \ ) \ ) \ /* Ainsi, a compter du 20050906091714, l'existence de deux '$X' de meme nom figurant a la */ \ /* fois dans '$xcg' et dans '$xci' est teste dynamiquement. On notera que les symboles */ \ /* 'NOM_DE_LA_COMMANDE_DANS_xcg' et 'NOM_DE_LA_COMMANDE_DANS_xci' n'existent pas reellement */ \ /* et que leur valeur est define par 'v $xcc/cpp$Z NOM_DE_LA_COMMANDE_DANS_xc.'. */ \ Bblock \ PRINT_ERREUR("ou encore, il y a CONFUSION entre deux '$X' de meme nom dans '$xcg' et dans '$xci'"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CAL1(Prer0("\n")); \ CAL1(Prer0("\n")); \ \ CAL1(Prer1("Pour la commande '%s', ont ete reconnus (ou pas...) les arguments :\n\n",NOM_DE_LA_COMMANDE)); \ gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_effectif_d_arguments \ ,BLOC(Test(IFNE(numero_d_argument_courant,NUMERO_ARGUMENT_COMMANDE)) \ Bblock \ CAL1(Prer2("%d fois : %s\n" \ ,IdTb1(compteur_reconnaissance_des_arguments_presents \ ,INDX(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ,nombre_d_arguments_y_compris_le_nom \ ) \ ,ITb1(arguments \ ,INDX(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ ) \ ); \ /* ATTENTION, autrefois, il y avait : */ \ /* */ \ /* CAL1(Prer3("%0*d fois : %s\n" */ \ /* ,TRPU(INTE(LO1X(_____BEAUCOUP))) */ \ /* ,IdTb1(compteur_reconnaissance_des_arguments_presents */ \ /* ,INDX(numero_d_argument_courant */ \ /* ,NUMERO_ARGUMENT_COMMANDE */ \ /* ) */ \ /* ,nombre_d_arguments_y_compris_le_nom */ \ /* ) */ \ /* ,ITb1(arguments */ \ /* ,INDX(numero_d_argument_courant */ \ /* ,NUMERO_ARGUMENT_COMMANDE */ \ /* ) */ \ /* ) */ \ /* ) */ \ /* ); */ \ /* */ \ /* mais en fait, il est evident qu'un argument ne peut etre reconnu que 0 (c'est-a-dire */ \ /* non reconnu) ou 1 (c'est-a-dire reconnu) fois. En consequence de quoi, le format "%d" */ \ /* est suffisant pour garantir une bonne tabulation... */ \ CAL1(Prer0("\n")); \ \ CODE_ERROR(ERREUR33); \ /* Introduit le 20110224105948... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____editer_les_commandes_avant_execution \ Bblock \ Test(IL_FAUT(editer_les_commandes_avant_execution)) \ Bblock \ DEFV(CHAR,INIC(POINTERc(commande_primaire_courante),CHAINE_UNDEF)); \ RECONSTITUTION_DE_LA_COMMANDE_COURANTE(commande_primaire_courante); \ /* Reconstitution de la commande courante... */ \ CALS(Fsauts_de_lignes(UN)); \ CAL3(Prme2("%s%s" \ ,"Edition des commandes et de leurs parametres avant execution :\n" \ ,"------------------------------------------------------------\n" \ ) \ ); \ CALS(Fsauts_de_lignes(DEUX)); \ \ CAL3(Prme1("CommandePrimaire=%s\n",commande_primaire_courante)); \ /* Edition de la commande courante (dite "primaire"...) avant son execution. */ \ CALZ_FreCC(commande_primaire_courante); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____lister_tous_les_messages_possibles \ Bblock \ Test(IL_FAUT(lister_tous_les_messages_possibles)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ CAL3(Prme2("%s%s" \ ,"Liste des messages recuperables de type '...nom=...valeur...' editables par cette commande :\n" \ ,"------------------------------------------------------------------------------------------\n" \ ) \ ); \ CALS(Fsauts_de_lignes(UN)); \ /* Par "symetrie" avec les autres editions, le 20060613165004, il y a eu passage de "\n\n" */ \ /* a "\n"... */ \ /* */ \ /* Le 20090803163803, furent introduits les '...'s car, en effet, sont recuperes en */ \ /* fait ici tous les messages qui contiennent "...=...%...". Cela correspond a beaucoup */ \ /* de choses et donne par exemple "2-soit d'utiliser l'option 'ValiderAxes=%s' pour..." */ \ /* qui n'est pas d'une grande utilite... */ \ \ G_LISTER_TOUS_LES_MESSAGES_POSSIBLES(); \ /* ATTENTION, ceci n'est pas l'appel a une fonction, mais uniquement un code destine */ \ /* a 'v $xcc/cpp$Z G_LISTER_TOUS_LES_MESSAGES_POSSIBLES' afin qu'il mette en place le */ \ /* code d'edition de tous les messages possibles... */ \ \ CAL1(Prer0("\n")); \ CAL2(Prin0("\n")); \ CALS(FPrme0("\n")); \ /* "Fermeture" de la liste de la plupart des messages. ATTENTION, etant donne que les */ \ /* messages ci-dessus peuvent utiliser indifferement 'Prer?(...)', 'Prin?(...)' et */ \ /* 'Prme?(...)', il faut utiliser ces trois directives pour "fermer" et ainsi etre sur */ \ /* d'avoir un "\n" en fin du fichier de liste... */ \ /* */ \ /* Le 20050126102747 les appels 'CAL3\(Prer0(...))' et 'CAL3\(Prin0(...))' ont ete remplaces */ \ /* respectivement par 'CAL1\(Prer0(...))' et 'CAL2\(Prin0(...))'. Cela correspond a la */ \ /* definition des procedures 'CALi(...)' mais est-ce correct par rapport aux commentaires */ \ /* precedents ? */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____ne_rien_faire_et_sortir_immediatement \ Bblock \ Test(IL_FAUT(ne_rien_faire_et_sortir_immediatement)) \ Bblock \ ABORT_Commande; \ /* Cette possibilite a ete introduite le 20061110090803 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... */ \ /* */ \ /* On notera qu'evidemment, aucun message n'est emis, contrairement a ce qui est fait */ \ /* ci-apres, par exemple, si 'IL_FAUT(editer_la_valeur_des_parametres_d_une_commande)'... */ \ /* */ \ /* Le 20180316110607, 'ABORT_Commande' a remplace 'Exit(OK);'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define GET_PARAMETRES_____forcer_l_execution_malgre_les_editions_demandees \ Bblock \ Test(IL_NE_FAUT_PAS(forcer_l_execution_malgre_les_editions_demandees)) \ /* Introduit le 20170604111437... */ \ Bblock \ Test(IFOU(IL_FAUT(editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation) \ ,I3OU(I6OU(IL_FAUT(editer_la_valeur_des_parametres_d_une_commande) \ ,IL_FAUT(editer_les_differentes_variables_d_environnement_utiles) \ ,IL_FAUT(editer_le_nom_des_parametres_non_generes_d_une_commande) \ ,IL_FAUT(editer_le_NOM_SYNTHETIQUE_de_la_commande_courante) \ ,IL_FAUT(editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante) \ ,IL_FAUT(lister_tous_les_messages_possibles) \ ) \ ,I6OU(IL_FAUT(permettre_l_acces_au_source_du_programme) \ ,IL_FAUT(permettre_l_acces_a_la_liste_des_fonctions_referencees_par_le_programme) \ ,IL_FAUT(editer_les_differentes_versions_du_programme) \ ,IL_FAUT(editer_les_differentes_versions_du_programme_dans_les_librairies_dynamiques) \ ,IL_FAUT(editer_la_liste_des_librairies_dynamiques_utilisees) \ ,IL_FAUT(editer_les_differents_includes_du_programme) \ ) \ ,IL_FAUT(editer_les_differents_bugs_reconnus) \ ) \ ) \ ) \ /* Le test de 'editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation' a */ \ /* ete introduit le 20091027135802... */ \ /* */ \ /* Le test de 'editer_les_differentes_versions_du_programme_dans_les_librairies_dynamiques' */ \ /* a ete introduit le 20111009110606 car, en effet, il manquait... */ \ /* */ \ /* Le test de 'editer_la_liste_des_librairies_dynamiques_utilisees' a ete introduit le */ \ /* 20220824180116... */ \ Bblock \ CAL1(Prer0("\n\n")); \ PRINT_ATTENTION("l'une des options demandees provoque l'arret immediat de cette commande"); \ \ Test(IL_FAUT(PRINT_ATTENTION_____editer_les_messages)) \ /* Ce test a ete introduit le 20020520114922 a cause de l'usage qui est fait de l'argument */ \ /* "ATTENTION=FAUX" dans l'alias 'v $xE/.alias.2$vv$Y alias.....use'. */ \ Bblock \ CAL1(Prer0("(a savoir ")); \ CAL1(Prer1("'All=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'Bugs=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'Includes=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'ListeFonctions=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'ListerMessages=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'NomSynthetique=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'NomAbsoluSource=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'Parametres=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'ParametresNonGeneres=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'Setenv=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'SourceProgramme=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'Versions=%s'",C_VRAI____)); \ CAL1(Prer0(", ")); \ CAL1(Prer1("'VersionsSO=%s'",C_VRAI____)); \ CAL1(Prer0(" ou enfin ")); \ CAL1(Prer2("'LibrairiesDynamiques=%s''LibDyn=%s'",C_VRAI____,C_VRAI____)); \ /* Le 20060316174102 furent introduits les 'C_VRAI____'s... */ \ /* */ \ /* L'argument "All=" a ete introduit le 20091027121953... */ \ /* */ \ /* L'argument "VersionsSO=" a ete introduit le 20111009111159... */ \ /* */ \ /* L'argument "LibDynam=" a ete introduit le 20220824182311... */ \ CAL1(Prer0(")\n")); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ ABORT_Commande; \ /* Lorsque l'edition des parametres est demandee, on sort immediatement afin d'eviter de */ \ /* "faire des degats" ; en effet, en general, dans ce cas rien n'a ete defini, et alors */ \ /* on peut etre amene a creer, par exemple, des fichiers, alors qu'en fait il ne faut pas */ \ /* evidemment. Cela a ete ajoute le 19971107160014. Cela a ete etendu le 19971107160607 */ \ /* a l'acces aux VERSIONs ainsi qu'a celui du source du programme. */ \ /* */ \ /* Le 20180316110607, 'ABORT_Commande' a remplace 'Exit(OK);'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit sous cette forme le 20221112114434... */ #define ACTIONS_DIVERSES_APRES_TOUTES_LES_ENTREES_DE_PARAMETRES_______GET_PARAMETRES_1 \ Bblock \ GET_PARAMETRES_____editer_les_differentes_variables_d_environnement_utiles; \ /* Introduit sous cette forme le 20221112114434... */ \ /* */ \ /* Cette procedure ne peut etre une fonction dans 'v $xig/fonct$vv$FON' car, en effet, */ \ /* elle demande des donnees locales aux '$K's (et evidemment aux '$c's) des '$X's... */ \ \ GET_PARAMETRES_____editer_les_differentes_versions_du_programme; \ /* Introduit sous cette forme le 20221112114434... */ \ /* */ \ /* Cette procedure ne peut etre une fonction dans 'v $xig/fonct$vv$FON' car, en effet, */ \ /* elle demande des donnees locales aux '$K's (et evidemment aux '$c's) des '$X's... */ \ \ GET_PARAMETRES_____editer_les_differents_includes_du_programme; \ /* Introduit sous cette forme le 20221112114434... */ \ /* */ \ /* Cette procedure ne peut etre une fonction dans 'v $xig/fonct$vv$FON' car, en effet, */ \ /* elle demande des donnees locales aux '$K's (et evidemment aux '$c's) des '$X's... */ \ \ GET_PARAMETRES_____lister_tous_les_messages_possibles; \ /* Introduit sous cette forme le 20221112114434... */ \ /* */ \ /* Cette procedure ne peut etre une fonction dans 'v $xig/fonct$vv$FON' car, en effet, */ \ /* elle demande des donnees locales aux '$K's (et evidemment aux '$c's) des '$X's... */ \ \ GET_PARAMETRES_____editer_le_NOM_SYNTHETIQUE_de_la_commande_courante; \ /* Introduit sous cette forme le 20221112114434... */ \ /* */ \ /* Cette procedure ne peut etre une fonction dans 'v $xig/fonct$vv$FON' car, en effet, */ \ /* elle demande des donnees locales aux '$K's (et evidemment aux '$c's) des '$X's... */ \ \ GET_PARAMETRES_____editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante; \ /* Introduit sous cette forme le 20221112114434... */ \ /* */ \ /* Cette procedure ne peut etre une fonction dans 'v $xig/fonct$vv$FON' car, en effet, */ \ /* elle demande des donnees locales aux '$K's (et evidemment aux '$c's) des '$X's... */ \ Eblock \ /* Introduit sous cette forme le 20221113171642... */ #define ACTIONS_DIVERSES_APRES_TOUTES_LES_ENTREES_DE_PARAMETRES_______GET_PARAMETRES_2 \ Bblock \ Eblock \ /* Introduit sous cette forme le 20221113171642 et modifie le 20221113180928... */ #define ACTIONS_DIVERSES_APRES_TOUTES_LES_ENTREES_DE_PARAMETRES_____FgGET_PARAMETRES \ Bblock \ CALS(FgGET_PARAMETRES_____editer_la_liste_des_librairies_dynamiques_utilisees()); \ /* Introduit sous cette forme le 20221112114434... */ \ \ CALS(FgGET_PARAMETRES_____permettre_l_acces_a_la_liste_des_fonctions_referencees()); \ /* Introduit sous cette forme le 20221112114434 et comme fonction le 20221112135642... */ \ \ CALS(FgGET_PARAMETRES_____editer_les_differents_bugs_reconnus()); \ /* Introduit sous cette forme le 20221112114434 et comme fonction le 20221112135642... */ \ \ CALS(FgGET_PARAMETRES_____permettre_l_acces_au_source_du_programme()); \ /* Introduit sous cette forme le 20221112114434 et comme fonction le 20221112135642... */ \ \ CALS(FgGET_PARAMETRES_____VALIDATION_DES_CLASSES_DE_SYNONYMES_D_ARGUMENTS()); \ /* Mis sous cette forme le 20210924120633... */ \ \ CALS(FgGET_PARAMETRES_____editer_les_commandes_avant_execution()); \ /* Introduit sous cette forme le 20221112114434... */ \ \ CALS(FgGET_PARAMETRES_____lister_les_parametres_non_parfaitement_reconnus()); \ /* Introduit sous cette forme le 20221112114434 et mis ici le 20221115134128... */ \ \ CALS(FgGET_PARAMETRES_____forcer_l_execution_malgre_les_editions_demandees()); \ /* Introduit sous cette forme le 20221112114434 et mis ici le 20221115134128... */ \ \ CALS(FgGET_PARAMETRES_____ne_rien_faire_et_sortir_immediatement()); \ /* Introduit sous cette forme le 20221112114434 et mis ici le 20221115134128... */ \ Eblock \ /* Introduit sous cette forme le 20221113171642... */ #define GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom,La,liste_de_recuperation_1,action_intermediaire,liste_de_recuperation_2) \ /* Ou 'La' designe 'liste_des_arguments'... */ \ Bblock \ \ __NEW_LINE__ \ %mdefine FICHIER_DE_BASE_ABSOLU_x FICHIER_COURANT_ABSOLU_x \ __NEW_LINE__ \ /* Introduit le 20190809094118 pour 'GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(...)' */ \ /* afin qu'elle puisse editer le nom du '$c' de base (a la racine des 'include's...). On */ \ /* notera le 'mdefine' (et non pas un 'define') et ce au cas ou il y aurait plusieurs appels */ \ /* a 'GET_PARAMETRES(...)'. On rappelle que lorsque l'on execute 'GET_PARAMETRES(...)' on */ \ /* est necessairement a la racine des 'include's et ainsi 'FICHIER_COURANT_ABSOLU_x' a la */ \ /* bonne valeur... */ \ /* */ \ /* On notera le 20190809105456 que 'FICHIER_DE_BASE_ABSOLU_x' n'est pas defini pour les */ \ /* librairies puisque les '$K's correspondant n'utilisent pas 'GET_PARAMETRES(...)' et */ \ /* ainsi, 'NOM_DE_LA_COMMANDE (utilise par 'v $xig/fonct$vv$FON BASIQUE____Prer' en */ \ /* particulier) ne peut etre, malheureusement, remplace par 'FICHIER_DE_BASE_ABSOLU_x' */ \ /* (dont l'avantage est d'etre un nom absolu, alors que 'NOM_DE_LA_COMMANDE' est relatif */ \ /* ou absolu, suivant la nature de l'appel du '$X' correspondant...). */ \ \ /* Le 20221113114530, 'nombre_d_arguments_non_compris_le_nom' est devenue une variable */ \ /* globale definie dans 'v $xil/defi_c1$vv$DEF 20221113114253'... */ \ \ EGAL(nombre_effectif_d_arguments,nombre_d_arguments_y_compris_le_nom); \ /* Nombre effectifs d'arguments. */ \ EGAL(nombre_d_arguments_recuperes,ZERO); \ /* Afin de comptabiliser les arguments corrects recuperes. La mise a 0 a ete rajoutee le */ \ /* 20000801165648 car elle manquait et rendait incorrect la "re-rentree" dans le 'Main(...)' */ \ /* faite par 'v $xiii/files$FON Iload_image_avec_redimensionnement_eventuel'... */ \ \ cpMalo(IDENTITE_des_arguments_presents \ ,bMUL(nombre_d_arguments_y_compris_le_nom,size_PointerInt) \ ,GET_PARAMETRES_____compteur_des_cpMalo \ ); \ /* Liste d'identite des arguments presents. */ \ ciMalo(compteur_reconnaissance_des_arguments_presents \ ,bMUL(nombre_d_arguments_y_compris_le_nom,size_Int) \ ,GET_PARAMETRES_____compteur_des_ciMalo \ ); \ /* Compteur de reconnaissance de chacun des arguments presents. */ \ \ EGAL(pointeurV_parametre_fictif_IDENTITE_des_arguments,aIDENTITE(parametre_fictif_IDENTITE_des_arguments)); \ EGAL(pointeurC_parametre_fictif_IDENTITE_des_arguments,pointeurV_parametre_fictif_IDENTITE_des_arguments); \ /* 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...). */ \ \ /* ATTENTION, jusqu'au 19970217132121, on trouvait ici : */ \ /* */ \ /* EGAL(nom_de_la_commande_courante,chain_Acopie(NOM_DE_LA_COMMANDE)); */ \ /* */ \ /* mais, malheureusement, de nombreux programmes peuvent editer des messages d'erreur */ \ /* avant de passer dans 'GET_PARAMETRES(...)' ('v $xrr/N_corps.11$K'). Cette initialisation */ \ /* est faite dorenavant dans 'BCommande(...)'. */ \ \ gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_effectif_d_arguments \ ,BLOC(EGAL(IdTb1(IDENTITE_des_arguments_presents \ ,INDX(numero_d_argument_courant,NUMERO_ARGUMENT_COMMANDE) \ ,nombre_d_arguments_y_compris_le_nom \ ) \ ,ADRESSE_NON_ENCORE_DEFINIE \ ); \ /* Initialisation de la liste des arguments presents... */ \ CLIR(IdTb1(compteur_reconnaissance_des_arguments_presents \ ,INDX(numero_d_argument_courant,NUMERO_ARGUMENT_COMMANDE) \ ,nombre_d_arguments_y_compris_le_nom \ ) \ ); \ /* Initialisation du detecteur de reconnaissance des arguments... */ \ ) \ ); \ \ PARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_effectif_d_arguments \ ,BLOC(BLOC(liste_de_recuperation_1); \ /* Premieres definitions... */ \ ) \ ); \ \ BLOC(action_intermediaire); \ /* Execution d'une certaine action entre les deux listes... */ \ \ PARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_effectif_d_arguments \ ,BLOC(BLOC(liste_de_recuperation_2); \ /* Autres definitions eventuellement... */ \ ) \ ); \ \ GET_PARAMETRES_____tester_la_double_definition_des_parametres(nombre_d_arguments_y_compris_le_nom,La); \ /* Introduit sous cette forme le 20221112114434... */ \ \ ACTIONS_DIVERSES_APRES_TOUTES_LES_ENTREES_DE_PARAMETRES_______GET_PARAMETRES_1; \ /* Introduit sous cette forme le 20221112114434... */ \ \ ACTIONS_DIVERSES_APRES_TOUTES_LES_ENTREES_DE_PARAMETRES_____FgGET_PARAMETRES; \ /* Introduit sous cette forme le 20221112114434... */ \ /* */ \ /* ATTENTION : il faut en premier '__GET_PARAMETRES' et en second 'FgGET_PARAMETRES' et */ \ /* ce a cause des tests 'v $xig/fonct$vv$DEF 20221113175029' qui doivent editer en */ \ /* quelque sorte un separateur entre '__GET_PARAMETRES' et 'FgGET_PARAMETRES'... */ \ \ ACTIONS_DIVERSES_APRES_TOUTES_LES_ENTREES_DE_PARAMETRES_______GET_PARAMETRES_2; \ /* Introduit sous cette forme le 20221113180928 et doit evidemment etre en dernier */ \ /* puisqu'elle provoque la sortie immediate, mais ce n'est plus le cas a compter du */ \ /* 20221115134128... */ \ \ CALZ_FreII(compteur_reconnaissance_des_arguments_presents); \ CALZ_FrePP(IDENTITE_des_arguments_presents); \ /* Liberation des vecteurs relatifs a la reconnaissance des arguments presents... */ \ Eblock \ /* Procedure de recuperation d'une liste de parametres. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O C E D U R E S ' GIT_ARGUMENT_?(...) ' : */ /* */ /*************************************************************************************************************************************/ #define VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(parametre,non_encore_defini_1,non_encore_defini_2,va_defaut) \ COND(IFET(EST_VRAI(c_est_la_derniere_recherche_des_parametres) \ ,IFOU(IFEQ(parametre,non_encore_defini_1) \ ,IFEQ(parametre,non_encore_defini_2) \ ) \ ) \ ,va_defaut \ ,parametre \ ) \ /* Procedure permettant de forcer 'va_defaut' pour 'parametre' si il possede la */ \ /* valeur 'non_encore_defini', mais uniquement lors de la derniere recherche de parametres. */ \ /* Ceci est necessaire au cas ou un certain parametre doit etre initialise via, par exemple, */ \ /* '_____?NORMALISE_OX(...)' car, en effet, cela n'a de sens qu'apres que '$formatI' ait ete */ \ /* interprete (si '$formatI' est presente bien entendu...). */ \ /* */ \ /* ATTENTION, utiliser 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' et donc les differentes */ \ /* procedures qui l'utilisent (par exemple 'GIT_ARGUMENT_I(...)') implique la presence */ \ /* d'au moins un argument d'appel pour la commande si l'on veut que les initialisations */ \ /* correspondantes soient faites. C'est pourquoi, le 1996062700 a ete reintroduit le nom */ \ /* de la commande dans la liste des arguments explores... */ \ /* */ \ /* ATTENTION, je note le 20070819113024 que 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' */ \ /* ne fonctionne bien que si 'non_encore_defini' est une valeur qui ne peut etre demandee */ \ /* pour 'parametre'. Cela explique donc que 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' ne */ \ /* peut etre utilisee avec, par exemple, 'GIT_ARGUMENT_L(...)' pour laquelle 'LUNDEF' vaut */ \ /* en fait 'VRAI' qui est donc une valeur possible (et frequente). C'est donc le cas de : */ \ /* */ \ /* GIT_ARGUMENT_C(...) */ \ /* GIT_ARGUMENT_K(...) */ \ /* GIT_ARGUMENT_L(...) */ \ /* GIT_ARGUMENT_N(...) */ \ /* GIT_ARGUMENT_P(...) */ \ /* */ \ /* qui a la date du 20070819130744 ne sont pas utilisees (ni dans '$xc', ni dans '$xr', ni */ \ /* dans '$xt') en fait. C'est pourquoi, a la date du 20070819132949 et du 20070819135021, */ \ /* je les desactive provisoirement (?) via '#nydefine'... */ \ /* */ \ /* Mais, meme pour les autres procedures, 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' n'est */ \ /* pas fiable a 100%. Par exemple avec 'GIT_ARGUMENT_I(...)', la valeur 'UNDEF', bien que */ \ /* peu probable, n'est pas impossible... */ \ /* */ \ /* Le 20101020105725, l'argument 'non_encore_defini' a ete dedouble en */ \ /* {non_encore_defini_1,non_encore_defini_2} afin de prendre en compte, en particulier, */ \ /* les valeurs 'FLOT__UNDEF' et 'FLOT__NIVEAU_UNDEF'. Cela s'est vu a cette date lors de */ \ /* la generation de 'v $xiac/VONK.52$R16' qui fut dans un premier temps quasiment invisible. */ \ /* Cela etait du a la variable 'v $xrv/champs_5.26$I niveau_du_champ_NOIR_et_BLANC' qui */ \ /* etait initialise avec 'FLOT__NIVEAU_UNDEF' (qui vaut 'NOIR') et non pas avec */ \ /* 'FLOT__UNDEF' que testait 'v $xrv/champs_5.1A$I NIVEAU_DU_CHAMP_NOIR_et_BLANC'... */ \ /* Evidemment s'il n'y a qu'une seule valeur 'non_encore_defini' a tester, les deux */ \ /* aguments 'non_encore_defini_1' et 'non_encore_defini_2' devront etre egaux... */ #nydefine GIT_ARGUMENT_K(titre_attendu,parametre_K,valeur_K_par_defaut) \ Bblock \ GET_PARAMETRE_K(arguments \ ,titre_attendu \ ,parametre_K \ ,valeur_K_par_defaut \ ); \ Eblock \ /* Recuperation d'un argument "caractere" avec initialisation systematique. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* GIT_ARGUMENT_K("titre1=",variable,initialisation); */ \ /* GIT_ARGUMENT_K("titre2=",variable,initialisation); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ \ /* */ \ /* ATTENTION : je note le 20070819113024 que l'on ne peut pas utiliser ici la procedure */ \ /* 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' car, en effet, 'K_UNDEF' est une valeur */ \ /* possible (et probable) de 'parametre_K'... */ #nydefine GIT_ARGUMENT_C(titre_attendu,parametre_C,valeur_C_par_defaut) \ Bblock \ GET_PARAMETRE_C(arguments \ ,titre_attendu \ ,parametre_C \ ,valeur_C_par_defaut \ ); \ Eblock \ /* Recuperation d'un argument "chaine de caracteres" avec initialisation systematique. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* GIT_ARGUMENT_C("titre1=",variable,initialisation); */ \ /* GIT_ARGUMENT_C("titre2=",variable,initialisation); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ \ /* */ \ /* ATTENTION : je note le 20070819113024 que je ne sais par si l'on peut utiliser ici la */ \ /* procedure 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' car, en effet, je ne sais pas a */ \ /* priori qu'elle est la valeur de type "UNDEF" de 'parametre_C'... */ #nydefine GIT_ARGUMENT_L(titre_attendu,parametre_L,valeur_L_par_defaut) \ Bblock \ GET_PARAMETRE_L(arguments \ ,titre_attendu \ ,parametre_L \ ,valeur_L_par_defaut \ ); \ Eblock \ /* Recuperation d'un argument "Logical" avec initialisation systematique. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* GIT_ARGUMENT_L("titre1=",variable,initialisation); */ \ /* GIT_ARGUMENT_L("titre2=",variable,initialisation); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ \ /* */ \ /* ATTENTION : je note le 20070819113024 que l'on ne peut pas utiliser ici la procedure */ \ /* 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' car, en effet, 'LUNDEF' est une valeur */ \ /* possible (et probable) de 'parametre_L'... */ #nydefine GIT_ARGUMENT_N(titre_attendu,parametre_N,valeur_N_par_defaut) \ Bblock \ GET_PARAMETRE_N(arguments \ ,titre_attendu \ ,parametre_N \ ,valeur_N_par_defaut \ ); \ Eblock \ /* Recuperation d'un argument "Logical" inverse (ou "Negate") avec initialisation */ \ /* systematique. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* GIT_ARGUMENT_N("titre1=",variable,initialisation); */ \ /* GIT_ARGUMENT_N("titre2=",variable,initialisation); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ \ /* */ \ /* ATTENTION : je note le 20070819113024 que l'on ne peut pas utiliser ici la procedure */ \ /* 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' car, en effet, 'LUNDEF' est une valeur */ \ /* possible (et probable) de 'parametre_N'... */ #define GIT_ARGUMENT_I(titre_attendu,parametre_I,valeur_I_par_defaut) \ Bblock \ Test(IFOU(IZEQ(UNDEF),IZEQ(UNDEF))) \ /* Test introduit le 20101025135756 car, en effet, si 'UNDEF' a une valeur nulle, il */ \ /* devient impossible de savoir si une variable n'est pas encore definie ou bien si elle */ \ /* a ete initialisee (a la compilation ou bien en tant qu'argument d'un '$K'...) avec une */ \ /* valeur nulle ! */ \ /* */ \ /* Le double test de 'UNDEF' n'est pas accidentelle : elle est la pour rappeler son double */ \ /* usage dans 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' ci-apres. */ \ /* */ \ /* On notera le 20101025141341 que ce test peut etre un peu "lourd", eventuellement repete */ \ /* plusieurs fois dans un '$K' et redondant avec celui de 'v $xcp/Konstantes$K UNDEF'... */ \ Bblock \ PRINT_ATTENTION("les constantes indefinies entieres ne doivent pas etre nulles"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ GET_PARAMETRE_I(arguments \ ,titre_attendu \ ,parametre_I \ ,VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(parametre_I,UNDEF,UNDEF,valeur_I_par_defaut) \ ); \ Eblock \ /* Recuperation d'un argument "Int" avec initialisation eventuelle si la variable etait */ \ /* a l'etat 'UNDEF', mais uniquement lors de la derniere recherche de parametres. */ \ /* */ \ /* Le 20101025113324, je suis passe de {UNDEF,NIVEAU_UNDEF} a 'UNDEF' ce qui correspond */ \ /* en fait a la situation anterieure au 20101020105725. En effet, tester 'NIVEAU_UNDEF' */ \ /* est, me semble-t-il, un peu dangeureux car sa valeur est nulle ; il ne pouurait donc */ \ /* pas etre distingue d'une valeur nulle introduite en tant qu'argument d'un '$K'... */ #define GIT_ARGUMENT_F(titre_attendu,parametre_F,valeur_F_par_defaut) \ Bblock \ Test(IFOU(IZEQ(FLOT__UNDEF),IZEQ(FLOT__NIVEAU_UNDEF))) \ /* Test introduit le 20101025135756 car, en effet, si '*_UNDEF' ont une valeur nulle, il */ \ /* devient impossible de savoir si une variable n'est pas encore definie ou bien si elle */ \ /* a ete initialisee (a la compilation ou bien en tant qu'argument d'un '$K'...) avec une */ \ /* valeur nulle ! */ \ /* */ \ /* On notera le 20101025141341 que ce test peut etre un peu "lourd", eventuellement repete */ \ /* plusieurs fois dans un '$K' et redondant avec celui de 'v $xcp/Konstantes$K UNDEF'... */ \ Bblock \ PRINT_ATTENTION("les constantes indefinies flottantes ne doivent pas etre nulles"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ GET_PARAMETRE_F(arguments \ ,titre_attendu \ ,parametre_F \ ,VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(parametre_F,FLOT__UNDEF,FLOT__NIVEAU_UNDEF,valeur_F_par_defaut) \ ); \ Eblock \ /* Recuperation d'un argument "Float" avec initialisation eventuelle si la variable etait */ \ /* a l'etat 'FLOT__UNDEF', mais uniquement lors de la derniere recherche de parametres. */ \ /* */ \ /* Le 20101025114210, l'introduction de {FLOT__UNDEF,FLOT__NIVEAU_UNDEF} le 20101020105725 */ \ /* me parait dangereuse car, en effet, a cette date 'FLOT__NIVEAU_UNDEF' a une valeur nulle */ \ /* que l'on ne pourra donc distinguer d'une valeur nulle introduite en tant qu'argument */ \ /* d'un '$K', d'ou la modification 'v $xiiD/definit.1$DEF 20101025114454' consistant a */ \ /* changer la valeur de 'FLOT__NIVEAU_UNDEF' (egale dorenavant a 'FLOT__UNDEF'...). */ #nydefine GIT_ARGUMENT_P(titre_attendu,parametre_P,valeur_P_par_defaut) \ Bblock \ GET_PARAMETRE_P(arguments \ ,titre_attendu \ ,parametre_P \ ,valeur_P_par_defaut \ ); \ Eblock \ /* Recuperation d'un argument "genere_p" avec initialisation systematique. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* GIT_ARGUMENT_P("titre1=",variable,initialisation); */ \ /* GIT_ARGUMENT_P("titre2=",variable,initialisation); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ \ /* */ \ /* ATTENTION : je note le 20070819135021 que l'on ne peut pas utiliser ici la procedure */ \ /* 'VALEUR_PAR_DEFAUT_POUR_GIT_ARGUMENT(...)' car, en effet, 'NIVEAU_UNDEF' est une valeur */ \ /* possible (et probable) de 'parametre_N'... */ #define PROKISS_ARGUMENT_K(titre_attendu,parametre_K,valeur_K_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_K(arguments,titre_attendu,parametre_K,valeur_K_par_defaut,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "caractere" avec initialisation et post-traitement. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_K("titre1=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* PROCISS_ARGUMENT_K("titre2=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define PROKISS_ARGUMENT_C(titre_attendu,parametre_C,valeur_C_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_C(arguments,titre_attendu,parametre_C,valeur_C_par_defaut,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "chaine de caracteres" avec initialisation et post-traitement. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_C("titre1=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* PROCISS_ARGUMENT_C("titre2=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define PROKISS_ARGUMENT_L(titre_attendu,parametre_L,valeur_L_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_L(arguments,titre_attendu,parametre_L,valeur_L_par_defaut,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "Logical" avec initialisation et post-traitement. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_L("titre1=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* PROCISS_ARGUMENT_L("titre2=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define PROKISS_ARGUMENT_N(titre_attendu,parametre_N,valeur_N_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_N(arguments,titre_attendu,parametre_N,valeur_N_par_defaut,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "Logical" inverse (ou "Negate") avec initialisation et */ \ /* post-traitement. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_N("titre1=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* PROCISS_ARGUMENT_N("titre2=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define PROKISS_ARGUMENT_I(titre_attendu,parametre_I,valeur_I_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_I(arguments \ ,titre_attendu \ ,parametre_I \ ,COND(IFET(EST_VRAI(le_format_des_images_a_ete_defini) \ ,IFEQ(parametre_I,UNDEF) \ ) \ ,valeur_I_par_defaut \ ,parametre_I \ ) \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ); \ Eblock \ /* Recuperation d'un argument "Int" avec initialisation et post-traitement. */ \ /* */ \ /* L'initialisation n'a lieu que si la variable etait a l'etat 'UNDEF' et seulement */ \ /* apres la definition du format des images, puisqu'en effet, cette definition peut etre */ \ /* une fonction de ce meme format... */ #define PROKISS_ARGUMENT_X(titre_attendu,parametre_X,valeur_X_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_X(arguments \ ,titre_attendu \ ,parametre_X \ ,COND(IFET(EST_VRAI(le_format_des_images_a_ete_defini) \ ,IFEQ(parametre_X,UNDEF) \ ) \ ,valeur_X_par_defaut \ ,parametre_X \ ) \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ); \ Eblock \ /* Recuperation d'un argument "Int" avec initialisation et post-traitement avec edition */ \ /* hexa-decimale (introduit le 20070421093557). */ \ /* */ \ /* L'initialisation n'a lieu que si la variable etait a l'etat 'UNDEF' et seulement */ \ /* apres la definition du format des images, puisqu'en effet, cette definition peut etre */ \ /* une fonction de ce meme format... */ #define PROKISS_ARGUMENT_F(titre_attendu,parametre_F,valeur_F_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_F(arguments \ ,titre_attendu \ ,parametre_F \ ,COND(IFET(EST_VRAI(le_format_des_images_a_ete_defini) \ ,IFEQ(parametre_F,FLOT__UNDEF) \ ) \ ,valeur_F_par_defaut \ ,parametre_F \ ) \ ,seq1 \ ,seqI \ ,seqC \ ,seqN \ ); \ Eblock \ /* Recuperation d'un argument "Float" avec initialisation et post-traitement. */ \ /* */ \ /* L'initialisation n'a lieu que si la variable etait a l'etat 'FLOT__UNDEF' et seulement */ \ /* apres la definition du format des images, puisqu'en effet, cette definition peut etre */ \ /* une fonction de ce meme format... */ #define PROKISS_ARGUMENT_P(titre_attendu,parametre_P,valeur_P_par_defaut,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_P(arguments,titre_attendu,parametre_P,valeur_P_par_defaut,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "genere_p" avec initialisation et post-traitement. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_P("titre1=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* PROCISS_ARGUMENT_P("titre2=",variable,initialisation,seq1,seqI,seqC,seqN); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define PROCISS_ARGUMENT_K(titre_attendu,parametre_K,valeur_K_par_defaut,sequenceI,sequenceC) \ Bblock \ PROCESS_PARAMETRE_K(arguments,titre_attendu,parametre_K,valeur_K_par_defaut,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "caractere" avec initialisation et post-traitement. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_K("titre1=",variable,initialisation,sequenceI,sequenceC); */ \ /* PROCISS_ARGUMENT_K("titre2=",variable,initialisation,sequenceI,sequenceC); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define PROCISS_ARGUMENT_C(titre_attendu,parametre_C,valeur_C_par_defaut,sequenceI,sequenceC) \ Bblock \ PROCESS_PARAMETRE_C(arguments,titre_attendu,parametre_C,valeur_C_par_defaut,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "chaine de caracteres" avec initialisation et post-traitement. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_C("titre1=",variable,initialisation,sequenceI,sequenceC); */ \ /* PROCISS_ARGUMENT_C("titre2=",variable,initialisation,sequenceI,sequenceC); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define PROCISS_ARGUMENT_L(titre_attendu,parametre_L,valeur_L_par_defaut,sequenceI,sequenceC) \ Bblock \ PROCESS_PARAMETRE_L(arguments,titre_attendu,parametre_L,valeur_L_par_defaut,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "Logical" avec initialisation et post-traitement. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_L("titre1=",variable,initialisation,sequenceI,sequenceC); */ \ /* PROCISS_ARGUMENT_L("titre2=",variable,initialisation,sequenceI,sequenceC); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define PROCISS_ARGUMENT_N(titre_attendu,parametre_N,valeur_N_par_defaut,sequenceI,sequenceC) \ Bblock \ PROCESS_PARAMETRE_N(arguments,titre_attendu,parametre_N,valeur_N_par_defaut,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "Logical" inverse (ou "Negate") avec initialisation et */ \ /* post-traitement. ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_N("titre1=",variable,initialisation,sequenceI,sequenceC); */ \ /* PROCISS_ARGUMENT_N("titre2=",variable,initialisation,sequenceI,sequenceC); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define PROCISS_ARGUMENT_I(titre_attendu,parametre_I,valeur_I_par_defaut,sequenceI,sequenceC) \ Bblock \ PROCESS_PARAMETRE_I(arguments \ ,titre_attendu \ ,parametre_I \ ,COND(IFET(EST_VRAI(le_format_des_images_a_ete_defini) \ ,IFEQ(parametre_I,UNDEF) \ ) \ ,valeur_I_par_defaut \ ,parametre_I \ ) \ ,sequenceI \ ,sequenceC \ ); \ Eblock \ /* Recuperation d'un argument "Int" avec initialisation et post-traitement. */ \ /* */ \ /* L'initialisation n'a lieu que si la variable etait a l'etat 'UNDEF' et seulement */ \ /* apres la definition du format des images, puisqu'en effet, cette definition peut etre */ \ /* une fonction de ce meme format... */ #define PROCISS_ARGUMENT_X(titre_attendu,parametre_X,valeur_X_par_defaut,sequenceI,sequenceC) \ Bblock \ PROCESS_PARAMETRE_X(arguments \ ,titre_attendu \ ,parametre_X \ ,COND(IFET(EST_VRAI(le_format_des_images_a_ete_defini) \ ,IFEQ(parametre_X,UNDEF) \ ) \ ,valeur_X_par_defaut \ ,parametre_X \ ) \ ,sequenceI \ ,sequenceC \ ); \ Eblock \ /* Recuperation d'un argument "Int" avec initialisation et post-traitement avec edition */ \ /* hexa-decimale (introduit le 20070421093557). */ \ /* */ \ /* L'initialisation n'a lieu que si la variable etait a l'etat 'UNDEF' et seulement */ \ /* apres la definition du format des images, puisqu'en effet, cette definition peut etre */ \ /* une fonction de ce meme format... */ #define PROCISS_ARGUMENT_F(titre_attendu,parametre_F,valeur_F_par_defaut,sequenceI,sequenceC) \ Bblock \ PROCESS_PARAMETRE_F(arguments \ ,titre_attendu \ ,parametre_F \ ,COND(IFET(EST_VRAI(le_format_des_images_a_ete_defini) \ ,IFEQ(parametre_F,FLOT__UNDEF) \ ) \ ,valeur_F_par_defaut \ ,parametre_F \ ) \ ,sequenceI \ ,sequenceC \ ); \ Eblock \ /* Recuperation d'un argument "Float" avec initialisation et post-traitement. */ \ /* */ \ /* L'initialisation n'a lieu que si la variable etait a l'etat 'FLOT__UNDEF' et seulement */ \ /* apres la definition du format des images, puisqu'en effet, cette definition peut etre */ \ /* une fonction de ce meme format... */ #define PROCISS_ARGUMENT_P(titre_attendu,parametre_P,valeur_P_par_defaut,sequenceI,sequenceC) \ Bblock \ PROCESS_PARAMETRE_P(arguments,titre_attendu,parametre_P,valeur_P_par_defaut,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "genere_p" avec initialisation et post-traitement. */ \ /* */ \ /* ATTENTION, ecrire : */ \ /* */ \ /* PROCISS_ARGUMENT_P("titre1=",variable,initialisation,sequenceI,sequenceC); */ \ /* PROCISS_ARGUMENT_P("titre2=",variable,initialisation,sequenceI,sequenceC); */ \ /* */ \ /* conduit a perdre la valeur entree si elle l'a ete par "titre1=...". */ #define GET_ARGUMENT_K(titre_attendu,parametre_K) \ Bblock \ INCK(GET_ARGUMENT_K_____Pcompteur_DAppel); \ \ GET_PARAMETRE_K(arguments,titre_attendu,parametre_K,parametre_K); \ Eblock \ /* Recuperation d'un argument "caractere". */ #define GET_ARGUMENT_C(titre_attendu,parametre_C) \ Bblock \ INCK(GET_ARGUMENT_C_____Pcompteur_DAppel); \ \ GET_PARAMETRE_C(arguments,titre_attendu,parametre_C,parametre_C); \ Eblock \ /* Recuperation d'un argument "chaine de caracteres". */ #define GET_ARGUMENT_L(titre_attendu,parametre_L) \ Bblock \ INCK(GET_ARGUMENT_L_____Pcompteur_DAppel); \ \ GET_PARAMETRE_L(arguments,titre_attendu,parametre_L,parametre_L); \ Eblock \ /* Recuperation d'un argument "Logical". */ #define GET_ARGUMENT_M(titre_attendu,parametre_M) \ Bblock \ BSaveVariable(Logical,parametre_M); \ /* Gestion du caractere "non modifiable" de cet argument fictif (le 20021207100111). */ \ \ INCK(GET_ARGUMENT_M_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_L(titre_attendu \ ,parametre_M \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ PRINT_ATTENTION("l'argument '" ## titre_attendu ## "' est fictif et donc non modifiable"); \ Eblock \ ) \ ); \ \ ESaveVariable(Logical,parametre_M); \ Eblock \ /* Recuperation d'un argument "Logical" non modifiable (introduit le 20111213080346). */ #define GET_ARGUMENT_N(titre_attendu,parametre_N) \ Bblock \ INCK(GET_ARGUMENT_N_____Pcompteur_DAppel); \ \ GET_PARAMETRE_N(arguments,titre_attendu,parametre_N,parametre_N); \ Eblock \ /* Recuperation d'un argument "Logical" inverse (ou "Negate"), voir par exemple un usage */ \ /* dans 'v $xci/disk_video_P$K utiliser_le_mode_PAL_BETA_FRAME_NUMBER_MODE'. */ #define GET_ARGUMENT_I(titre_attendu,parametre_I) \ Bblock \ INCK(GET_ARGUMENT_I_____Pcompteur_DAppel); \ \ GET_PARAMETRE_I(arguments,titre_attendu,parametre_I,parametre_I); \ Eblock \ /* Recuperation d'un argument "Int". */ #define GET_ARGUMENT_E(titre_attendu,parametre_E) \ Bblock \ BSaveVariable(Float,parametre_E); \ /* Gestion du caractere "non modifiable" de 'parametre_E' (introduit le 20021207102525). */ \ \ INCK(GET_ARGUMENT_E_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_I(titre_attendu \ ,parametre_E \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ PRINT_ATTENTION("l'argument '" ## titre_attendu ## "' est fictif et donc non modifiable"); \ Eblock \ ) \ ); \ \ ESaveVariable(Float,parametre_E); \ Eblock \ /* Recuperation d'un argument "Int" non modifiable (introduit le 20111213080346). */ #define GET_ARGUMENT_J(titre_attendu,parametre_J) \ Bblock \ BSaveVariable(Int,parametre_J); \ /* Gestion du caractere "non modifiable" de 'parametre_J' (introduit le 20021207102525). */ \ \ INCK(GET_ARGUMENT_J_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_J(titre_attendu \ ,parametre_J \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ PRINT_ATTENTION("l'argument '" ## titre_attendu ## "' est fictif et donc non modifiable"); \ Eblock \ ) \ ); \ \ ESaveVariable(Int,parametre_J); \ Eblock \ /* Recuperation d'un argument "Int" non modifiable... */ #define GET_ARGUMENT_X(titre_attendu,parametre_X) \ Bblock \ INCK(GET_ARGUMENT_X_____Pcompteur_DAppel); \ \ GET_PARAMETRE_X(arguments,titre_attendu,parametre_X,parametre_X); \ Eblock \ /* Recuperation d'un argument "Int" a editer en hexa-decimal (cela fut introduit le */ \ /* 20070420190059 pour 'v $xcg/parallele.01$K GET_ARGUMENT_X'). */ #define GET_ARGUMENT_Y(titre_attendu,parametre_Y) \ Bblock \ BSaveVariable(Int,parametre_Y); \ \ INCK(GET_ARGUMENT_Y_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_Y(titre_attendu \ ,parametre_Y \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ PRINT_ATTENTION("l'argument '" ## titre_attendu ## "' est fictif et donc non modifiable"); \ Eblock \ ) \ ); \ \ ESaveVariable(Int,parametre_Y); \ Eblock \ /* Recuperation d'un argument "Int" non modifiable et a editer en hexa-decimal (ceci */ /* fut introduit le 20070420191651 pour 'v $xcp/substitue.01$K'). */ #define GET_ARGUMENT_F(titre_attendu,parametre_F) \ Bblock \ INCK(GET_ARGUMENT_F_____Pcompteur_DAppel); \ \ GET_PARAMETRE_F(arguments,titre_attendu,parametre_F,parametre_F); \ Eblock \ /* Recuperation d'un argument "Float". */ #define GET_ARGUMENT_G(titre_attendu,parametre_G) \ Bblock \ BSaveVariable(Float,parametre_G); \ /* Gestion du caractere "non modifiable" de 'parametre_G' (introduit le 20021207102525). */ \ \ INCK(GET_ARGUMENT_G_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_F(titre_attendu \ ,parametre_G \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ PRINT_ATTENTION("l'argument '" ## titre_attendu ## "' est fictif et donc non modifiable"); \ Eblock \ ) \ ); \ \ ESaveVariable(Float,parametre_G); \ Eblock \ /* Recuperation d'un argument "Float" non modifiable... */ #define GET_ARGUMENT_P(titre_attendu,parametre_P) \ Bblock \ INCK(GET_ARGUMENT_P_____Pcompteur_DAppel); \ \ GET_PARAMETRE_P(arguments,titre_attendu,parametre_P,parametre_P); \ Eblock \ /* Recuperation d'un argument "genere_p". */ #define VALEUR_INITIALE_DE___COMPTEUR__B__ \ __COMPTEUR__B__ \ /* Introduit le 20190905082754 pour 'GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(...)'. */ #define NIVEAU_MAXIMAL_D_IMBRICATION____DES_GET_ARGUMENTSn_x \ DIX #define NIVEAU_MINIMAL_D_IMBRICATION____DES_GET_ARGUMENTSn_x \ DEUX #define CHAINE_DE_TABULATION____DES_GET_ARGUMENTSn_x \ C_VIDE /* Valeur arbitraire introduite le 20190904092406 qui correspond au niveau maximal */ /* d'imbrication des procedures 'GET_ARGUMENTSn_x(...)'. Elle correspond en fait a */ /* 'GET_ARGUMENTSa_L(...)' et a 'GET_ARGUMENTSa_N(...)'. Le niveau minimal correspond */ /* evidemment au premier niveau d'imbrication et par exemple a ''GET_ARGUMENTS2_L(...)'... */ %define GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(procedure,titre_attendu,condition,format_1,param_1,format_2,param_2,Get_n_1) \ /* Le 20190808131930, la procedure 'GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(...)' */ \ /* est passee de '$PASSE_1' a '$PASSE_4' afin de simplifier les choses. En effet, avant */ \ /* date, on trouvait ci-apres, par exemple pour la definition de 'GET_ARGUMENTS2_K(...)' : */ \ /* date, on trouvait par exemple ci-apres : */ \ /* */ \ /* #define GET_ARGUMENTS2_K(titre_attendu,parametre_K1,parametre_K2) \ */ \ /* Bblock \ */ \ /* &define nom_du_GET_ARGUMENTSn_x __MACRO__&&& \ */ \ /* GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(titre_attendu \ */ \ /* (...) \ */ \ /* Eblock */ \ /* */ \ /* En effet, il etait alors impossible de donner '__MACRO__' en argument de cette procedure */ \ /* 'GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(...)' car etant definie en '$PASSE_1', */ \ /* la valeur de '__MACRO__' etait 'GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x' et non */ \ /* pas 'GET_ARGUMENTS2_K'... */ \ Bblock \ Test(TOUJOURS_VRAI) \ /* Introduit le 20190807080656 au cas ou on souhaiterait supprimer facilement ce test... */ \ Bblock \ Test(EST_VRAI(c_est_la_premiere_recherche_des_parametres)) \ Bblock \ Test(condition) \ Bblock \ CAL3(Prme1("Dans '%s', ",FICHIER_DE_BASE_ABSOLU_x)); \ /* Depuis le passage de '$PASSE_1' a '$PASSE_4' l'edition suivante : */ \ /* */ \ /* CAL3(Prme1("Dans '%s', ",FICHIER_COURANT_ABSOLU_x)); \ */ \ /* */ \ /* donnait "$x/includes/generales/fonct.vv.def", d'ou le nouvel argument 'file' pour */ \ /* transmettre un 'FICHIER_COURANT_ABSOLU_x' correct. Cela semble venir de la "chaine" */ \ /* des definitions : */ \ /* */ \ /* FICHIER_COURANT_ABSOLU_x */ \ /* | */ \ /* -------> FICHIER_COURANT_RELATIF */ \ /* | */ \ /* -------> __FILER__ */ \ /* */ \ /* Mais en fait, les experiences du 20190808173648 montrent que cela semble beaucoup */ \ /* plus complique que cela et du certainement a une forte imbrication des procedures. */ \ /* N'oublions pas, par exemple, que 'GET_ARGUMENTS2_F(...)' est appelee en general via */ \ /* 'GET_ARGUMENTSi(...)'. */ \ /* */ \ /* On notera a cette date qu'utiliser : */ \ /* */ \ /* chain_Aconcaten3(CURRENT_DIRECTORY,cSEPARATEUR_DES_PATHS,NOM_DE_LA_COMMANDE) */ \ /* */ \ /* a la place de 'file' n'est pas la solution car, en effet, d'une part 'NOM_DE_LA_COMMANDE' */ \ /* peut etre relatif ou absolu et d'autre part, 'CURRENT_DIRECTORY' n'est pas necessairement */ \ /* le directory d'appartenance de cette commande... */ \ /* */ \ /* En fait, le 20190809094118, j'ai compris : la variable '__FILER__' est "dynamique" et */ \ /* contient donc en permanence le 'include' courant. Cela a donc conduit a l'introduction */ \ /* de 'FICHIER_DE_BASE_ABSOLU_x' qui est defini dans 'GET_PARAMETRES(...)' et donc dans */ \ /* l'include de base et en '$PASSE_3' afin de ne pas etre mal substitue en '$PASSE_1'. */ \ /* L'argument 'file' devenu inutile a donc evidemment disparu... */ \ /* */ \ /* On notera que j'ai essaye de faire aux environs du 20190809094118 : */ \ /* */ \ /* BSaveModifyVariable(Logical,Prme_____editer_les_messages_d_en_tete,VRAI); */ \ /* CAL3(Prme1("Dans '%s', ",FICHIER_DE_BASE_ABSOLU_x)); */ \ /* ESaveModifyVariable(Logical,Prme_____editer_les_messages_d_en_tete); */ \ /* */ \ /* mais, malheureusement 'NOM_COMMANDE' qui est alors edite n'est pas necessairement */ \ /* absolu, tout dependu du mode d'appel du '$X' correspondant. Et tout cela avant de */ \ /* trouver la solution universelle : celle de :FICHIER_DE_BASE_ABSOLU_x'... */ \ \ Test(IFGT(SOUS(`_COMPTEUR__B_` \ ,VALEUR_INITIALE_DE___COMPTEUR__B__ \ ) \ ,SOUS(NIVEAU_MAXIMAL_D_IMBRICATION____DES_GET_ARGUMENTSn_x \ ,NIVEAU_MINIMAL_D_IMBRICATION____DES_GET_ARGUMENTSn_x \ ) \ ) \ ) \ Bblock \ PRINT_ATTENTION("augmenter le niveau maximal d'imbrication des 'GET_ARGUMENTSn_x(...)'s."); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CAL3(Prme5("le '%*s(...)%*s' relatif a '%s' " \ ,ADD2(chain_Xtaille(procedure),`_COMPTEUR__B_`) \ ,procedure \ ,SOUS(SOUS(SOUS(NIVEAU_MAXIMAL_D_IMBRICATION____DES_GET_ARGUMENTSn_x \ ,NIVEAU_MINIMAL_D_IMBRICATION____DES_GET_ARGUMENTSn_x \ ) \ ,chain_Xtaille(CHAINE_DE_TABULATION____DES_GET_ARGUMENTSn_x) \ ) \ ,`_COMPTEUR__B_` \ ) \ ,CHAINE_DE_TABULATION____DES_GET_ARGUMENTSn_x \ ,titre_attendu \ ) \ ); \ /* Avant la modification du 20190808131930, il y avait ci-dessus : */ \ /* */ \ /* CAL3(Prme2("le '%s(...)' relatif a '%s' ",nom_du_GET_ARGUMENTSn_x,titre_attendu)); \ */ \ /* */ \ /* On notera la tabulation introduite le 20190831122149 qui permet de mettre en evidence */ \ /* les imbrications des procedures 'GET_ARGUMENTSn_x(...)', par exemple, sous la forme : */ \ /* */ \ /* 'GET_ARGUMENTS4_F(...) ' */ \ /* ' GET_ARGUMENTS3_F(...) ' */ \ /* ' GET_ARGUMENTS2_F(...) ' */ \ /* */ \ /* (je n'ai rien trouve de mieux, tout en etant simple...). */ \ /* */ \ /* On notera au passage qu'il n'est pas possible de mieux optimiser le nombre d'espaces */ \ /* qui precedent la deuxieme '$K_QS' car on ne peut pas connaitre le niveau d'imbrication */ \ /* de la premiere 'GET_ARGUMENTSn_x(...)' appelee (par exemple 'GET_ARGUMENTS4_F(...)'). */ \ /* J'ai essaye d'utiliser '`_COMPTEUR__B_`' mais cela ne marche pas : il faudrait en fait */ \ /* un decompteur qui serait initialise a 4 dans cet exemple, or cela ne pourrait se faire */ \ /* qu'a l'exterieur de 'GET_ARGUMENTS4_F(...)' puisque cette procedure pouvant etre */ \ /* elle-meme referencee par une eventuelle 'GET_ARGUMENTS5_F(...)' il est impossible */ \ /* d'y initailiser un compteur a 4... */ \ /* */ \ /* On notera que l'on ne peut pas utiliser directement '__COMPTEUR__B__' car, en effet, */ \ /* la valeur du compteur serait substitue en '$PASSE_1', alors que nous sommes ici en */ \ /* '$PASSE_3' et alors la valeur du compteur ne refleterait pas les imbrications en */ \ /* ayant toujours la meme valeur (0). On bloque donc la substitution en '$PASSE_1' grace */ \ /* a l'operateur de concatenation '$S_UNDERSCORE' qui est gere en '$PASSE_2' et donc */ \ /* entre '$PASSE_1' et '$PASSE_3'... */ \ /* */ \ /* On notera aussi que '`_COMPTEUR__B_`' est utilise avant {`_PLUS1__B_`,`_MOINS1__B_`} */ \ /* ce qui permet d'avoir au cours des imbrications la suite {0,1,2,...} et donc 0 pour */ \ /* la premiere... */ \ CALS(FPrme0("gere des arguments de valeurs par defaut differentes : ")); \ CAL3(Prme6(chain_Aconcaten5("{%c",format_1,"%c # %c",format_2,"%c}.\n") \ ,K_QUOTE,param_1,K_QUOTE \ ,K_QUOTE,param_2,K_QUOTE \ ) \ ); \ /* Dans ce cas, il est important de separer ce 'GET_ARGUMENTSn_x(...)' en autant de */ \ /* 'GET_ARGUMENT_x(...)'s que necessaire et ce afin de permettre en particulier une */ \ /* edition pertinente des valeurs par defaut des parametres ("Parametres=VRAI"). En */ \ /* contrepartie, on perd ainsi un peu en facilite d'usage puisque l'on sera alors dans */ \ /* l'obligation de definir deux (voire plus) parametres fonctionnellement voisins, mais */ \ /* differents lors de l'appel de ce '$X'... */ \ /* */ \ /* On notera l'usage de 'CAL3(Prme?(...))' ci-dessus (et non pas 'PRINT_ERREUR(...)' et */ \ /* 'CAL1(Prer?(...))') afin d'etre compatible avec 'v $xig/fonct$vv$FON CAL3(Prme9(format_' */ \ /* et ce via la commande 'use' en particulier... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ `_PLUS1__B_` \ /* Introduit le 20190831115344 afin de mettre en evidence les imbrications des */ \ /* 'GET_ARGUMENTSn_x(...)'. */ \ /* */ \ /* Comme pour '__COMPTEUR__B__' on ne peut pas utiliser directement '__PLUS1__B__'... */ \ \ BLOC(Get_n_1); \ /* Execution du GET_ARGUMENTSn_x(...)' de niveau inferieur (introduit le 20190831110352 */ \ /* sous cette forme...). */ \ \ /* Avant la modification du 20190808131930, il y avait ici : */ \ /* */ \ /* &undef nom_du_GET_ARGUMENTSn_x&&& \ */ \ /* */ \ \ `_MOINS1__B_` \ /* Introduit le 20190831115344 afin de mettre en evidence les imbrications des */ \ /* 'GET_ARGUMENTSn_x(...)'. */ \ /* */ \ /* Comme pour '__COMPTEUR__B__' on ne peut pas utiliser directement '__MOINS1__B__'... */ \ \ Eblock \ /* Validation de l'usage des 'GET_ARGUMENTS?_?(...)'. Ceci fut introduit le 20190806132343 */ \ /* suite au probleme decrit dans 'v $xci/jeu_vie.01$K 20190806104105'... */ #define GESTION_DE_L_IMBRICATION_FORMAT_UNIVERSEL(introduction,format_d_edition) \ chain_Aconcaten3(introduction,"=",format_d_edition) #define GESTION_DE_L_IMBRICATION_FORMAT_K(introduction) \ GESTION_DE_L_IMBRICATION_FORMAT_UNIVERSEL(introduction,FORMAT_CHAR_EDITION) #define GESTION_DE_L_IMBRICATION_FORMAT_C(introduction) \ GESTION_DE_L_IMBRICATION_FORMAT_UNIVERSEL(introduction,FORMAT_CHAI_EDITION) #define GESTION_DE_L_IMBRICATION_FORMAT_L(introduction) \ GESTION_DE_L_IMBRICATION_FORMAT_UNIVERSEL(introduction,FORMAT_LOGI_EDITION) #define GESTION_DE_L_IMBRICATION_FORMAT_N(introduction) \ GESTION_DE_L_IMBRICATION_FORMAT_UNIVERSEL(introduction,FORMAT_NOGI_EDITION) #define GESTION_DE_L_IMBRICATION_FORMAT_P(introduction) \ GESTION_DE_L_IMBRICATION_FORMAT_UNIVERSEL(introduction,FORMAT_INTE_EDITION) #define GESTION_DE_L_IMBRICATION_FORMAT_I(introduction) \ GESTION_DE_L_IMBRICATION_FORMAT_UNIVERSEL(introduction,FORMAT_INTE_EDITION) #define GESTION_DE_L_IMBRICATION_FORMAT_X(introduction) \ GESTION_DE_L_IMBRICATION_FORMAT_UNIVERSEL(introduction \ ,SE12(FORMAT_HEXA_DECIMAL_SANS_0_EDITION,FORMAT_HEXA_DECIMAL_EDITION) \ ) #define GESTION_DE_L_IMBRICATION_FORMAT_F(introduction) \ GESTION_DE_L_IMBRICATION_FORMAT_UNIVERSEL(introduction,FORMAT_FLOT_EDITION) /* Definitions introduites le 20190904074034... */ /* */ /* Le 20190906114010, 'FORMAT_HEXA_DECIMAL_EDITION' a ete remplace par */ /* 'FORMAT_HEXA_DECIMAL_SANS_0_EDITION' afin de supprimer les "0"s redondants en tete */ /* des valeurs hexa-decimales... */ #define GET_ARGUMENTS2_K(titre_attendu,parametre_K1,parametre_K2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_K1,parametre_K2) \ ,GESTION_DE_L_IMBRICATION_FORMAT_K("K1"),parametre_K1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_K("K2"),parametre_K2 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2_K_____Pcompteur_DAppel); \ \ GET_ARGUMENT_K(titre_attendu,parametre_K1); \ \ EGAL(parametre_K2,parametre_K1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "caractere" (introduit le 20091204091116). */ #define GET_ARGUMENTS2_C(titre_attendu,parametre_C1,parametre_C2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE_chaine(parametre_C1,parametre_C2) \ ,GESTION_DE_L_IMBRICATION_FORMAT_C("C1"),parametre_C1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_C("C2"),parametre_C2 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2_C_____Pcompteur_DAppel); \ \ GET_ARGUMENT_C(titre_attendu,parametre_C1); \ \ EGAp(parametre_C2,chain_Acopie(parametre_C1)); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "chaine de caracteres" (introduit le 20091204091116). */ #define GET_ARGUMENTS2_L(titre_attendu,parametre_L1,parametre_L2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_L1,parametre_L2) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L1"),ETAT_LOGIQUE(parametre_L1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L2"),ETAT_LOGIQUE(parametre_L2) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2_L_____Pcompteur_DAppel); \ \ GET_ARGUMENT_L(titre_attendu,parametre_L1); \ \ EGAL(parametre_L2,parametre_L1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "Logical" (introduit le 20091204091116). */ #define GET_ARGUMENTS2_N(titre_attendu,parametre_N1,parametre_N2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_N1,parametre_N2) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N1"),ETAT_LOGIQUE(parametre_N1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N2"),ETAT_LOGIQUE(parametre_N2) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2_N_____Pcompteur_DAppel); \ \ GET_ARGUMENT_N(titre_attendu,parametre_N1); \ \ EGAL(parametre_N2,parametre_N1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "Logical" inverse -ou "Negate"- (introduit le */ \ /* 20091204091116). */ #define GET_ARGUMENTS2_I(titre_attendu,parametre_I1,parametre_I2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_I1,parametre_I2) \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I1"),parametre_I1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I2"),parametre_I2 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2_I_____Pcompteur_DAppel); \ \ GET_ARGUMENT_I(titre_attendu,parametre_I1); \ \ EGAL(parametre_I2,parametre_I1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "Int" (introduit le 20091204091116). */ #define GET_ARGUMENTS2g_I(titre_attendu,parametre_I1,parametre_I2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_I1,parametre_I2) \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I1"),parametre_I1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I2"),parametre_I2 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2g_I_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE(arguments \ ,titre_attendu \ ,parametre_I1 \ ,parametre_I1 \ ,FconversionI \ ,NEUT \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ EGAL(parametre_I2,parametre_I1); \ Eblock \ ) \ ,BLOC(VIDE;) \ ,styp_I \ ,ityp_I \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "Int" plus "Generales" que 'GET_ARGUMENTS2_I(...)' */ \ /* introduite le 20180110105338 et qui permet d'ecrire par exemple : */ \ /* */ \ /* GET_ARGUMENTS2g_I("titre12=",argument1,argument2); */ \ /* (...) */ \ /* GET_ARGUMENT_I("titre1=",argument1); */ \ /* GET_ARGUMENT_I("titre2=",argument2); */ \ /* */ \ /* sans probleme (c'est-a-dire que les deux arguments ont bien les bonnes valeurs quelles */ \ /* que soient les circonstances...). */ #define GET_ARGUMENTS2_X(titre_attendu,parametre_X1,parametre_X2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_X1,parametre_X2) \ ,GESTION_DE_L_IMBRICATION_FORMAT_X("X1"),parametre_X1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_X("X2"),parametre_X2 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2_X_____Pcompteur_DAppel); \ \ GET_ARGUMENT_X(titre_attendu,parametre_X1); \ \ EGAL(parametre_X2,parametre_X1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "Int" a editer en hexa-decimal (introduit le */ \ /* 20091204091116). */ #define GET_ARGUMENTS2_F(titre_attendu,parametre_F1,parametre_F2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFET(IFNE(parametre_F1,parametre_F2) \ ,IFET(IFNE_chaine(titre_attendu,"DepthCueingMinimal=dcm=") \ ,TOUJOURS_VRAI \ ) \ ) \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F1"),parametre_F1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F2"),parametre_F2 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2_F_____Pcompteur_DAppel); \ \ GET_ARGUMENT_F(titre_attendu,parametre_F1); \ \ EGAL(parametre_F2,parametre_F1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "Float" (introduit le 20091204091116). */ \ /* */ \ /* Le traitement specifique de "DepthCueingMinimal=dcm=" introduit le 20190807091111 */ \ /* ('v $xrv/champs_5.1A$I GET_ARGUMENTS2_F..DepthCueingMinimal=..dcm=..') est du aux */ \ /* programmes : */ \ /* */ \ /* $xrq/Hspherik.21$K */ \ /* $xrq/hydrogene.21$K */ \ /* $xrq/hydrogene.51$K */ \ /* */ \ /* $xrv/champs_5.10$K */ \ /* $xrv/champs_5.20$K */ \ /* $xrv/champs_5.30$K */ \ /* */ \ /* Pour lesquels on a : */ \ /* */ \ /* F1=+0 */ \ /* F2=+0.25 */ \ /* */ \ /* car, en effet, ils redefinissent {PROFONDEUR_MINIMALE,PROFONDEUR_MINIMALE_DE_TRONCATION} */ \ /* qui servent a initialiser {profondeur_minimale,profondeur_minimale_de_troncation} (voir */ \ /* 'v $xrq/Hspherik.21$K PROFONDEUR_MINIMALE' par exemple...). */ \ /* */ \ /* Tout cela n'est peut-etre pas tres elegant, mais je n'ai rien trouve de plus simple */ \ /* afin, en particulier, de garantir la compatibilite anterieure... */ \ /* */ \ /* D'ailleurs, au passage, {PROFONDEUR_MINIMALE,PROFONDEUR_MINIMALE_DE_TRONCATION} sont */ \ /* redefinies differemment et {profondeur_minimale,profondeur_minimale_de_troncation} sont */ \ /* donc initialisees differemment, mais cela semble en fait "gomme" (et donc ignore) ici */ \ /* via ce 'GET_ARGUMENTS2_F(...)' a cause du 'EGAL(parametre_F2,parametre_F1)'... */ \ /* */ \ /* Le 20190807120424 fut introduit 'IFET...,TOUJOURS_VRAI)' afin de prevoir l'avenir (cas */ \ /* ou d'autres 'titre_attendu's a exclure devraient etre introduits...). */ #define GET_ARGUMENTS2g_F(titre_attendu,parametre_F1,parametre_F2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_F1,parametre_F2) \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F1"),parametre_F1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F2"),parametre_F2 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2g_F_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE(arguments \ ,titre_attendu \ ,parametre_F1 \ ,parametre_F1 \ ,FconversionF \ ,NEUT \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ EGAL(parametre_F2,parametre_F1); \ Eblock \ ) \ ,BLOC(VIDE;) \ ,styp_F \ ,ityp_F \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "Float" plus "Generales" que 'GET_ARGUMENTS2_F(...)' */ \ /* introduite le 20180110105338 et qui permet d'ecrire par exemple : */ \ /* */ \ /* GET_ARGUMENTS2g_F("titre12=",argument1,argument2); */ \ /* (...) */ \ /* GET_ARGUMENT_F("titre1=",argument1); */ \ /* GET_ARGUMENT_F("titre2=",argument2); */ \ /* */ \ /* sans probleme (c'est-a-dire que les deux arguments ont bien les bonnes valeurs quelles */ \ /* que soient les circonstances...). */ #define GET_ARGUMENTS2_P(titre_attendu,parametre_P1,parametre_P2) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_P1,parametre_P2) \ ,GESTION_DE_L_IMBRICATION_FORMAT_P("P1"),parametre_P1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_P("P2"),parametre_P2 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS2_P_____Pcompteur_DAppel); \ \ GET_ARGUMENT_P(titre_attendu,parametre_P1); \ \ EGAL(parametre_P2,parametre_P1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de deux arguments "genere_p" (introduit le 20091204091116). */ #define GET_ARGUMENTS3_K(titre_attendu,parametre_K1,parametre_K2,parametre_K3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_K1,parametre_K3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_K("K1"),parametre_K1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_K("K3"),parametre_K3 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3_K_____Pcompteur_DAppel); \ \ GET_ARGUMENTS2_K(titre_attendu \ ,parametre_K1 \ ,parametre_K2 \ ); \ \ EGAL(parametre_K3,parametre_K1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "caractere" (introduit le 20111018094618). */ #define GET_ARGUMENTS3_C(titre_attendu,parametre_C1,parametre_C2,parametre_C3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE_chaine(parametre_C1,parametre_C3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_C("C1"),parametre_C1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_C("C3"),parametre_C3 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3_C_____Pcompteur_DAppel); \ \ GET_ARGUMENTS2_C(titre_attendu \ ,parametre_C1 \ ,parametre_C2 \ ); \ \ EGAp(parametre_C3,chain_Acopie(parametre_C1)); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "chaine de caracteres" (introduit le 20111018094618). */ #define GET_ARGUMENTS3_L(titre_attendu,parametre_L1,parametre_L2,parametre_L3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_L1,parametre_L3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L1"),ETAT_LOGIQUE(parametre_L1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L3"),ETAT_LOGIQUE(parametre_L3) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3_L_____Pcompteur_DAppel); \ \ GET_ARGUMENTS2_L(titre_attendu \ ,parametre_L1 \ ,parametre_L2 \ ); \ \ EGAL(parametre_L3,parametre_L1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "Logical" (introduit le 20111018094618). */ #define GET_ARGUMENTS3_N(titre_attendu,parametre_N1,parametre_N2,parametre_N3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_N1,parametre_N3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N1"),ETAT_LOGIQUE(parametre_N1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N3"),ETAT_LOGIQUE(parametre_N3) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3_N_____Pcompteur_DAppel); \ \ GET_ARGUMENTS2_N(titre_attendu \ ,parametre_N1 \ ,parametre_N2 \ ); \ \ EGAL(parametre_N3,parametre_N1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "Logical" inverse -ou "Negate"- (introduit le */ \ /* 20111018094618). */ #define GET_ARGUMENTS3_I(titre_attendu,parametre_I1,parametre_I2,parametre_I3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_I1,parametre_I3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I1"),parametre_I1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I3"),parametre_I3 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3_I_____Pcompteur_DAppel); \ \ GET_ARGUMENTS2_I(titre_attendu \ ,parametre_I1 \ ,parametre_I2 \ ); \ \ EGAL(parametre_I3,parametre_I1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "Int" (introduit le 20111018094618). */ #define GET_ARGUMENTS3g_I(titre_attendu,parametre_I1,parametre_I2,parametre_I3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_I1,parametre_I3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I1"),parametre_I1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I3"),parametre_I3 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3g_I_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE(arguments \ ,titre_attendu \ ,parametre_I1 \ ,parametre_I1 \ ,FconversionI \ ,NEUT \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ EGAL(parametre_I2,parametre_I1); \ EGAL(parametre_I3,parametre_I1); \ Eblock \ ) \ ,BLOC(VIDE;) \ ,styp_I \ ,ityp_I \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "Int" plus "Generales" que 'GET_ARGUMENTS3_I(...)' */ \ /* introduite le 20180110105338 (pour 'v $xrf/EpongeDeMenger.01$K GET_ARGUMENTS3g_I') */ \ /* et qui permet d'ecrire par exemple : */ \ /* */ \ /* GET_ARGUMENTS3g_I("titre123=",argument1,argument2,argument3); */ \ /* (...) */ \ /* GET_ARGUMENT_I("titre1=",argument1); */ \ /* GET_ARGUMENT_I("titre2=",argument2); */ \ /* GET_ARGUMENT_I("titre3=",argument3); */ \ /* */ \ /* sans probleme (c'est-a-dire que les trois arguments ont bien les bonnes valeurs quelles */ \ /* que soient les circonstances...). */ #define GET_ARGUMENTS3_X(titre_attendu,parametre_X1,parametre_X2,parametre_X3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_X1,parametre_X3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_X("X1"),parametre_X1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_X("X3"),parametre_X3 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3_X_____Pcompteur_DAppel); \ \ GET_ARGUMENTS2_X(titre_attendu \ ,parametre_X1 \ ,parametre_X2 \ ); \ \ EGAL(parametre_X3,parametre_X1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "Int" a editer en hexa-decimal (introduit le */ \ /* 20111018094618). */ #define GET_ARGUMENTS3_F(titre_attendu,parametre_F1,parametre_F2,parametre_F3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_F1,parametre_F3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F1"),parametre_F1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F3"),parametre_F3 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3_F_____Pcompteur_DAppel); \ \ GET_ARGUMENTS2_F(titre_attendu \ ,parametre_F1 \ ,parametre_F2 \ ); \ \ EGAL(parametre_F3,parametre_F1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "Float" (introduit le 20111018094618). */ #define GET_ARGUMENTS3g_F(titre_attendu,parametre_F1,parametre_F2,parametre_F3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_F1,parametre_F3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F1"),parametre_F1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F3"),parametre_F3 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3g_F_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE(arguments \ ,titre_attendu \ ,parametre_F1 \ ,parametre_F1 \ ,FconversionF \ ,NEUT \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ EGAL(parametre_F2,parametre_F1); \ EGAL(parametre_F3,parametre_F1); \ Eblock \ ) \ ,BLOC(VIDE;) \ ,styp_F \ ,ityp_F \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "Float" plus "Generales" que 'GET_ARGUMENTS3_F(...)' */ \ /* introduite le 20180110105338 (pour 'v $xrf/EpongeDeMenger.01$K GET_ARGUMENTS3g_F') */ \ /* et qui permet d'ecrire par exemple : */ \ /* */ \ /* GET_ARGUMENTS3g_F("titre123=",argument1,argument2,argument3); */ \ /* (...) */ \ /* GET_ARGUMENT_F("titre1=",argument1); */ \ /* GET_ARGUMENT_F("titre2=",argument2); */ \ /* GET_ARGUMENT_F("titre3=",argument3); */ \ /* */ \ /* sans probleme (c'est-a-dire que les trois arguments ont bien les bonnes valeurs quelles */ \ /* que soient les circonstances...). */ #define GET_ARGUMENTS3_P(titre_attendu,parametre_P1,parametre_P2,parametre_P3) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_P1,parametre_P3) \ ,GESTION_DE_L_IMBRICATION_FORMAT_P("P1"),parametre_P1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_P("P3"),parametre_P3 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS3_P_____Pcompteur_DAppel); \ \ GET_ARGUMENTS2_P(titre_attendu \ ,parametre_P1 \ ,parametre_P2 \ ); \ \ EGAL(parametre_P3,parametre_P1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de trois arguments "genere_p" (introduit le 20111018094618). */ #define GET_ARGUMENTS4_K(titre_attendu,parametre_K1,parametre_K2,parametre_K3,parametre_K4) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_K1,parametre_K4) \ ,GESTION_DE_L_IMBRICATION_FORMAT_K("K1"),parametre_K1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_K("K4"),parametre_K4 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS4_K_____Pcompteur_DAppel); \ \ GET_ARGUMENTS3_K(titre_attendu \ ,parametre_K1 \ ,parametre_K2 \ ,parametre_K3 \ ); \ \ EGAL(parametre_K4,parametre_K1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de quatre arguments "caractere" (introduit le 20111018094618). */ #define GET_ARGUMENTS4_C(titre_attendu,parametre_C1,parametre_C2,parametre_C3,parametre_C4) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE_chaine(parametre_C1,parametre_C4) \ ,GESTION_DE_L_IMBRICATION_FORMAT_C("C1"),parametre_C1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_C("C4"),parametre_C4 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS4_C_____Pcompteur_DAppel); \ \ GET_ARGUMENTS3_C(titre_attendu \ ,parametre_C1 \ ,parametre_C2 \ ,parametre_C3 \ ); \ \ EGAp(parametre_C4,chain_Acopie(parametre_C1)); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de quatre arguments "chaine de caracteres" (introduit le 20111018094618). */ #define GET_ARGUMENTS4_L(titre_attendu,parametre_L1,parametre_L2,parametre_L3,parametre_L4) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_L1,parametre_L4) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L1"),ETAT_LOGIQUE(parametre_L1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L4"),ETAT_LOGIQUE(parametre_L4) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS4_L_____Pcompteur_DAppel); \ \ GET_ARGUMENTS3_L(titre_attendu \ ,parametre_L1 \ ,parametre_L2 \ ,parametre_L3 \ ); \ \ EGAL(parametre_L4,parametre_L1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de quatre arguments "Logical" (introduit le 20111018094618). */ #define GET_ARGUMENTS4_N(titre_attendu,parametre_N1,parametre_N2,parametre_N3,parametre_N4) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_N1,parametre_N4) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N1"),ETAT_LOGIQUE(parametre_N1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N4"),ETAT_LOGIQUE(parametre_N4) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS4_N_____Pcompteur_DAppel); \ \ GET_ARGUMENTS3_N(titre_attendu \ ,parametre_N1 \ ,parametre_N2 \ ,parametre_N3 \ ); \ \ EGAL(parametre_N4,parametre_N1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de quatre arguments "Logical" inverse -ou "Negate"- (introduit le */ \ /* 20111018094618). */ #define GET_ARGUMENTS4_I(titre_attendu,parametre_I1,parametre_I2,parametre_I3,parametre_I4) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_I1,parametre_I4) \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I1"),parametre_I1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_I("I4"),parametre_I4 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS4_I_____Pcompteur_DAppel); \ \ GET_ARGUMENTS3_I(titre_attendu \ ,parametre_I1 \ ,parametre_I2 \ ,parametre_I3 \ ); \ \ EGAL(parametre_I4,parametre_I1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de quatre arguments "Int" (introduit le 20111018094618). */ #define GET_ARGUMENTS4_X(titre_attendu,parametre_X1,parametre_X2,parametre_X3,parametre_X4) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_X1,parametre_X4) \ ,GESTION_DE_L_IMBRICATION_FORMAT_X("X1"),parametre_X1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_X("X4"),parametre_X4 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS4_X_____Pcompteur_DAppel); \ \ GET_ARGUMENTS3_X(titre_attendu \ ,parametre_X1 \ ,parametre_X2 \ ,parametre_X3 \ ); \ \ EGAL(parametre_X4,parametre_X1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de quatre arguments "Int" a editer en hexa-decimal (introduit le */ \ /* 20111018094618). */ #define GET_ARGUMENTS4_F(titre_attendu,parametre_F1,parametre_F2,parametre_F3,parametre_F4) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_F1,parametre_F4) \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F1"),parametre_F1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_F("F4"),parametre_F4 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS4_F_____Pcompteur_DAppel); \ \ GET_ARGUMENTS3_F(titre_attendu \ ,parametre_F1 \ ,parametre_F2 \ ,parametre_F3 \ ); \ \ EGAL(parametre_F4,parametre_F1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de quatre arguments "Float" (introduit le 20111018094618). */ \ /* */ \ /* On notera que pour tester le bon fonctionnement du dispositif de validation, il suffit, */ \ /* par exemple, d'introduire dans 'v $xci/jeu_vie.01$K' l'appel suivant : */ \ /* */ \ /* GET_ARGUMENTS4_F */ \ /* ("arg1=""arg2=" */ \ /* ,Ijeu_de_la_vie_generalise_____force_de_la_vie */ \ /* ,Ijeu_de_la_vie_generalise_variable_____rapport_critique */ \ /* ,Ijeu_de_la_vie_generalise_____rapport_critique */ \ /* ,Pconvolution_____ponderation_de_Pconvolution_____maximum_sur_la_spirale */ \ /* ); */ \ /* */ \ /* qui evidemment ne correspond a rien de "coherent" (il s'agit juste d'un test...). */ #define GET_ARGUMENTS4_P(titre_attendu,parametre_P1,parametre_P2,parametre_P3,parametre_P4) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(parametre_P1,parametre_P4) \ ,GESTION_DE_L_IMBRICATION_FORMAT_P("P1"),parametre_P1 \ ,GESTION_DE_L_IMBRICATION_FORMAT_P("P4"),parametre_P4 \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS4_P_____Pcompteur_DAppel); \ \ GET_ARGUMENTS3_P(titre_attendu \ ,parametre_P1 \ ,parametre_P2 \ ,parametre_P3 \ ); \ \ EGAL(parametre_P4,parametre_P1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de quatre arguments "genere_p" (introduit le 20111018094618). */ #define GET_ARGUMENTS5_L(titre_attendu,param_L1,param_L2,param_L3,param_L4,param_L5) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_L1,param_L5) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L1"),ETAT_LOGIQUE(param_L1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L5"),ETAT_LOGIQUE(param_L5) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS5_L_____Pcompteur_DAppel); \ \ GET_ARGUMENTS4_L(titre_attendu \ ,param_L1 \ ,param_L2 \ ,param_L3 \ ,param_L4 \ ); \ \ EGAL(param_L5,param_L1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de cinq arguments "Logical" (introduit le 20150528123220). */ #define GET_ARGUMENTS5_N(titre_attendu,param_N1,param_N2,param_N3,param_N4,param_N5) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_N1,param_N5) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N1"),ETAT_LOGIQUE(param_N1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N5"),ETAT_LOGIQUE(param_N5) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS5_N_____Pcompteur_DAppel); \ \ GET_ARGUMENTS4_N(titre_attendu \ ,param_N1 \ ,param_N2 \ ,param_N3 \ ,param_N4 \ ); \ \ EGAL(param_N5,param_N1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de cinq arguments "Logical" inverse -ou "Negate"- (introduit le */ \ /* 20150528123220). */ #define GET_ARGUMENTS6_L(titre_attendu,param_L1,param_L2,param_L3,param_L4,param_L5,param_L6) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_L1,param_L6) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L1"),ETAT_LOGIQUE(param_L1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L6"),ETAT_LOGIQUE(param_L6) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS6_L_____Pcompteur_DAppel); \ \ GET_ARGUMENTS5_L(titre_attendu \ ,param_L1 \ ,param_L2 \ ,param_L3 \ ,param_L4 \ ,param_L5 \ ); \ \ EGAL(param_L6,param_L1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de six arguments "Logical" (introduit le 20150528123220). */ #define GET_ARGUMENTS6_N(titre_attendu,param_N1,param_N2,param_N3,param_N4,param_N5,param_N6) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_N1,param_N6) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N1"),ETAT_LOGIQUE(param_N1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N6"),ETAT_LOGIQUE(param_N6) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS6_N_____Pcompteur_DAppel); \ \ GET_ARGUMENTS5_N(titre_attendu \ ,param_N1 \ ,param_N2 \ ,param_N3 \ ,param_N4 \ ,param_N5 \ ); \ \ EGAL(param_N6,param_N1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de six arguments "Logical" inverse -ou "Negate"- (introduit le */ \ /* 20150528123220). */ #define GET_ARGUMENTS7_L(titre_attendu,param_L1,param_L2,param_L3,param_L4,param_L5,param_L6,param_L7) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_L1,param_L7) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L1"),ETAT_LOGIQUE(param_L1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L7"),ETAT_LOGIQUE(param_L7) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS7_L_____Pcompteur_DAppel); \ \ GET_ARGUMENTS6_L(titre_attendu \ ,param_L1 \ ,param_L2 \ ,param_L3 \ ,param_L4 \ ,param_L5 \ ,param_L6 \ ); \ \ EGAL(param_L7,param_L1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de sept arguments "Logical" (introduit le 20150528123220). */ #define GET_ARGUMENTS7_N(titre_attendu,param_N1,param_N2,param_N3,param_N4,param_N5,param_N6,param_N7) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_N1,param_N7) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N1"),ETAT_LOGIQUE(param_N1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N7"),ETAT_LOGIQUE(param_N7) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS7_N_____Pcompteur_DAppel); \ \ GET_ARGUMENTS6_N(titre_attendu \ ,param_N1 \ ,param_N2 \ ,param_N3 \ ,param_N4 \ ,param_N5 \ ,param_N6 \ ); \ \ EGAL(param_N7,param_N1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de sept arguments "Logical" inverse -ou "Negate"- (introduit le */ \ /* 20150528123220). */ #define GET_ARGUMENTS8_L(titre_attendu,param_L1,param_L2,param_L3,param_L4,param_L5,param_L6,param_L7,param_L8) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_L1,param_L8) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L1"),ETAT_LOGIQUE(param_L1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L8"),ETAT_LOGIQUE(param_L8) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS8_L_____Pcompteur_DAppel); \ \ GET_ARGUMENTS7_L(titre_attendu \ ,param_L1 \ ,param_L2 \ ,param_L3 \ ,param_L4 \ ,param_L5 \ ,param_L6 \ ,param_L7 \ ); \ \ EGAL(param_L8,param_L1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de huit arguments "Logical" (introduit le 20150528123220). */ #define GET_ARGUMENTS8_N(titre_attendu,param_N1,param_N2,param_N3,param_N4,param_N5,param_N6,param_N7,param_N8) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_N1,param_N8) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N1"),ETAT_LOGIQUE(param_N1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N8"),ETAT_LOGIQUE(param_N8) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS8_N_____Pcompteur_DAppel); \ \ GET_ARGUMENTS7_N(titre_attendu \ ,param_N1 \ ,param_N2 \ ,param_N3 \ ,param_N4 \ ,param_N5 \ ,param_N6 \ ,param_N7 \ ); \ \ EGAL(param_N8,param_N1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de huit arguments "Logical" inverse -ou "Negate"- (introduit le */ \ /* 20150528123220). */ #define GET_ARGUMENTS9_L(titre_attendu,param_L1,param_L2,param_L3,param_L4,param_L5,param_L6,param_L7,param_L8,param_L9) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_L1,param_L9) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L1"),ETAT_LOGIQUE(param_L1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L9"),ETAT_LOGIQUE(param_L9) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS9_L_____Pcompteur_DAppel); \ \ GET_ARGUMENTS8_L(titre_attendu \ ,param_L1 \ ,param_L2 \ ,param_L3 \ ,param_L4 \ ,param_L5 \ ,param_L6 \ ,param_L7 \ ,param_L8 \ ); \ \ EGAL(param_L9,param_L1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de neuf arguments "Logical" (introduit le 20150528124434). */ #define GET_ARGUMENTS9_N(titre_attendu,param_N1,param_N2,param_N3,param_N4,param_N5,param_N6,param_N7,param_N8,param_N9) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_N1,param_N9) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N1"),ETAT_LOGIQUE(param_N1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N9"),ETAT_LOGIQUE(param_N9) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTS9_N_____Pcompteur_DAppel); \ \ GET_ARGUMENTS8_N(titre_attendu \ ,param_N1 \ ,param_N2 \ ,param_N3 \ ,param_N4 \ ,param_N5 \ ,param_N6 \ ,param_N7 \ ,param_N8 \ ); \ \ EGAL(param_N9,param_N1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de neuf arguments "Logical" inverse -ou "Negate"- (introduit le */ \ /* 20150528124434). */ #define GET_ARGUMENTSa_L(titre_attendu,param_L1,param_L2,param_L3,param_L4,param_L5,param_L6,param_L7,param_L8,param_L9,param_La) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_L1,param_La) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("L1"),ETAT_LOGIQUE(param_L1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_L("La"),ETAT_LOGIQUE(param_La) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTSa_L_____Pcompteur_DAppel); \ \ GET_ARGUMENTS9_L(titre_attendu \ ,param_L1 \ ,param_L2 \ ,param_L3 \ ,param_L4 \ ,param_L5 \ ,param_L6 \ ,param_L7 \ ,param_L8 \ ,param_L9 \ ); \ \ EGAL(param_La,param_L1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de dix arguments "Logical" (introduit le 20150528124434). */ #define GET_ARGUMENTSa_N(titre_attendu,param_N1,param_N2,param_N3,param_N4,param_N5,param_N6,param_N7,param_N8,param_N9,param_Na) \ Bblock \ GESTION_DE_L_IMBRICATION____DES_GET_ARGUMENTSn_x(__MACRO__,titre_attendu \ ,IFNE(param_N1,param_Na) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("N1"),ETAT_LOGIQUE(param_N1) \ ,GESTION_DE_L_IMBRICATION_FORMAT_N("Na"),ETAT_LOGIQUE(param_Na) \ ,BLOC(Bblock \ INCK(GET_ARGUMENTSa_N_____Pcompteur_DAppel); \ \ GET_ARGUMENTS9_N(titre_attendu \ ,param_N1 \ ,param_N2 \ ,param_N3 \ ,param_N4 \ ,param_N5 \ ,param_N6 \ ,param_N7 \ ,param_N8 \ ,param_N9 \ ); \ \ EGAL(param_Na,param_N1); \ Eblock \ ) \ ); \ Eblock \ /* Recuperation de dix arguments "Logical" inverse -ou "Negate"- (introduit le */ \ /* 20150528124434). */ #define PROKESS_ARGUMENT_K(titre_attendu,parametre_K,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_K(arguments,titre_attendu,parametre_K,parametre_K,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "caractere" avec execution d'un post-traitement. */ #define PROKESS_ARGUMENT_C(titre_attendu,parametre_C,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_C(arguments,titre_attendu,parametre_C,parametre_C,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "chaine de caracteres" avec execution d'un post-traitement. */ #define PROKESS_ARGUMENT_L(titre_attendu,parametre_L,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_L(arguments,titre_attendu,parametre_L,parametre_L,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "Logical" avec execution d'un post-traitement. */ #define PROKESS_ARGUMENT_N(titre_attendu,parametre_N,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_N(arguments,titre_attendu,parametre_N,parametre_N,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "Logical" inverse (ou "Negate") avec execution d'un */ \ /* post-traitement. */ #define PROKESS_ARGUMENT_I(titre_attendu,parametre_I,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_I(arguments,titre_attendu,parametre_I,parametre_I,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "Int" avec execution d'un post-traitement. */ #define PROKESS_ARGUMENT_X(titre_attendu,parametre_X,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_X(arguments,titre_attendu,parametre_X,parametre_X,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "Int" avec execution d'un post-traitement avec edition */ \ /* hexa-decimale (introduit le 20070421093557). */ #define PROKESS_ARGUMENT_F(titre_attendu,parametre_F,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_F(arguments,titre_attendu,parametre_F,parametre_F,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "Float" avec execution d'un post-traitement. */ #define PROKESS_ARGUMENT_P(titre_attendu,parametre_P,seq1,seqI,seqC,seqN) \ Bblock \ PROKESS_PARAMETRE_P(arguments,titre_attendu,parametre_P,parametre_P,seq1,seqI,seqC,seqN); \ Eblock \ /* Recuperation d'un argument "genere_p" avec execution d'un post-traitement. */ #define PROKESF_ARGUMENT_C(titre_attendu,parametre_C,seq1,seqI,seqC,seqN) \ Bblock \ INCK(PROKESF_ARGUMENT_C_____Pcompteur_DAppel); \ \ gPROCESS_PARAMETRE(arguments \ ,titre_attendu \ ,parametre_C \ ,parametre_C \ ,FconversionC \ ,NEUT \ ,seq1 \ ,seqI \ ,NE_PAS_FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE \ ,seqC \ ,seqN \ ,styp_C \ ,PERMETTRE_LES_ABREVIATIONS_DANS_gPROCESS_PARAMETRE \ ,ityp_C \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un argument "chaine de caracteres" avec execution d'un post-traitement */ \ /* avec forcage de l'execution de 'seqC' au "dernier tour" introduit le 20000207110651. */ \ /* C'est "Forcage" qui justifie le 'F' de 'PROCESF_ARGUMENT_C'... */ \ /* */ \ /* Enfin, on notera que je n'ai introduit que 'PROCESF_ARGUMENT_C(...)' (et pas les */ \ /* {_K,_L,_I,_F,_P} par symetrie) car lui-seul a de l'interet associe a la lecture de */ \ /* fichiers. Mais si besoin etait, cela serait simple que de les introduire... */ \ /* */ \ /* En fait, j'ai decouvert le 20000207173145 que cela ne marchait pas. En effet, tout */ \ /* argument de ce type va donc voir l'execution forcee de 'seqC' lors du dernier */ \ /* tour ; or cela n'est pas toujours souhaite. Ainsi, dans le cas de fichiers, on peut */ \ /* vouloir donner a tous leurs elements la valeur par defaut et non pas les connecter */ \ /* au "pipe". Donc : */ \ /* */ \ /* FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE */ \ /* */ \ /* a ete remplace par : */ \ /* */ \ /* NE_PAS_FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE */ \ /* */ \ /* et ainsi on devrait revenir a la version anterieure, sans malgre tout detruire cette */ \ /* possibilite... */ \ /* */ \ /* Le 20030704142017, les abreviations ont ete autorisees uniquement dans la definition */ \ /* de 'PROCESF_ARGUMENT_C(...)'. */ #define PROKESF_ARGUMENT_FICHIER(titre_attendu,nom_du_fichier,liste_des_valeurs,valeur_par_defaut,transformation,generation) \ Bblock \ INCK(PROKESF_ARGUMENT_FICHIER_____Pcompteur_DAppel); \ \ PROKESF_ARGUMENT_C(titre_attendu,nom_du_fichier \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ,BLOC(transformation(nom_du_fichier \ ,liste_des_valeurs \ ,valeur_par_defaut \ ); \ ) \ ,BLOC(generation(liste_des_valeurs,valeur_par_defaut);) \ ); \ Eblock \ /* Recuperation d'un argument de type "fichier" (introduit le 20190408143526)... */ /* On notera le passage de "_____xxxx" a "____________________xxxx" le 20021105094657 */ /* dans la definition des 'DebutParametres...' et 'FinParametres...' afin qu'ils soient */ /* plus visibles... */ #define PROCESS_ARGUMENT_K(titre_attendu,parametre_K,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_K_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_K(arguments,titre_attendu,parametre_K,parametre_K,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "caractere" avec execution d'un post-traitement. */ #define PROCESS_ARGUMENT_C(titre_attendu,parametre_C,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_C_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_C(arguments,titre_attendu,parametre_C,parametre_C,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "chaine de caracteres" avec execution d'un post-traitement. */ #define PROCESS_ARGUMENT_FICHIER(titre_attendu,nom_du_fichier,liste_des_valeurs,valeur_par_defaut,transformation) \ Bblock \ INCK(PROCESS_ARGUMENT_FICHIER_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_C(titre_attendu,nom_du_fichier \ ,BLOC(VIDE;) \ ,BLOC(transformation(nom_du_fichier \ ,liste_des_valeurs \ ,valeur_par_defaut \ ); \ ) \ ); \ Eblock \ /* Recuperation d'un argument de type "fichier" (introduit le 20190403133126 et completes */ \ /* le 20190403141454, puis simplifie le 20190404081830)... */ #define PROCESS_ARGUMENT_L(titre_attendu,parametre_L,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_L_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_L(arguments,titre_attendu,parametre_L,parametre_L,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "Logical" avec execution d'un post-traitement. */ #define PROCESS_ARGUMENT_N(titre_attendu,parametre_N,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_N_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_N(arguments,titre_attendu,parametre_N,parametre_N,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "Logical" inverse (ou "Negate") avec execution d'un */ \ /* post-traitement. */ \ /* */ \ /* ATTENTION : en ce qui concerne l'usage de 'PROCESS_ARGUMENT_N(...)', il est suggere de */ \ /* consulter 'v $xig/fonct$vv$DEF .carree=' ou encore 'v $xci/gauss$K 20071226163024'... */ #define PROCESS_ARGUMENT_I(titre_attendu,parametre_I,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_I_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_I(arguments,titre_attendu,parametre_I,parametre_I,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "Int" avec execution d'un post-traitement. */ #define PROCESS_ARGUMENT_J(titre_attendu,parametre_J,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_J_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_J(arguments,titre_attendu,parametre_J,parametre_J,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "Int" avec execution d'un post-traitement (introduit le */ \ /* 20111213132424). */ #define PROCESS_ARGUMENT_X(titre_attendu,parametre_X,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_X_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_X(arguments,titre_attendu,parametre_X,parametre_X,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "Int" avec execution d'un post-traitement avec edition */ \ /* hexa-decimale (introduit le 20070421093557). */ #define PROCESS_ARGUMENT_Y(titre_attendu,parametre_Y,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_Y_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_Y(arguments,titre_attendu,parametre_Y,parametre_Y,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "Int" avec execution d'un post-traitement avec edition */ \ /* hexa-decimale (introduit le 20111213132424). */ #define PROCESS_ARGUMENT_F(titre_attendu,parametre_F,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_F_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_F(arguments,titre_attendu,parametre_F,parametre_F,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "Float" avec execution d'un post-traitement. */ #define PROCESS_ARGUMENT_P(titre_attendu,parametre_P,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENT_P_____Pcompteur_DAppel); \ \ PROCESS_PARAMETRE_P(arguments,titre_attendu,parametre_P,parametre_P,sequenceI,sequenceC); \ Eblock \ /* Recuperation d'un argument "genere_p" avec execution d'un post-traitement. */ #define PROCESS_ARGUMENTS2_K(titre_attendu,parametre_K1,parametre_K2,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENTS2_K_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_K(titre_attendu,parametre_K1,sequenceI,sequenceC); \ EGAL(parametre_K2,parametre_K1); \ Eblock \ /* Recuperation de deux arguments "caractere" avec execution d'un post-traitement */ \ /* (introduit le 20100105100659). */ #define PROCESS_ARGUMENTS2_C(titre_attendu,parametre_C1,parametre_C2,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENTS2_C_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_C(titre_attendu,parametre_C1,sequenceI,sequenceC); \ EGAp(parametre_C2,chain_Acopie(parametre_C1)); \ Eblock \ /* Recuperation de deux arguments "chaine de caracteres" avec execution d'un post-traitement */ \ /* (introduit le 20100105100659). */ #define PROCESS_ARGUMENTS2_L(titre_attendu,parametre_L1,parametre_L2,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENTS2_L_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_L(titre_attendu,parametre_L1,sequenceI,sequenceC); \ EGAL(parametre_L2,parametre_L1); \ Eblock \ /* Recuperation de deux arguments "Logical" avec execution d'un post-traitement */ \ /* (introduit le 20100105100659). */ #define PROCESS_ARGUMENTS2_N(titre_attendu,parametre_N1,parametre_N2,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENTS2_N_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_N(titre_attendu,parametre_N1,sequenceI,sequenceC); \ EGAL(parametre_N2,parametre_N1); \ Eblock \ /* Recuperation de deux arguments "Logical" inverse (ou "Negate") avec execution d'un */ \ /* post-traitement (introduit le 20100105100659). */ #define PROCESS_ARGUMENTS2_I(titre_attendu,parametre_I1,parametre_I2,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENTS2_I_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_I(titre_attendu,parametre_I1,sequenceI,sequenceC); \ EGAL(parametre_I2,parametre_I1); \ Eblock \ /* Recuperation de deux arguments "Int" avec execution d'un post-traitement */ \ /* (introduit le 20100105100659). */ #define PROCESS_ARGUMENTS2_X(titre_attendu,parametre_X1,parametre_X2,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENTS2_X_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_X(titre_attendu,parametre_X1,sequenceI,sequenceC); \ EGAL(parametre_X2,parametre_X1); \ Eblock \ /* Recuperation de deux arguments "Int" avec execution d'un post-traitement avec edition */ \ /* hexa-decimale (introduit le 20100105100659). */ #define PROCESS_ARGUMENTS2_F(titre_attendu,parametre_F1,parametre_F2,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENTS2_F_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_F(titre_attendu,parametre_F1,sequenceI,sequenceC); \ EGAL(parametre_F2,parametre_F1); \ Eblock \ /* Recuperation de deux arguments "Float" avec execution d'un post-traitement */ \ /* (introduit le 20100105100659). */ #define PROCESS_ARGUMENTS2_P(titre_attendu,parametre_P1,parametre_P2,sequenceI,sequenceC) \ Bblock \ INCK(PROCESS_ARGUMENTS2_P_____Pcompteur_DAppel); \ \ PROCESS_ARGUMENT_P(titre_attendu,parametre_P1,sequenceI,sequenceC); \ EGAL(parametre_P2,parametre_P1); \ Eblock \ /* Recuperation de deux arguments "genere_p" avec execution d'un post-traitement */ \ /* (introduit le 20100105100659). */ #define PROCESF_ARGUMENT_C(titre_attendu,parametre_C,sequenceI,sequenceC) \ Bblock \ INCK(PROCESF_ARGUMENT_C_____Pcompteur_DAppel); \ \ gPROCESS_PARAMETRE(arguments \ ,titre_attendu \ ,parametre_C \ ,parametre_C \ ,FconversionC \ ,NEUT \ ,BLOC(VIDE;) \ ,sequenceI \ ,NE_PAS_FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE \ ,sequenceC \ ,BLOC(VIDE;) \ ,styp_C \ ,PERMETTRE_LES_ABREVIATIONS_DANS_gPROCESS_PARAMETRE \ ,ityp_C \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ Eblock \ /* Recuperation d'un argument "chaine de caracteres" avec execution d'un post-traitement */ \ /* avec forcage de l'execution de 'seqC' au "dernier tour" introduit le 20000207110651. */ \ /* C'est "Forcage" qui justifie le 'F' de 'PROCESF_ARGUMENT_C'... */ \ /* */ \ /* Enfin, on notera que je n'ai introduit que 'PROCESF_ARGUMENT_C(...)' (et pas les */ \ /* {_K,_L,_I,_F,_P} par symetrie) car lui-seul a de l'interet associe a la lecture de */ \ /* fichiers. Mais si besoin etait, cela serait simple que de les introduire... */ \ /* */ \ /* En fait, j'ai decouvert le 20000207173145 que cela ne marchait pas. En effet, tout */ \ /* argument de ce type va donc voir l'execution forcee de 'seqC' lors du dernier */ \ /* tour ; or cela n'est pas toujours souhaite. Ainsi, dans le cas de fichiers, on peut */ \ /* vouloir donner a tous leurs elements la valeur par defaut et non pas les connecter */ \ /* au "pipe". Donc : */ \ /* */ \ /* FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE */ \ /* */ \ /* a ete remplace par : */ \ /* */ \ /* NE_PAS_FORCER_sequenceC_DANS_gPROCESS_PARAMETRE_LORS_DE_LA_DERNIERE_RECHERCHE */ \ /* */ \ /* et ainsi on devrait revenir a la version anterieure, sans malgre tout detruire cette */ \ /* possibilite... */ \ /* */ \ /* Le 20030704142017, les abreviations ont ete autorisees uniquement dans la definition */ \ /* de 'PROCESF_ARGUMENT_C(...)'. */ #define PROCESF_ARGUMENT_FICHIER(titre_attendu,nom_du_fichier,liste_des_valeurs,valeur_par_defaut,transformation) \ Bblock \ INCK(PROCESF_ARGUMENT_FICHIER_____Pcompteur_DAppel); \ \ PROCESF_ARGUMENT_C(titre_attendu,nom_du_fichier \ ,BLOC(VIDE;) \ ,BLOC(transformation(nom_du_fichier \ ,liste_des_valeurs \ ,valeur_par_defaut \ ); \ ) \ ); \ Eblock \ /* Recuperation d'un argument de type "fichier" (introduit le 20190408143526)... */ /* On notera le passage de "_____xxxx" a "____________________xxxx" le 20021105094657 */ /* dans la definition des 'DebutParametres...' et 'FinParametres...' afin qu'ils soient */ /* plus visibles... */ #define DETECTION_DE_PRESENCE_D_UN_ARGUMENT_OBLIGATOIRE \ Bblock \ Test(I4OU(I4OU(IL_FAUT(editer_la_valeur_des_parametres_d_une_commande) \ ,IL_FAUT(editer_le_NOM_SYNTHETIQUE_de_la_commande_courante) \ ,IL_FAUT(editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante) \ ,IL_FAUT(lister_tous_les_messages_possibles) \ ) \ ,I6OU(IL_FAUT(permettre_l_acces_au_source_du_programme) \ ,IL_FAUT(permettre_l_acces_a_la_liste_des_fonctions_referencees_par_le_programme) \ ,IL_FAUT(editer_les_differentes_versions_du_programme) \ ,IL_FAUT(editer_les_differentes_versions_du_programme_dans_les_librairies_dynamiques) \ ,IL_FAUT(editer_la_liste_des_librairies_dynamiques_utilisees) \ ,IL_FAUT(editer_les_differents_includes_du_programme) \ ) \ ,IL_FAUT(editer_les_differents_bugs_reconnus) \ ,IL_FAUT(ne_rien_faire_et_sortir_immediatement) \ ) \ ) \ /* Test introduit le 20070330085246 car, en effet, a cette date, il manquait. A la date du */ \ /* 20070331110328 il fut complete avec le test de 'ne_rien_faire_et_sortir_immediatement'... */ \ /* */ \ /* Le test de 'editer_les_differentes_versions_du_programme_dans_les_librairies_dynamiques' */ \ /* a ete introduit le 20111009110606 car, en effet, il manquait... */ \ /* */ \ /* Le test de 'editer_la_liste_des_librairies_dynamiques_utilisees' a ete introduit le */ \ /* 20220824180116... */ \ Bblock \ Eblock \ ATes \ Bblock \ Test(I4ET(EST_VRAI(c_est_la_derniere_recherche_des_parametres) \ ,IZEQ(ITb1(UTILISATION_des_arguments_possibles \ ,INDX(numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes \ ,PREMIER_NUMERO_UNIQUE_DES_ARGUMENTS_POSSIBLES \ ) \ ) \ ) \ /* C'est 'numero_de_l_argument_possible_courant__en_tenant________compte_des_synonymes' */ \ /* qui indexe et non pas 'NUMERO_de_l_argument_possible_courant' car, en effet, ce dernier */ \ /* n'est incremente que si 'EST_VRAI(c_est_la_derniere_recherche_des_parametres' */ \ /* semble-t-il... */ \ ,EST_FAUX(au_moins_un_titre_synonyme_a_ete_reconnu_parmi_la_liste_des_titres_synonymes) \ ,EST_VRAI(tous_____titre_attendu_____ont_ete_recupere_dans_liste_titres_synonymes) \ ) \ ) \ /* Avant le 20070323154106, le test precedent etait : */ \ /* */ \ /* Test(IFET(EST_VRAI(c_est_la_derniere_recherche_des_parametres) */ \ /* ,ABSENT(valeur_recherchee_dans_la_liste_des_arguments) */ \ /* ) */ \ /* ) */ \ /* */ \ /* ce qui avait pour effet d'editer le message qui suit pour chacun des synonymes d'une */ \ /* liste de synonymes et ce meme si l'un de ces synonymes avaient ete utilise comme argument */ \ /* et donc reconnu. A compter du 20070323154106 le message suivant ne peut etre emis que */ \ /* lors du traitement du dernier synonyme d'une liste de synonymes (grace a l'indicateur */ \ /* 'tous_____titre_attendu_____ont_ete_recupere_dans_liste_titres_synonymes') et */ \ /* si aucun synonyme de cette liste n'a ete utilise dans 'liste_des_arguments' (grace a */ \ /* 'au_moins_un_titre_synonyme_a_ete_reconnu_parmi_la_liste_des_titres_synonymes'). */ \ /* */ \ /* Le 20070820113942 fut introduit le test de 'UTILISATION_des_arguments_possibles'... */ \ /* deja ete incremente lorsque l'on arrive ici... */ \ Bblock \ PRINT_ERREUR("un argument dont la presence est obligatoire est absent"); \ CAL1(Prer1(COND(IFEQ(compteur_des_synonymes_de_____titre_attendu,UN) \ ,ccCHAR("(il s'agit de l'argument '%s')\n") \ ,ccCHAR("(il s'agit de l'un des arguments synonymes suivants '%s')\n") \ ) \ ,liste_des_____titre_attendu_____synonymes \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ /* Ce detecteur de presence d'un argument obligatoire a ete introduit le 20070323151657. */ \ /* Pour voir comment cela s'utilise, imaginons l'argument suivant : */ \ /* */ \ /* GET_ARGUMENT_?("nom=",valeur); */ \ /* */ \ /* et supposons que l'on veuille rendre sa presence obligatoire. Il suffira alors de */ \ /* remplacer le 'GET_ARGUMENT_?(...)' precedent par : */ \ /* */ \ /* PROCESS_ARGUMENT_?("nom=",valeur */ \ /* ,BLOC(DETECTION_DE_PRESENCE_D_UN_ARGUMENT_OBLIGATOIRE;) */ \ /* ,BLOC(VIDE;) */ \ /* ) */ \ /* */ \ /* ('v $xcg/ABSO.01$K DETECTION_DE_PRESENCE_D_UN_ARGUMENT_OBLIGATOIRE') pour que le tour */ \ /* soit joue. On notera au passage que cette detection se fait dans la sequence */ \ /* inconditionnelle 'seqI' de 'PROCESS_ARGUMENT_?(...)'. Au passage, '"nom="' peut etre */ \ /* evidemment une liste de synonymes auquel cas, l'anomalie sera signalee pour chacun des */ \ /* synonymes, alors qu'il serait peut-etre plus logique qu'elle ne sorte qu'une seule fois. */ \ /* Ce dernier probleme fut resolu le 20070323154106 ; desormais, c'est le dernier synonyme */ \ /* de la liste qui est edite si aucun des synonymes n'a ete reconnu... */ \ /* */ \ /* Avant le 20070325172306, l'edition etait : */ \ /* */ \ /* CAL1(Prer1("(son dernier -son seul ?- synonyme est '%s')\n" */ \ /* ,titre_attendu_unique_parmi_une_liste_de_titres_synonymes */ \ /* ) */ \ /* ); */ \ /* */ \ /* qui n'editait que le dernier synonyme de la liste... */ \ /* */ \ /* Le 20070820082420, la procedure 'DETECTION_DE_PRESENCE_D_UN_ARGUMENT_OBLIGATOIRE' a */ \ /* montre une fonctionnement incorrect : elle detectait l'absence d'un parametre obligatoire */ \ /* si celui-ci etait present, alors qu'un ou plusieurs autres parametres le suivait. Cela */ \ /* s'est vu a ce moment-la avec le test : */ \ /* */ \ /* $xcg/ABSO.01$X x=1 K_LF=VRAI */ \ /* */ \ /* "x=" etant declare absent ! Le probleme vient du fait que c'est en traitant "K_LF=VRAI" */ \ /* que la condition 'c_est_la_derniere_recherche_des_parametres' est 'VRAI'. En passant */ \ /* sur la tentative de recuperation de "x=", elle echoue puisque l'on en est en train de */ \ /* recuperer "K_LF=" ("x=" a ete recuperee lors de la boucle precedente...) et l'on */ \ /* considere donc, a tort, que "x=" est absent... */ \ /* */ \ /* Il a fallu introduire 'UTILISATION_des_arguments_possibles' pour resoudre ce probleme... */ #define MARQUEUR________DebutParametresGeneraux \ Bblock \ GET_ARGUMENT_M("____________________DebutParametresGeneraux=",marqueur_____debut_des_parametres_generaux); \ Eblock \ /* Argument fictif destine a marquer le debut des Parametres Generaux (le 20010420143829) */ \ /* lors de l'edition "Parametres=VRAI". Il doit etre le premier... */ #define MARQUEUR________FinParametresGeneraux \ Bblock \ GET_ARGUMENT_M("____________________FinParametresGeneraux=",marqueur_____fin_des_parametres_generaux); \ Eblock \ /* Argument fictif destine a marquer la fin des Parametres Generaux (le 20010420143829) */ \ /* lors de l'edition "Parametres=VRAI". Il doit etre le dernier... */ #define MARQUEUR________DebutParametresAutomatiques \ Bblock \ GET_ARGUMENT_M("____________________DebutParametresAutomatiques=",marqueur_____debut_des_parametres_automatiques); \ Eblock \ /* Argument fictif destine a marquer le debut des Parametres mis en place Automatiquement */ \ /* (le 20120701115154) lors de l'edition "Parametres=VRAI". Il doit etre le premier... */ #define MARQUEUR________FinParametresAutomatiques \ Bblock \ GET_ARGUMENT_M("____________________FinParametresAutomatiques=",marqueur_____fin_des_parametres_automatiques); \ Eblock \ /* Argument fictif destine a marquer la fin des Parametres mis en place Automatiquement */ \ /* (le 20120701115154) lors de l'edition "Parametres=VRAI". Il doit etre le dernier... */ #define MARQUEUR________DebutParametresImages \ Bblock \ GET_ARGUMENT_M("____________________DebutParametresImages=",marqueur_____debut_des_parametres_images); \ Eblock \ /* Argument fictif destine a marquer le debut des Parametres Generaux de nature "Image" */ \ /* (le 20020626162809) lors de l'edition "Parametres=VRAI". Il doit etre le premier... */ #define MARQUEUR________FinParametresImages \ Bblock \ GET_ARGUMENT_M("____________________FinParametresImages=",marqueur_____fin_des_parametres_images); \ Eblock \ /* Argument fictif destine a marquer la fin des Parametres Generaux de nature "Image" */ \ /* (le 20020626162809) lors de l'edition "Parametres=VRAI". Il doit etre le dernier... */ #define MARQUEUR________DebutParametresSpecifiques \ Bblock \ GET_ARGUMENT_M("____________________DebutParametresSpecifiques=",marqueur_____debut_des_parametres_specifiques); \ Eblock \ /* Argument fictif destine a marquer le debut des Parametres Specifiques (20010421090617) */ \ /* lors de l'edition "Parametres=VRAI". Il doit etre le premier... */ #define MARQUEUR________FinParametresSpecifiques \ Bblock \ GET_ARGUMENT_M("____________________FinParametresSpecifiques=",marqueur_____fin_des_parametres_specifiques); \ Eblock \ /* Argument fictif destine a marquer la fin des Parametres Specifiques (20010421090617) */ \ /* lors de l'edition "Parametres=VRAI". Il doit etre le dernier... */ #ifdef Ftraitement_des_formats_de_sortie_VERSION_01 # define INITIALISATIONS_DE_GET_ARGUMENTS_DE_CONTROLE_DE_TRAITEMENT_DES_FORMATS_DE_SORTIE \ Bblock \ Test(EST_FAUX(STANDARD_OUT_EST_UN_PIPE)) \ /* Ceci est inspire de 'v $xtc/files.12$c'... */ \ /* */ \ /* L'appel a 'STANDARD_OUT_EST_UN_PIPE' a ete introduit le 20051117101713... */ \ Bblock \ EGAL(FPrin_____supprimer_les_K_BLANCs_autour_des_K_EGAL,FAUX); \ EGAL(FPrin_____supprimer_les_K_BLANCs_redondants,FAUX); \ /* Lorsque 'STANDARD_OUT' est vraiment la "sortie standard", on autorise par defaut les */ \ /* 'K_BLANC's autour des 'K_EGAL's. Ainsi, en mode interactif on respecte, la mise en page */ \ /* originale, c'est plus joli... */ \ /* */ \ /* La gestion des blancs redondants a ete introduite le 20150310154259... */ \ Eblock \ ATes \ Bblock \ /* Cas ou 'STANDARD_OUT' est un "pipe" ou une redirection : */ \ EGAL(FPrin_____supprimer_les_K_BLANCs_autour_des_K_EGAL,VRAI); \ EGAL(FPrin_____supprimer_les_K_BLANCs_redondants,SE12(VRAI,FAUX)); \ /* Lorsque 'STANDARD_OUT' est redirige vers un "pipe" ou un fichier", on demande par defaut */ \ /* la suppression des 'K_BLANC's autour des 'K_EGAL's. Ainsi, en mode non interactif, il y */ \ /* aura, par defaut, suppression des 'K_BLANC's autour des 'K_EGAL's afin que tous les */ \ /* programmes se comportent de la meme facon et produisent des resultats compatibles et */ \ /* "standardises"... */ \ /* */ \ /* La gestion des blancs redondants a ete introduite le 20150310154259... */ \ /* */ \ /* Le 20210307181536, a cause des sorties de 'v $xcp/Konstantes$K', la gestion des blancs */ \ /* redondants a ete inversees afin que ses sorties dans des fichiers ou bien dans des */ \ /* "pipe"s restent parfaites... */ \ /* */ \ /* Le 20210324094917, la gestion des blancs redondants a ete de nouveau inversee et ce */ \ /* a cause d'eventuels problemes de compatibilite anterieure comme cela s'est vu la veille */ \ /* avec 'v $xiMo/LOG_xiMc$Z 20210323172314'. Cela a evidemment conduit a la modification */ \ /* 'v $xcp/Konstantes$K 20210324095057'... */ \ Eblock \ ETes \ Eblock \ /* Initialisations utiles au traitement des formats de sortie (introduit le 20050131105740). */ \ /* On notera que 'FPrin_____supprimer_les_K_BLANCs_autour_des_K_DEUX_POINTS' n'est pas */ \ /* concerne par cela ; sa valeur par defaut est toujours 'FAUX'... */ # define GET_ARGUMENTS_DE_CONTROLE_DE_TRAITEMENT_DES_FORMATS_DE_SORTIE \ Bblock \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ GET_ARGUMENT_L("FormatEditerCaracteresNonReconnus=""fecnr=" \ ,chain_Acopie_avec_gestion_des_formats_des_editions_entieres_____editer_carac_non_reconnus \ ); \ /* Arguments introduits le 20120118123321... */ \ \ GET_ARGUMENT_L("SupprimerBlancDeuxPoints=""sbdp=",FPrin_____supprimer_les_K_BLANCs_autour_des_K_DEUX_POINTS); \ GET_ARGUMENT_L("SupprimerBlancEgal=""sbe=",FPrin_____supprimer_les_K_BLANCs_autour_des_K_EGAL); \ GET_ARGUMENT_L("SupprimerBlancRedondant=""sbr=",FPrin_____supprimer_les_K_BLANCs_redondants); \ /* Le 20090325094302, ":=" et "==" ont ete remplaces par "sbdp=" et "sbe=" suite a */ \ /* l'introduction possible de 'entrer_des_parametres_via_des_setenv' via une variable */ \ /* d'environnement ('v $xig/fonct$vv$DEF 20090325094302'). */ \ /* */ \ /* L'argument "SupprimerBlancRedondant=" a ete introduit le 20150310154259... */ \ GET_ARGUMENT_L("Pmajuscules=",FPrin_____convertir_les_caracteres_majuscules_en_caracteres_minuscules); \ GET_ARGUMENT_L("Pminuscules=",FPrin_____convertir_les_caracteres_minuscules_en_caracteres_majuscules); \ GET_ARGUMENT_K("Pcarret=",FPrin_____carret_chain_Acopie_avec_conversions_possibles_majuscules_minuscules); \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ Eblock \ /* L'option "SupprimerBlancEgal=" a ete introduite le 20050127112701 et l'option */ \ /* "SupprimerBlancDeuxPoints=" aux environs du 20050128112507. Les "raccourcis" de ces */ \ /* deux options ('":="' et '"=="' l'ont ete 20050128214158 ; finalement, le 20070221112836, */ \ /* '"=="' a ete supprime a cause de 'v $xig/fonct$vv$DEF 20070221110204' ; le 20070226134221 */ \ /* il fut retabli grace a 'v $xig/fonct$vv$FON 20070226134226'...). */ #Aifdef Ftraitement_des_formats_de_sortie_VERSION_01 #Eifdef Ftraitement_des_formats_de_sortie_VERSION_01 #ifdef Ftraitement_des_formats_de_sortie_VERSION_02 # define INITIALISATIONS_DE_GET_ARGUMENTS_DE_CONTROLE_DE_TRAITEMENT_DES_FORMATS_DE_SORTIE \ Bblock \ BLOC(VIDE;); \ Eblock # define GET_ARGUMENTS_DE_CONTROLE_DE_TRAITEMENT_DES_FORMATS_DE_SORTIE \ Bblock \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ BLOC(VIDE;); \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ Eblock #Aifdef Ftraitement_des_formats_de_sortie_VERSION_02 #Eifdef Ftraitement_des_formats_de_sortie_VERSION_02 #ifdef PRAGMA_CPP_____AUTORISER_LE_GooF # ifdef PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS /* Cas de l'arithmetique etendue des nombres flottants : */ # define GET_ARGUMENTS_DE_BASCULE_ENTRE_L_ARITHMETIQUE_DE_BASE_ET_L_ARITHMETIQUE_ETENDUE \ Bblock \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ /* Introduit le 20070130103328 car, en effet, il manquait... */ \ \ BLOC(VIDE;); \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ /* Introduit le 20070130103328 car, en effet, il manquait... */ \ \ Eblock \ /* Lorsque le 'GooF' est activable et que l'arithmetique etendue est forcee, alors la */ \ /* bascule avec l'arithmetique de base est evidemment impossible... */ # Aifdef PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS /* Cas de l'arithmetique traditionnelle des nombres flottants : */ # Eifdef PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS #Aifdef PRAGMA_CPP_____AUTORISER_LE_GooF #Eifdef PRAGMA_CPP_____AUTORISER_LE_GooF #define use_arithmetique_etendue_et_non_basique \ utiliser_l_arithmetique_etendue_au_lieu_de_l_arithmetique_de_base \ /* Afin de raccourcir certaines lignes ('v $xci/gauss$K _et_non_celle_de_base' par exemple. */ \ /* Ceci a ete introduit le 20071224115515... */ \ /* */ \ /* Le 20071226163917, le symbole 'use_arithmetique_etendue_et_non_celle_de_base' a ete */ \ /* raccourci en 'use_arithmetique_etendue_et_non_basique' et ce principalement a cause de */ \ /* 'v $xci/PolyPolaire$K use_arithmetique_etendue_et_non_basique'... */ \ /* */ \ /* Le 20080126091728, cette definition est sortie du '#ifndef' qui suit a cause de */ \ /* 'v $xrs/surfaces.13$I use_arithmetique_etendue_et_non_basique'... */ #ifndef GET_ARGUMENTS_DE_BASCULE_ENTRE_L_ARITHMETIQUE_DE_BASE_ET_L_ARITHMETIQUE_ETENDUE # define GET_ARGUMENTS_DE_BASCULE_ENTRE_L_ARITHMETIQUE_DE_BASE_ET_L_ARITHMETIQUE_ETENDUE \ Bblock \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ GET_ARGUMENT_L("arithmetique_etendue=""arie=" \ ,si_le_GooF_est_activable_utiliser_l_arithmetique_etendue_au_lieu_de_l_arithmetique_de_base \ ); \ GET_ARGUMENT_N("arithmetique_de_base=""arib=" \ ,si_le_GooF_est_activable_utiliser_l_arithmetique_etendue_au_lieu_de_l_arithmetique_de_base \ ); \ /* Introduit le 20061018105913... */ \ /* */ \ /* ATTENTION, le 20150417093847, je rappelle l'existence d'indicateurs de controle */ \ /* secondaires necessaires lors des calculs avec les nombres complexes, hyper-complexes */ \ /* et hyper-hyper-complexes. Il s'agit de : */ \ /* */ \ /* 'v $ximcf/common$DEF arithmetique_etendue_C=' */ \ /* 'v $ximcf/common$DEF arithmetique_etendue_HC=' */ \ /* 'v $ximcf/common$DEF arithmetique_etendue_HHC=' */ \ /* */ \ /* et ainsi, il conviendra d'utiliser : */ \ /* */ \ /* [arithmetique_etendue=VRAI] arithmetique_etendue_C=VRAI */ \ /* - */ \ /* [arithmetique_etendue=VRAI] arithmetique_etendue_HC=VRAI */ \ /* -- */ \ /* [arithmetique_etendue=VRAI] arithmetique_etendue_HHC=VRAI */ \ /* ------------------------- --- */ \ /* | */ \ /* | */ \ /* ------> facultatif... */ \ /* */ \ /* pour acceder a l'arithmetique etendue des nombres complexes, hyper-complexes et */ \ /* hyper-hyper-complexes respectivement... */ \ /* */ \ /* */ \ /* ATTENTION, le 20150516094936, je rappelle de plus l'existence d'indicateurs de controle */ \ /* secondaires relatifs a l'usage de 'GENERATION_DU_CHAMP_DEMANDE(...)'. Ainsi, par exemple, */ \ /* pour etendre l'arithmetique de 'v $xci/gauss$K', il conviendra d'utiliser : */ \ /* */ \ /* [arithmetique_etendue=VRAI] arithmetique_etendue_gauss=VRAI */ \ /* ------------------------- ----- */ \ /* | */ \ /* | */ \ /* ------> facultatif... */ \ /* */ \ /* et ceci sera vrai de tous les '$K's utilisant 'GENERATION_DU_CHAMP_DEMANDE(...)'... */ \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ Eblock \ /* Recuperation des arguments relatifs a la bascule entre l'arithmetique de base et */ \ /* l'arithmetique etendue. Ceci a ete introduit le 20061018132259 sous cette forme... */ \ /* */ \ /* ATTENTION : evidemment ce nouveau parametre n'a d'utilite que dans les programme dans */ \ /* lesquels le 'GooF' est activable et surtout dans les programmes qui utilisent des */ \ /* librairies dans lesquelles le 'GooF' est activable. C'est ainsi le cas du programme */ \ /* 'v $xci/multHC_02.01$K' linkant 'v $xbii/GooF_image$K PRAGMA_CPP_____AUTORISER_LE_GooF'. */ #Aifndef GET_ARGUMENTS_DE_BASCULE_ENTRE_L_ARITHMETIQUE_DE_BASE_ET_L_ARITHMETIQUE_ETENDUE #Eifndef GET_ARGUMENTS_DE_BASCULE_ENTRE_L_ARITHMETIQUE_DE_BASE_ET_L_ARITHMETIQUE_ETENDUE #define SIGNE_EGAL \ " = " \ /* Introduit le 20180319112641 pour garantir la presence des espaces entourant "="... */ #define EDITION_DE_LA_VALEUR_DE_LA_PLUPART_DES_COMPTEURS \ Bblock \ CALS(FgEDITION_DE_LA_VALEUR_DE_LA_PLUPART_DES_COMPTEURS()); \ Eblock \ /* Introduit le 20180410205856... */ #define EDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ACCES_AUX_FONCTIONS_DE_BASE \ Bblock \ CALS(FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ACCES_AUX_FONCTIONS_DE_BASE()); \ Eblock \ /* Introduit le 20180413110838... */ #define EDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE \ Bblock \ CALS(FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE()); \ Eblock \ /* Introduit ainsi le 20180316135439 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'... */ #define EDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ENTREE_DES_ARGUMENTS_DES_K_S \ Bblock \ CALS(FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ENTREE_DES_ARGUMENTS_DES_K_S()); \ Eblock \ /* Introduit le 20180410123854... */ #define EDITION_D_UN_COMPTEUR_D_ALLOCATION_DESALLOCATION_MEMOIRE(fonction,compteur,tabulation,cumul_des_compteurs) \ Bblock \ CALS(Fedition_d_un_compteur_quelconque("#'kMalo(...)'s de '" \ ,fonction \ ,EnTete_de_sauvegardA ## compteur \ ,tabulation \ ) \ ); \ /* Cette solution implementee le 20180410180411 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 \ ,EnTete_de_sauvegardA ## compteur \ ); \ Eblock \ /* Introduit le 20180318102750... */ \ /* procedure a ete simplifiee le 20180318100021 par passage a deux arguments... */ #define TABULATION_EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE \ CENT #define EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE(fonction,compteur) \ Bblock \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_DESALLOCATION_MEMOIRE(fonction \ ,compteur \ ,TABULATION_EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE \ ,cumul_des_compteurs_de_toutes_les____allocations_memoire \ ); \ Eblock \ /* Introduit le 20180317092429 pour simplifier la mise a jour de ce qui suit. Cette */ \ /* procedure a ete simplifiee le 20180318100021 par passage a deux arguments... */ #define TABULATION_EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE \ VINGT #define EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE(fonction,compteur) \ Bblock \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_DESALLOCATION_MEMOIRE(fonction \ ,compteur \ ,TABULATION_EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE \ ,cumul_des_compteurs_de_toutes_les_desallocations_memoire \ ); \ Eblock \ /* Introduit le 20180317111712 pour simplifier la mise a jour de ce qui suit... */ #define gEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE \ Bblock \ Test(IL_FAUT(FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE_____activer)) \ Bblock \ BSaveVariable(Positive,Flist_Gelement_____compteur_des_tMalo); \ BSaveVariable(Positive,Flist_Selement_____compteur_des_kMalo); \ BSaveVariable(Positive,Flist_creation_____compteur_des_tMalo); \ BSaveVariable(Positive,Fload_fichier_non_formatte_____compteur_des_kMalo); \ BSaveVariable(Positive,Fsize_fichier_____compteur_des_kMalo); \ BSaveVariable(Positive,Fstore_fichier_non_formatte_____compteur_des_kMalo); \ BSaveVariable(Positive,Fstore_non_securise_fichier_non_formatte_____compteur_des_kMalo); \ BSaveVariable(Positive,Ftest_fichier_____compteur_des_kMalo); \ BSaveVariable(Positive,Ftraitement_des_formats_de_sortie_____compteur_des_kMalo); \ BSaveVariable(Positive,GET_PARAMETRES_____compteur_des_ciMalo); \ BSaveVariable(Positive,GET_PARAMETRES_____compteur_des_cpMalo); \ BSaveVariable(Positive,GENERE__FonctionC_FconversionC_____compteur_des_kMalo); \ BSaveVariable(Positive,RECHERCHE_D_UNE_VALEUR_____compteur_des_kMalo); \ BSaveVariable(Positive,_chain_numero_____compteur_des_kMalo); \ BSaveVariable(Positive,allocation_memoire_avec_validation_____compteur_de_tous_les_Malo); \ BSaveVariable(Positive,chain_ANcopie_____compteur_des_kMalo); \ BSaveVariable(Positive,chain_Aconcaten2_____compteur_des_kMalo); \ BSaveVariable(Positive,chain_Acopie_____compteur_des_kMalo); \ BSaveVariable(Positive,chain_Acopie_avec_conversions_possibles_majuscules_minuscules_____compteur_des_kMalo); \ BSaveVariable(Positive,chain_Acopie_avec_gestion_des_formats_des_editions_entieres_____compteur_des_kMalo); \ BSaveVariable(Positive,chain_Aentier_____compteur_des_kMalo); \ BSaveVariable(Positive,conversion_d_un_chiffre_decimal_en_caractere_____compteur_des_kMalo); \ BSaveVariable(Positive,exec_shell_____compteur_des_kMalo); \ BSaveVariable(Positive,getv_shell_____compteur_des_kMalo); \ BSaveVariable(Positive,parametrage_des_formats_des_editions_flottantes_____compteur_des_kMalo); \ BSaveVariable(Positive,print_defaut_____compteur_des_kMalo); \ \ BSaveVariable(Positive,gCALZ_Free_____compteur_de_tous_les_gCALZ_Free); \ BSaveVariable(Positive,CALZ_FreCC_____compteur_de_tous_les_CALZ_FreCC); \ BSaveVariable(Positive,CALZ_FreDD_____compteur_de_tous_les_CALZ_FreDD); \ BSaveVariable(Positive,CALZ_FreFF_____compteur_de_tous_les_CALZ_FreFF); \ BSaveVariable(Positive,CALZ_FreII_____compteur_de_tous_les_CALZ_FreII); \ BSaveVariable(Positive,CALZ_FreLL_____compteur_de_tous_les_CALZ_FreLL); \ BSaveVariable(Positive,CALZ_FrePP_____compteur_de_tous_les_CALZ_FrePP); \ BSaveVariable(Positive,CALZ_FreSS_____compteur_de_tous_les_CALZ_FreSS); \ /* En effet, les 'Prme1(...)' qui suivent vont eux-aussi incrementer la valeur de ces */ \ /* compteurs. Il convient donc de les sauvegarder avant et d'editer donc ces valeurs */ \ /* sauvegardees... */ \ \ DEFV(Int,INIT(cumul_des_compteurs_de_toutes_les____allocations_memoire,ZERO)); \ DEFV(Int,INIT(veritable_compteur_de_tous_les_gCALZ_Free,UNDEF)); \ DEFV(Int,INIT(cumul_des_compteurs_de_toutes_les_desallocations_memoire,UNDEF)); \ DEFV(Int,INIT(valeur_initiale_du_cumul_des_compteurs_de_toutes_les_desallocations_memoire \ ,SE22(ZERO \ ,allocation_memoire_et_generation_des_format_EGAr_____compteur_d_allocation_memoire \ ) \ ) \ ); \ /* Le 20180407092822, on anticipe ainsi les 'CALZ_FreCC(...)' qui auront lieu ensuite */ \ /* dans 'v $xig/allocation$vv$FON DESALLOCATION_MEMOIRE' et dont on ne connait pas encore */ \ /* le resultat du comptage. Au passage, on notera que l'on fait l'hypothese qu'il y a */ \ /* autant de desallocations que d'allocations, ce qui permet donc d'utiliser ci-dessus */ \ /* le compteur d'allocations... */ \ \ EGAL(veritable_compteur_de_tous_les_gCALZ_Free \ ,ADD2(EnTete_de_sauvegardA ## gCALZ_Free_____compteur_de_tous_les_gCALZ_Free \ ,valeur_initiale_du_cumul_des_compteurs_de_toutes_les_desallocations_memoire \ ) \ ); \ EGAL(cumul_des_compteurs_de_toutes_les_desallocations_memoire \ ,valeur_initiale_du_cumul_des_compteurs_de_toutes_les_desallocations_memoire \ ); \ \ PRINT_MESSAGE(C_VIDE,"EDITION DES COMPTEURS D'ALLOCATION/DESALLOCATION MEMOIRE"); \ \ CALS(Fsauts_de_lignes(UN)); \ \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("Flist_Gelement/t",Flist_Gelement_____compteur_des_tMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("Flist_Selement/k",Flist_Selement_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("Flist_creation/t",Flist_creation_____compteur_des_tMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("Fload_fichier_non_formatte/k" \ ,Fload_fichier_non_formatte_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("Fsize_fichier/k",Fsize_fichier_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("Fstore_fichier_non_formatte/k" \ ,Fstore_fichier_non_formatte_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("Fstore_non_securise_fichier_non_formatte/k" \ ,Fstore_non_securise_fichier_non_formatte_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("Ftest_fichier/k",Ftest_fichier_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("Ftraitement_des_formats_de_sortie/k" \ ,Ftraitement_des_formats_de_sortie_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("GENERE__FonctionC_FconversionC/k" \ ,GENERE__FonctionC_FconversionC_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("GET_PARAMETRES/i" \ ,GET_PARAMETRES_____compteur_des_ciMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("GET_PARAMETRES/p" \ ,GET_PARAMETRES_____compteur_des_cpMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("RECHERCHE_D_UNE_VALEUR/k" \ ,RECHERCHE_D_UNE_VALEUR_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("_chain_numero/k",_chain_numero_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("chain_ANcopie/k",chain_ANcopie_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("chain_Aconcaten2/k",chain_Aconcaten2_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("chain_Acopie/k",chain_Acopie_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE \ ("chain_Acopie_avec_conversions_possibles_majuscules_minuscules/k" \ ,chain_Acopie_avec_conversions_possibles_majuscules_minuscules_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE \ ("chain_Acopie_avec_gestion_des_formats_des_editions_entieres/k" \ ,chain_Acopie_avec_gestion_des_formats_des_editions_entieres_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("chain_Aentier/k",chain_Aentier_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE \ ("conversion_d_un_chiffre_decimal_en_caractere/k" \ ,conversion_d_un_chiffre_decimal_en_caractere_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("exec_shell/k",exec_shell_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("getv_shell/k",getv_shell_____compteur_des_kMalo); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE \ ("parametrage_des_formats_des_editions_flottantes/k" \ ,parametrage_des_formats_des_editions_flottantes_____compteur_des_kMalo \ ); \ EDITION_D_UN_COMPTEUR_D_ALLOCATION_MEMOIRE("print_defaut/k",print_defaut_____compteur_des_kMalo); \ \ CALS(Fsauts_de_lignes(UN)); \ \ CAL3(Prme2("Cumul des compteurs des 'Malo(...)'s (incluant donc les '?Malo(...)'s)%s%d\n" \ ,SIGNE_EGAL \ ,EnTete_de_sauvegardA ## allocation_memoire_avec_validation_____compteur_de_tous_les_Malo \ ) \ ); \ /* Edition introduite le 20180315085718... */ \ \ Test(IFNE(cumul_des_compteurs_de_toutes_les____allocations_memoire \ ,EnTete_de_sauvegardA ## allocation_memoire_avec_validation_____compteur_de_tous_les_Malo \ ) \ ) \ /* Validation introduite le 20180315135802... */ \ Bblock \ PRINT_ERREUR("incoherence dans le comptage des allocations memoire"); \ CAL1(Prer2("(la valeur totale est %d, alors que le cumul est %d)\n" \ ,EnTete_de_sauvegardA ## allocation_memoire_avec_validation_____compteur_de_tous_les_Malo \ ,cumul_des_compteurs_de_toutes_les____allocations_memoire \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CALS(Fsauts_de_lignes(UN)); \ \ EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE("CALZ_FreCC",CALZ_FreCC_____compteur_de_tous_les_CALZ_FreCC); \ EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE("CALZ_FreDD",CALZ_FreDD_____compteur_de_tous_les_CALZ_FreDD); \ EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE("CALZ_FreFF",CALZ_FreFF_____compteur_de_tous_les_CALZ_FreFF); \ EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE("CALZ_FreII",CALZ_FreII_____compteur_de_tous_les_CALZ_FreII); \ EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE("CALZ_FreLL",CALZ_FreLL_____compteur_de_tous_les_CALZ_FreLL); \ EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE("CALZ_FrePP",CALZ_FrePP_____compteur_de_tous_les_CALZ_FrePP); \ EDITION_D_UN_COMPTEUR_DE_DESALLOCATION_MEMOIRE("CALZ_FreSS",CALZ_FreSS_____compteur_de_tous_les_CALZ_FreSS); \ /* Edition des compteurs des 'Fre?(...)'s introduite le 20180315085718... */ \ \ CALS(Fsauts_de_lignes(UN)); \ \ CAL3(Prme5("Cumul anticipe des compteurs des 'gCALZ_Free(...)'s%s%d+%d%s%d\n" \ ,SIGNE_EGAL \ ,EnTete_de_sauvegardA ## gCALZ_Free_____compteur_de_tous_les_gCALZ_Free \ ,valeur_initiale_du_cumul_des_compteurs_de_toutes_les_desallocations_memoire \ ,SIGNE_EGAL \ ,veritable_compteur_de_tous_les_gCALZ_Free \ ) \ ); \ /* ATTENTION : il s'agit du cumul ANTICIPE car, en effet, l'appel a la fonction */ \ /* 'v $xig/allocation$vv$FON desallocation_memoire_des_format_EGAr' ne peut avoir lieu */ \ /* qu'apres ce qui suit... */ \ \ CALS(Fsauts_de_lignes(UN)); \ \ Test(IFNE(veritable_compteur_de_tous_les_gCALZ_Free \ ,cumul_des_compteurs_de_toutes_les_desallocations_memoire \ ) \ ) \ /* Validation introduite le 20180315135802... */ \ Bblock \ PRINT_ERREUR("incoherence dans le comptage des 'CALZ_Fre?(...)'."); \ CAL1(Prer2("(la valeur totale est %d, alors que le cumul est %d)\n" \ ,veritable_compteur_de_tous_les_gCALZ_Free \ ,cumul_des_compteurs_de_toutes_les_desallocations_memoire \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ ESaveVariable(Positive,CALZ_FreSS_____compteur_de_tous_les_CALZ_FreSS); \ ESaveVariable(Positive,CALZ_FrePP_____compteur_de_tous_les_CALZ_FrePP); \ ESaveVariable(Positive,CALZ_FreLL_____compteur_de_tous_les_CALZ_FreLL); \ ESaveVariable(Positive,CALZ_FreII_____compteur_de_tous_les_CALZ_FreII); \ ESaveVariable(Positive,CALZ_FreFF_____compteur_de_tous_les_CALZ_FreFF); \ ESaveVariable(Positive,CALZ_FreDD_____compteur_de_tous_les_CALZ_FreDD); \ ESaveVariable(Positive,CALZ_FreCC_____compteur_de_tous_les_CALZ_FreCC); \ ESaveVariable(Positive,gCALZ_Free_____compteur_de_tous_les_gCALZ_Free); \ \ ESaveVariable(Positive,print_defaut_____compteur_des_kMalo); \ ESaveVariable(Positive,parametrage_des_formats_des_editions_flottantes_____compteur_des_kMalo); \ ESaveVariable(Positive,getv_shell_____compteur_des_kMalo); \ ESaveVariable(Positive,exec_shell_____compteur_des_kMalo); \ ESaveVariable(Positive,conversion_d_un_chiffre_decimal_en_caractere_____compteur_des_kMalo); \ ESaveVariable(Positive,chain_Aentier_____compteur_des_kMalo); \ ESaveVariable(Positive,chain_Acopie_avec_gestion_des_formats_des_editions_entieres_____compteur_des_kMalo); \ ESaveVariable(Positive,chain_Acopie_avec_conversions_possibles_majuscules_minuscules_____compteur_des_kMalo); \ ESaveVariable(Positive,chain_Acopie_____compteur_des_kMalo); \ ESaveVariable(Positive,chain_Aconcaten2_____compteur_des_kMalo); \ ESaveVariable(Positive,chain_ANcopie_____compteur_des_kMalo); \ ESaveVariable(Positive,allocation_memoire_avec_validation_____compteur_de_tous_les_Malo); \ ESaveVariable(Positive,_chain_numero_____compteur_des_kMalo); \ ESaveVariable(Positive,RECHERCHE_D_UNE_VALEUR_____compteur_des_kMalo); \ ESaveVariable(Positive,GENERE__FonctionC_FconversionC_____compteur_des_kMalo); \ ESaveVariable(Positive,GET_PARAMETRES_____compteur_des_cpMalo); \ ESaveVariable(Positive,GET_PARAMETRES_____compteur_des_ciMalo); \ ESaveVariable(Positive,Ftraitement_des_formats_de_sortie_____compteur_des_kMalo); \ ESaveVariable(Positive,Ftest_fichier_____compteur_des_kMalo); \ ESaveVariable(Positive,Fstore_non_securise_fichier_non_formatte_____compteur_des_kMalo); \ ESaveVariable(Positive,Fstore_fichier_non_formatte_____compteur_des_kMalo); \ ESaveVariable(Positive,Fsize_fichier_____compteur_des_kMalo); \ ESaveVariable(Positive,Fload_fichier_non_formatte_____compteur_des_kMalo); \ ESaveVariable(Positive,Flist_creation_____compteur_des_tMalo); \ ESaveVariable(Positive,Flist_Selement_____compteur_des_kMalo); \ ESaveVariable(Positive,Flist_Gelement_____compteur_des_tMalo); \ /* Par symetrie... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit le 20180314112759... */ #ifdef GENERER_LES_GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS # define si_le_GooF_est_activable_utiliser_l_arithmetique_etendue \ si_le_GooF_est_activable_utiliser_l_arithmetique_etendue_au_lieu_de_l_arithmetique_de_base \ /* Introduit le 20180818113515 pour raccourcir deux lignes qui suivent... */ # define GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS \ Bblock \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ GET_ARGUMENTS_DE_BASCULE_ENTRE_L_ARITHMETIQUE_DE_BASE_ET_L_ARITHMETIQUE_ETENDUE; \ /* Introduit le 20061018132259 sous cette forme... */ \ \ PROCESS_ARGUMENT_L("MIN2_ADD2__ADD2_MUL2=""MIN2_ADD2=""min_plus=" \ ,remplacer_l_arithmetique__ADD2_MUL2__par_l_arithmetique__MIN2_ADD2 \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ EGAL(FfxADD2_____ponderation_de_ADD2,FZERO); \ EGAL(FfxADD2_____ponderation_de_MIN2,FU); \ \ EGAL(FfxMUL2_____ponderation_de_MUL2,FZERO); \ EGAL(FfxMUL2_____ponderation_de_ADD2,FU); \ \ EGAL(si_le_GooF_est_activable_utiliser_l_arithmetique_etendue,VRAI); \ Eblock \ ) \ ); \ /* Introduit le 20180818111546 et complete le 20181109100545 par "min_plus="... */ \ /* */ \ /* Le 20181109143219, "ADD2_MUL2__MIN2_ADD2=" a ete remplace par "MIN2_ADD2__ADD2_MUL2=" */ \ /* plus logique... */ \ \ PROCESS_ARGUMENT_L("MAX2_ADD2__ADD2_MUL2=""MAX2_ADD2=""max_plus=""tropical=" \ ,remplacer_l_arithmetique__ADD2_MUL2__par_l_arithmetique__MAX2_ADD2 \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ EGAL(FfxADD2_____ponderation_de_ADD2,FZERO); \ EGAL(FfxADD2_____ponderation_de_MAX2,FU); \ \ EGAL(FfxMUL2_____ponderation_de_MUL2,FZERO); \ EGAL(FfxMUL2_____ponderation_de_ADD2,FU); \ \ EGAL(si_le_GooF_est_activable_utiliser_l_arithmetique_etendue,VRAI); \ Eblock \ ) \ ); \ /* Introduit le 20180818111546 et complete le 20181109100545 par "max_plus=""tropical="... */ \ /* */ \ /* Le 20181109143219, "ADD2_MUL2__MAX2_ADD2=" a ete remplace par "MAX2_ADD2__ADD2_MUL2=" */ \ /* plus logique... */ \ \ GET_ARGUMENT_L("xFloat=",utiliser_evidemment_la_precision_Float_avec_l_arithmetique_etendue); \ /* Introduit le 20090331084223... */ \ \ GET_ARGUMENT_L("mFloat=""calculs_modulo=""congruence=" \ ,faire_des_calculs_entiers_brutaux_modulo_avec_l_arithmetique_etendue \ ); \ PROCESS_ARGUMENT_I("rFloat=""raison_modulo=""raison_congruence=" \ ,raison_des_calculs_entiers_brutaux_modulo_avec_l_arithmetique_etendue \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ Test(IZEQ(raison_des_calculs_entiers_brutaux_modulo_avec_l_arithmetique_etendue)) \ Bblock \ PRINT_ERREUR("la raison d'une congruence ne peut etre nulle"); \ EGAL(raison_des_calculs_entiers_brutaux_modulo_avec_l_arithmetique_etendue \ ,RAISON_DES_CALCULS_ENTIERS_BRUTAUX_MODULO_AVEC_L_ARITHMETIQUE_ETENDUE \ ); \ CAL1(Prer1("(la valeur par defaut (%d) est forcee)\n" \ ,raison_des_calculs_entiers_brutaux_modulo_avec_l_arithmetique_etendue \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ) \ ); \ /* Introduit le 20111003104139, la validation ayant ete introduite le 20111003113313... */ \ \ GET_ARGUMENT_L("xFloat_ADD2=",FfxADD2_____utiliser_evidemment_la_precision_Float); \ GET_ARGUMENT_F("pxADD2_ADD2=",FfxADD2_____ponderation_de_ADD2); \ GET_ARGUMENT_F("pxSOUS_ADD2=",FfxADD2_____ponderation_de_SOUS); \ GET_ARGUMENT_F("pxSOUSnc_ADD2=",FfxADD2_____ponderation_de_SOUSnc); \ GET_ARGUMENT_F("pxMUL2_ADD2=",FfxADD2_____ponderation_de_MUL2); \ GET_ARGUMENT_F("pxDIVZ_ADD2=",FfxADD2_____ponderation_de_DIVZ); \ GET_ARGUMENT_F("pxDIVZnc_ADD2=",FfxADD2_____ponderation_de_DIVZnc); \ GET_ARGUMENT_F("pxMIN2_ADD2=",FfxADD2_____ponderation_de_MIN2); \ GET_ARGUMENT_F("pxMAX2_ADD2=",FfxADD2_____ponderation_de_MAX2); \ GET_ARGUMENT_F("pxMINMAX_ADD2=",FfxADD2_____ponderation_de_MINMAX); \ GET_ARGUMENT_F("pxMAXMIN_ADD2=",FfxADD2_____ponderation_de_MAXMIN); \ GET_ARGUMENT_F("pxIMINMAX_ADD2=",FfxADD2_____ponderation_de_IMINMAX); \ GET_ARGUMENT_F("pxIMAXMIN_ADD2=",FfxADD2_____ponderation_de_IMAXMIN); \ GET_ARGUMENT_F("pxMOYE_ADD2=",FfxADD2_____ponderation_de_MOYE); \ GET_ARGUMENT_F("pxMOYZ_ADD2=",FfxADD2_____ponderation_de_MOYZ); \ GET_ARGUMENT_F("pxMOYZSI_ADD2=",FfxADD2_____ponderation_de_MOYZSI); \ GET_ARGUMENT_F("pxMOYQ_ADD2=",FfxADD2_____ponderation_de_MOYQ); \ GET_ARGUMENT_F("pxMOYQSI_ADD2=",FfxADD2_____ponderation_de_MOYQSI); \ GET_ARGUMENT_F("pxMOYH_ADD2=",FfxADD2_____ponderation_de_MOYH); \ GET_ARGUMENT_F("pxSPUIX_ADD2=",FfxADD2_____ponderation_de_SPUIX); \ GET_ARGUMENT_F("pxSPUIXnc_ADD2=",FfxADD2_____ponderation_de_SPUIXnc); \ GET_ARGUMENT_F("pxSE12_ADD2=",FfxADD2_____ponderation_de_SE12); \ GET_ARGUMENT_F("pxSE22_ADD2=",FfxADD2_____ponderation_de_SE22); \ GET_ARGUMENT_F("pxATAN_ADD2=",FfxADD2_____ponderation_de_ATAN); \ GET_ARGUMENT_F("pxATANnc_ADD2=",FfxADD2_____ponderation_de_ATANnc); \ GET_ARGUMENT_F("pxMULH24_ADD2=",FfxADD2_____ponderation_de_MULH24); \ \ GET_ARGUMENT_L("xFloat_SOUS=",FfxSOUS_____utiliser_evidemment_la_precision_Float); \ GET_ARGUMENT_F("pxADD2_SOUS=",FfxSOUS_____ponderation_de_ADD2); \ GET_ARGUMENT_F("pxSOUS_SOUS=",FfxSOUS_____ponderation_de_SOUS); \ GET_ARGUMENT_F("pxSOUSnc_SOUS=",FfxSOUS_____ponderation_de_SOUSnc); \ GET_ARGUMENT_F("pxMUL2_SOUS=",FfxSOUS_____ponderation_de_MUL2); \ GET_ARGUMENT_F("pxDIVZ_SOUS=",FfxSOUS_____ponderation_de_DIVZ); \ GET_ARGUMENT_F("pxDIVZnc_SOUS=",FfxSOUS_____ponderation_de_DIVZnc); \ GET_ARGUMENT_F("pxMIN2_SOUS=",FfxSOUS_____ponderation_de_MIN2); \ GET_ARGUMENT_F("pxMAX2_SOUS=",FfxSOUS_____ponderation_de_MAX2); \ GET_ARGUMENT_F("pxMINMAX_SOUS=",FfxSOUS_____ponderation_de_MINMAX); \ GET_ARGUMENT_F("pxMAXMIN_SOUS=",FfxSOUS_____ponderation_de_MAXMIN); \ GET_ARGUMENT_F("pxIMINMAX_SOUS=",FfxSOUS_____ponderation_de_IMINMAX); \ GET_ARGUMENT_F("pxIMAXMIN_SOUS=",FfxSOUS_____ponderation_de_IMAXMIN); \ GET_ARGUMENT_F("pxMOYE_SOUS=",FfxSOUS_____ponderation_de_MOYE); \ GET_ARGUMENT_F("pxMOYZ_SOUS=",FfxSOUS_____ponderation_de_MOYZ); \ GET_ARGUMENT_F("pxMOYZSI_SOUS=",FfxSOUS_____ponderation_de_MOYZSI); \ GET_ARGUMENT_F("pxMOYQ_SOUS=",FfxSOUS_____ponderation_de_MOYQ); \ GET_ARGUMENT_F("pxMOYQSI_SOUS=",FfxSOUS_____ponderation_de_MOYQSI); \ GET_ARGUMENT_F("pxMOYH_SOUS=",FfxSOUS_____ponderation_de_MOYH); \ GET_ARGUMENT_F("pxSPUIX_SOUS=",FfxSOUS_____ponderation_de_SPUIX); \ GET_ARGUMENT_F("pxSPUIXnc_SOUS=",FfxSOUS_____ponderation_de_SPUIXnc); \ GET_ARGUMENT_F("pxSE12_SOUS=",FfxSOUS_____ponderation_de_SE12); \ GET_ARGUMENT_F("pxSE22_SOUS=",FfxSOUS_____ponderation_de_SE22); \ GET_ARGUMENT_F("pxATAN_AOUS=",FfxSOUS_____ponderation_de_ATAN); \ GET_ARGUMENT_F("pxATANnc_AOUS=",FfxSOUS_____ponderation_de_ATANnc); \ GET_ARGUMENT_F("pxMULH24_AOUS=",FfxSOUS_____ponderation_de_MULH24); \ \ GET_ARGUMENT_L("ADD2_SOUS=",FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS); \ GET_ARGUMENT_N("SOUS_SOUS=",FfxxSOUS_____utiliser_FfxADD2_a_la_place_de_FfxSOUS); \ /* Introduits le 20061030155146... */ \ \ GET_ARGUMENT_L("xFloat_MUL2=",FfxMUL2_____utiliser_evidemment_la_precision_Float); \ GET_ARGUMENT_F("pxADD2_MUL2=",FfxMUL2_____ponderation_de_ADD2); \ GET_ARGUMENT_F("pxSOUS_MUL2=",FfxMUL2_____ponderation_de_SOUS); \ GET_ARGUMENT_F("pxSOUSnc_MUL2=",FfxMUL2_____ponderation_de_SOUSnc); \ GET_ARGUMENT_F("pxMUL2_MUL2=",FfxMUL2_____ponderation_de_MUL2); \ GET_ARGUMENT_F("pxDIVZ_MUL2=",FfxMUL2_____ponderation_de_DIVZ); \ GET_ARGUMENT_F("pxDIVZnc_MUL2=",FfxMUL2_____ponderation_de_DIVZnc); \ GET_ARGUMENT_F("pxMIN2_MUL2=",FfxMUL2_____ponderation_de_MIN2); \ GET_ARGUMENT_F("pxMAX2_MUL2=",FfxMUL2_____ponderation_de_MAX2); \ GET_ARGUMENT_F("pxMINMAX_MUL2=",FfxMUL2_____ponderation_de_MINMAX); \ GET_ARGUMENT_F("pxMAXMIN_MUL2=",FfxMUL2_____ponderation_de_MAXMIN); \ GET_ARGUMENT_F("pxIMINMAX_MUL2=",FfxMUL2_____ponderation_de_IMINMAX); \ GET_ARGUMENT_F("pxIMAXMIN_MUL2=",FfxMUL2_____ponderation_de_IMAXMIN); \ GET_ARGUMENT_F("pxMOYE_MUL2=",FfxMUL2_____ponderation_de_MOYE); \ GET_ARGUMENT_F("pxMOYZ_MUL2=",FfxMUL2_____ponderation_de_MOYZ); \ GET_ARGUMENT_F("pxMOYZSI_MUL2=",FfxMUL2_____ponderation_de_MOYZSI); \ GET_ARGUMENT_F("pxMOYQ_MUL2=",FfxMUL2_____ponderation_de_MOYQ); \ GET_ARGUMENT_F("pxMOYQSI_MUL2=",FfxMUL2_____ponderation_de_MOYQSI); \ GET_ARGUMENT_F("pxMOYH_MUL2=",FfxMUL2_____ponderation_de_MOYH); \ GET_ARGUMENT_F("pxSPUIX_MUL2=",FfxMUL2_____ponderation_de_SPUIX); \ GET_ARGUMENT_F("pxSPUIXnc_MUL2=",FfxMUL2_____ponderation_de_SPUIXnc); \ GET_ARGUMENT_F("pxSE12_MUL2=",FfxMUL2_____ponderation_de_SE12); \ GET_ARGUMENT_F("pxSE22_MUL2=",FfxMUL2_____ponderation_de_SE22); \ GET_ARGUMENT_F("pxATAN_MUL2=",FfxMUL2_____ponderation_de_ATAN); \ GET_ARGUMENT_F("pxATANnc_MUL2=",FfxMUL2_____ponderation_de_ATANnc); \ GET_ARGUMENT_F("pxMULH24_MUL2=",FfxMUL2_____ponderation_de_MULH24); \ \ GET_ARGUMENT_L("xFloat_DIVZ=",FfxDIVZ_____utiliser_evidemment_la_precision_Float); \ GET_ARGUMENT_F("pxADD2_DIVZ=",FfxDIVZ_____ponderation_de_ADD2); \ GET_ARGUMENT_F("pxSOUS_DIVZ=",FfxDIVZ_____ponderation_de_SOUS); \ GET_ARGUMENT_F("pxSOUSnc_DIVZ=",FfxDIVZ_____ponderation_de_SOUSnc); \ GET_ARGUMENT_F("pxMUL2_DIVZ=",FfxDIVZ_____ponderation_de_MUL2); \ GET_ARGUMENT_F("pxDIVZ_DIVZ=",FfxDIVZ_____ponderation_de_DIVZ); \ GET_ARGUMENT_F("pxDIVZnc_DIVZ=",FfxDIVZ_____ponderation_de_DIVZnc); \ GET_ARGUMENT_F("pxMIN2_DIVZ=",FfxDIVZ_____ponderation_de_MIN2); \ GET_ARGUMENT_F("pxMAX2_DIVZ=",FfxDIVZ_____ponderation_de_MAX2); \ GET_ARGUMENT_F("pxMINMAX_DIVZ=",FfxDIVZ_____ponderation_de_MINMAX); \ GET_ARGUMENT_F("pxMAXMIN_DIVZ=",FfxDIVZ_____ponderation_de_MAXMIN); \ GET_ARGUMENT_F("pxIMINMAX_DIVZ=",FfxDIVZ_____ponderation_de_IMINMAX); \ GET_ARGUMENT_F("pxIMAXMIN_DIVZ=",FfxDIVZ_____ponderation_de_IMAXMIN); \ GET_ARGUMENT_F("pxMOYE_DIVZ=",FfxDIVZ_____ponderation_de_MOYE); \ GET_ARGUMENT_F("pxMOYZ_DIVZ=",FfxDIVZ_____ponderation_de_MOYZ); \ GET_ARGUMENT_F("pxMOYZSI_DIVZ=",FfxDIVZ_____ponderation_de_MOYZSI); \ GET_ARGUMENT_F("pxMOYQ_DIVZ=",FfxDIVZ_____ponderation_de_MOYQ); \ GET_ARGUMENT_F("pxMOYQSI_DIVZ=",FfxDIVZ_____ponderation_de_MOYQSI); \ GET_ARGUMENT_F("pxMOYH_DIVZ=",FfxDIVZ_____ponderation_de_MOYH); \ GET_ARGUMENT_F("pxSPUIX_DIVZ=",FfxDIVZ_____ponderation_de_SPUIX); \ GET_ARGUMENT_F("pxSPUIXnc_DIVZ=",FfxDIVZ_____ponderation_de_SPUIXnc); \ GET_ARGUMENT_F("pxSE12_DIVZ=",FfxDIVZ_____ponderation_de_SE12); \ GET_ARGUMENT_F("pxSE22_DIVZ=",FfxDIVZ_____ponderation_de_SE22); \ GET_ARGUMENT_F("pxATAN_DIVZ=",FfxDIVZ_____ponderation_de_ATAN); \ GET_ARGUMENT_F("pxATANnc_DIVZ=",FfxDIVZ_____ponderation_de_ATANnc); \ GET_ARGUMENT_F("pxMULH24_DIVZ=",FfxDIVZ_____ponderation_de_MULH24); \ \ GET_ARGUMENT_L("MUL2_DIVZ=",FfxxDIVZ_____utiliser_FfxMUL2_a_la_place_de_FfxDIVZ); \ GET_ARGUMENT_N("DIVZ_DIVZ=",FfxxDIVZ_____utiliser_FfxMUL2_a_la_place_de_FfxDIVZ); \ /* Introduits le 20061030155146... */ \ \ GET_ARGUMENT_L("xFloat_MIN2=",FfxMIN2_____utiliser_evidemment_la_precision_Float); \ GET_ARGUMENT_F("pxADD2_MIN2=",FfxMIN2_____ponderation_de_ADD2); \ GET_ARGUMENT_F("pxSOUS_MIN2=",FfxMIN2_____ponderation_de_SOUS); \ GET_ARGUMENT_F("pxSOUSnc_MIN2=",FfxMIN2_____ponderation_de_SOUSnc); \ GET_ARGUMENT_F("pxMUL2_MIN2=",FfxMIN2_____ponderation_de_MUL2); \ GET_ARGUMENT_F("pxDIVZ_MIN2=",FfxMIN2_____ponderation_de_DIVZ); \ GET_ARGUMENT_F("pxDIVZnc_MIN2=",FfxMIN2_____ponderation_de_DIVZnc); \ GET_ARGUMENT_F("pxMIN2_MIN2=",FfxMIN2_____ponderation_de_MIN2); \ GET_ARGUMENT_F("pxMAX2_MIN2=",FfxMIN2_____ponderation_de_MAX2); \ GET_ARGUMENT_F("pxMINMAX_MIN2=",FfxMIN2_____ponderation_de_MINMAX); \ GET_ARGUMENT_F("pxMAXMIN_MIN2=",FfxMIN2_____ponderation_de_MAXMIN); \ GET_ARGUMENT_F("pxIMINMAX_MIN2=",FfxMIN2_____ponderation_de_IMINMAX); \ GET_ARGUMENT_F("pxIMAXMIN_MIN2=",FfxMIN2_____ponderation_de_IMAXMIN); \ GET_ARGUMENT_F("pxMOYE_MIN2=",FfxMIN2_____ponderation_de_MOYE); \ GET_ARGUMENT_F("pxMOYZ_MIN2=",FfxMIN2_____ponderation_de_MOYZ); \ GET_ARGUMENT_F("pxMOYZSI_MIN2=",FfxMIN2_____ponderation_de_MOYZSI); \ GET_ARGUMENT_F("pxMOYQ_MIN2=",FfxMIN2_____ponderation_de_MOYQ); \ GET_ARGUMENT_F("pxMOYQSI_MIN2=",FfxMIN2_____ponderation_de_MOYQSI); \ GET_ARGUMENT_F("pxMOYH_MIN2=",FfxMIN2_____ponderation_de_MOYH); \ GET_ARGUMENT_F("pxSPUIX_MIN2=",FfxMIN2_____ponderation_de_SPUIX); \ GET_ARGUMENT_F("pxSPUIXnc_MIN2=",FfxMIN2_____ponderation_de_SPUIXnc); \ GET_ARGUMENT_F("pxSE12_MIN2=",FfxMIN2_____ponderation_de_SE12); \ GET_ARGUMENT_F("pxSE22_MIN2=",FfxMIN2_____ponderation_de_SE22); \ GET_ARGUMENT_F("pxATAN_MIN2=",FfxMIN2_____ponderation_de_ATAN); \ GET_ARGUMENT_F("pxATANnc_MIN2=",FfxMIN2_____ponderation_de_ATANnc); \ GET_ARGUMENT_F("pxMULH24_MIN2=",FfxMIN2_____ponderation_de_MULH24); \ \ GET_ARGUMENT_L("xFloat_MAX2=",FfxMAX2_____utiliser_evidemment_la_precision_Float); \ GET_ARGUMENT_F("pxADD2_MAX2=",FfxMAX2_____ponderation_de_ADD2); \ GET_ARGUMENT_F("pxSOUS_MAX2=",FfxMAX2_____ponderation_de_SOUS); \ GET_ARGUMENT_F("pxSOUSnc_MAX2=",FfxMAX2_____ponderation_de_SOUSnc); \ GET_ARGUMENT_F("pxMUL2_MAX2=",FfxMAX2_____ponderation_de_MUL2); \ GET_ARGUMENT_F("pxDIVZ_MAX2=",FfxMAX2_____ponderation_de_DIVZ); \ GET_ARGUMENT_F("pxDIVZnc_MAX2=",FfxMAX2_____ponderation_de_DIVZnc); \ GET_ARGUMENT_F("pxMIN2_MAX2=",FfxMAX2_____ponderation_de_MIN2); \ GET_ARGUMENT_F("pxMAX2_MAX2=",FfxMAX2_____ponderation_de_MAX2); \ GET_ARGUMENT_F("pxMINMAX_MAX2=",FfxMAX2_____ponderation_de_MINMAX); \ GET_ARGUMENT_F("pxMAXMIN_MAX2=",FfxMAX2_____ponderation_de_MAXMIN); \ GET_ARGUMENT_F("pxIMINMAX_MAX2=",FfxMAX2_____ponderation_de_IMINMAX); \ GET_ARGUMENT_F("pxIMAXMIN_MAX2=",FfxMAX2_____ponderation_de_IMAXMIN); \ GET_ARGUMENT_F("pxMOYE_MAX2=",FfxMAX2_____ponderation_de_MOYE); \ GET_ARGUMENT_F("pxMOYZ_MAX2=",FfxMAX2_____ponderation_de_MOYZ); \ GET_ARGUMENT_F("pxMOYZSI_MAX2=",FfxMAX2_____ponderation_de_MOYZSI); \ GET_ARGUMENT_F("pxMOYQ_MAX2=",FfxMAX2_____ponderation_de_MOYQ); \ GET_ARGUMENT_F("pxMOYQSI_MAX2=",FfxMAX2_____ponderation_de_MOYQSI); \ GET_ARGUMENT_F("pxMOYH_MAX2=",FfxMAX2_____ponderation_de_MOYH); \ GET_ARGUMENT_F("pxSPUIX_MAX2=",FfxMAX2_____ponderation_de_SPUIX); \ GET_ARGUMENT_F("pxSPUIXnc_MAX2=",FfxMAX2_____ponderation_de_SPUIXnc); \ GET_ARGUMENT_F("pxSE12_MAX2=",FfxMAX2_____ponderation_de_SE12); \ GET_ARGUMENT_F("pxSE22_MAX2=",FfxMAX2_____ponderation_de_SE22); \ GET_ARGUMENT_F("pxATAN_MAX2=",FfxMAX2_____ponderation_de_ATAN); \ GET_ARGUMENT_F("pxATANnc_MAX2=",FfxMAX2_____ponderation_de_ATANnc); \ GET_ARGUMENT_F("pxMULH24_MAX2=",FfxMAX2_____ponderation_de_MULH24); \ \ GET_ARGUMENT_F("HORNER_2_04_44=""H2_04_44=",FfHORNER_2_04_____coefficient_44); \ GET_ARGUMENT_F("HORNER_2_04_43=""H2_04_43=",FfHORNER_2_04_____coefficient_43); \ GET_ARGUMENT_F("HORNER_2_04_42=""H2_04_42=",FfHORNER_2_04_____coefficient_42); \ GET_ARGUMENT_F("HORNER_2_04_41=""H2_04_41=",FfHORNER_2_04_____coefficient_41); \ GET_ARGUMENT_F("HORNER_2_04_40=""H2_04_40=",FfHORNER_2_04_____coefficient_40); \ GET_ARGUMENT_F("HORNER_2_04_34=""H2_04_34=",FfHORNER_2_04_____coefficient_34); \ GET_ARGUMENT_F("HORNER_2_04_33=""H2_04_33=",FfHORNER_2_04_____coefficient_33); \ GET_ARGUMENT_F("HORNER_2_04_32=""H2_04_32=",FfHORNER_2_04_____coefficient_32); \ GET_ARGUMENT_F("HORNER_2_04_31=""H2_04_31=",FfHORNER_2_04_____coefficient_31); \ GET_ARGUMENT_F("HORNER_2_04_30=""H2_04_30=",FfHORNER_2_04_____coefficient_30); \ GET_ARGUMENT_F("HORNER_2_04_24=""H2_04_24=",FfHORNER_2_04_____coefficient_24); \ GET_ARGUMENT_F("HORNER_2_04_23=""H2_04_23=",FfHORNER_2_04_____coefficient_23); \ GET_ARGUMENT_F("HORNER_2_04_22=""H2_04_22=",FfHORNER_2_04_____coefficient_22); \ GET_ARGUMENT_F("HORNER_2_04_21=""H2_04_21=",FfHORNER_2_04_____coefficient_21); \ GET_ARGUMENT_F("HORNER_2_04_20=""H2_04_20=",FfHORNER_2_04_____coefficient_20); \ GET_ARGUMENT_F("HORNER_2_04_14=""H2_04_14=",FfHORNER_2_04_____coefficient_14); \ GET_ARGUMENT_F("HORNER_2_04_13=""H2_04_13=",FfHORNER_2_04_____coefficient_13); \ GET_ARGUMENT_F("HORNER_2_04_12=""H2_04_12=",FfHORNER_2_04_____coefficient_12); \ GET_ARGUMENT_F("HORNER_2_04_11=""H2_04_11=",FfHORNER_2_04_____coefficient_11); \ GET_ARGUMENT_F("HORNER_2_04_10=""H2_04_10=",FfHORNER_2_04_____coefficient_10); \ GET_ARGUMENT_F("HORNER_2_04_04=""H2_04_04=",FfHORNER_2_04_____coefficient_04); \ GET_ARGUMENT_F("HORNER_2_04_03=""H2_04_03=",FfHORNER_2_04_____coefficient_03); \ GET_ARGUMENT_F("HORNER_2_04_02=""H2_04_02=",FfHORNER_2_04_____coefficient_02); \ GET_ARGUMENT_F("HORNER_2_04_01=""H2_04_01=",FfHORNER_2_04_____coefficient_01); \ GET_ARGUMENT_F("HORNER_2_04_00=""H2_04_00=",FfHORNER_2_04_____coefficient_00); \ /* Les arguments de 'HORNER_2_04(...)' ont ete introduits le 20181126113624... */ \ /* */ \ /* Pour ce qui est de leur signification, voir 'v $xig/fonct$vv$FON HORNER_2_04.x,y,.....='. */ \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ Eblock \ /* Recuperation des arguments relatifs a l'arithmetique "etendue" des nombres flottants. */ \ /* Ceci a ete introduit le 20050303120845... */ \ /* */ \ /* Le 20061023104050 furent introduites les ponderations du type '_*ponderation_de_MINMAX' */ \ /* et '_*ponderation_de_MAXMIN'... */ \ /* */ \ /* Le 20061025132344 furent introduites les ponderations du type '_*ponderation_de_MOYZSI' */ \ /* et '_*ponderation_de_MOYQSI'... */ \ /* */ \ /* Le 20080102133640 furent introduites les ponderations du type '*_ponderation_de_IMINMAX' */ \ /* et '*_ponderation_de_IMAXMIN'... */ \ /* */ \ /* Le 20090330123200 les indicateurs '*_utiliser_evidemment_la_precision_Float' furent */ \ /* introduits... */ \ /* */ \ /* Le 20180821095031 furent introduites les ponderations du type '*_ponderation_de_SE12' */ \ /* et '*_ponderation_de_SE22'... */ \ /* */ \ /* Le 20180823095353 furent introduites les ponderations du type '_*ponderation_de_MOYH'... */ \ /* */ \ /* Le 20181009170824 furent introduites les ponderations du type '_*ponderation_de_ATAN'... */ # define EDITION_DE_LA_VALEUR_DES_COMPTEURS_DE_REFERENCE_LORS_DU__RETU_Commande \ Bblock \ EDITION_DE_LA_VALEUR_DE_LA_PLUPART_DES_COMPTEURS; \ /* Editions introduites sous cette forme le 20180410205856... */ \ \ Test(IL_FAUT(editer_la_valeur_des_compteurs_de_reference_lors_du__RETU_Commande)) \ Bblock \ PRINT_MESSAGE(C_VIDE,"EDITION DES COMPTEURS D'INSTRUCTION"); \ /* Edition introduite le 20170518184508... */ \ \ CALS(Fsauts_de_lignes(UN)); \ \ CAL3(Prme2("Compteur de reference 'FfxADD2(...)'%s%d\n",SIGNE_EGAL,FfxADD2_____compteur_de_reference)); \ CAL3(Prme2("Compteur de reference 'FfxSOUS(...)'%s%d\n",SIGNE_EGAL,FfxSOUS_____compteur_de_reference)); \ CAL3(Prme2("Compteur de reference 'FfxMUL2(...)'%s%d\n",SIGNE_EGAL,FfxMUL2_____compteur_de_reference)); \ CAL3(Prme2("Compteur de reference 'FfxDIVZ(...)'%s%d\n",SIGNE_EGAL,FfxDIVZ_____compteur_de_reference)); \ CAL3(Prme2("Compteur de reference 'FfxMIN2(...)'%s%d\n",SIGNE_EGAL,FfxMIN2_____compteur_de_reference)); \ CAL3(Prme2("Compteur de reference 'FfxMAX2(...)'%s%d\n",SIGNE_EGAL,FfxMAX2_____compteur_de_reference)); \ \ CALS(Fsauts_de_lignes(UN)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Introduit le 20130518210504... */ #Aifdef GENERER_LES_GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS # define GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS \ Bblock \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ BLOC(VIDE;); \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ Eblock # define EDITION_DE_LA_VALEUR_DES_COMPTEURS_DE_REFERENCE_LORS_DU__RETU_Commande \ Bblock \ EDITION_DE_LA_VALEUR_DE_LA_PLUPART_DES_COMPTEURS; \ /* Editions introduites sous cette forme le 20180410205856... */ \ Eblock \ /* Introduit le 20130518210504... */ #Eifdef GENERER_LES_GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS #define INTRODUCTION_D_UNE_VALEUR_INTERACTIVE \ K_INTERROGATION \ /* Pour demander la definition interactive d'une valeur (introduit le 20051111123040). */ #define AVERTIR_EN_CAS_D_INCOMPATIBILITE_D_EDITION_DES_SYNONYMES \ Bblock \ Test(IFET(IL_NE_FAUT_PAS(editer_les_synonymes_des_parametres_d_une_commande) \ ,IL_FAUT(grouper_les_synonymes_des_parametres_d_une_commande) \ ) \ ) \ Bblock \ PRINT_ATTENTION("les options 'ParametresSynonymes=' et 'ParametresSynonymesGrouper=' sont mal utilises"); \ CAL1(Prer0("(le fonctionnement suivant sera equivalent a : ")); \ CAL1(Prer2("'ParametresSynonymes=%s' et 'ParametresSynonymesGrouper=%s')\n" \ ,C_FAUX____ \ ,C_FAUX____ \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Avertissement en cas d'incompatibilites reconnues dans l'edition des synonymes. Cela a */ \ /* ete introduit le 20070330185257... */ #define AVERTIR_EN_CAS_D_INCOMPATIBILITE_DE_MISE_EN_PAGE_DES_PARAMETRES \ Bblock \ Test(IFET(IL_FAUT(sauter_une_ligne_pour_chaque_nouveau_Parametre) \ ,IL_FAUT(alterner_les_parametres_pour_plus_de_lisibilite) \ ) \ ) \ Bblock \ PRINT_ATTENTION("les options 'SautParametres=' et 'AlternerParametres=' ne peuvent etre VRAI simultanement"); \ CAL1(Prer2("(le fonctionnement suivant sera equivalent a : 'SautParametres=%s' et 'AlternerParametres=%s')\n" \ ,C_FAUX____ \ ,C_VRAI____ \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Avertissement en cas d'incompatibilites reconnues dans la mise en page d'edition des */ \ /* parametres. Cela a ete introduit le 20060622135953... */ #define AVERTIR_EN_CAS_D_ENTREE_INTERACTIVE_D_UN_PARAMETRE \ Bblock \ Test(IL_FAUT(tenter_une_entree_interactive_des_parametres)) \ Bblock \ Test(EST_VRAI(STANDARD_IN_EST_UN_PIPE)) \ Bblock \ PRINT_ATTENTION("l'entree interactive des Parametres est impossible si 'STANDARD_IN' est un 'pipe'"); \ EGAL(tenter_une_entree_interactive_des_parametres,FAUX); \ /* L'entree interactive est alors desactivee immediatement (introduit le 20051117101210)... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFET(IL_FAUT(tenter_une_entree_interactive_des_parametres) \ ,IFEQ(PREMIER_CARACTERE_ITb0(introduction_d_une_valeur_interactive) \ ,INTRODUCTION_D_UNE_VALEUR_INTERACTIVE \ ) \ ) \ ) \ Bblock \ PRINT_ATTENTION("un 'set noglob' prealable est necessaire dans le contexte courant (et dans cet ordre)"); \ CAL1(Prer2("ParametresInteractifsIntroduction='%c' ParametresInteractifsActivation=%s\n" \ ,PREMIER_CARACTERE_ITb0(introduction_d_une_valeur_interactive) \ ,ETAT_LOGIQUE(tenter_une_entree_interactive_des_parametres) \ ) \ ); \ CAL1(Prer2("[PII='%c' PIA=%s]\n" \ ,PREMIER_CARACTERE_ITb0(introduction_d_une_valeur_interactive) \ ,ETAT_LOGIQUE(tenter_une_entree_interactive_des_parametres) \ ) \ ); \ CAL1(Prer0("\n")); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Avertissement en cas d'entree interactive des parametres. Ceci fut introduit le */ \ /* 20051112205650... */ #define AVERTIR_EN_CAS_D_ENTREE_VIA_UN_setenv_D_UN_PARAMETRE \ Bblock \ Test(EST_VRAI(entrer_des_parametres_via_des_setenv)) \ Bblock \ Test(IFGT(numero_d_argument_courant,NUMERO_PREMIER_ARGUMENT)) \ Bblock \ PRINT_ATTENTION("le parametre 'Environnement=' (ou 'setenv=') doit etre le premier pour etre effectif"); \ \ EGAL(entrer_des_parametres_via_des_setenv,FAUX); \ /* Ce parametre est alors desactive (meme si cela ne sert plus a rien et ce a cause de */ \ /* la definition de 'v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_ENTREE_PAR_setenv'...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Avertissement en cas d'entree des parametres via des 'setenv's. Ceci fut introduit le */ \ /* 20060315151257 a cause de 'v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_ENTREE_PAR_setenv' */ \ /* ou l'on voit que l'entree via des 'setenv' ne se fait que lors du premier balayage de */ \ /* liste complete des arguments du '$K' courant, c'est-a-dire lorsque l'on tente de */ \ /* recuperer le premier parametre. Dans ce cas, celui-ci doit imperativement etre donc */ \ /* 'entrer_des_parametres_via_des_setenv' (entre via "Environnement=" ou "setenv=")... */ #define MISE_A_JOUR_des_format_EGAr \ Bblock \ CALS(desallocation_memoire_des_format_EGAr()); \ CALS(allocation_memoire_et_generation_des_format_EGAr()); \ Eblock \ /* Introduit le 20200329091313. En effet a cette date (et donc bien tardivement) je decouvre */ \ /* que la pre-generation des 'format_EGAr's presente un inconvenient en ce qui concerne les */ \ /* formats susceptibles d'etre modifies via un 'GET_ARGUMENT_*(...)'. C'est par exemple */ \ /* le cas de "SigneInt=" et de "SigneFlot=" qui, a cette date, etaient donc ineffectifs... */ \ /* La solution est donc de les regenerer apres ces 'GET_ARGUMENT_*(...)'s... */ #define editer_versions_programme_librairies_dynamiques \ editer_les_differentes_versions_du_programme_dans_les_librairies_dynamiques \ /* Pour raccourcir une ligne qui va suivre (introduit le 20111009111159)... */ #ifndef NE_PAS_GENERER__GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE__POUVANT_ETRE_FACULTATIFS__01 /* Cet indicateur est controlable par '$xcc/cpp$Z __POUVANT_ETRE_FACULTATIFS__' ainsi que */ /* par 'PRAGMA_CPP_____BLOQUER_LA_SIMPLIFICATION__POUVANT_ETRE_FACULTATIFS__'... */ #Aifndef NE_PAS_GENERER__GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE__POUVANT_ETRE_FACULTATIFS__01 & mdefine NePasGenerer_PARAMETRE_____editer_la_valeur_des_compteurs_de_reference_lors_du__RETU_Commande&&& & mdefine NePasGenerer_PARAMETRE_____lister_les_parametres_non_parfaitement_reconnus&&& & mdefine NePasGenerer_PARAMETRE_____permettre_l_acces_au_source_du_programme&&& & mdefine NePasGenerer_PARAMETRE_____valider_la_longueur_des_noms_absolus_de_fichiers&&& & mdefine NePasGenerer_PARAMETRE_____forcer_la_validation_de_la_longueur_des_noms_absolus_de_fichiers&&& & mdefine NePasGenerer_PARAMETRE_____valider_la_longueur_des_noms_relatifs_de_fichiers&&& & mdefine NePasGenerer_PARAMETRE_____forcer_la_validation_de_la_longueur_des_noms_relatifs_de_fichiers&&& & mdefine NePasGenerer_PARAMETRE_____DoQu_____editer_le_message_d_une_possible_boucle_infinie&&& & mdefine NePasGenerer_PARAMETRE_____editer_____liste_des_CODE_ERREUR_rencontres&&& & mdefine NePasGenerer_PARAMETRE_____Fstore_non_securise_fichier_non_formatte_____compacter_1&&& & mdefine NePasGenerer_PARAMETRE_____Fstore_non_securise_fichier_non_formatte_____taux_de_compactage_1&&& & mdefine NePasGenerer_PARAMETRE_____Fload_fichier_non_formatte_____decompacter_1&&& /* Ces 'mdefine's ont ete introduits le 20200418132843. L'avantage de cette solution par */ /* rapport a la solution anterieure (qui consistait a ne pas implementer les procedures */ /* du type 'GET_ARGUMENT_L(...)' correspondantes) est que les 'GET_ARGUMENT_L(...)'s */ /* associees sont bien referencees ce qui permet de lister ensuite les parametres non */ /* generees via 'editer_le_nom_des_parametres_non_generes_d_une_commande'... */ #Eifndef NE_PAS_GENERER__GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE__POUVANT_ETRE_FACULTATIFS__01 #ifndef NE_PAS_GENERER__GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE__POUVANT_ETRE_FACULTATIFS__02 /* Cet indicateur est controlable par '$xcc/cpp$Z __POUVANT_ETRE_FACULTATIFS__' ainsi que */ /* par 'PRAGMA_CPP_____BLOQUER_LA_SIMPLIFICATION__POUVANT_ETRE_FACULTATIFS__'... */ #Aifndef NE_PAS_GENERER__GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE__POUVANT_ETRE_FACULTATIFS__02 & mdefine NePasGenerer_PARAMETRE_____allocation_memoire_avec_validation_____valider_par_rapport_a_MemorySizeMB&&& & mdefine NePasGenerer_PARAMETRE_____temp_allocation_memoire_avec_validation_____Amarge_de_securite&&& & mdefine NePasGenerer_PARAMETRE_____temp_allocation_memoire_avec_validation_____Bmarge_de_securite&&& & mdefine NePasGenerer_PARAMETRE_____Malo_____valider_si_possible_l_utilisation_de_la_memoire_allouee&&& /* Ces 'mdefine's ont ete introduits le 20200418132843. L'avantage de cette solution par */ /* rapport a la solution anterieure (qui consistait a ne pas implementer les procedures */ /* du type 'GET_ARGUMENT_L(...)' correspondantes) est que les 'GET_ARGUMENT_L(...)'s */ /* associees sont bien referencees ce qui permet de lister ensuite les parametres non */ /* generees via 'editer_le_nom_des_parametres_non_generes_d_une_commande'... */ #Eifndef NE_PAS_GENERER__GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE__POUVANT_ETRE_FACULTATIFS__02 #define GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE \ Bblock \ /* Cette initialisation doit etre faite dynamiquement car, en effet, cela n'est pas possible */ \ /* dans 'v $xig/fonct$vv$FON sequence_d_echappement_VT100_alternance_des_parametres' puisque */ \ /* la fonction generalement referencee par 'INIC(...)' ne peut etre executee au moment de */ \ /* la definition d'une variable 'Common'. Ceci fut mis en place le 20060610115523... */ \ /* */ \ /* Jusqu'au 20060610150539, il y avait donc ci-desus : */ \ /* */ \ /* EGAL(sequence_d_echappement_VT100_alternance_des_parametres */ \ /* ,chain_Acopie(SEQUENCE_D_ECHAPPEMENT_VT100_INVERSION) */ \ /* ); */ \ /* */ \ /* parce qu'il semblait impossible de faire cette initialisation directement dans */ \ /* 'v $xig/fonct$vv$FON sequence_d_echappement_VT100_alternance_des_parametres'. En fait */ \ /* cela est effectivement impossible si l'on utilise alors 'INIC(...)', or apparemment, il */ \ /* est possible d'utiliser 'INIT(...)', d'ou la suppression de ce 'EGAL(...)'. */ \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____PRIMAIRES; \ \ BLOC( \ begin_nouveau_block \ Bblock \ /* Introduit le 20091123131100 pour des raisons de lisibilite (tabulation...). */ \ EGAL(bloquer_provisoirement__entrer_des_parametres_via_des_setenv,VRAI); \ /* Introduit le 20090422091211... */ \ \ GET_ARGUMENT_L("Parametres=",editer_la_valeur_des_parametres_d_une_commande); \ /* Ce parametre doit imperativement etre le premier, puisque c'est lui qui controle */ \ /* l'edition des parametres qui le suivent (d'ou le 20061116094115 la remise en seconde */ \ /* position de 'MARQUEUR________DebutParametresGeneraux'...). */ \ /* */ \ /* Le 20030710112150, j'ai enfin compris pourquoi "Parametres=" n'apparaissait pas lors */ \ /* "Parametres=VRAI" etait demande, de meme que le manque d'homogeneite du debut de la */ \ /* liste des parametres (lorsque "Parametres=VRAI") alors que les parametres de mise en */ \ /* page "TabulationParametres=" et/ou "SautParametres=" etaient demandes. En fait, il */ \ /* suffit que d'autres parametres les suivent. Ainsi, pour que la mise en page des */ \ /* parametres soit homogene, il faut imperativement qu'il y ait d'autres parametres */ \ /* introduits apres eux et ce afin que le traitement de l'un d'eux ne soit pas fait */ \ /* dans 'c_est_la_derniere_recherche_des_parametres' car, en effet, dans ce cas le */ \ /* dernier parametre traite (le dernier de la liste d'appel) est traite simultanement a */ \ /* l'edition des parametres ; donc si ce parametre controle cette edition, une partie de */ \ /* celle-ci (en fait celle qui concerne les parametres qui precedent ce dernier parametre */ \ /* dans la liste des 'GET_ARGUMENT_?(...)' qui est ici definie....) sera faite alors que */ \ /* ce parametre n'aura pas encore sa nouvelle valeur. Ainsi, par exemple, on pourra */ \ /* ecrire : */ \ /* */ \ /* Parametres=VRAI */ \ /* TabulationParametres=... */ \ /* SautParametres=VRAI */ \ /* Parametres=VRAI */ \ /* */ \ /* le deuxieme "Parametres=VRAI" etant la uniquement pour que "SautParametres=VRAI" (ou */ \ /* "TabulationParametres=...") ne soit pas le dernier de la liste. Cela a d'ailleurs */ \ /* entraine la modification 'v $Falias_use 20030710115901'. */ \ \ EGAL(bloquer_provisoirement__entrer_des_parametres_via_des_setenv,FAUX); \ /* Introduit le 20090422091211... */ \ Eblock \ end_nouveau_block \ \ MARQUEUR________DebutParametresGeneraux; \ /* Argument fictif destine a marquer le debut des Parametres Generaux (le 20010420143829). */ \ /* Il ne peut apparaitre qu'apres 'editer_la_valeur_des_parametres_d_une_commande' afin */ \ /* justement de pouvoir etre edite... */ \ /* */ \ /* Le 20030710112150, 'MARQUEUR________DebutParametresGeneraux' est passe en tete car cela */ \ /* est plus logique (par definition de 'MARQUEUR________DebutParametresGeneraux'...). */ \ /* */ \ /* Le 20061116094115, 'MARQUEUR________DebutParametresGeneraux' est repasse en seconde */ \ /* position (et donc derriere "Parametres=") car, en effet, en premiere position il ne */ \ /* peut pas etre edite par "Parametres=VRAI"... */ \ \ GET_ARGUMENT_L("ForcerExecution=",forcer_l_execution_malgre_les_editions_demandees); \ /* Ce parametre a ete introduit le 20170604111437 afin de permettre de savoir quels sont */ \ /* parametres reellement utilises pour l'execution d'une commande. Il faudra donc utiliser : */ \ /* */ \ /* Parametres=VRAI */ \ /* ForcerExecution=VRAI */ \ /* */ \ \ GET_ARGUMENT_L("ParametresNonGeneres=""PNG=",editer_le_nom_des_parametres_non_generes_d_une_commande); \ /* Introduit le 20180228101858 et mis ici le 20200418122451, hots des arguments facultatifs */ \ /* 'GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE__POUVANT_ETRE_FACULTATIFS__01'... */ \ \ GET_ARGUMENTS5_L("editer_compteurs_de_reference=""ecr=" \ ,editer_la_valeur_des_compteurs_de_reference_lors_du__RETU_Commande \ ,FgEDITION_DE_LA_VALEUR_DE_LA_PLUPART_DES_COMPTEURS_____activer \ ,FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ALLOCATION_DESALLOCATION_MEMOIRE_____activer \ ,FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ENTREE_DES_ARGUMENTS_DES_K_S____activer \ ,FgEDITION_DE_LA_VALEUR_DES_COMPTEURS_D_ACCES_AUX_FONCTIONS_DE_BASE____activer \ ); \ /* Mis ici le 20180314115527... */ \ \ GET_ARGUMENT_L("ListerParametresNonParfaitementReconnus=""LPNPR=" \ ,lister_les_parametres_non_parfaitement_reconnus \ ); \ /* Ce parametre introduit le 20150530094835 permet de bloquer l'edition des messages */ \ /* emis lorsqu'un ou plusieurs parametres n'existent pas ou sont mal utilises. Il pourra */ \ /* etre utilise, par exemple, dans un '$Z' pour remplacer temporairement un '$X' par un */ \ /* autre, alors qu'il n'ont pas les memes parametres (ainsi, par exemple, '$xci/init$X' */ \ /* remplacant '$xci/fract_2D.01$X'...). */ \ \ GET_ARGUMENT_L("SourceProgramme=",permettre_l_acces_au_source_du_programme); \ /* ATTENTION : je note le 20080917170001 qu'evidemment il ne faut pas ecrire : */ \ /* */ \ /* ... SourceProgramme=VRAI | $Mor */ \ /* */ \ /* car, en effet, cela donne le message : */ \ /* */ \ /* Vim: Warning: Output is not to a terminal */ \ /* */ \ /* et ne fonctionne pas... */ \ \ GET_ARGUMENT_L("Vna=""Valider_noms_absolus=",valider_la_longueur_des_noms_absolus_de_fichiers); \ /* Le parametre "Vna=" a ete introduit le 20070416135936... */ \ GET_ARGUMENT_L("Fvna=""Forcer_validation_noms_absolus=" \ ,forcer_la_validation_de_la_longueur_des_noms_absolus_de_fichiers \ ); \ /* Ce parametre a ete introduit le 20070619173244... */ \ GET_ARGUMENT_L("Vnr=""Valider_noms_relatifs=",valider_la_longueur_des_noms_relatifs_de_fichiers); \ /* Le parametre "Vnr=" a ete introduit le 20070416135936... */ \ GET_ARGUMENT_L("Fvnr=""Forcer_validation_noms_relatifs=" \ ,forcer_la_validation_de_la_longueur_des_noms_relatifs_de_fichiers \ ); \ /* Ce parametre a ete introduit le 20070619173244... */ \ \ GET_ARGUMENT_L("DoQu_infinie=""DoQu=",DoQu_____editer_le_message_d_une_possible_boucle_infinie); \ /* Introduit le 20120419142800... */ \ \ GET_ARGUMENT_L("EditerCodesErreurs=""ECE=",editer_____liste_des_CODE_ERREUR_rencontres); \ /* Introduit le 20110224152209... */ \ \ GET_ARGUMENT_L("compacter_1=",Fstore_non_securise_fichier_non_formatte_____compacter_1); \ GET_ARGUMENT_F("taux_compactage_1=",Fstore_non_securise_fichier_non_formatte_____taux_de_compactage_1); \ GET_ARGUMENT_L("decompacter_1=",Fload_fichier_non_formatte_____decompacter_1); \ \ PROCESS_ARGUMENT_L("All=" \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ EGAL(editer_les_differents_bugs_reconnus \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ EGAL(editer_les_differents_includes_du_programme \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ EGAL(lister_tous_les_messages_possibles \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ EGAL(editer_le_NOM_SYNTHETIQUE_de_la_commande_courante \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ EGAL(editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ EGAL(editer_la_valeur_des_parametres_d_une_commande \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ EGAL(editer_les_differentes_variables_d_environnement_utiles \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ EGAL(editer_les_differentes_versions_du_programme \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ EGAL(editer_la_liste_des_librairies_dynamiques_utilisees \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ EGAL(editer_versions_programme_librairies_dynamiques \ ,editer_tout_ce_est_utile_concernant_le_fonctionnement_et_l_utilisation \ ); \ Eblock \ ) \ ); \ /* Ce parametre a ete introduit le 20091027115127... */ \ /* */ \ /* Le cas de 'editer_les_differentes_versions_du_programme_dans_les_librairies_dynamiques' */ \ /* a ete introduit le 20111009110606 car, en effet, il manquait... */ \ /* */ \ /* Le test de 'editer_la_liste_des_librairies_dynamiques_utilisees' a ete introduit le */ \ /* 20220824180116... */ \ \ GET_ARGUMENT_I("TabulationParametres=",tabulation_des_valeurs_affectees_aux_titres); \ /* Ce parametre doit imperativement etre le second si l'on souhaite que la tabulation des */ \ /* sorties de "Parametres=VRAI" soit homogene... */ \ PROCESS_ARGUMENT_L("SautParametres=" \ ,sauter_une_ligne_pour_chaque_nouveau_Parametre \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ AVERTIR_EN_CAS_D_INCOMPATIBILITE_DE_MISE_EN_PAGE_DES_PARAMETRES; \ Eblock \ ) \ ); \ /* Ce nouveau parametre a ete introduit le 20030627132814 afin de permettre d'aerer la */ \ /* presentation. Le 20030628110830, j'ai change "NL_Parametres=" en "SautParametres=" qui */ \ /* me semble plus "homogene"... */ \ \ /* Les parametres suivants relatifs aux synonymes ont ete mis ici le 20070330145617, alors */ \ /* qu'anterieurement ils figuraient juste apres "cpp="... */ \ \ PROCESS_ARGUMENT_L("ParametresSynonymes=""PS=" \ ,editer_les_synonymes_des_parametres_d_une_commande \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ AVERTIR_EN_CAS_D_INCOMPATIBILITE_D_EDITION_DES_SYNONYMES; \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_L("ParametresSynonymesGrouper=""PSG=" \ ,grouper_les_synonymes_des_parametres_d_une_commande \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ AVERTIR_EN_CAS_D_INCOMPATIBILITE_D_EDITION_DES_SYNONYMES; \ Eblock \ ) \ ); \ /* Parametre introduit le 20070330091147... */ \ \ GET_ARGUMENT_I("ParametresLongueurMaximale=" \ ,editer_la_valeur_des_parametres_d_une_commande_____longueur_maximale_des_vecteurs \ ); \ \ /* Les parametres precedents relatifs aux synonymes ont ete mis ici le 20070330145617, alors */ \ /* qu'anterieurement ils figuraient juste apres "cpp="... */ \ \ PROCESS_ARGUMENT_K("FORMAT_CHAI=""CHAI=" \ ,PREMIER_CARACTERE_ITb0(FORMAT_CHAI_EDITION_____caractere_d_encadrement) \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ MISE_A_JOUR_des_format_EGAr; \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_K("FORMAT_CHAR=""CHAR=" \ ,PREMIER_CARACTERE_ITb0(FORMAT_CHAR_EDITION_____caractere_d_encadrement) \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ MISE_A_JOUR_des_format_EGAr; \ Eblock \ ) \ ); \ /* Introduit le 20070227185323... */ \ \ PROCESS_ARGUMENT_L("AlternerParametres=" \ ,alterner_les_parametres_pour_plus_de_lisibilite \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ AVERTIR_EN_CAS_D_INCOMPATIBILITE_DE_MISE_EN_PAGE_DES_PARAMETRES; \ Eblock \ ) \ ); \ GET_ARGUMENT_C("TypeAlternanceParametres=",sequence_d_echappement_VT100_alternance_des_parametres); \ /* Ces nouveaux parametres ont ete introduits le 20060610103137 afin de permettre d'inverser */ \ /* un parametre sur deux lors de leur eventuelle edition et ainsi en ameliorer la */ \ /* lisibilite... */ \ /* */ \ /* Evidemment, l'inversion ne prend effet qu'apres son activation dans le cas ou la non */ \ /* est l'etat par defaut (cas le 20060610111958)... */ \ \ GET_ARGUMENT_L("NomParametres=",editer_le_nom_des_parametres_d_une_commande); \ \ PROCESS_ARGUMENT_C("PreFixeParametres=""PFP=" \ ,prefixe_destine_a_abreger_certains_Parametres_qui_suivent \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ Test(EST_FAUX(chain_compare(prefixe_destine_a_abreger_certains_Parametres_qui_suivent \ ,C_VIDE \ ) \ ) \ ) \ Bblock \ INCR(nombre_de_demandes_effectives_de_PreFixeParametres,I); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ) \ ); \ /* Le parametre 'prefixe_destine_a_abreger_certains_Parametres_qui_suivent' a ete */ \ /* introduit le 20030704090902 afin de permettre une utilisation du type abreviation des */ \ /* parametres trop longs. Ainsi, par exemple, au lieu d'ecrire : */ \ /* */ \ /* LISTE_A11=... */ \ /* LISTE_A12=... */ \ /* (...) */ \ /* LISTE_A23=... */ \ /* */ \ /* on pourra ecrire : */ \ /* */ \ /* PreFixeParametres="LISTE_" */ \ /* A11=... */ \ /* A12=... */ \ /* (...) */ \ /* A23=... */ \ /* */ \ /* lors de l'utilisation de 'v $xrv/SysLin_2D.01$K'. Mais ATTENTION, afin de pouvoir */ \ /* ecrire : */ \ /* */ \ /* (...) */ \ /* PreFixeParametres="LISTE_" */ \ /* A11=... */ \ /* A12=... */ \ /* (...) */ \ /* A23=... */ \ /* PreFixeParametres="" */ \ /* (...) */ \ /* */ \ /* il est necessaire que ce dispositif ne prefixe pas "PreFixeParametres=" (et ne le */ \ /* transforme donc pas, dans cet exemple, en "LISTE_PreFixeParametres=" qui n'existe */ \ /* pas...). C'est pourquoi, le 20030704142017, ce dispositif a vu son utilisation */ \ /* restreinte a 'PROCESF_ARGUMENT_C(...)' et interdite a 'PROCESS_PARAMETRE(...)'... */ \ /* Ainsi, "PreFixeParametres=" n'est plus prefixable de meme que tous les parametres */ \ /* definis via 'PROCESS_PARAMETRE(...)'... */ \ /* */ \ /* Le 20030708094336, les 'GET_ARGUMENT_C(...)' ont ete remplaces par des */ \ /* 'PROCESS_ARGUMENT_C(...)' afin de permettre le comptage des demandes de modifications */ \ /* effectives de 'prefixe_destine_a_abreger_certains_Parametres_qui_suivent'... */ \ \ PROCESS_ARGUMENT_L("ParametresInteractifsActivation=""PIA=" \ ,tenter_une_entree_interactive_des_parametres \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ AVERTIR_EN_CAS_D_ENTREE_INTERACTIVE_D_UN_PARAMETRE; \ Eblock \ ) \ ); \ /* Ce parametre a ete introduit le 20051111141329 et le 20051112205650 ("PIA="). */ \ PROCESS_ARGUMENT_K("ParametresInteractifsIntroduction=""PII=" \ ,PREMIER_CARACTERE_ITb0(introduction_d_une_valeur_interactive) \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ AVERTIR_EN_CAS_D_ENTREE_INTERACTIVE_D_UN_PARAMETRE; \ Eblock \ ) \ ); \ /* Ce parametre a ete introduit le 20051112205650 et le 20051114115905 ("PII="). */ \ \ GET_ARGUMENT_L("ChronometrerCommande=""ChC=",chronometrer_la_commande_courante); \ /* Ce parametre a ete introduit le 20170518114143 et permet de chronometrer la commande */ \ /* courante. Au passage, "CC=" n'est pas disponible ('v $xci/ondes.01$K CC=')... */ \ \ GET_ARGUMENT_L("NeRienFaire=""NRF=",ne_rien_faire_et_sortir_immediatement); \ /* Ce parametre a ete introduit le 20061110090803 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... */ \ /* */ \ /* Le synonyme "NRF=" a ete introduit le 20180414110021 pour simplifier les tests... */ \ \ GET_ARGUMENT_C("IdentifiantBranchesParalleles=""IdentifiantBrancheParallele=""IBP=" \ ,identifiant_de_branches_paralleles \ ); \ /* Afin de pouvoir distinguer, si besoin est, plusieurs commandes identiques s'executant */ \ /* en parallele, par exemple via 'execRVB' (introduit le 20111121135717 et complete le */ \ /* 20111122093216 avec les synonymes "IdentifiantBrancheParallele=" et "IBP="...). */ \ \ GET_ARGUMENT_L("FconversionIJXY_vide_forcee=""FIJXYvf=" \ ,FconversionI__FconversionJ__FconversionX__FconversionY_____une_valeur_vide_doit_etre_forcee \ ); \ GET_ARGUMENT_L("FconversionF_vide_forcee=""FFvf=" \ ,FconversionF_____une_valeur_vide_doit_etre_forcee \ ); \ GET_ARGUMENT_L("FconversionK_vide_forcee=""FKvf=" \ ,FconversionK_____une_valeur_vide_doit_etre_forcee \ ); \ GET_ARGUMENT_L("FconversionCCLCN_vide_forcee=""FCCLCNvf=" \ ,FconversionC__FconversionCL__FconversionCN_____une_valeur_vide_doit_etre_forcee \ ); \ /* Arguments introduits le 20120108102520... */ \ /* */ \ /* On notera qu'evidemment ces arguments doivent etre utilises avant les arguments */ \ /* concernes. Ainsi, par exemple : */ \ /* */ \ /* $xcg/DIVZ.01$X nombre_2= FconversionF_vide_forcee=FAUX */ \ /* */ \ /* n'utilisera pas la valeur par defaut (=1, 'v $xcg/DIVZ.01$K NOMBRE_2') mais la valeur */ \ /* forcee (=0, 'v $xig/fonct$vv$DEF VALEUR_VIDE_POUR_FconversionF'). Il conviendra donc */ \ /* d'ecrire : */ \ /* */ \ /* $xcg/DIVZ.01$X FconversionF_vide_forcee=FAUX nombre_2= */ \ /* */ \ /* pour obtenir l'effet attendu... */ \ \ GET_ARGUMENT_L("avertir_UNDEF=""UNDEF=" \ ,FconversionI__FconversionJ__FconversionX__FconversionY_____avertir_lors_de_l_entree_de_UNDEF \ ); \ GET_ARGUMENT_L("avertir_FLOT__UNDEF=""FLOT__UNDEF=""FUNDEF=" \ ,FconversionF_____avertir_lors_de_l_entree_de_FLOT__UNDEF \ ); \ /* Parametres introduits le 20070821131554... */ \ /* */ \ /* Evidemment, ces parametres doivent etre utilises avant toute entree de nombres valant */ \ /* 'UNDEF' et 'FLOT__UNDEF' respectivement... */ \ \ GET_ARGUMENT_L("confondre_J_X_Y_avec_I=""cJXYI=""cIJXY=""IJXY=" \ ,FconversionJ__FconversionX__FconversionY_____confondre_les_types__J_X_Y__avec__le_type_I \ ); \ /* On notera que la logique veut qu'evidemment ce 'GET_ARGUMENT_L(...)' apparaisse */ \ /* avant tout {GET_ARGUMENT_J(...),GET_ARGUMENT_X(...),GET_ARGUMENT_Y(...)}. Ceci fut */ \ /* introduit le 20070422091214... */ \ \ GET_ARGUMENT_L("IBase_10_10=""IB1010=""Base_10_10=""B1010=" \ ,FconversionI__FconversionJ_____editer_les_valeurs_entieres_decimales_en_decimal \ ); \ GET_ARGUMENT_N("IBase_10_16=""IB1016=""Base_10_16=""B1016=" \ ,FconversionI__FconversionJ_____editer_les_valeurs_entieres_decimales_en_decimal \ ); \ GET_ARGUMENT_L("IBase_16_10=""IB1610=""Base_16_10=""B1610=" \ ,FconversionI__FconversionJ_____editer_les_valeurs_entieres_hexa_decimales_en_decimal \ ); \ GET_ARGUMENT_N("IBase_16_16=""IB1616=""Base_16_16=""B1616=" \ ,FconversionI__FconversionJ_____editer_les_valeurs_entieres_hexa_decimales_en_decimal \ ); \ /* Ceci a ete introduit le 20021204090003 en vue de l'utiliser dans 'v $xcp/substitue.01$K' */ \ /* et les versions simplifiees ont ete introduites le 20021207131214. Le 20030710112150, */ \ /* ces 'GET_ARGUMENT_L(...)'s et 'GET_ARGUMENT_N(...)'s ont ete mis ici, alors qu'avant */ \ /* cette date, ils etaient avant le 'NomParametres=', mais il etait plus logique que la */ \ /* des parametres : */ \ /* */ \ /* editer_le_nom_des_parametres_d_une_commande */ \ /* prefixe_destine_a_abreger_certains_Parametres_qui_suivent */ \ /* */ \ /* soit juste apres 'MARQUEUR________DebutParametresGeneraux'... */ \ /* */ \ /* Le prefixe "I" a ete introduit le 20070421084035 par symetrie avec les nouveaux */ \ /* parametres qui sont destines a 'GET_ARGUMENT_X(...)' et 'GET_ARGUMENT_Y(...)' et qui */ \ /* suivent. Malgre tout, les anciennes formes (sans le prefixe "I") sont conservees afin */ \ /* d'eviter de tout recompiler (et ce a cause de 'v $Falias_use Base_10_16'...). */ \ GET_ARGUMENT_L("XBase_10_10=""XB1010=" \ ,FconversionX__FconversionY_____editer_les_valeurs_entieres_decimales_en_decimal \ ); \ GET_ARGUMENT_N("XBase_10_16=""XB1016=" \ ,FconversionX__FconversionY_____editer_les_valeurs_entieres_decimales_en_decimal \ ); \ GET_ARGUMENT_L("XBase_16_10=""XB1610=" \ ,FconversionX__FconversionY_____editer_les_valeurs_entieres_hexa_decimales_en_decimal \ ); \ GET_ARGUMENT_N("XBase_16_16=""XB1616=" \ ,FconversionX__FconversionY_____editer_les_valeurs_entieres_hexa_decimales_en_decimal \ ); \ /* Ceci a ete introduit le 20070420190717 en vue de l'utiliser dans 'v $xcg/parallele.01$K'. */ \ \ GET_ARGUMENT_L("Gmajuscules=" \ ,GET_ARGUMENT_____convertir_les_caracteres_majuscules_en_caracteres_minuscules \ ); \ GET_ARGUMENT_L("Gminuscules=" \ ,GET_ARGUMENT_____convertir_les_caracteres_minuscules_en_caracteres_majuscules \ ); \ GET_ARGUMENT_K("Gcarret=" \ ,GET_ARGUMENT_____carret_chain_Acopie_avec_conversions_possibles_majuscules_minuscules \ ); \ \ GET_ARGUMENTS_DE_CONTROLE_DE_TRAITEMENT_DES_FORMATS_DE_SORTIE; \ \ GET_ARGUMENT_K("cpp=",PREMIER_CARACTERE_ITb0(cINTRODUCTION_DES_DIRECTIVES_DU_PREPROCESSEUR_cpp)); \ \ PROCESS_ARGUMENT_K("SigneInt=" \ ,PREMIER_CARACTERE_ITb0(signe_de_FORMAT_INTE_EDITION) \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ MISE_A_JOUR_des_format_EGAr; \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_K("SigneFlot=" \ ,PREMIER_CARACTERE_ITb0(signe_de_FORMAT_FLOT_EDITION) \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ MISE_A_JOUR_des_format_EGAr; \ Eblock \ ) \ ); \ /* Ces deux nouveaux parametres ont ete introduits aux environs du 20010202150000. */ \ /* ATTENTION, ces deux parametres ne sont pas editees lors de "Parametres=VRAI" si leur */ \ /* valeur est vide ; en effet, 'v $xig/fonct$vv$FON EDITER_LA_VALEUR_dans_FconversionK' */ \ /* (la valeur vide correspondant a 'K_NULL'). */ \ /* */ \ /* Le 20200329091313 a ete introduite une mise a jour immedaite des 'format_EGAr's... */ \ PROCESS_ARGUMENT_K("ModeFlot=" \ ,PREMIER_CARACTERE_ITb0(mode_fg_de_FORMAT_FLOT_EDITION) \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ MISE_A_JOUR_des_format_EGAr; \ Eblock \ ) \ ); \ /* Ce nouveau parametre a ete introduit le 20091123111002 afin de permettre de garantir le */ \ /* nombre de decimales (via donc "%f"). Ceci sera particulierement utilise dans l'usage */ \ /* 'v $xci/display$K X11_____KeyPress_____norm_XY_curseur'... */ \ PROCESS_ARGUMENT_I("ChiffresFlot=" \ ,nombre_de_chiffres_des_editions_flottantes \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ EGAL(parametrage_des_formats_des_editions_flottantes_____initialiser_le_parametrage \ ,VRAI \ ); \ &define _____GENERE_I_SETENV_ChiffresFlot GENERE_I_SETENV("SETENV_ChiffresFlot",nombre_de_chiffres_des_editions_flottantes)&&& \ /* En effet, si 'nombre_de_chiffres_des_editions_flottantes' a change de valeur, il faut */ \ /* refaire l'initialisation du processus de parametrage des formats des editions flottantes. */ \ /* */ \ /* Jusqu'au 20060109093426, il y avait ici de plus : */ \ /* */ \ /* GET_ARGUMENT_K */ \ /* ("CaractereFlot=" */ \ /* ,PREMIER_CARACTERE_ITb0 */ \ /* (parametrage_des_formats_des_editions_flottantes_____caractere_param) */ \ /* ); */ \ /* */ \ /* mais, cela n'a aucune utilite, je le supprime donc... */ \ /* */ \ /* On notera bien que via 'v $xci/valeurs.03$I nombre_de_decimales' ce parametre possede */ \ /* un synonyme 'nombre_de_decimales' declare en general sous la forme : */ \ /* */ \ /* GET_ARGUMENT_I("decimales=",nombre_de_decimales); */ \ /* */ \ /* par exemple dans 'v $xcg/ABSO.01$K nombre_de_decimales'... */ \ Eblock \ ) \ ); \ /* Ce nouveau parametre a ete introduit le 20060104161630 et 'SETENV_ChiffresFlot' le */ \ /* 20180218190542... */ \ \ GET_ARGUMENT_I("NombreMaximalChiffresNumeros=""nmcn=""Nchiffres=" \ ,ChaineNumero_____nombre_maximal_de_chiffres \ ); \ /* Ce nouveau parametre a ete introduit le 20080602111607... */ \ /* */ \ /* Le 20160721174735 fut ajoute "Nchiffres=" qui est proche de "chiffres=" frequemment */ \ /* utilise ('v $xrc/mandel.41$K GET_ARGUMENT_I..chiffres=..nombre_de_chiffres..')... */ \ \ GET_ARGUMENT_L("DoubleDefinition=",tester_la_double_definition_des_parametres); \ \ GET_ARGUMENT_L("EditerCommandes=",editer_les_commandes_avant_execution); \ \ begin_nouveau_block \ Bblock \ /* Introduit le 20091123131100 pour des raisons de lisibilite (tabulation...). */ \ EGAL(bloquer_provisoirement__entrer_des_parametres_via_des_setenv,VRAI); \ /* Introduit le 20090422091211... */ \ \ GET_ARGUMENT_L("NomSynthetique=",editer_le_NOM_SYNTHETIQUE_de_la_commande_courante); \ GET_ARGUMENT_L("NomAbsoluSource=",editer_le_NOM_ABSOLU_DU_SOURCE_c_de_la_commande_courante); \ /* Introduit le 20240104111119... */ \ GET_ARGUMENT_L("ListerMessages=",lister_tous_les_messages_possibles); \ \ EGAL(bloquer_provisoirement__entrer_des_parametres_via_des_setenv,FAUX); \ /* Introduit le 20090422091211... */ \ Eblock \ end_nouveau_block \ \ PROCESS_ARGUMENT_L("SETENV=""setenv=""Environnement=" \ ,entrer_des_parametres_via_des_setenv \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ AVERTIR_EN_CAS_D_ENTREE_VIA_UN_setenv_D_UN_PARAMETRE; \ Eblock \ ) \ ); \ /* Ce dispositif permet d'entrer certains parametres via des variables de type 'setenv'. */ \ /* Soit un certain parametre qui habituellement est introduit via : */ \ /* */ \ /* PARAMETRE=... */ \ /* */ \ /* Deux cas se presentent : */ \ /* */ \ /* 1-la variable '$P__' existe (cas standard, car cette variable est definie */ \ /* implicitement par 'v $Fcommandes P__'). Alors, ce parametre peut etre introduit */ \ /* par un : */ \ /* */ \ /* setenv P__PARAMETRE ... */ \ /* */ \ /* 2-la variable '$P__' n'existe pas (elle a donc ete detruite par un 'unsetenv'). */ \ /* Alors, ce parametre peut etre introduit par un : */ \ /* */ \ /* unsetenv P__ */ \ /* (...) */ \ /* setenv P__NomSynthetiqueDuFichierCourant__PARAMETRE ... */ \ /* */ \ /* ou 'NomSynthetiqueDuFichierCourant' designe la chaine qui est engendree par la */ \ /* variable 'NOM_SYNTHETIQUE_DU_FICHIER_COURANT' et qui peut etre editee grace a : */ \ /* */ \ /* NomSynthetique=VRAI */ \ /* */ \ /* ce qui permet de traiter ainsi simultanement plusieurs commandes '$X' (ce qui */ \ /* n'est pas possible si la variable '$P__' existe car alors les noms des variables */ \ /* de type 'setenv' sont independantes de la commande '$X' utilisee...) meme si */ \ /* elles possedent des parametres formellement identiques... */ \ /* */ \ /* Le 20060315151257, les 'GET_ARGUMENT_L(...)'s correspondants ont ete remplaces par des */ \ /* 'PROCESS_ARGUMENT_L(...)'s afin de garantir que 'entrer_des_parametres_via_des_setenv' */ \ /* est le premier parametre traite d'un programme '$K' et de signaler le probleme dans le */ \ /* cas contraire ('v $xig/fonct$vv$DEF gPROCESS_PARAMETRE_ENTREE_PAR_setenv')... */ \ /* */ \ /* Le 20080918131207, je note que lorsqu'il y a des synonymes et que plusieurs variables */ \ /* 'setenv' correspondantes existent, c'est la derniere rencontree qui l'emporte. Ainsi par */ \ /* exemple, la commande 'v $xcg/ABSO.01$K "x=""nombre=""n=""a="' possede quatre synonymes */ \ /* pour definir le nombre 'nombre' dont on cherche la valeur absolue. Si les deux variables */ \ /* suivantes existent : */ \ /* */ \ /* setenv P__n -1 */ \ /* setenv P__x -2 */ \ /* */ \ /* la valeur editee vaudra "+1" puisque "n=" est apres "x=" dans '"x=""nombre=""n=""a="'... */ \ /* ---- ---- ---- ---- */ \ /* || || /||\ /||\ */ \ /* || || || || */ \ /* || | --------- | || */ \ /* || ----------- || */ \ /* || || */ \ /* | ------------------------------------- | */ \ /* --------------------------------------- */ \ /* */ \ /* Ce n'est donc pas l'ordre alphabetique des variables 'P__...' qui l'emporte, mais l'odre */ \ /* de definition des synonymes. Enfin, si l'un des {"x=","nombre=","n=","a="} est present */ \ /* (lors de l'appel de la commande '$xcg/ABSO.01$X'), c'est le dernier rencontre qui */ \ /* l'emporte sur les eventuelles variables 'setenv'... */ \ /* */ \ /* Le 20090325094302, fut introduit "SETENV=" par symetrie avec la variable d'environnement */ \ /* '$SETENV' introduite la meme date... */ \ \ begin_nouveau_block \ Bblock \ /* Introduit le 20091123131100 pour des raisons de lisibilite (tabulation...). */ \ EGAL(bloquer_provisoirement__entrer_des_parametres_via_des_setenv,VRAI); \ /* Introduit le 20090422091211... */ \ \ GET_ARGUMENT_L("ListeFonctions=" \ ,permettre_l_acces_a_la_liste_des_fonctions_referencees_par_le_programme \ ); \ /* Introduit le 20120626104316... */ \ GET_ARGUMENT_L("SetenvUniverselles=""SeUn=" \ ,GENERE_TYPE_SETENV_____editer_les_variables_SETENV_universelles \ ); \ /* Introduit le 20180218174623... */ \ /* */ \ /* Le 20180328144928, il y a eu remplacement de '"UniverselleSetenv=""UnSe="' par */ \ /* par '"SetenvUniverselles=""SeUn="' plus homogene... */ \ GET_ARGUMENT_L("Setenv=",editer_les_differentes_variables_d_environnement_utiles); \ /* Introduit le 20091114113908... */ \ GET_ARGUMENT_L("SetenvSO=" \ ,editer_les_differentes_variables_d_environnement_utiles_dans_les_librairies_dynamiques \ ); \ /* Introduit le 20091116092801... */ \ GET_ARGUMENT_L("Versions=",editer_les_differentes_versions_du_programme); \ PROCESS_ARGUMENT_L("VersionsSO=" \ ,editer_versions_programme_librairies_dynamiques \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ Test(IFET(IL_NE_FAUT_PAS(editer_les_differentes_versions_du_programme) \ ,IL_FAUT(editer_versions_programme_librairies_dynamiques) \ ) \ ) \ Bblock \ PRINT_ERREUR("Probleme dans l'edition des versions"); \ EGAL(editer_les_differentes_versions_du_programme,VRAI); \ CAL1(Prer2("'VersionsSO=%s' demande 'Versions=%s' qui est force " \ ,ETAT_LOGIQUE(editer_versions_programme_librairies_dynamiques) \ ,ETAT_LOGIQUE(editer_les_differentes_versions_du_programme) \ ) \ ); \ CAL1(Prer2("dans l'ordre 'Versions=%s VersionsSO=%s'.\n" \ ,ETAT_LOGIQUE(editer_les_differentes_versions_du_programme) \ ,ETAT_LOGIQUE(editer_versions_programme_librairies_dynamiques) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ) \ ); \ /* Introduit le 20091116092801... */ \ GET_ARGUMENT_L("LibrairiesDynamiques=""LibDyn=",editer_la_liste_des_librairies_dynamiques_utilisees); \ /* Introduit le 20220824180116... */ \ GET_ARGUMENT_L("Bugs=",editer_les_differents_bugs_reconnus); \ GET_ARGUMENT_L("Includes=",editer_les_differents_includes_du_programme); \ \ EGAL(bloquer_provisoirement__entrer_des_parametres_via_des_setenv,FAUX); \ /* Introduit le 20090422091211... */ \ Eblock \ end_nouveau_block \ \ GET_ARGUMENT_L("Prin=",Prin_____changer_le_stream); \ GET_ARGUMENT_L("Prer=",Prer_____changer_le_stream); \ GET_ARGUMENT_L("Prme=",Prme_____changer_le_stream); \ /* ATTENTION, l'ordre a de l'importance ; par exemple : */ \ /* */ \ /* ... Parametres=VRAI Prme=VRAI | $Mor */ \ /* */ \ /* ne donnera pas une bonne pagination, alors qu'il faut en fait utiliser : */ \ /* */ \ /* ... Prme=VRAI Parametres=VRAI | $Mor */ \ /* */ \ /* a cause de 'v $xig/fonct$vv$FON Valeur.de.tous.les.parametres.de.cette.commande'. */ \ /* */ \ /* On notera les valeurs par defaut suivantes : */ \ /* */ \ /* stream_Prin = STREAM_OUT */ \ /* stream_Prme = STREAM_ERREUR */ \ /* stream_Prer = STREAM_ERREUR */ \ /* */ \ \ GET_ARGUMENT_L("CAL1=",CAL1_____executer); \ &define _____GENERE_L_SETENV_CAL1 GENERE_L_SETENV("SETENV_CAL1",CAL1_____executer)&&& \ GET_ARGUMENT_L("CAL2=",CAL2_____executer); \ &define _____GENERE_L_SETENV_CAL2 GENERE_L_SETENV("SETENV_CAL2",CAL2_____executer)&&& \ GET_ARGUMENT_L("CAL3=",CAL3_____executer); \ &define _____GENERE_L_SETENV_CAL3 GENERE_L_SETENV("SETENV_CAL3",CAL3_____executer)&&& \ GET_ARGUMENT_L("CAL4=",CAL4_____executer); \ /* Les "_____GENERE_L_SETENV_" ont ete introduits le 20180218102015... */ \ \ GET_ARGUMENT_L("AccelerateurFonctions=""AccFoncs=",ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS____utiliser); \ /* Ce parametre a ete introduit le 20120310093800... */ \ \ GET_ARGUMENT_L("EditionVerrou=""EditerVerrou=""EV=",ePARALLELE_____editer_le_verrou); \ /* Ce parametre a ete introduit le 20070710113651 et complete le 20070710125300... */ \ \ GET_ARGUMENT_L("Bloquer=",bloquer_tous_les_messages_d_erreur_des_fichiers); \ \ GET_ARGUMENT_L("NomsConvertissables=" \ ,FonctionI_Fload_____les_noms_des_fichiers_sont_convertissables_en_valeurs_numeriques \ ); \ /* Introduit le 20031130101525... */ \ /* */ \ /* ATTENTION : ce parametre doit evidemment etre modifie avant d'etre utilise via les */ \ /* fonctions 'Fload_fichier_formatte_Int(...)' et 'Fload_fichier_formatte_Float(...)'. */ \ \ GET_ARGUMENT_L("Verifier=" \ ,Fstore_fichier_non_formatte_____valider_le_contenu_des_fichiers_apres_leur_ecriture \ ); \ \ GET_ARGUMENT_L("UtiliserDirectoryTemporaire=""UDT=" \ ,Fstore_fichier_non_formatte_____utiliser_un_directory_temporaire \ ); \ GET_ARGUMENT_I("NumeroDirectoryTemporaire=""NDT=" \ ,Fstore_fichier_non_formatte_____numero_directory_temporaire_a_utiliser \ ); \ GET_ARGUMENT_L("ConserverTemporairementFichierExistant=""CTFE=" \ ,Fstore_fichier_non_formatte_____conserver_temporairement_le_fichier_s_il_existe_deja \ ); \ GET_ARGUMENT_L("NomFicherNomCache=""NFNC=" \ ,Fstore_fichier_non_formatte_____introduire__nom_du_fichier__dans__nom_cache_du_fichier \ ); \ GET_ARGUMENT_K("SubstitutSeparateurPath=""SSP=" \ ,MOVE_CARACTERE_____substitut_des_SEPARATEUR_DES_PATHS \ ); \ GET_ARGUMENT_I("IndexHeuristiqueIdentiteFileSystems=""IHIFS=" \ ,Fstore_fichier_non_formatte_____index_heuristique_d_identite_de_File_Systems \ ); \ /* Introduits le 20160511102356... */ \ /* */ \ /* Le 20160511114847, le changement de Directory Temporaire a ete deconseille (voir a */ \ /* ce propos 'v $xig/fonct$vv$FON 20160511114323'), puis le 20160512124152, cet */ \ /* avertissement a ete supprime, apres avoir resolu de facon heuristique le test */ \ /* de savoir sir deux noms absolus appartiennent au meme 'File System' (voir a ce */ \ /* propos 'v $xig/fonct$vv$FON 20160512122844'). Cela a conduit le 20160512124152 a */ \ /* l'introduction de 'index_heuristique_d_identite_de_File_Systems' ci-dessus... */ \ /* */ \ /* Le 20170424144151 cela fut complete par l'introduction possible du nom d'un fichier */ \ /* dans son nom cache ('v $xig/fonct$vv$FON nom_relatif_temporaire'), mais evidemment */ \ /* apres avoir remplacer les 'SEPARATEUR_DES_PATHS' par d'autres caracteres ('_' par */ \ /* defaut)... */ \ /* */ \ /* Le 20170424174046 fut introduite la possibilite de conserver temporairement la nouvelle */ \ /* version d'un fichier pre-existant... */ \ \ GET_ARGUMENT_L("Attendre=",attendre_un_fichier_inexistant_ou_non_conforme); \ \ GET_ARGUMENT_L("Alleger=",gPRINT_DEFAUT_____n_editer_que_le_message_principal); \ &define _____GENERE_L_SETENV_Alleger GENERE_L_SETENV("SETENV_Alleger",gPRINT_DEFAUT_____n_editer_que_le_message_principal)&&& \ /* Les "_____GENERE_L_SETENV_" ont ete introduits le 20180218102015... */ \ \ GET_ARGUMENT_L("ATTENTION=",PRINT_ATTENTION_____editer_les_messages); \ &define _____GENERE_L_SETENV_ATTENTION GENERE_L_SETENV("SETENV_ATTENTION",PRINT_ATTENTION_____editer_les_messages)&&& \ /* Les "_____GENERE_L_SETENV_" ont ete introduits le 20180218102015... */ \ GET_ARGUMENT_L("AVERTISSEMENT=",PRINT_AVERTISSEMENT_____editer_les_messages); \ GET_ARGUMENT_L("DEBUG=",PRINT_DEBUG_____editer_les_messages); \ GET_ARGUMENT_L("DEFAUT=",PRINT_DEFAUT_____editer_les_messages); \ GET_ARGUMENT_L("ERREUR=",PRINT_ERREUR_____editer_les_messages); \ &define _____GENERE_L_SETENV_ERREUR GENERE_L_SETENV("SETENV_ERREUR",PRINT_ERREUR_____editer_les_messages)&&& \ /* Les "_____GENERE_L_SETENV_" ont ete introduits le 20180218102015... */ \ GET_ARGUMENT_L("MESSAGE=",PRINT_MESSAGE_____editer_les_messages); \ \ GET_ARGUMENT_L("EnTetePrin=",Prin_____editer_les_messages_d_en_tete); \ &define _____GENERE_L_SETENV_EnTetePrin GENERE_L_SETENV("SETENV_EnTetePrin",Prin_____editer_les_messages_d_en_tete)&&& \ /* Les "_____GENERE_L_SETENV_" ont ete introduits le 20180218102015... */ \ GET_ARGUMENT_L("EnTetePrer=",Prer_____editer_les_messages_d_en_tete); \ &define _____GENERE_L_SETENV_EnTetePrer GENERE_L_SETENV("SETENV_EnTetePrer",Prer_____editer_les_messages_d_en_tete)&&& \ /* Les "_____GENERE_L_SETENV_" ont ete introduits le 20180218102015... */ \ GET_ARGUMENT_L("EnTetePrme=",Prme_____editer_les_messages_d_en_tete); \ &define _____GENERE_L_SETENV_EnTetePrme GENERE_L_SETENV("SETENV_EnTetePrme",Prme_____editer_les_messages_d_en_tete)&&& \ /* Les "_____GENERE_L_SETENV_" ont ete introduits le 20180218102015... */ \ /* Introduits le 20111121144901... */ \ \ GET_ARGUMENT_L("suppression_K_LF_en_tete=""sK_LFet=" \ ,chain_Acopie_avec_suppression_d_un_eventuel_K_LF_en_tete_____la_suppression_est_utile \ ); \ /* Introduit le 20150504175719 pour 'v $Falias_exec123 suppression__K_LF_en_tete'... */ \ \ GET_ARGUMENT_I("SeuilLectureFichier=""SLF=",Fload_fichier_non_formatte_____seuil_size_fichier); \ GET_ARGUMENT_I("SeuilEcritureFichier=""SEF=",Fstore_fichier_non_formatte_____seuil_size_fichier); \ /* Introduits le 20141006101935... */ \ /* */ \ /* ATTENTION, l'usage de "SLF=..." impliquera en general l'usage de : */ \ /* */ \ /* Verifier=FAUX */ \ /* */ \ /* afin que les octets non lus ne soient pas ensuite consideres comme des trous... */ \ /* */ \ /* Le 20160520143437, on notera que : */ \ /* */ \ /* SeuilLectureFichier=... */ \ /* */ \ /* permet, par exemple, de visualiser avec 'v $xci/display$K' des fichiers qui ne sont */ \ /* en fait pas des images (et par exemple des images qui auraient ete compressees ; voir */ \ /* par exemple 'v $xrC/CompressionDeCompression_Compression.01$vv$I 20160520143634'). */ \ \ GET_ARGUMENT_L("generation_d_un_nom_relatif_temporaire_____compatibilite_20061226=""compatibilite_20061226=" \ ,generation_d_un_nom_relatif_temporaire_____compatibilite_20061226 \ ); \ /* Introduit le 20061226105656 et complete le 20090302092640... */ \ GET_ARGUMENT_L("generation_d_un_nom_relatif_temporaire_____compatibilite_20231213=""compatibilite_20231213=" \ ,generation_d_un_nom_relatif_temporaire_____compatibilite_20231213 \ ); \ /* Introduit le 20231213171956... */ \ \ GET_ARGUMENT_L("ValidMalo=",allocation_memoire_avec_validation_____valider_par_rapport_a_MemorySizeMB); \ /* Introduit le 20120201124742... */ \ GET_ARGUMENT_L("SignalerAbortNonAllocation=""SANA=" \ ,allocation_memoire_avec_validation_____signaler_explicitement_l_abort_de_non_allocation \ ); \ /* Introduit le 20200727115625... */ \ \ begin_nouveau_block \ Bblock \ DEFV(Int,INIT(temp_allocation_memoire_avec_validation_____Amarge_de_securite \ ,allocation_memoire_avec_validation_____Amarge_de_securite \ ) \ ); \ DEFV(Int,INIT(temp_allocation_memoire_avec_validation_____Bmarge_de_securite \ ,allocation_memoire_avec_validation_____Bmarge_de_securite \ ) \ ); \ /* Ceci a ete introduit le 20051026160342 car, en effet, il est extremement dangereux de */ \ /* modifier ces variables dynamiquement puisque 'Malo(...)' est utilise partout et tout */ \ /* le temps (en particulier ici-meme...). Il faut donc passer par des variables temporaires */ \ /* dont le type est 'Int', contrairement aux "originaux" qui eux sont 'Positive'. C'est */ \ /* seulement apres avoir valide ces valeurs temporaires, qu'elles peuvent etre activees... */ \ /* */ \ /* ATTENTION : ces deux variables temporaires sont referencees explicitement dans */ \ /* 'v $xcc/cpp$Z 20060203092633'. */ \ /* */ \ /* ATTENTION : ces deux variables temporaires sont aussi referencees explicitement dans */ \ /* 'v $xcc/LFonctionR$vv$D/ArgumentsModification$vv$sed'. */ \ \ PROCESS_ARGUMENT_I("AMargeMalo=" \ ,temp_allocation_memoire_avec_validation_____Amarge_de_securite \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ Test(IZGT(temp_allocation_memoire_avec_validation_____Amarge_de_securite)) \ Bblock \ EGAL(allocation_memoire_avec_validation_____Amarge_de_securite \ ,temp_allocation_memoire_avec_validation_____Amarge_de_securite \ ); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("marge 'multiplicative A' de 'Malo(...)' negative ou nulle"); \ CAL1(Prer2("(marge demandee %d et marge courante conservee %d)\n" \ ,temp_allocation_memoire_avec_validation_____Amarge_de_securite \ ,allocation_memoire_avec_validation_____Amarge_de_securite \ ) \ ); \ Eblock \ ETes \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_I("BMargeMalo=" \ ,temp_allocation_memoire_avec_validation_____Bmarge_de_securite \ ,BLOC(VIDE;) \ ,BLOC( \ Bblock \ Test(IZGE(temp_allocation_memoire_avec_validation_____Bmarge_de_securite)) \ Bblock \ EGAL(allocation_memoire_avec_validation_____Bmarge_de_securite \ ,temp_allocation_memoire_avec_validation_____Bmarge_de_securite \ ); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("marge 'additive B' de 'Malo(...)' negative"); \ CAL1(Prer2("(marge demandee %d et marge courante conservee %d)\n" \ ,temp_allocation_memoire_avec_validation_____Bmarge_de_securite \ ,allocation_memoire_avec_validation_____Bmarge_de_securite \ ) \ ); \ Eblock \ ETes \ Eblock \ ) \ ); \ /* Introduit le 20041020114836. On notera bien que la valeur alors forcee ne s'appliquera */ \ /* evidemment qu'aux 'Malo(...)' posterieurs et non pas a ceux qui ont deja eu lieu... */ \ /* */ \ /* Le 20051026152349, j'ai introduit en plus de la marge "additive" 'B', une marge */ \ /* "multiplicative" 'A'... */ \ Eblock \ end_nouveau_block \ \ GET_ARGUMENT_L("CheckMalo=",Malo_____valider_si_possible_l_utilisation_de_la_memoire_allouee); \ /* Introduit le 20041023103137... */ \ \ GET_ARGUMENT_F("FffDIVZ_a_peu_pres_____epsilon=",FffDIVZ_a_peu_pres_____epsilon); \ \ GET_ARGUMENT_I("Int_indefini=",Fload_fichier_formatte_Int_____valeur_indefinie); \ GET_ARGUMENT_F("Float_indefini=",Fload_fichier_formatte_Float_____valeur_indefinie); \ /* Le 20000126173913 les valeurs {PETIT_INFINI,F_PETIT_INFINI} ont ete remplacees par les */ \ /* valeurs {ZERO,FZERO} qui semblent plus universels, les structures : */ \ /* */ \ /* GIT_ARGUMENT_I("Int_indefini=",...,PETIT_INFINI); */ \ /* GIT_ARGUMENT_F("Float_indefini=",...,F_PETIT_INFINI); */ \ /* */ \ /* n'ont plus de raison d'etre... */ \ \ GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS; \ /* Introduit le 20050303120845... */ \ \ MARQUEUR________FinParametresGeneraux; \ /* Argument fictif destine a marquer la fin des Parametres Generaux (le 20010420143829) */ \ /* et qui doit imperativement etre le dernier... */ \ \ MARQUEUR________DebutParametresAutomatiques; \ /* Argument fictif destine a marquer le debut des Parametres mis en place Automatiquement */ \ /* (le 20120701120424). */ \ BLOC(VIDE;); \ /* A la date du 20120701124750 il n'y a pas de parametres mis en place automatiquement... */ \ MARQUEUR________FinParametresAutomatiques; \ /* Argument fictif destine a marquer la fin des Parametres mis en place Automatiquement */ \ /* (le 20120701120424). */ \ ) \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____PRIMAIRES; \ \ Eblock \ /* Recuperation de tous les arguments de controle de portee generale. */ \ /* */ \ /* ATTENTION, dans le cas ou une 'liste_de_recuperation' contiendrait elle-meme des */ \ /* elements susceptibles d'utiliser l'un de ces indicateurs, il est alors evident que */ \ /* l'ordre d'apparition des arguments effectifs est significatif. Ainsi, par exemple, */ \ /* le programme 'v $xrv/AXPB.01$K GET_ARGUMENTS_' qui contient dans 'GET_ARGUMENTS_(...)' */ \ /* un 'PRINT_ATTENTION(...)'. Alors : */ \ /* */ \ /* $xrv/AXPB.01$X ne=... (...) DEFAUT=FAUX */ \ /* */ \ /* et : */ \ /* */ \ /* $xrv/AXPB.01$X DEFAUT=FAUX (...) ne=... */ \ /* */ \ /* ne se comporteront pas de la meme facon. Dans le premier cas, 'PRINT_ATTENTION(...)' */ \ /* sera effectif (le message sortira) et ineffectif dans le second cas (le message ne */ \ /* sortira pas...). */ \ /* */ \ /* Dans le meme ordre d'idee, le parametre "Parametres=" ne peut jamais etre edite par */ \ /* lui-meme, ce qui implique que tous les parametres qui le precederaient ne pourraient */ \ /* etre edites, ce qui impose qu'il soit mis en premier... */ \ /* */ \ /* De meme, les options "Int_indefini=" et "Float_indefini=" doivent apparaitre avant que */ \ /* les valeurs ainsi positionnees soient utilisees dans les deux fonctions */ \ /* 'Fload_fichier_formatte_Int(...)' et 'Fload_fichier_formatte_Float(...)'. */ #define VALIDATION_DES_DEMANDES_EVENTUELLES_DE_PREFIXAGE_DE_CERTAINS_PARAMETRES \ Bblock \ Test(IZNE(nombre_de_demandes_effectives_de_PreFixeParametres)) \ Bblock \ Test(IZEQ(nombre_de_parametres_supportant_PreFixeParametres)) \ Bblock \ PRINT_ATTENTION("le prefixage de certains parametres n'a pas d'utilite ici"); \ CAL1(Prer2("il y a eu %d %s de changement du prefixe (via 'PreFixeParametres=' ou 'PFP=')\n" \ ,nombre_de_demandes_effectives_de_PreFixeParametres \ ,PLURIEL_S("demande",nombre_de_demandes_effectives_de_PreFixeParametres) \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Validation de l'utilite des demandes de prefixage introduite le 20030708094336... */ #define ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_AVANT_GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom) \ Bblock \ CALS(FgACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_AVANT_GET_PARAMETRES()); \ /* Introduit le 20180217183252 afin d'eviter la recompilation des '$K's dans le cas ou */ \ /* des actions nouvelles seraient introduites ici... */ \ \ EGAL(nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes \ ,valeur_calculee_par_xcc_cpp_Z_de_____nombre_d_arguments_possibles_regroupes_par_classe_de_synonymes \ ); \ /* Introduit le 20081116113229. La valeur attribuee est en fait une "pseudo-variable" */ \ /* calculee par 'v $xccp/cpp$Z VC_NoMbRe_PaRaMeTrEs'... */ \ \ EGAL(entrer_des_parametres_via_des_setenv \ ,GvalDefaut("SETENV" \ ,GvalDefaut("setenv" \ ,entrer_des_parametres_via_des_setenv \ ) \ ) \ ); \ /* Le 20090324182721, j'ai tente d'introduire ici : */ \ /* */ \ /* EGAL(entrer_des_parametres_via_des_setenv */ \ /* ,GvalDefaut("SETENV" */ \ /* ,entrer_des_parametres_via_des_setenv */ \ /* ) */ \ /* ); */ \ /* */ \ /* afin de permettre de "forcer" dans tous les '$X's devant s'executer (par exemple dans */ \ /* un '$Z') le parametre : */ \ /* */ \ /* Environnement=VRAI */ \ /* */ \ /* Cela permettrait, par exemple, d'inhiber globalement la sortie des messages d'erreur, en */ \ /* faisant donc : */ \ /* */ \ /* setenv SETENV $EXIST */ \ /* setenv SETENV_MesNoParam $EXIST */ \ /* */ \ /* setenv P__CAL1 FAUX */ \ /* */ \ /* au prealable... */ \ /* */ \ /* Le 20090421100424, il a fallu introduire de plus la variable '$SETENV_MesNoParam' a */ \ /* cause des '$X's qui sont utilises sans parametres ('v $Falias_direct .xcp.ferme_K_NL.X'). */ \ /* Il faut donc pouvoir inhiber, si besoin est, les messages d'avertissement correspondants. */ \ /* */ \ /* Malheureusement, cela ne marche pas (provisoirement...) a cause des parametres ":=" et */ \ /* "==" qui semblent alors recevoir les valeurs logiques erronees "P__". Ce probleme */ \ /* subsiste si l'on force 'entrer_des_parametres_via_des_setenv' brutalement a 'VRAI'. */ \ /* Je supprime donc cette possibilite jusqu'a nouvel ordre... */ \ /* */ \ /* Le 20090325094302, j'ai compris. Cela vient du fait qu'a cette date, on trouvait dans */ \ /* l'ordre : */ \ /* */ \ /* GET_ARGUMENT_L("SupprimerBlancDeuxPoints="":=",...); */ \ /* GET_ARGUMENT_L("SupprimerBlancEgal=""==",...); */ \ /* */ \ /* via 'GET_ARGUMENTS_DE_CONTROLE_DE_TRAITEMENT_DES_FORMATS_DE_SORTIE', puis plus loin : */ \ /* */ \ /* PROCESS_ARGUMENT_L("setenv=""Environnement=",...); */ \ /* */ \ /* Or lorsque 'EST_VRAI(entrer_des_parametres_via_des_setenv)', le nom des variables */ \ /* d'environnement demande 'MOVE_CARACTERE_NE_DEPLACE_QUE_LES_CARACTERES_ALPHA_NUMERIQUES', */ \ /* d'abord et a la fin 'MOVE_CARACTERE_DEPLACE_TOUS_LES_CARACTERES'. Ainsi, en utilisant : */ \ /* */ \ /* setenv=VRAI */ \ /* */ \ /* le probleme decrit le 20090324182721 ne se manifestait pas car, encore une fois ":=" et */ \ /* "==" etait traites avant le "setenv=VRAI". Mais si 'entrer_des_parametres_via_des_setenv' */ \ /* est force ici a 'VRAI' via le 'GvalDefaut(...)' l'ordre precedent n'est plus verifie : */ \ /* un "setenv=VRAI" est alors en quelque sorte fait avant ":=" et "==". La solution la plus */ \ /* simple est donc de remplacer ":=" et "==" par quelque chose ne contenant que des */ \ /* caracteres alpha-numeriques... */ \ /* */ \ /* On notera que la variable '$setenv' est aussi disponible par symetrie avec ""setenv="... */ \ \ Test(TOUJOURS_FAUX) \ /* Test introduit le 20090422110711. La variable '$SETENV_MesNoParam' n'a plus d'interet, */ \ /* non plus que les 'PRINT_ATTENTION(...)'s, a cette date. Mais je ne veux pas detruire */ \ /* cette sequence, d'ou ce 'Test(...)'... */ \ Bblock \ Test(IFET(EST_VRAI(entrer_des_parametres_via_des_setenv) \ ,IFEQ(nombre_d_arguments_y_compris_le_nom,UN) \ ) \ ) \ /* Test introduit le 20090325102311. En effet, la recuperation des arguments via des */ \ /* 'setenv's est faite lorsque 'IFEQ(numero_d_argument_courant,NUMERO_PREMIER_ARGUMENT)'. */ \ /* Or si la commande courante ne recoit aucun argument, la condition 'IFEQ(...)' precedente */ \ /* n'est jamais remplie et alors aucun argument ne peut donc "rentrer" via des 'setenv's... */ \ Bblock \ Test(EST_VRAI(GvalDefaut("SETENV_MesNoParam",EXIST))) \ /* Test introduit le 20090421100424 car il y a effectivement un certain nombre de '$X's qui */ \ /* sont utilises sans parametres ('v $Falias_direct .xcp.ferme_K_NL.X'). Il faut donc */ \ /* pouvoir inhiber, si besoin est, les messages suivants... */ \ Bblock \ PRINT_ATTENTION("l'une des deux variables '$setenv'/'$SETENV' est positionnee a 'VRAI'"); \ PRINT_ATTENTION("cette commande n'ayant aucun argument : ce positionnement est ici ineffectif"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INITIALISATIONS_DE_GET_ARGUMENTS_DE_CONTROLE_DE_TRAITEMENT_DES_FORMATS_DE_SORTIE; \ /* Initialisations utiles au traitement des formats de sortie introduit le 20050131105740... */ \ Eblock \ /* Introduit le 20030710091913 pour prevoir des extensions futures... */ #define ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_APRES_GET_PARAMETRES \ Bblock \ VALIDATION_DES_DEMANDES_EVENTUELLES_DE_PREFIXAGE_DE_CERTAINS_PARAMETRES; \ /* Validation de l'utilite des demandes de prefixage introduite le 20030708094336... */ \ \ CALS(FgACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_APRES_GET_PARAMETRES()); \ /* Introduit le 20180217183252 afin d'eviter la recompilation des '$K's dans le cas ou */ \ /* des actions nouvelles seraient introduites ici... */ \ Eblock \ /* Introduit le 20030710091913 pour prevoir des extensions futures... */ #define GET_ARGUMENTS_(nombre_d_arguments_y_compris_le_nom,liste_de_recuperation) \ Bblock \ ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_AVANT_GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom); \ /* Actions a effectuer systematiquement apres 'GET_PARAMETRES(...)' introduites le */ \ /* 20030710091913. */ \ \ GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom \ ,arguments \ ,BLOC(GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE; \ \ MARQUEUR________DebutParametresSpecifiques; \ /* Argument fictif destine a marquer le debut des Parametres Specifiques (20010421090617). */ \ \ BLOC(liste_de_recuperation); \ \ MARQUEUR________FinParametresSpecifiques; \ /* Argument fictif destine a marquer la fin des Parametres Specifiques (20010421090617). */ \ ) \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ /* Cette nouvelle option permet d'editer les valeurs des parametres reellement utilises... */ \ /* ATTENTION, pour certaines commandes, et en particulier celles de '$xcp', cette option */ \ /* ne doit pas etre utilisee en temps normal (sa valeur par defaut respecte cette contrainte */ \ /* puisqu'elle vaut 'NE_PAS_EDITER_LES_VALEURS_APRES_Fconversion'). En effet, pour les */ \ /* commandes de type "filtre", la valeur des parametres alors obtenues s'insererait dans */ \ /* le flot des fichiers traites. Malgre cela, pour connaitre la valeur des parametres par */ \ /* defaut des commandes de type "filtre", il suffira de faire par exemple : */ \ /* */ \ /* saut | <commande_de_type_filtre> Parametres=VRAI */ \ /* */ \ /* pour obtenir cette information... */ \ \ ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_APRES_GET_PARAMETRES; \ /* Actions a effectuer systematiquement apres 'GET_PARAMETRES(...)' introduites le */ \ /* 20030710091913. */ \ Eblock \ /* Procedure de recuperation d'une liste d'arguments. */ #define ARG__Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025 \ "Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025=""compatibilite_20121025=" \ /* Pour raccourcir une ligne qui va suivre (introduit le 20121025182732)... */ \ /* */ \ /* Le 20140824094534, pour eviter une definition circulaire, 'ARG__' a ete place devant */ \ /* 'Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025'... */ #define GET_ARGUMENTSf(nombre_d_arguments_y_compris_le_nom,liste_de_recuperation) \ /* On notera le nom 'GET_ARGUMENTSf(...)' ne meme longueur que 'GET_ARGUMENTSi(...)' afin */ \ /* de ne pas provoquer de decalages dans les sources '$K' des programmes de '$xciP' le */ \ /* 19981202094102 lors de leur mise a jour... */ \ Bblock \ ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_AVANT_GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom); \ /* Actions a effectuer systematiquement apres 'GET_PARAMETRES(...)' introduites le */ \ /* 20030710091913. */ \ \ GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom \ ,arguments \ ,BLOC(GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE; \ \ MARQUEUR________DebutParametresImages; \ /* Argument fictif destine a marquer le debut des Parametres Generaux de nature "Image" */ \ /* (le 20020626162809) et qui doit imperativement etre le premier... */ \ \ GET_ARGUMENT_F("EpsilonLissageSubstitution=",epsilon_de_LISSAGE_LISTE_DE_SUBSTITUTION); \ /* Cet argument a ete introduit le 20040910131944, principalement a cause de */ \ /* 'v $xiii/Images$DEF LISSAGE_LISTE_DE_SUBSTITUTION' qui est utilise par la commande */ \ /* 'v $xciP/LISSE$K GET_ARGUMENTSf'. Cela a mis en evidence le fait qu'en general : */ \ /* */ \ /* __DENORMALISE_NIVEAU(______NORMALISE_NIVEAU(niveau)) # niveau */ \ /* */ \ /* et meme : */ \ /* */ \ /* __DENORMALISE_NIVEAU(______NORMALISE_NIVEAU(niveau)) < niveau */ \ /* */ \ /* Cela a donc des consequences ennuyeuses dans 'v $xigP/.INTERPOLE$Y .xciP/LISSE.X' */ \ /* ce qui s'est manifeste a cette date dans 'v $xigP/gris.52.1$Z'. */ \ \ GET_ARGUMENT_L("Dpipe_Iload_fichier=",Iload_fichier_____tester_le_debordement_du_pipe); \ /* Afin de pouvoir ne pas tester le debordement des pipes dans 'Iload_fichier(...)' alors */ \ /* qu'il est teste par defaut et provoque une erreur. Ceci a ete introduit le 19980520185424 */ \ /* pour etre utilise dans des programmes tels 'v $xci/Sdisplay_RVB$K' qui peuvent recevoir */ \ /* des triplets d'images {$ROUGE,$VERTE,$BLEUE}, ou encore 'v $xciP/S_NIVEAU$K' qui peut */ \ /* transmettre des triplets de palettes {$ROUGE,$VERTE,$BLEUE}. Une autre application a */ \ /* ete decouverte le 20001213125231 ; elle permet a un programme producteur d'une serie */ \ /* d'images (par exemple '$xci/Ising_2D.11$X') de communiquer ses resultats a un programme */ \ /* consommateur d'images (par exemple '$xci/sequence$X' qui visualise ainsi "en direct"). */ \ \ \ GET_ARGUMENT_L(ARG__Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025 \ ,Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025 \ ); \ /* Introduit le 20121025182732... */ \ GET_ARGUMENT_L("ErreurLecture=" \ ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers \ ); \ /* L'acces a cet argument a ete introduit le 20020626162809 (il etait inaccessible avant). */ \ \ MARQUEUR________FinParametresImages; \ /* Argument fictif destine a marquer la fin des Parametres Generaux de nature "Image" */ \ /* (le 20020626162809) et qui doit imperativement etre le dernier... */ \ \ MARQUEUR________DebutParametresSpecifiques; \ /* Argument fictif destine a marquer le debut des Parametres Specifiques (20010421090617). */ \ \ BLOC(liste_de_recuperation); \ \ MARQUEUR________FinParametresSpecifiques; \ /* Argument fictif destine a marquer la fin des Parametres Specifiques (20010421090617). */ \ ) \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ \ ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_APRES_GET_PARAMETRES; \ /* Actions a effectuer systematiquement apres 'GET_PARAMETRES(...)' introduites le */ \ /* 20030710091913. */ \ Eblock \ /* Procedure de recuperation d'une liste d'arguments specifique aux programmes de '$xciP'. */ \ /* Le 19981202094102, la procedure 'GET_ARGUMENTSif(...)' a ete introduite afin que le */ \ /* parametre 'Iload_fichier_____tester_le_debordement_du_pipe' soit utilisable dans des */ \ /* programmes tels 'v $xciP/S_NIVEAU$K' qui n'utilisaient par 'GET_ARGUMENTSi(...)' mais */ \ /* 'GET_ARGUMENTS_(...)'... */ #define ENTREE_ARGUMENT_pasX \ "px=" #define ENTREE_ARGUMENT_pasY \ "py=" #define ENTREE_ARGUMENTS_pasX_pasY \ Bblock \ GET_ARGUMENT_I(ENTREE_ARGUMENT_pasX,pasX); \ GET_ARGUMENT_I(ENTREE_ARGUMENT_pasY,pasY); \ Eblock #define ENTREE_ARGUMENT_translationX \ "tx=" #define ENTREE_ARGUMENT_translationY \ "ty=" /* Entree des ARGUMENTs {pasX,pasY}. */ /* */ /* Ne pas oublier 'v $xiii/Images$DEF ENTREE_ARGUMENT_translation' (le 20170713094944)... */ #ifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI /* Introduit le 20170712134325... */ # define ENTREE_ARGUMENTS_translationX_translationY \ Bblock \ GET_ARGUMENT_I(ENTREE_ARGUMENT_translationX,translationX); \ GET_ARGUMENT_I(ENTREE_ARGUMENT_translationY,translationY); \ Eblock /* Entree des ARGUMENTs {translationX,translationY}. */ #Aifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI # define ENTREE_ARGUMENTS_translationX_translationY \ Bblock \ GET_ARGUMENT_E(ENTREE_ARGUMENT_translationX,translationX); \ GET_ARGUMENT_E(ENTREE_ARGUMENT_translationY,translationY); \ /* Malgre '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', les arguments {"tx=","ty="} */ \ /* sont ici definis afin de les "bloquer" de facon a ce qu'aucun '$K's ne les definissent */ \ /* avec un autre sens... */ \ Eblock #Eifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI #ifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_01 # define INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi \ Bblock \ /* Rien a faire car, en effet, c'est le mode implicite... */ \ Eblock \ /* Initialisation du format des images en mode 'Std'. */ #Aifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_01 #Eifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_01 #ifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_02 # define INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi \ Bblock \ SET_DIMENSIONS_2D_SANS_VALIDATION(XminPal,XmaxPal,YminPal,YmaxPal); \ Eblock \ /* Initialisation du format des images en mode 'Pal'. */ #Aifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_02 #Eifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_02 #ifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_03 # define INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi \ Bblock \ SET_DIMENSIONS_2D_SANS_VALIDATION(GvalDefaut("Xmin",XminPal) \ ,GvalDefaut("Xmax",XmaxPal) \ ,GvalDefaut("Ymin",YminPal) \ ,GvalDefaut("Ymax",YmaxPal) \ ); \ Eblock \ /* Initialisation du format des images en utilisant les variables d'environnement */ \ /* {{$Xmin,$Xmax},{$Ymin,$Ymax}} (introduit le 20020126150829). */ #Aifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_03 #Eifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_03 #ifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_04 # define INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi \ Bblock \ SET_DIMENSIONS_3D_SANS_VALIDATION(GvalDefaut("Xmin",XminPal) \ ,GvalDefaut("Xmax",XmaxPal) \ ,GvalDefaut("Ymin",YminPal) \ ,GvalDefaut("Ymax",YmaxPal) \ ,GvalDefaut("Zmin",k___Zmin) \ ,GvalDefaut("Zmax",k___Zmax) \ ); \ Eblock \ /* Initialisation du format des images en utilisant les variables d'environnement */ \ /* {{$Xmin,$Xmax},{$Ymin,$Ymax},{$Zmin,$Zmax}} (introduit le 20020212154742). */ #Aifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_04 #Eifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_04 #ifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_05 # define INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi \ Bblock \ SET_DIMENSIONS_2D(GvalDefaut("Xmin",XminPal) \ ,GvalDefaut("Xmax",XmaxPal) \ ,GvalDefaut("Ymin",YminPal) \ ,GvalDefaut("Ymax",YmaxPal) \ ); \ Eblock \ /* Initialisation du format des images en utilisant les variables d'environnement */ \ /* {{$Xmin,$Xmax},{$Ymin,$Ymax}} (introduit le 20020213100517). */ #Aifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_05 #Eifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_05 #ifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_06 # define INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi \ Bblock \ SET_DIMENSIONS_3D(GvalDefaut("Xmin",XminPal) \ ,GvalDefaut("Xmax",XmaxPal) \ ,GvalDefaut("Ymin",YminPal) \ ,GvalDefaut("Ymax",YmaxPal) \ ,GvalDefaut("Zmin",k___Zmin) \ ,GvalDefaut("Zmax",k___Zmax) \ ); \ Eblock \ /* Initialisation du format des images en utilisant les variables d'environnement */ \ /* {{$Xmin,$Xmax},{$Ymin,$Ymax},{$Zmin,$Zmax}} (introduit le 20020213100517). */ #Aifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_06 #Eifdef INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_06 #define AVERTIR_EN_CAS_DE_COORDONNEES_X_DENORMALISEES_HORS_D_UN_CARRE(coordonnees_dans_un_carre,coordonnees_normalisees) \ Bblock \ Test(IFET(EST_VRAI(coordonnees_dans_un_carre) \ ,EST_FAUX(coordonnees_normalisees) \ ) \ ) \ Bblock \ PRINT_ATTENTION("les 'X' denormalisees ne seront pas utilisables en mode 'carre' des champs 3D"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Validation introduite le 20060607175331... */ #define AVERTIR_EN_CAS_DE_COORDONNEES_Y_DENORMALISEES_HORS_D_UN_CARRE(coordonnees_dans_un_carre,coordonnees_normalisees) \ Bblock \ Test(IFET(EST_VRAI(coordonnees_dans_un_carre) \ ,EST_FAUX(coordonnees_normalisees) \ ) \ ) \ Bblock \ PRINT_ATTENTION("les 'Y' denormalisees ne seront pas utilisables en mode 'carre' des champs 3D"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Validation introduite le 20060607175331... */ #define ARG__AXE_NIVEAUX_OUVERT_FERME_____COMPATIBILITE_19951221 \ "AXE_NIVEAUX_OUVERT_FERME_____compatibilite_19951221=""compatibilite_19951221=""compatibilite_20091015=" \ /* Introduit le 20101020110921 afin de raccourcir la longueur d'une ligne a venir, le */ \ /* nouvel argment "compatibilite_20091015=" rappelant 'v $xiii/Images$STR 20091015174102'. */ \ /* */ \ /* Le 20140824093631 "NIVEAUX_____compatibilite_19951221=" ainsi que */ \ /* "NIVEAUX_____compatibilite_20091015=" ont ete reduits pour des raisons d'encombrement... */ #define ACTIONS_A_EFFECTUER_POUR_LA_GESTION_DE_LA_NORMALISATION_DES_COORDONNEES \ Bblock \ /* Nota : le gestion de la "super-echelle" a ete introduite le 20060118094518 car, en */ \ /* effet, je me suis rendu compte a cette date que de plus en plus de programmes */ \ /* utilisaient ce dispositif... */ \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ GET_ARGUMENTS2_F("cXmin=""lXmin=" \ ,f____cNORMALISE_OX_____borne_inferieure \ ,f____lNORMALISE_OX_____borne_inferieure \ ); \ GET_ARGUMENTS2_F("cXmax=""lXmax=" \ ,f____cNORMALISE_OX_____borne_superieure \ ,f____lNORMALISE_OX_____borne_superieure \ ); \ GET_ARGUMENTS2_F("cYmin=""lYmin=" \ ,f____cNORMALISE_OY_____borne_inferieure \ ,f____lNORMALISE_OY_____borne_inferieure \ ); \ GET_ARGUMENTS2_F("cYmax=""lYmax=" \ ,f____cNORMALISE_OY_____borne_superieure \ ,f____lNORMALISE_OY_____borne_superieure \ ); \ GET_ARGUMENTS2_F("cZmin=""lZmin=" \ ,f____cNORMALISE_OZ_____borne_inferieure \ ,f____lNORMALISE_OZ_____borne_inferieure \ ); \ GET_ARGUMENTS2_F("cZmax=""lZmax=" \ ,f____cNORMALISE_OZ_____borne_superieure \ ,f____lNORMALISE_OZ_____borne_superieure \ ); \ /* Introduits le 20120323075041... */ \ \ PROCESS_ARGUMENT_L("rectangulaire=" \ ,super_echelle_____utiliser_le_mode_rectangulaire \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ CHOIX_DE_LA_SUPER_ECHELLE(NEUL(super_echelle_____utiliser_le_mode_rectangulaire) \ ,NEUL(super_echelle_____utiliser_le_mode_carre__grand_carre) \ ); \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_N("carree=""carre=" \ ,super_echelle_____utiliser_le_mode_rectangulaire \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ CHOIX_DE_LA_SUPER_ECHELLE(NOTL(super_echelle_____utiliser_le_mode_rectangulaire) \ ,NEUL(super_echelle_____utiliser_le_mode_carre__grand_carre) \ ); \ /* L'usage de 'NOTL(...)' est du a celui de 'PROCESS_ARGUMENT_N(...)' car, en effet, lorsque */ \ /* 'CHOIX_DE_LA_SUPER_ECHELLE(...)' est execute, le parametre logique en cours de traitement */ \ /* est alors inverse ('v $xig/fonct$vv$DEF NOTL.valeur_L_par_defaut'). Evidemment ce */ \ /* 'NOTL(...)' ne porte que sur 'super_echelle_____utiliser_le_mode_rectangulaire' qui est */ \ /* le parametre qui est en train de faire l'objet du 'PROCESS_ARGUMENT_N(...)', alors que */ \ /* 'super_echelle_____utiliser_le_mode_carre__grand_carre' est un indicateur que l'on ne */ \ /* fait que tester ici (via 'CHOIX_DE_LA_SUPER_ECHELLE(...)') et qui ne fait donc que */ \ /* l'objet d'un 'NEUL(...)'... */ \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_L("grand_carre=" \ ,super_echelle_____utiliser_le_mode_carre__grand_carre \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ CHOIX_DE_LA_SUPER_ECHELLE(NEUL(super_echelle_____utiliser_le_mode_rectangulaire) \ ,NEUL(super_echelle_____utiliser_le_mode_carre__grand_carre) \ ); \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_N("petit_carre=" \ ,super_echelle_____utiliser_le_mode_carre__grand_carre \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ CHOIX_DE_LA_SUPER_ECHELLE(NEUL(super_echelle_____utiliser_le_mode_rectangulaire) \ ,NOTL(super_echelle_____utiliser_le_mode_carre__grand_carre) \ ); \ /* L'usage de 'NOTL(...)' est du a celui de 'PROCESS_ARGUMENT_N(...)' car, en effet, lorsque */ \ /* 'CHOIX_DE_LA_SUPER_ECHELLE(...)' est execute, le parametre logique en cours de traitement */ \ /* est alors inverse ('v $xig/fonct$vv$DEF NOTL.valeur_L_par_defaut'). */ \ Eblock \ ) \ ); \ \ /* Nota : le gestion de la "super-echelle" a ete introduite le 20060118094518 car, en */ \ /* effet, je me suis rendu compte a cette date que de plus en plus de programmes */ \ /* utilisaient ce dispositif... */ \ \ PROCESS_ARGUMENT_L("carre_X_CHAMP_3D=" \ ,ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_dans_un_carre \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ AVERTIR_EN_CAS_DE_COORDONNEES_X_DENORMALISEES_HORS_D_UN_CARRE \ (NEUL(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_dans_un_carre) \ ,NEUL(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees) \ ); \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_L("carre_Y_CHAMP_3D=" \ ,ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_dans_un_carre \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ AVERTIR_EN_CAS_DE_COORDONNEES_Y_DENORMALISEES_HORS_D_UN_CARRE \ (NEUL(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_dans_un_carre) \ ,NEUL(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees) \ ); \ Eblock \ ) \ ); \ /* Introduit le 20041107135519 afin de pouvoir garantir, par exemple, de generer une periode */ \ /* d'un sinus le long de 'dimX' et 'dimY' dans 'v $xci/sinus$K GENERATION_DU_CHAMP_DEMANDE'. */ \ GET_ARGUMENT_L("carre_X_CHAMP_3D_____compatibilite_20061128=" \ ,ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20061128 \ ); \ GET_ARGUMENT_L("carre_Y_CHAMP_3D_____compatibilite_20061128=" \ ,ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20061128 \ ); \ /* Introduit le 20061128143333 afin de pouvoir garantir la compatibilite anterieure, si */ \ /* besoin est... */ \ GET_ARGUMENT_L("carre_X_CHAMP_3D_____compatibilite_20100210=" \ ,ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____compatibilite_20100210 \ ); \ GET_ARGUMENT_L("carre_Y_CHAMP_3D_____compatibilite_20100210=" \ ,ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____compatibilite_20100210 \ ); \ /* Introduit le 20100210104418 afin de pouvoir garantir la compatibilite anterieure, si */ \ /* besoin est... */ \ \ GET_ARGUMENT_L \ ("AXES_COORDONNEES_FERMES_OUVERTS_____compatibilite_20090929=""COORDONNEES_____compatibilite_20090929=" \ ,AXES_COORDONNEES_FERMES_OUVERTS_____compatibilite_20090929 \ ); \ /* Introduit le 20090929094249 afin de pouvoir garantir la compatibilite anterieure, si */ \ /* besoin est... */ \ GET_ARGUMENT_L(ARG__AXE_NIVEAUX_OUVERT_FERME_____COMPATIBILITE_19951221 \ ,AXE_NIVEAUX_OUVERT_FERME_____compatibilite_19951221 \ ); \ /* Introduit le 20091015111748 afin de pouvoir garantir la compatibilite anterieure, si */ \ /* besoin est... */ \ /* */ \ /* Le 20091015174057, "compatibilite_20091015" a ete change en "compatibilite_19951221" */ \ /* la date "19951221" etant approximative et resultat d'un 'retrouva $xiiD/definit.2$DEF' */ \ /* en choisissant la plus ancienne archive utilisant 'BLANC' et non plus 'COULEURS', */ \ /* c'est-a-dire finalement la premiere... */ \ \ PROCESS_ARGUMENT_L("X_CHAMP_3D_normalisee=" \ ,ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ AVERTIR_EN_CAS_DE_COORDONNEES_X_DENORMALISEES_HORS_D_UN_CARRE \ (NEUL(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_dans_un_carre) \ ,NEUL(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees) \ ); \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_N("X_CHAMP_3D_denormalisee=" \ ,ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ AVERTIR_EN_CAS_DE_COORDONNEES_X_DENORMALISEES_HORS_D_UN_CARRE \ (NEUL(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_dans_un_carre) \ ,NOTL(ACCES_A_LA_COORDONNEE_X_D_UN_CHAMP_3D_____coordonnees_normalisees) \ ); \ /* L'usage de 'NOTL(...)' est du a celui de 'PROCESS_ARGUMENT_N(...)' car, en effet, */ \ /* lorsque 'AVERTIR_EN_CAS_DE_COORDONNEES_X_DENORMALISEES_HORS_D_UN_CARRE(...)' est */ \ /* execute, le parametre logique en cours de traitement est alors inverse */ \ /* ('v $xig/fonct$vv$DEF NOTL.valeur_L_par_defaut'). */ \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_L("Y_CHAMP_3D_normalisee=" \ ,ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ AVERTIR_EN_CAS_DE_COORDONNEES_Y_DENORMALISEES_HORS_D_UN_CARRE \ (NEUL(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_dans_un_carre) \ ,NEUL(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees) \ ); \ Eblock \ ) \ ); \ PROCESS_ARGUMENT_N("Y_CHAMP_3D_denormalisee=" \ ,ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees \ ,BLOC(VIDE;) \ ,BLOC(Bblock \ AVERTIR_EN_CAS_DE_COORDONNEES_Y_DENORMALISEES_HORS_D_UN_CARRE \ (NEUL(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_dans_un_carre) \ ,NOTL(ACCES_A_LA_COORDONNEE_Y_D_UN_CHAMP_3D_____coordonnees_normalisees) \ ); \ /* L'usage de 'NOTL(...)' est du a celui de 'PROCESS_ARGUMENT_N(...)' car, en effet, */ \ /* lorsque 'AVERTIR_EN_CAS_DE_COORDONNEES_X_DENORMALISEES_HORS_D_UN_CARRE(...)' est */ \ /* execute, le parametre logique en cours de traitement est alors inverse */ \ /* ('v $xig/fonct$vv$DEF NOTL.valeur_L_par_defaut'). */ \ Eblock \ ) \ ); \ /* Introduits le 20060607175331... */ \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ \ Eblock \ /* Introduit le 20060118095058... */ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) # define GET_ARGUMENTSi(nombre_d_arguments_y_compris_le_nom,liste_de_recuperation) \ Bblock \ DEFV(Logical,INIT(le_format_des_images_a_ete_defini,VRAI)); \ /* Le format des images etant immuable en 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01' on fait */ \ /* comme si les definitions avaient ete deja rencontrees... */ \ \ ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_AVANT_GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom); \ /* Actions a effectuer systematiquement apres 'GET_PARAMETRES(...)' introduites le */ \ /* 20030710091913. */ \ \ GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom \ ,arguments \ ,BLOC(GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE; \ \ MARQUEUR________DebutParametresImages; \ /* Argument fictif destine a marquer le debut des Parametres Generaux de nature "Image" */ \ /* (le 20010420143829) et qui doit imperativement etre le premier... */ \ \ ENTREE_ARGUMENTS_pasX_pasY; \ ENTREE_ARGUMENTS_translationX_translationY; \ /* A cause de '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', cette forme "compacte" a ete */ \ /* introduite le 20170712135356... */ \ \ GET_ARGUMENT_L("UniquementSubstitutions=""us=",ne_faire_que_les_substitutions); \ GET_ARGUMENT_L("EtatFiltrageNiveaux=""efn=",etat_Filtrage_niveaux); \ GET_ARGUMENT_I("CodeCombinaisonNiveaux=""ccn=" \ ,Fcombinaison_universelle_de_deux_niveaux_____code \ ); \ GET_ARGUMENT_F("PonderationCombinaisonNiveaux=""pcn=" \ ,FBARY_____ponderation_de_la_fonction \ ); \ /* Introduit le 20170715093935 afin de controler l'ecriture des points. Ainsi, si l'on veut */ \ /* que lors de l'ecriture d'un point, il y ait combinaison d'une certaine facon avec la */ \ /* valeur anterieure, il faudra activer le dispositif en faisant : */ \ /* */ \ /* UniquementSubstitutions=FAUX */ \ /* EtatFiltrageNiveaux=VRAI */ \ /* */ \ /* en choisissant le mode de combinaison avec ('v $xiipf/fonction.2$DEF code_FVARIABLE') : */ \ /* */ \ /* CodeCombinaisonNiveaux=1 FNEUTRE1 */ \ /* =2 FNEUTRE2 */ \ /* =3 FNEUTRE */ \ /* =4 FADD */ \ /* =5 FBARY */ \ /* =6 FMOYENNE */ \ /* =7 FSUB */ \ /* =8 FMUL */ \ /* =10 FDIV */ \ /* =11 FMAX */ \ /* =12 FMIN */ \ /* =13 FMINMAX */ \ /* =14 FOR */ \ /* =15 FAND */ \ /* =16 FEOR */ \ /* */ \ /* avec, si besoin est : */ \ /* */ \ /* PonderationCombinaisonNiveaux=... */ \ /* */ \ \ GET_ARGUMENT_F("EpsilonAxes=",DENORMALISE_AXES_____epsilon); \ GET_ARGUMENT_F("EpsilonNiveaux=",GENP_____epsilon_des_fonctions_de_ce_type); \ GET_ARGUMENT_F("EpsilonLissageSubstitution=",epsilon_de_LISSAGE_LISTE_DE_SUBSTITUTION); \ /* Definition du format des images. On notera la presence de deux listes de recuperation */ \ /* afin de pouvoir gerer l'indicateur 'le_format_des_images_a_ete_defini' correctement... */ \ /* 'Xmin', 'Xmax',... sont recuperes en premiers, au cas ou leur "vraie" valeur serait */ \ /* necessaire dans 'BLOC(liste_de_recuperation)', par exemple dans des normalisations ou */ \ /* des denormalisations (voir le cas des 'GIT_ARGUMENT_X(...)'). ATTENTION : dans un tel */ \ /* cas, leur utilisation est faite avant de les valider dans les tests qui suivent... */ \ /* */ \ /* Je note le 20160708092557 que si l'on souhaite sous-echantillonner une image, etant */ \ /* donnee l'existence des parametres 'NE_PAS_FORCER_L_INDEXATION_SIMPLIFIEE_A_PRIORI' et */ \ /* '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', le plus simple et le plus sur est d'utiliser */ \ /* d'une part : */ \ /* */ \ /* px=... py=... */ \ /* */ \ /* pour n'atteindre qu'un point sur N ('pasX' et 'pasY' etant references explicitement et */ \ /* inconditionnellement dans les definitions du type 'v $xiii/begin_end$DEF begin_ligne') */ \ /* et d'autre part : */ \ /* */ \ /* Xmin=... Xmax=... Ymin=... Ymax=... */ \ /* */ \ /* pour faire une translation de la grille de sous-echantillonnage (ici aussi, 'Xmin', */ \ /* 'Xmax', 'Ymin' et 'Ymax' etant references explicitement et inconditionnellement dans */ \ /* les definitions du type 'v $xiii/begin_end$DEF begin_ligne')... */ \ \ ACTIONS_A_EFFECTUER_POUR_LA_GESTION_DE_LA_NORMALISATION_DES_COORDONNEES; \ /* Introduit le 20060118095058... */ \ \ GET_ARGUMENT_L("Progression=",begin_end_____editer_la_progression); \ GET_ARGUMENT_I("PasProgression=",begin_end_____pas_d_edition_de_la_progression); \ /* Afin de pouvoir voir eventuellement la progression des parcours d'images... */ \ /* */ \ /* Je rappelle le 20190311100351 que c'est en general (toujours ?) {$Zmin,$Zmax} et non */ \ /* pas '$formatI' qui conditionnent l'edition de la progression si elle est demandee... */ \ \ GET_ARGUMENT_P("load_niveau_hors_image=""lnhi=",Niveau____hors_image); \ GET_ARGUMENT_P("load_niveau_hors_album=""lnha=",Niveau____hors_album); \ /* Ces arguments ont ete introduits le 20070213145252. */ \ \ \ GET_ARGUMENT_L \ (ARG__Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025 \ ,Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025 \ ); \ /* Introduit le 20121025182732... */ \ \ GET_ARGUMENT_L("Dpipe_Iload_fichier=",Iload_fichier_____tester_le_debordement_du_pipe); \ /* Afin de pouvoir ne pas tester le debordement des pipes dans 'Iload_fichier(...)' alors */ \ /* qu'il est teste par defaut et provoque une erreur. Ceci a ete introduit le 19980520185424 */ \ /* pour etre utilise dans des programmes tels 'v $xci/Sdisplay_RVB$K' qui peuvent recevoir */ \ /* des triplets d'images {$ROUGE,$VERTE,$BLEUE}, ou encore 'v $xciP/S_NIVEAU$K' qui peut */ \ /* transmettre des triplets de palettes {$ROUGE,$VERTE,$BLEUE}... */ \ GET_ARGUMENT_L("ErreurLecture=" \ ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers \ ); \ /* L'acces a cet argument a ete introduit le 20020626102936 (il etait inaccessible avant). */ \ \ GET_ARGUMENT_L("erreur_nom_absent_Iload_image=""enaIl=" \ ,Iload_image_____un_nom_absent_est_une_erreur \ ); \ GET_ARGUMENT_L("erreur_nom_absent_Iacces_image=""enaIa=" \ ,Iacces_image_____un_nom_absent_est_une_erreur \ ); \ GET_ARGUMENT_L("erreur_nom_absent_IloadF_image=""enaIlF=" \ ,IloadF_image_____un_nom_absent_est_une_erreur \ ); \ /* Afin de pouvoir autoriser des noms absents (sans que cela soit une erreur...). Cela fut */ \ /* introduit le 20080212100203 (principalement pour 'v $xci/somExt_02.01$K IloadF_image' */ \ /* qui recoit de tres nombreuses 'imageF' comme Arguments...). */ \ \ GET_ARGUMENT_L("convert_Iload_image=""cIl=" \ ,Iload_image_____tenter_les_conversions_de_nom \ ); \ GET_ARGUMENT_L("convert_Iacces_image=""cIa=" \ ,Iacces_image_____tenter_les_conversions_de_nom \ ); \ GET_ARGUMENT_L("convert_IloadF_image=""cIlF=" \ ,IloadF_image_____tenter_les_conversions_de_nom \ ); \ /* Afin de pouvoir convertir des noms en valeurs numeriques (etat par defaut...). */ \ \ GET_ARGUMENT_P("valeur_error_Iload_image=""valeur_erreur_Iload_image=""veIl=" \ ,Iload_image_____valeur_initiale_si_erreur \ ); \ GET_ARGUMENT_P("valeur_error_Iacces_image=""valeur_erreur_Iacces_image=""veIa=" \ ,Iacces_image_____valeur_initiale_si_erreur \ ); \ GET_ARGUMENT_F("valeur_error_IloadF_image=""valeur_erreur_IloadF_image=""veIlF=" \ ,IloadF_image_____valeur_initiale_si_erreur \ ); \ /* Ces arguments ont ete introduits le 20021004151854. */ \ \ GET_ARGUMENT_L("convertir_si_erreur_Iload_image=""cseIl=" \ ,Iload_image_____tenter_une_conversion_standard_en_cas_d_erreur \ ); \ GET_ARGUMENT_L("conversion_avec_renormalisation_si_erreur_Iload_image=""crseIl=" \ ,Iload_image_____faire_la_conversion_standard_avec_renormalisation \ ); \ GET_ARGUMENT_N("conversion_brutale_si_erreur_Iload_image=""cbseIl=" \ ,Iload_image_____faire_la_conversion_standard_avec_renormalisation \ ); \ /* Ces arguments ont ete introduits le 20080916174849 et modifies le 20080917104757... */ \ \ GET_ARGUMENT_L("convertir_si_erreur_IloadF_image=""cseIlF=" \ ,IloadF_image_____tenter_une_conversion_standard_en_cas_d_erreur \ ); \ GET_ARGUMENT_F("niveau_minimal_si_erreur_IloadF_image=""nmseIlF=" \ ,IloadF_image_____niveau_minimal_lors_d_une_conversion_standard \ ); \ GET_ARGUMENT_F("niveau_maximal_si_erreur_IloadF_image=""nMseIlF=" \ ,IloadF_image_____niveau_maximal_lors_d_une_conversion_standard \ ); \ /* Ces arguments ont ete introduits le 20080916135822. */ \ \ GET_ARGUMENT_L("valider_IloadF_image=""vIlF=" \ ,IloadF_image_____valider_les_genere_Float \ ); \ GET_ARGUMENT_F("seuil_inferieur_IloadF_image=""siIlF=" \ ,IloadF_image_____seuil_inferieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_epsilon_IloadF_image=""seIlF=" \ ,IloadF_image_____seuil_epsilon___de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_superieur_IloadF_image=""ssIlF=" \ ,IloadF_image_____seuil_superieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_L("editer_niveaux_invalides_IloadF_image=""eniIlF=" \ ,IloadF_image_____editer_les_niveaux_invalides \ ); \ /* Ces arguments ont ete introduits le 20030211092913 et completes le 20030301095032. */ \ \ GET_ARGUMENT_L("valider_IloadJ_image=""vIlJ=" \ ,IloadJ_image_____valider_les_genere_Float \ ); \ GET_ARGUMENT_F("seuil_inferieur_IloadJ_image=""siIlJ=" \ ,IloadJ_image_____seuil_inferieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_epsilon_IloadJ_image=""seIlJ=" \ ,IloadJ_image_____seuil_epsilon___de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_superieur_IloadJ_image=""ssIlJ=" \ ,IloadJ_image_____seuil_superieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_L("editer_niveaux_invalides_IloadJ_image=""eniIlJ=" \ ,IloadJ_image_____editer_les_niveaux_invalides \ ); \ /* Ces arguments ont ete introduits le 20030211092913 et completes le 20030301095032. */ \ \ GET_ARGUMENT_L("valider_IloadF_image_and_delete=""vIlFd=" \ ,IloadF_image_and_delete_____valider_les_genere_Float \ ); \ GET_ARGUMENT_F("seuil_inferieur_IloadF_image_and_delete=""siIlFd=" \ ,IloadF_image_and_delete_____seuil_inferieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_epsilon_IloadF_image_and_delete=""seIlFd=" \ ,IloadF_image_and_delete_____seuil_epsilon___de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_superieur_IloadF_image_and_delete=""ssIlFd=" \ ,IloadF_image_and_delete_____seuil_superieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_L("editer_niveaux_invalides_IloadF_image_and_delete=""eniIlFd=" \ ,IloadF_image_and_delete_____editer_les_niveaux_invalides \ ); \ /* Ces arguments ont ete introduits le 20030211092913 et completes le 20030301095032. */ \ \ GET_ARGUMENT_L("valider_IloadJ_image_and_delete=""vIlJd=" \ ,IloadJ_image_and_delete_____valider_les_genere_Float \ ); \ GET_ARGUMENT_F("seuil_inferieur_IloadJ_image_and_delete=""siIlJd=" \ ,IloadJ_image_and_delete_____seuil_inferieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_epsilon_IloadJ_image_and_delete=""seIlJd=" \ ,IloadJ_image_and_delete_____seuil_epsilon___de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_superieur_IloadJ_image_and_delete=""ssIlJd=" \ ,IloadJ_image_and_delete_____seuil_superieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_L("editer_niveaux_invalides_IloadJ_image_and_delete=""eniIlJd=" \ ,IloadJ_image_and_delete_____editer_les_niveaux_invalides \ ); \ /* Ces arguments ont ete introduits le 20030211092913 et completes le 20030301095032. */ \ \ MARQUEUR________FinParametresImages; \ /* Argument fictif destine a marquer la fin des Parametres Generaux de nature "Image" */ \ /* (le 20010420143829) et qui doit imperativement etre le dernier... */ \ \ MARQUEUR________DebutParametresSpecifiques; \ /* Argument fictif destine a marquer le debut des Parametres Specifiques (20010421090617). */ \ \ BLOC(liste_de_recuperation); \ \ MARQUEUR________FinParametresSpecifiques; \ /* Argument fictif destine a marquer la fin des Parametres Specifiques (20010421090617). */ \ ) \ ,BLOC(VIDE;) \ ,BLOC(VIDE;) \ ); \ /* 'pasX', 'pasY',... sont recuperes en premiers par symetrie avec la version suivante (a */ \ /* savoir 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02'). */ \ \ ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_APRES_GET_PARAMETRES; \ /* Actions a effectuer systematiquement apres 'GET_PARAMETRES(...)' introduites le */ \ /* 20030710091913. */ \ \ SET_ECHANTILLONNAGE(pasX,pasY); \ /* Et ce afin de forcer 'TEST_ECHANTILLONNAGE'... */ \ Eblock \ /* Procedure de recuperation d'une liste d'arguments avec recuperation implicite des */ \ /* arguments utiles pour la gestion des images : */ \ /* */ \ /* ((px,py),(tx,ty)). */ \ /* */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # define L_AXE_OX_N_EST_PAS_BIEN_DEFINI \ I3OU(IFGT(dimX,K___dimX),IFLE(Xmax,Xmin),IZNE(Xmin)) # define L_AXE_OY_N_EST_PAS_BIEN_DEFINI \ I3OU(IFGT(dimY,K___dimY),IFLE(Ymax,Ymin),IZNE(Ymin)) # define L_AXE_OZ_N_EST_PAS_BIEN_DEFINI \ I3OU(IFGT(dimZ,K___dimZ),IFLE(Zmax,Zmin),IZNE(Zmin)) /* Procedures de validation de la definition des trois axes 'OX', 'OY' et 'OZ'... */ # define ACTION_INITIALE_SUR_LES_IMAGES_STATIQUES_GET_ARGUMENTSi \ Bblock \ /* Dans cette version, il n'y a rien a faire... */ \ Eblock \ /* Procedure de traitement eventuel des "objets" Statiques... */ # define ACTION_INITIALE_SUR_LES_IMAGES_STATIQUES_GET_ARGUMENTSv \ Bblock \ /* Dans cette version, il n'y a rien a faire... */ \ Eblock \ /* Procedure de traitement eventuel des "objets" Statiques... */ # Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # define L_AXE_OX_N_EST_PAS_BIEN_DEFINI \ IFOU(IFLE(Xmax,Xmin),IZNE(Xmin)) # define L_AXE_OY_N_EST_PAS_BIEN_DEFINI \ IFOU(IFLE(Ymax,Ymin),IZNE(Ymin)) # define L_AXE_OZ_N_EST_PAS_BIEN_DEFINI \ IFOU(IFLE(Zmax,Zmin),IZNE(Zmin)) /* Procedures de validation de la definition des trois axes 'OX', 'OY' et 'OZ'... */ /* ATTENTION, le 19971212181937 j'ai ajoute des tests de non nullite des minima des trois */ /* suite a un probleme dans 'v $xrk/rdn_walk.41$K _____.NORMALISE_OZ'. En effet, ce */ /* programme avait ete appele avec "Zmin=1" alors que la normalisation d'une longueur de */ /* 1.0 avait ete demandee ; or cette operation retranche le minimum de la coordonnee, */ /* d'ou ici 1-1=0, utilise ensuite dans une division... */ # define ACTION_INITIALE_SUR_LES_IMAGES_STATIQUES_GET_ARGUMENTSi \ Bblock \ BSaveModifyVariable(Positive \ ,allocation_memoire_avec_validation_____increment_du_compteur_de_tous_les_Malo \ ,ZERO \ ); \ /* Introduit le 20180401073120 suite aux tests de comptage des allocations et desallocations */ \ /* memoire effectues a ces moments-la via 'v $xci/neutre$K'. Ainsi, avec : */ \ /* */ \ /* $xci/neutre$X NeRienFaire=VRAI editer_compteurs_de_reference=VRAI */ \ /* */ \ /* la valeur totale (6961) etait egale au cumul de tous les compteurs (6961), alors */ \ /* qu'avec : */ \ /* */ \ /* $xci/neutre$X NeRienFaire=FAUX editer_compteurs_de_reference=VRAI */ \ /* */ \ /* la valeur totale (4705) n'etait pas egale au cumul de tous les compteurs (4701). La */ \ /* difference (4 = 4705-4701) correspond aux 4 'allocation_memoire_avec_validation(...)' */ \ /* des 4 images {IFmageA,IFmageR,ImageA,ImageR}. D'ou cette remise a 0 de l'increment du */ \ /* compteur, pour voir. Et c'etait bien cela... */ \ \ G_STATIK(); \ /* Dans '$xcc/cpp$Z', on recuperera la liste des "objets" Statiques utilisees reellement, et */ \ /* grace aux declarations provenant de '$xiii/Images$DEF', on generera automatiquement ici, */ \ /* grace a 'G_STATIK()', les sequences d'allocation de la memoire dynamique necessaires a */ \ /* celles-ci, maintenant que les dimensions sont connues. ATTENTION, on notera un probleme */ \ /* non resolu : c'est celui de la liberation finale de cette memoire ; mais est-ce bien */ \ /* necessaire, puisque par definition, les "objets" Statiques sont persistantes... */ \ /* */ \ /* On notera donc que 'G_STATIK()', tout comme 'D_STATIK(...)', n'est pas une procedure */ \ /* definie ; elle n'est qu'un code arbitraire utilise par '$xcc/cpp$Z' pour generer le */ \ /* code d'allocation des "objets" Statiques... */ \ \ ESaveModifyVariable(Positive \ ,allocation_memoire_avec_validation_____increment_du_compteur_de_tous_les_Malo \ ); \ Eblock \ /* Procedure de traitement eventuel des "objets" Statiques... */ # define ACTION_INITIALE_SUR_LES_IMAGES_STATIQUES_GET_ARGUMENTSv \ Bblock \ /* On notera donc que 'DECLARATION_D_UNE_IMAGE_STATIQUE_CACHEE(...)', tout comme les deux */ \ /* pseudo-procedures 'D_STATIK(...)' et 'G_STATIK()' ne sont pas definies, et sont presentes */ \ /* uniquement pour '$xcc/cpp$Z'... */ \ \ DECLARATION_D_UNE_IMAGE_STATIQUE_CACHEE(ImageG); \ DECLARATION_D_UNE_IMAGE_STATIQUE_CACHEE(Marqueur); \ DECLARATION_D_UNE_IMAGE_STATIQUE_CACHEE(Masque); \ /* Pour les memes raisons que ci-dessous, il semble plus prudent de declarer ces quelques */ \ /* images statiques qui sont en general cachees... */ \ \ DECLARATION_D_UNE_IMAGE_STATIQUE_CACHEE(Z_Buffer); \ /* Dans cette version, il faut declarer explicitement le 'Z-Buffer', car en effet, sinon */ \ /* l'image de nom 'Z_Buffer' ne sera pas recuperee par '$xcc/cpp$Z' via 'D_STATIK(...)', */ \ /* alors qu'elle peut tres bien etre utilisee dans l'une des bibliotheques referencees */ \ /* (par exemple dans 'v $xiii/vecteurs$FON') sans etre referencee directement dans ce module */ \ /* (c'est le cas, par exemple, de 'v $xci/grille.01$K'). */ \ DECLARATION_D_UNE_IMAGE_STATIQUE_CACHEE(Z_Buffer_accumule); \ /* Ceci a ete introduit un peu tardivement le 20010829095919 (ayant ete oublie lors de */ \ /* l'introduction de 'Z_Buffer_accumule' le 20010722100154...). */ \ \ DECLARATION_D_UNE_IMAGE_STATIQUE_CACHEE(Iassociation_de_voisinage_____X); \ DECLARATION_D_UNE_IMAGE_STATIQUE_CACHEE(Iassociation_de_voisinage_____Y); \ /* Introduit le 20101011165744 pour 'v $xci/interpole.12$K 20101011165628'... */ \ Eblock \ /* Procedure de traitement eventuel des "objets" Statiques qui sont utilisees dans les */ \ /* librairies sans etre explicitement referencees dans les '$K's... */ # Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # define COEFFICIENT_DE_FORME_DE_L_ESPACE_TRIDIMENSIONNEL \ FQUATRE \ /* Coefficient qui permet de tester les trop grandes disparites entre les axes 'OX', 'OY' */ \ /* et 'OZ' ; une valeur unite ('FU'), par exemple, permettrait de verifier que l'espace */ \ /* est cubique (c'est-a-dire que les trois dimensions sont egales...). La valeur arbitraire */ \ /* choisie permet d'eviter les erreurs lors de l'utilisation du mode 'Suq' avec la plus */ \ /* grande extension de l'axe 'OZ' (soit 'EXTENSION_EXTREME_DES_DIMENSIONS_DES_AXES_OZ(...)'. */ \ /* */ \ /* Le 20140105182900, je suis passe de 'FLOT(SEIZE)' a 'FQUATRE' car cette valeur correspond */ \ /* mieux aux usages : */ \ /* */ \ /* v $xci/accumule.41$K coefficient_de_forme_de_l_espace_tridimensionnel */ \ /* v $xci/accumule.42$K coefficient_de_forme_de_l_espace_tridimensionnel */ \ /* v $xci/densite_3D.11$K coefficient_de_forme_de_l_espace_tridimensionnel */ \ /* v $xci/ombrage.11$K coefficient_de_forme_de_l_espace_tridimensionnel */ /* */ # define ENTREE_ARGUMENT_pasZ \ "pz=" # define ENTREE_ARGUMENTS_pasX_pasY_pasZ \ Bblock \ ENTREE_ARGUMENTS_pasX_pasY; \ GET_ARGUMENT_I(ENTREE_ARGUMENT_pasZ,pasZ); \ Eblock # define ENTREE_ARGUMENT_translationZ \ "tz=" /* Entree de l'ARGUMENT {pasZ}. */ /* */ /* Ne pas oublier 'v $xiii/Images$DEF ENTREE_ARGUMENT_translation' (le 20170713094944)... */ # ifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI /* Introduit le 20170712134325... */ # define ENTREE_ARGUMENTS_translationX_translationY_translationZ \ Bblock \ ENTREE_ARGUMENTS_translationX_translationY; \ GET_ARGUMENT_I(ENTREE_ARGUMENT_translationZ,translationZ); \ Eblock /* Entree de l'ARGUMENT {translationZ}. */ # Aifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI # define ENTREE_ARGUMENTS_translationX_translationY_translationZ \ Bblock \ ENTREE_ARGUMENTS_translationX_translationY; \ GET_ARGUMENT_E(ENTREE_ARGUMENT_translationZ,translationZ); \ /* Malgre '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', les arguments {"tx=","ty=","tz=} */ \ /* sont ici definis afin de les "bloquer" de facon a ce qu'aucun '$K's ne les definissent */ \ /* avec un autre sens... */ \ Eblock # Eifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI /* Entree des ARGUMENTs {pasZ,translationZ}. */ # define gINITIALISATION_DES_INTERPOLATIONS_____compatibilite_20090225 \ gINITIALISATION_DES_INTERPOLATIONS_BILINEAIRE_ET_BICUBIQUE_____compatibilite_20090225 \ /* Pour raccourcir une ligne qui va suivre... */ # define GET_ARGUMENTSi(nombre_d_arguments_y_compris_le_nom,liste_de_recuperation) \ Bblock \ DEFV(Logical,INIT(le_format_des_images_a_ete_defini,FAUX)); \ /* Le format des images etant modifiable en 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02', il */ \ /* faut attendre qu'il ait ete completement defini pour pouvoir traiter les initialisations */ \ /* des parametres par les procedures 'PROCISS_ARGUMENT_I(...)' et 'PROCISS_ARGUMENT_F(...)'. */ \ \ INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi; \ /* Initialisation explicite du format des images introduit le 20020122102707. */ \ \ ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_AVANT_GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom); \ /* Actions a effectuer systematiquement apres 'GET_PARAMETRES(...)' introduites le */ \ /* 20030710091913. */ \ \ GET_PARAMETRES(nombre_d_arguments_y_compris_le_nom \ ,arguments \ ,BLOC(GET_ARGUMENTS_DE_CONTROLE_DE_PORTEE_GENERALE; \ \ MARQUEUR________DebutParametresImages; \ /* Argument fictif destine a marquer le debut des Parametres Generaux de nature "Image" */ \ /* (le 20010420143829) et qui doit imperativement etre le premier... */ \ \ GET_ARGUMENT_L("ValiderAxes=",valider_les_axes_OX_OY_OZ); \ GET_ARGUMENT_F("CoefficientFormeEspaceTriDimensionnel=""CFETD=" \ ,coefficient_de_forme_de_l_espace_tridimensionnel \ ); \ /* Le 20020912135959, l'entree de 'valider_les_axes_OX_OY_OZ' a ete mise juste avant */ \ /* l'entree de {Xmin,Xmax,Ymin,Ymax,Zmin,Zmax} alors qu'anterieurement, il etait juste */ \ /* derriere de 'ETes' qui suit. En effet, a l'entree de {Xmin,Xmax,Ymin,Ymax,Zmin,Zmax} */ \ /* certaines validations inhibables par 'valider_les_axes_OX_OY_OZ' pourraient etre */ \ /* introduites ulterieurement... */ \ /* */ \ /* Cela fut complete par 'coefficient_de_forme_de_l_espace_tridimensionnel' le */ \ /* 20140103185613... */ \ \ Test(IFEQ(programme_principal_____indicateur_de_rerentree \ ,PREMIERE_ENTREE_DANS_LE_PROGRAMME_PRINCIPAL \ ) \ ) \ Bblock \ /* Cas de la premiere entree dans le programme principal : le format des images peut etre */ \ /* defini... */ \ \ /* ATTENTION : il est absolument imperatif que les entrees suivantes (relatives aux */ \ /* {X,Y,Z}{min,max}) figurent avant : */ \ /* */ \ /* DebutParametresSpecifiques */ \ /* BLOC(liste_de_recuperation); */ \ /* FinParametresSpecifiques */ \ /* */ \ /* et ce a cause des eventuelles 'GIT_ARGUMENT_?(...)' qui pourraient y figurer et qui */ \ /* utiliseraient des fonctions du type '_____?NORMALISE_O?(...)' et '_?DENORMALISE_O?(...)' */ \ /* qui demandent a ce que {{Xmin,Xmax},{Ymin,Ymax},{Zmin,Zmax}} soient definis avec leurs */ \ /* bonnes valeurs et non point leurs valeurs implicites... */ \ \ GET_ARGUMENT_I("Xmin_PremiereEntree=",Xmin); \ GET_ARGUMENT_I("Xmax_PremiereEntree=",Xmax); \ GET_ARGUMENT_I("Ymin_PremiereEntree=",Ymin); \ GET_ARGUMENT_I("Ymax_PremiereEntree=",Ymax); \ GET_ARGUMENT_I("Zmin_PremiereEntree=",Zmin); \ GET_ARGUMENT_I("Zmax_PremiereEntree=",Zmax); \ /* Les parametres "????_PremiereEntree" sont provisoires et sont lies uniquement au */ \ /* dispositif 'v $xcc/cpp$Z TiTrE_AtTeNdU' afin de ne pas etre consideres comme des */ \ /* doubles definitions des parametres "????_ReRentree" (introduits le 20050624153414). */ \ /* */ \ /* On notera au passage que l'on ne peut malheureusement ecrire simplement : */ \ /* */ \ /* Test(IFEQ(programme_principal_____indicateur_de_rerentree */ \ /* ,PREMIERE_ENTREE_DANS_LE_PROGRAMME_PRINCIPAL */ \ /* ) */ \ /* ) */ \ /* Bblock */ \ /* Eblock */ \ /* ATes */ \ /* Bblock */ \ /* PUSH_DIMENSIONS_2D; */ \ /* Eblock */ \ /* ETes */ \ /* */ \ /* GET_ARGUMENT_I("Xmin=",Xmin); */ \ /* GET_ARGUMENT_I("Xmax=",Xmax); */ \ /* GET_ARGUMENT_I("Ymin=",Ymin); */ \ /* GET_ARGUMENT_I("Ymax=",Ymax); */ \ /* GET_ARGUMENT_I("Zmin=",Zmin); */ \ /* GET_ARGUMENT_I("Zmax=",Zmax); */ \ /* */ \ /* Test(IFEQ(programme_principal_____indicateur_de_rerentree */ \ /* ,PREMIERE_ENTREE_DANS_LE_PROGRAMME_PRINCIPAL */ \ /* ) */ \ /* ) */ \ /* Bblock */ \ /* Eblock */ \ /* ATes */ \ /* Bblock */ \ /* PULL_DIMENSIONS_2D; */ \ /* Eblock */ \ /* ETes */ \ /* */ \ /* a cause de 'PUSH_DIMENSIONS_2D' qui debute par un 'Bblock' et de 'PULL_DIMENSIONS_2D' */ \ /* qui se termine par le 'Eblock' associe... */ \ /* */ \ /* */ \ /* Le 20170630123909 je rappelle qu'ici ne figurent pas explicitement : */ \ /* */ \ /* [1] Xmin= */ \ /* Xmax= */ \ /* Ymin= */ \ /* Ymax= */ \ /* Zmin= */ \ /* Zmax= */ \ /* */ \ /* mais : */ \ /* */ \ /* [2] Xmin_PremiereEntree= Xmin_ReRentree= */ \ /* Xmax_PremiereEntree= Xmax_ReRentree= */ \ /* Ymin_PremiereEntree= Ymin_ReRentree= */ \ /* Ymax_PremiereEntree= Ymax_ReRentree= */ \ /* Zmin_PremiereEntree= Zmin_ReRentree= */ \ /* Zmax_PremiereEntree= Zmax_ReRentree= */ \ /* */ \ /* et que 'v $xcc/cpp$Z DeGuIsEmEnT' et 'v $xcc/cpp$Z ReReNtReE' assurent les reecritures */ \ /* necessaires pour passer de [2] a [1]... */ \ \ GET_ARGUMENT_L \ ("cHOMOTHETIE_Std_____compatibilite_20120210=""Ccompatibilite_20120210=" \ ,cHOMOTHETIE_Std_AXES_____compatibilite_20120210 \ ); \ GET_ARGUMENT_L \ ("lHOMOTHETIE_Std_____compatibilite_20120210=""Lcompatibilite_20120210=" \ ,lHOMOTHETIE_Std_AXES_____compatibilite_20120210 \ ); \ /* Introduit le 20120210184544... */ \ \ /* ATTENTION : il est absolument imperatif que les entrees precedentes (relatives aux */ \ /* {X,Y,Z}{min,max}) figurent avant : */ \ /* */ \ /* DebutParametresSpecifiques */ \ /* BLOC(liste_de_recuperation); */ \ /* FinParametresSpecifiques */ \ /* */ \ /* et ce a cause des eventuelles 'GIT_ARGUMENT_?(...)' qui pourraient y figurer et qui */ \ /* utiliseraient des fonctions du type '_____?NORMALISE_O?(...)' et '_?DENORMALISE_O?(...)' */ \ /* qui demandent a ce que {{Xmin,Xmax},{Ymin,Ymax},{Zmin,Zmax}} soient definis avec leurs */ \ /* bonnes valeurs et non point leurs valeurs implicites... */ \ \ Eblock \ ATes \ Bblock \ /* Cas d'une "rerentree" dans le programme principal : dans ce cas le format des images */ \ /* doit rester tel qu'il est (voir 'Iload_image_avec_redimensionnement_eventuel(...)' qui */ \ /* le modifie eventuellement, il faut donc que ce travail ne soit pas perdu...). On notera */ \ /* deux choses : */ \ /* */ \ /* 1-il est impossible de rendre conditionnels les appels a 'PUSH_DIMENSIONS_2D' et a */ \ /* 'PULL_DIMENSIONS_2D' car en effet, le premier contient un 'Bblock' alors que le second */ \ /* contient le 'Eblock' associe (ils sont la a des fins de validation) ; cela explique donc */ \ /* en partie la redondance de ce code. */ \ /* */ \ /* 2-meme lorsque les arguments ne dimensionnement des images doivent etre ignores, il est */ \ /* essentiel que leurs valeurs soient interpretees a cause du dispositif de detection des */ \ /* aguments incomprehensibles ; les valeurs alors positionnees sont ensuite "abandonnees" */ \ /* grace aux sauvegardes 'PUSH_DIMENSIONS_2D'/'PULL_DIMENSIONS_2D'... */ \ PUSH_DIMENSIONS_2D; \ \ /* ATTENTION : il est absolument imperatif que les entrees suivantes (relatives aux */ \ /* {X,Y,Z}{min,max}) figurent avant : */ \ /* */ \ /* DebutParametresSpecifiques */ \ /* BLOC(liste_de_recuperation); */ \ /* FinParametresSpecifiques */ \ /* */ \ /* et ce a cause des eventuelles 'GIT_ARGUMENT_?(...)' qui pourraient y figurer et qui */ \ /* utiliseraient des fonctions du type '_____?NORMALISE_O?(...)' et '_?DENORMALISE_O?(...)' */ \ /* qui demandent a ce que {{Xmin,Xmax},{Ymin,Ymax},{Zmin,Zmax}} soient definis avec leurs */ \ /* bonnes valeurs et non point leurs valeurs implicites... */ \ \ GET_ARGUMENT_I("Xmin_ReRentree=",Xmin); \ GET_ARGUMENT_I("Xmax_ReRentree=",Xmax); \ GET_ARGUMENT_I("Ymin_ReRentree=",Ymin); \ GET_ARGUMENT_I("Ymax_ReRentree=",Ymax); \ GET_ARGUMENT_I("Zmin_ReRentree=",Zmin); \ GET_ARGUMENT_I("Zmax_ReRentree=",Zmax); \ /* Les parametres "????_ReRentree" sont provisoires et sont lies uniquement au */ \ /* dispositif 'v $xcc/cpp$Z TiTrE_AtTeNdU' afin de ne pas etre consideres comme des */ \ /* doubles definitions des parametres "????_PremiereEntree" (introduits le 20050624153414). */ \ /* */ \ /* Le 20170630123909 je rappelle qu'ici ne figurent pas explicitement : */ \ /* */ \ /* [1] Xmin= */ \ /* Xmax= */ \ /* Ymin= */ \ /* Ymax= */ \ /* Zmin= */ \ /* Zmax= */ \ /* */ \ /* mais : */ \ /* */ \ /* [2] Xmin_PremiereEntree= Xmin_ReRentree= */ \ /* Xmax_PremiereEntree= Xmax_ReRentree= */ \ /* Ymin_PremiereEntree= Ymin_ReRentree= */ \ /* Ymax_PremiereEntree= Ymax_ReRentree= */ \ /* Zmin_PremiereEntree= Zmin_ReRentree= */ \ /* Zmax_PremiereEntree= Zmax_ReRentree= */ \ /* */ \ /* et que 'v $xcc/cpp$Z DeGuIsEmEnT' et 'v $xcc/cpp$Z ReReNtReE' assurent les reecritures */ \ /* necessaires pour passer de [2] a [1]... */ \ \ /* ATTENTION : il est absolument imperatif que les entrees precedentes (relatives aux */ \ /* {X,Y,Z}{min,max}) figurent avant : */ \ /* */ \ /* DebutParametresSpecifiques */ \ /* BLOC(liste_de_recuperation); */ \ /* FinParametresSpecifiques */ \ /* */ \ /* et ce a cause des eventuelles 'GIT_ARGUMENT_?(...)' qui pourraient y figurer et qui */ \ /* utiliseraient des fonctions du type '_____?NORMALISE_O?(...)' et '_?DENORMALISE_O?(...)' */ \ /* qui demandent a ce que {{Xmin,Xmax},{Ymin,Ymax},{Zmin,Zmax}} soient definis avec leurs */ \ /* bonnes valeurs et non point leurs valeurs implicites... */ \ \ PULL_DIMENSIONS_2D; \ Eblock \ ETes \ \ ENTREE_ARGUMENTS_pasX_pasY_pasZ; \ ENTREE_ARGUMENTS_translationX_translationY_translationZ; \ /* A cause de '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', cette forme "compacte" a ete */ \ /* introduite le 20170712135356... */ \ \ GET_ARGUMENT_L("UniquementSubstitutions=""us=",ne_faire_que_les_substitutions); \ GET_ARGUMENT_L("EtatFiltrageNiveaux=""efn=",etat_Filtrage_niveaux); \ GET_ARGUMENT_I("CodeCombinaisonNiveaux=""ccn=" \ ,Fcombinaison_universelle_de_deux_niveaux_____code \ ); \ GET_ARGUMENT_F("PonderationCombinaisonNiveaux=""pcn=" \ ,FBARY_____ponderation_de_la_fonction \ ); \ /* Introduit le 20170715093935 afin de controler l'ecriture des points. Ainsi, si l'on veut */ \ /* que lors de l'ecriture d'un point, il y ait combinaison d'une certaine facon avec la */ \ /* valeur anterieure, il faudra activer le dispositif en faisant : */ \ /* */ \ /* UniquementSubstitutions=FAUX */ \ /* EtatFiltrageNiveaux=VRAI */ \ /* */ \ /* en choisissant le mode de combinaison avec ('v $xiipf/fonction.2$DEF code_FVARIABLE') : */ \ /* */ \ /* CodeCombinaisonNiveaux=1 FNEUTRE1 */ \ /* =2 FNEUTRE2 */ \ /* =3 FNEUTRE */ \ /* =4 FADD */ \ /* =5 FBARY */ \ /* =6 FMOYENNE */ \ /* =7 FSUB */ \ /* =8 FMUL */ \ /* =10 FDIV */ \ /* =11 FMAX */ \ /* =12 FMIN */ \ /* =13 FMINMAX */ \ /* =14 FOR */ \ /* =15 FAND */ \ /* =16 FEOR */ \ /* */ \ /* avec, si besoin est : */ \ /* */ \ /* PonderationCombinaisonNiveaux=... */ \ /* */ \ \ GET_ARGUMENT_F("EpsilonAxes=",DENORMALISE_AXES_____epsilon); \ GET_ARGUMENT_F("EpsilonNiveaux=",GENP_____epsilon_des_fonctions_de_ce_type); \ GET_ARGUMENT_F("EpsilonLissageSubstitution=",epsilon_de_LISSAGE_LISTE_DE_SUBSTITUTION); \ /* Definition du format des images. On notera la presence de deux listes de recuperation */ \ /* afin de pouvoir gerer l'indicateur 'le_format_des_images_a_ete_defini' correctement... */ \ /* 'Xmin', 'Xmax',... sont recuperes en premiers, au cas ou leur "vraie" valeur serait */ \ /* necessaire dans 'BLOC(liste_de_recuperation)', par exemple dans des normalisations ou */ \ /* des denormalisations (voir le cas des 'GIT_ARGUMENT_X(...)'). ATTENTION : dans un tel */ \ /* cas, leur utilisation est faite avant de les valider dans les tests qui suivent... */ \ \ ACTIONS_A_EFFECTUER_POUR_LA_GESTION_DE_LA_NORMALISATION_DES_COORDONNEES; \ /* Introduit le 20060118095058... */ \ \ GET_ARGUMENT_L("Progression=",begin_end_____editer_la_progression); \ GET_ARGUMENT_I("PasProgression=",begin_end_____pas_d_edition_de_la_progression); \ /* Afin de pouvoir voir eventuellement la progression des parcours d'images... */ \ /* */ \ /* Je rappelle le 20190311100351 que c'est en general (toujours ?) {$Zmin,$Zmax} et non */ \ /* pas '$formatI' qui conditionnent l'edition de la progression si elle est demandee... */ \ \ GET_ARGUMENT_P("load_niveau_hors_image=""lnhi=",Niveau____hors_image); \ GET_ARGUMENT_P("load_niveau_hors_album=""lnha=",Niveau____hors_album); \ /* Ces arguments ont ete introduits le 20070213145252. */ \ \ GET_ARGUMENT_L("E_SUBSTITUTION=" \ ,RECHERCHE_D_UNE_LISTE_DE_SUBSTITUTION_____signaler_erreurs \ ); \ /* Afin de pouvoir voir eventuellement la progression des parcours d'images... */ \ \ GET_ARGUMENT_L \ (ARG__Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025 \ ,Fmise_a_jour_du_systeme_de_gestion_de_fichiers_____compatibilite_20121025 \ ); \ /* Introduit le 20121025182732... */ \ \ \ GET_ARGUMENT_L("Dpipe_Iload_fichier=",Iload_fichier_____tester_le_debordement_du_pipe); \ /* Afin de pouvoir ne pas tester le debordement des pipes dans 'Iload_fichier(...)' alors */ \ /* qu'il est teste par defaut et provoque une erreur. Ceci a ete introduit le 19980520185424 */ \ /* pour etre utilise dans des programmes tels 'v $xci/Sdisplay_RVB$K' qui peuvent recevoir */ \ /* des triplets d'images {$ROUGE,$VERTE,$BLEUE}, ou encore 'v $xciP/S_NIVEAU$K' qui peut */ \ /* transmettre des triplets de palettes {$ROUGE,$VERTE,$BLEUE}... */ \ GET_ARGUMENT_L("ErreurLecture=" \ ,files_____editer_les_messages_d_erreur_de_lecture_des_fichiers \ ); \ /* L'acces a cet argument a ete introduit le 20020626102936 (il etait inaccessible avant). */ \ \ GET_ARGUMENT_L("permuter_bits_Iload_image=""pbIl=" \ ,Iload_image_____permuter_les_bits_de_l_image \ ); \ GET_ARGUMENT_I("taille_paquets_bits_Iload_image=""tpbIl=" \ ,Iload_image_____taille_des_paquets_de_bits \ ); \ GET_ARGUMENT_I("translation_index_bits_Iload_image=""tibIl=" \ ,Iload_image_____translation_des_index_de_bits \ ); \ /* La permutation des bits dans 'Iload_image(...)' a ete introduite le 20130707184535... */ \ \ GET_ARGUMENT_L("erreur_nom_absent_Iload_image=""enaIl=" \ ,Iload_image_____un_nom_absent_est_une_erreur \ ); \ GET_ARGUMENT_L("erreur_nom_absent_Iacces_image=""enaIa=" \ ,Iacces_image_____un_nom_absent_est_une_erreur \ ); \ GET_ARGUMENT_L("erreur_nom_absent_IloadF_image=""enaIlF=" \ ,IloadF_image_____un_nom_absent_est_une_erreur \ ); \ /* Afin de pouvoir autoriser des noms absents (sans que cela soit une erreur...). Cela fut */ \ /* introduit le 20080212100203... */ \ \ GET_ARGUMENT_L("convert_Iload_image=""cIl=" \ ,Iload_image_____tenter_les_conversions_de_nom \ ); \ GET_ARGUMENT_L("convert_Iacces_image=""cIa=" \ ,Iacces_image_____tenter_les_conversions_de_nom \ ); \ GET_ARGUMENT_L("convert_IloadF_image=""cIlF=" \ ,IloadF_image_____tenter_les_conversions_de_nom \ ); \ /* Afin de pouvoir convertir des noms en valeurs numeriques (etat par defaut...). */ \ \ GET_ARGUMENT_P("valeur_error_Iload_image=""valeur_erreur_Iload_image=""veIl=" \ ,Iload_image_____valeur_initiale_si_erreur \ ); \ GET_ARGUMENT_P("valeur_error_Iacces_image=""valeur_erreur_Iacces_image=""veIa=" \ ,Iacces_image_____valeur_initiale_si_erreur \ ); \ GET_ARGUMENT_F("valeur_error_IloadF_image=""valeur_erreur_IloadF_image=""veIlF=" \ ,IloadF_image_____valeur_initiale_si_erreur \ ); \ /* Ces arguments ont ete introduits le 20021004151854. */ \ \ GET_ARGUMENT_L("convertir_si_erreur_Iload_image=""cseIl=" \ ,Iload_image_____tenter_une_conversion_standard_en_cas_d_erreur \ ); \ GET_ARGUMENT_L("conversion_avec_renormalisation_si_erreur_Iload_image=""crseIl=" \ ,Iload_image_____faire_la_conversion_standard_avec_renormalisation \ ); \ GET_ARGUMENT_N("conversion_brutale_si_erreur_Iload_image=""cbseIl=" \ ,Iload_image_____faire_la_conversion_standard_avec_renormalisation \ ); \ /* Ces arguments ont ete introduits le 20080916174849 et modifies le 20080917104757... */ \ \ GET_ARGUMENT_L("forcer_redimensionnement_Iload_image=""frIl=" \ ,Iload_image_____forcer_un_redimensionnement_meme_en_l_absence_d_erreur \ ); \ GET_ARGUMENT_L("redimensionnement_si_erreur_Iload_image=""rseIl=" \ ,Iload_image_____tenter_un_redimensionnement_en_cas_d_erreur \ ); \ GET_ARGUMENT_I("methode_redimensionnement_si_erreur_Iload_image=""mrseIl=" \ ,Iload_image_____methode_de_redimensionnement_a_utiliser \ ); \ GET_ARGUMENT_L("avertir_redimensionnement_si_erreur_Iload_image=""arseIl=" \ ,Iload_image_____avertir_s_il_y_a_redimensionnement_en_cas_d_erreur \ ); \ /* Ces arguments ont ete introduits le 20090418234528 et complete le 20090422092647, puis */ \ /* le 20090502093745 en ce qui concerne le redimensionnement... */ \ \ GET_ARGUMENT_L("convertir_si_erreur_IloadF_image=""cseIlF=" \ ,IloadF_image_____tenter_une_conversion_standard_en_cas_d_erreur \ ); \ GET_ARGUMENT_F("niveau_minimal_si_erreur_IloadF_image=""nmseIlF=" \ ,IloadF_image_____niveau_minimal_lors_d_une_conversion_standard \ ); \ GET_ARGUMENT_F("niveau_maximal_si_erreur_IloadF_image=""nMseIlF=" \ ,IloadF_image_____niveau_maximal_lors_d_une_conversion_standard \ ); \ /* Ces arguments ont ete introduits le 20080916135822. */ \ \ GET_ARGUMENT_L("forcer_redimensionnement_IloadF_image=""frIlF=" \ ,IloadF_image_____forcer_un_redimensionnement_meme_en_l_absence_d_erreur \ ); \ GET_ARGUMENT_L("redimensionnement_si_erreur_IloadF_image=""rseIlF=" \ ,IloadF_image_____tenter_un_redimensionnement_en_cas_d_erreur \ ); \ GET_ARGUMENT_I("methode_redimensionnement_si_erreur_IloadF_image=""mrseIlF=" \ ,IloadF_image_____methode_de_redimensionnement_a_utiliser \ ); \ GET_ARGUMENT_L("avertir_redimensionnement_si_erreur_IloadF_image=""arseIlF=" \ ,IloadF_image_____avertir_s_il_y_a_redimensionnement_en_cas_d_erreur \ ); \ /* Ces arguments ont ete introduits le 20090418234528 et complete le 20090422092647, puis */ \ /* le 20090502093745 en ce qui concerne le redimensionnement... */ \ \ GET_ARGUMENT_L("valider_IloadF_image=""vIlF=" \ ,IloadF_image_____valider_les_genere_Float \ ); \ GET_ARGUMENT_F("seuil_inferieur_IloadF_image=""siIlF=" \ ,IloadF_image_____seuil_inferieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_epsilon_IloadF_image=""seIlF=" \ ,IloadF_image_____seuil_epsilon___de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_superieur_IloadF_image=""ssIlF=" \ ,IloadF_image_____seuil_superieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_L("editer_niveaux_invalides_IloadF_image=""eniIlF=" \ ,IloadF_image_____editer_les_niveaux_invalides \ ); \ /* Ces arguments ont ete introduits le 20030211092913 et completes le 20030301095032. */ \ \ GET_ARGUMENT_L("valider_IloadJ_image=""vIlJ=" \ ,IloadJ_image_____valider_les_genere_Float \ ); \ GET_ARGUMENT_F("seuil_inferieur_IloadJ_image=""siIlJ=" \ ,IloadJ_image_____seuil_inferieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_epsilon_IloadJ_image=""seIlJ=" \ ,IloadJ_image_____seuil_epsilon___de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_superieur_IloadJ_image=""ssIlJ=" \ ,IloadJ_image_____seuil_superieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_L("editer_niveaux_invalides_IloadJ_image=""eniIlJ=" \ ,IloadJ_image_____editer_les_niveaux_invalides \ ); \ /* Ces arguments ont ete introduits le 20030211092913 et completes le 20030301095032. */ \ \ GET_ARGUMENT_L("valider_IloadF_image_and_delete=""vIlFd=" \ ,IloadF_image_and_delete_____valider_les_genere_Float \ ); \ GET_ARGUMENT_F("seuil_inferieur_IloadF_image_and_delete=""siIlFd=" \ ,IloadF_image_and_delete_____seuil_inferieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_epsilon_IloadF_image_and_delete=""seIlFd=" \ ,IloadF_image_and_delete_____seuil_epsilon___de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_superieur_IloadF_image_and_delete=""ssIlFd=" \ ,IloadF_image_and_delete_____seuil_superieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_L("editer_niveaux_invalides_IloadF_image_and_delete=""eniIlFd=" \ ,IloadF_image_and_delete_____editer_les_niveaux_invalides \ ); \ /* Ces arguments ont ete introduits le 20030211092913 et completes le 20030301095032. */ \ \ GET_ARGUMENT_L("valider_IloadJ_image_and_delete=""vIlJd=" \ ,IloadJ_image_and_delete_____valider_les_genere_Float \ ); \ GET_ARGUMENT_F("seuil_inferieur_IloadJ_image_and_delete=""siIlJd=" \ ,IloadJ_image_and_delete_____seuil_inferieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_epsilon_IloadJ_image_and_delete=""seIlJd=" \ ,IloadJ_image_and_delete_____seuil_epsilon___de_validation_des_genere_Float \ ); \ GET_ARGUMENT_F("seuil_superieur_IloadJ_image_and_delete=""ssIlJd=" \ ,IloadJ_image_and_delete_____seuil_superieur_de_validation_des_genere_Float \ ); \ GET_ARGUMENT_L("editer_niveaux_invalides_IloadJ_image_and_delete=""eniIlJd=" \ ,IloadJ_image_and_delete_____editer_les_niveaux_invalides \ ); \ /* Ces arguments ont ete introduits le 20030211092913 et completes le 20030301095032. */ \ \ GET_ARGUMENT_L("permuter_bits_Istore=""pbIs=" \ ,Istore_image_____permuter_les_bits_de_l_image \ ); \ GET_ARGUMENT_I("taille_paquets_bits_Istore=""tpbIs=" \ ,Istore_image_____taille_des_paquets_de_bits \ ); \ GET_ARGUMENT_I("translation_index_bits_Istore=""tibIs=" \ ,Istore_image_____translation_des_index_de_bits \ ); \ /* La permutation des bits dans 'Istore_image(...)' a ete introduite le 20130707184535... */ \ \ GET_ARGUMENT_L("renormaliser_Istore=""rIs=" \ ,Istore_image_____renormaliser_l_image \ ); \ GET_ARGUMENT_P("niveau_minimal_renormalisation_Istore=""nmrIs=" \ ,Istore_image_____niveau_minimal_de_renormalisation \ ); \ GET_ARGUMENT_P("niveau_maximal_renormalisation_Istore=""nMrIs=" \ ,Istore_image_____niveau_maximal_de_renormalisation \ ); \ /* La renormalisation dans 'Istore_image(...)' a ete introduite le 20161128150521... */ \ \ GET_ARGUMENT_L("complementer_Istore=""cIs=" \ ,Istore_image_____complementer_l_image \ ); \ /* La complementation dans 'Istore_image(...)' a ete introduite le 20161129102525... */ \ \ GET_ARGUMENT_L("faciliter_NOM_FICHIER=" \ ,files_____faciliter_l_acces_au_directory_images \ ); \ /* Introduit le 20020514153041 afin de pouvoir controler le "fonctionnement" de la variable */ \ /* 'v $xiii/files$FON NOM_FICHIER'. */ \ \ GET_ARGUMENT_F("translation_Afloat_std=""tAfs=" \ ,Afloat_std_____translation_d_arrondi_au_plus_proche_entier \ ); \ GET_ARGUMENT_F("translation_Ifloat_std=""tIfs=" \ ,Ifloat_std_____translation_d_arrondi_au_plus_proche_entier \ ); \ /* Introduit le 20020315122536 ('v $xiii/conversion$FON 20020315122536'). On notera que des */ \ /* valeurs nulles pour ces deux parametres permettent d'assurer la compatibilite avec les */ \ /* generations anterieures a cette date... */ \ \ GET_ARGUMENT_L("INTERPOLATIONS_____compatibilite_20090225=" \ ,gINITIALISATION_DES_INTERPOLATIONS_____compatibilite_20090225 \ ); \ /* Introduit le 20090225133610 afin de garantir la compatibilite anterieure... */ \ \ GET_ARGUMENT_I("VOISINAGE_POINT_BILINEAIRE_pasX=""VPBL_px=" \ ,VOISINAGE_POINT_BILINEAIRE_____pasX \ ); \ GET_ARGUMENT_I("VOISINAGE_POINT_BILINEAIRE_pasY=""VPBL_py=" \ ,VOISINAGE_POINT_BILINEAIRE_____pasY \ ); \ GET_ARGUMENT_I("VOISINAGE_POINT_BICUBIQUE_pasX=""VPBC_px=" \ ,VOISINAGE_POINT_BICUBIQUE_____pasX \ ); \ GET_ARGUMENT_I("VOISINAGE_POINT_BICUBIQUE_pasY=""VPBC_py=" \ ,VOISINAGE_POINT_BICUBIQUE_____pasY \ ); \ /* Introduits le 20160329122414... */ \ \ MARQUEUR________FinParametresImages; \ /* Argument fictif destine a marquer la fin des Parametres Generaux et de nature "Image" */ \ /* (le 20010420143829) et qui doit imperativement etre le dernier... */ \ ) \ ,BLOC(EGAL(le_format_des_images_a_ete_defini,VRAI); \ /* Le format des images etant modifiable en 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02', il */ \ /* faut attendre qu'il ait ete completement defini pour pouvoir traiter les initialisations */ \ /* des parametres par les procedures 'PROCISS_ARGUMENT_I(...)' et 'PROCISS_ARGUMENT_F(...)'. */ \ ) \ ,BLOC( \ MARQUEUR________DebutParametresSpecifiques; \ /* Argument fictif destine a marquer le debut des Parametres Specifiques (20010421090617). */ \ \ BLOC(liste_de_recuperation); \ /* Autres definitions... */ \ /* */ \ /* ATTENTION, il est tres important de mettre 'liste_de_recuperation' apres l'entree de */ \ /* '$formatI' car, en effet, certaines valeurs initiales de parametres peuvent en dependre */ \ /* via 'GIT_ARGUMENT_?(...)'... */ \ \ MARQUEUR________FinParametresSpecifiques; \ /* Argument fictif destine a marquer la fin des Parametres Specifiques (20010421090617). */ \ ) \ ); \ \ ACTIONS_A_EFFECTUER_SYSTEMATIQUEMENT_APRES_GET_PARAMETRES; \ /* Actions a effectuer systematiquement apres 'GET_PARAMETRES(...)' introduites le */ \ /* 20030710091913. */ \ \ Test(IL_FAUT(valider_les_axes_OX_OY_OZ)) \ /* Ce test a ete ajoute le 19980324104621 afin de permettre de manipuler des fichiers */ \ /* "textes" comme des images definies par : */ \ /* */ \ /* Xmin = 0 */ \ /* Xmax = LongueurFichierTexte-1 */ \ /* */ \ /* Ymin = 0 */ \ /* Ymax = 0 */ \ /* */ \ /* ainsi, on pourra, par exemple, faire une sorte de "ou" entre deux textes a l'aide de la */ \ /* commande 'v $xci/maximum$K'. On notera au passage que le code du '$K_BLANC' est le plus */ \ /* faible des codes utiles, ce qui fait que ce caractere joue en quelque sorte le role du */ \ /* zero. Ceci est exploite par exemple dans 'v $xiMo/transparents$Z', commande nouvelle */ \ /* introduite le 19980422143225. */ \ Bblock \ Test(L_AXE_OX_N_EST_PAS_BIEN_DEFINI) \ Bblock \ PRINT_ERREUR("la definition de l'axe 'OX' est mauvaise"); \ CAL1(Prer2("l'axe 'OX' demande est defini par [%d,%d]\n",Xmin,Xmax)); \ EGAL(Xmin,k___Xmin); \ EGAL(Xmax,k___Xmax); \ /* Et restauration de l'axe 'OX' standard... */ \ CAL1(Prer2("l'axe 'OX' est donc redefini selon [%d,%d]\n",Xmin,Xmax)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(L_AXE_OY_N_EST_PAS_BIEN_DEFINI) \ Bblock \ PRINT_ERREUR("la definition de l'axe 'OY' est mauvaise"); \ CAL1(Prer2("l'axe 'OY' demande est defini par [%d,%d]\n",Ymin,Ymax)); \ EGAL(Ymin,k___Ymin); \ EGAL(Ymax,k___Ymax); \ /* Et restauration de l'axe 'OY' standard... */ \ CAL1(Prer2("l'axe 'OY' est donc redefini selon [%d,%d]\n",Ymin,Ymax)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(L_AXE_OZ_N_EST_PAS_BIEN_DEFINI) \ Bblock \ PRINT_ERREUR("la definition de l'axe 'OZ' est mauvaise"); \ CAL1(Prer2("l'axe 'OZ' demande est defini par [%d,%d]\n",Zmin,Zmax)); \ EGAL(Zmin,k___Zmin); \ EGAL(Zmax,k___Zmax); \ /* Et restauration de l'axe 'OZ' standard... */ \ CAL1(Prer2("l'axe 'OZ' est donc redefini selon [%d,%d]\n",Zmin,Zmax)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFGT(bDIV(FLOT(MAX3(dimX,dimY,dimZ)) \ ,FLOT(MIN3(dimX,dimY,dimZ)) \ ) \ ,coefficient_de_forme_de_l_espace_tridimensionnel \ ) \ ) \ /* Ce test a ete rajoute a cause de difficultes avec le programme 'v $xrv/champs_5.30$K' */ \ /* lorsqu'il y a peu d'images a empiler orthogonalement a 'OZ' ; on a alors affaire a */ \ /* un espace tres plat ('dimZ' etant tres inferieur a 'dimX' et a 'dimY') ; les rotations */ \ /* (et par exemple 'ROTATION_OX') donnent alors des resultats visuellement bizarres... */ \ /* */ \ /* La raison a cela semble etre liee au fait que dans les programmes de ce type, les */ \ /* dimensions {dimX,dimY,dimZ} designent aussi bien les dimensions de l'"objet" a deplacer */ \ /* (rotation, translation et zoom) dans l'espace, que les dimensions de l'espace absolu */ \ /* dans lequel on visualise celui-ci. D'autre part, le 19961021150710, j'ai decouvert */ \ /* que dans le cas de '$xrv/champs_5.30$K', lors de rotations, par exemple, certains points */ \ /* pouvaient d'approcher trop pres de l'observateur ; cela a conduit a l'introduction de */ \ /* 'FACTEUR_D_ELOIGNEMENT_EN_Z_D_UN_OBSERVATEUR_LOINTAIN'... */ \ /* */ \ /* Le 20050622153457, en testant le programme 'v $xrs/project3D.11$K', j'ai note aussi */ \ /* les consequences de cela, par exemple, sur les procedures '_____lNORMALISE_O?(...)'. */ \ /* En particulier, l'usage 'v $xrv/champs_5.1C$I _____lNORMALISE_OZ' conduit, lorsque */ \ /* 'dimZ' est petit (il valait 8 dans ce test...), a des corrections d'anti-aliasing */ \ /* aberrantes. Cela a conduit a la mise a jour 'v $xrv/champs_5.1C$I 20050622154321... */ \ Bblock \ PRINT_ATTENTION("l'espace est tres 'distordu', c'est-a-dire est tres different d'un cube"); \ CAL1(Prer3("ses dimensions sont (%d,%d,%d)\n",dimX,dimY,dimZ)); \ CAL1(Prer0("pour chaque axe trop court, il est donc suggere :\n")); \ CAL1(Prer0("1-soit d'introduire (s'il n'existe pas encore) un facteur specifique ")); \ CAL1(Prer0("de dilatation et de l'utiliser,\n")); \ CAL1(Prer1("2-soit d'utiliser l'option 'ValiderAxes=%s' pour supprimer cette verification.\n" \ ,C_FAUX____ \ ) \ ); \ /* Voir par exemple a ce propos 'v $xrv/champs_5.30$K facteur_du_Z.FACTEUR_DU_Z' qui */ \ /* montre que cette notion de "facteur de dilatation" est "locale" aux programmes qui */ \ /* en ont besoin et qu'il ne s'agit donc pas d'un dispositif general et commun... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ SET_ECHANTILLONNAGE(pasX,pasY); \ /* Et ce afin de forcer 'TEST_ECHANTILLONNAGE'... */ \ \ ACTION_INITIALE_SUR_LES_IMAGES_STATIQUES_GET_ARGUMENTSi; \ /* Action initiale eventuelle sur les images Statiques... */ \ Eblock \ /* Procedure de recuperation d'une liste d'arguments avec recuperation implicite des */ \ /* arguments utiles pour la gestion des images : */ \ /* */ \ /* ((Xmin,Xmax),(Ymin,Ymax),(Zmin,Zmax),(px,py),(tx,ty)). */ \ /* */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #define GET_ARGUMENTSv(nombre_d_arguments_y_compris_le_nom,liste_de_recuperation) \ Bblock \ GET_ARGUMENTSi(nombre_d_arguments_y_compris_le_nom,liste_de_recuperation); \ /* Recuperation des arguments suivant 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01' ou */ \ /* 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02'... */ \ \ ACTION_INITIALE_SUR_LES_IMAGES_STATIQUES_GET_ARGUMENTSv; \ /* Action initiale eventuelle sur les images Statiques... */ \ Eblock \ /* Procedure de recuperation d'une liste d'arguments avec recuperation implicite des */ \ /* arguments utiles pour la gestion des images : */ \ /* */ \ /* ([(Xmin,Xmax),(Ymin,Ymax),(Zmin,Zmax),](px,py),(tx,ty)). */ \ /* */ \ /* et gestion de certaines images statiques (celles qui sont utilisees dans les librairies */ \ /* sans etre explicitement referencees dans les '$K's). Ceci fut introduit le 20101011190940 */ \ /* afin de separer cette possibilite de celle qui consiste en plus a initialiser les */ \ /* differentes echelles Graphiques (ce que fait 'GET_ARGUMENTSg(...)'). */ #define GET_ARGUMENTSg(nombre_d_arguments_y_compris_le_nom,liste_de_recuperation) \ Bblock \ GET_ARGUMENTSv(nombre_d_arguments_y_compris_le_nom,liste_de_recuperation); \ /* Recuperation des arguments suivant 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01' ou */ \ /* 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02'... */ \ \ SK(INTER_POINT); \ /* Definition de l'echelle globale, */ \ SX(INTER_POINT); \ SY(INTER_POINT); \ SZ(INTER_POINT); \ /* Definition de l'echelle sur les axes 'OX', 'OY' et 'OZ'. */ \ /* */ \ /* Je comprends (un peu tard...) pourquoi on execute ici ces initialisations. Cela vient */ \ /* des definitions de 'SX(...)', 'SY(...)' et 'SZ(...)' qui utilisent respectivement */ \ /* '_____cNORMALISE_OX(...)', '_____cNORMALISE_OY(...)' et '_____cNORMALISE_OZ(...)', */ \ /* ces procedures ne fonctionnant correctement qu'apres la definition des trois axes */ \ /* dans 'GET_ARGUMENTSv(...)'. Il en est de meme pour 'SK(...)' qui utiliset {dimX,dimY} */ \ /* via la definition de 'PLUS_PETITE_IMAGE_CARREE_CIRCONSCRITE'... */ \ Eblock \ /* Procedure de recuperation d'une liste d'arguments avec recuperation implicite des */ \ /* arguments utiles pour la gestion des images : */ \ /* */ \ /* ([(Xmin,Xmax),(Ymin,Ymax),(Zmin,Zmax),](px,py),(tx,ty)). */ \ /* */ \ /* et mise a jour des echelles graphiques 'SK', 'SX', 'SY' et 'SZ' (ce qui est essentiel */ \ /* dans le cas de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02') ; l'utilisation de cette */ \ /* procedure n'a de sens que si un */ \ /* */ \ /* #include image_image_VECTEURS_EXT */ \ /* */ \ /* a ete fait ou pour declarer certaines images statiques... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A F I N D ' E D I T E R L E S V A L E U R S R E S U L T A N T */ /* D E S F O N C T I O N S ' Fconversion?(...) ' : */ /* */ /*************************************************************************************************************************************/ #define EDITER_LES_VALEURS_APRES_Fconversion \ VRAI #define NE_PAS_EDITER_LES_VALEURS_APRES_Fconversion \ NOTL(EDITER_LES_VALEURS_APRES_Fconversion) /* Valeurs possibles de 'editer_la_valeur_des_parametres_d_une_commande'... */ #define EDITER_LE_NOM_DES_PARAMETRES_NON_GENERES_D_UNE_COMMANDE \ VRAI #define NE_PAS_EDITER_LE_NOM_DES_PARAMETRES_NON_GENERES_D_UNE_COMMANDE \ NOTL(EDITER_LE_NOM_DES_PARAMETRES_NON_GENERES_D_UNE_COMMANDE) /* Valeurs possibles de 'editer_le_nom_des_parametres_non_generes_d_une_commande'... */ #define EDITER_LE_NOM_DES_SYMBOLES_APRES_Fconversion \ VRAI #define NE_PAS_EDITER_LE_NOM_DES_SYMBOLES_APRES_Fconversion \ NOTL(EDITER_LE_NOM_DES_SYMBOLES_APRES_Fconversion) /* Valeurs possibles de 'editer_le_nom_des_parametres_d_une_commande'... */ #define EDITER_LES_SYNONYMES_APRES_Fconversion \ VRAI #define NE_PAS_EDITER_LES_SYNONYMES_APRES_Fconversion \ NOTL(EDITER_LES_SYNONYMES_APRES_Fconversion) /* Valeurs possibles de 'editer_les_synonymes_des_parametres_d_une_commande'... */ #define GROUPER_LES_SYNONYMES_APRES_Fconversion \ VRAI #define NE_PAS_GROUPER_LES_SYNONYMES_APRES_Fconversion \ NOTL(GROUPER_LES_SYNONYMES_APRES_Fconversion) /* Valeurs possibles de 'grouper_les_synonymes_des_parametres_d_une_commande' (introduites */ /* le 20070330091147). */ #define LONGUEUR_MAXIMALE_DES_VECTEURS_DANS_EDITER_LES_VALEURS_APRES_Fconversion \ TROIS \ /* Nombre d'elements edites par defaut dans le cas des vecteurs lorsque */ \ /* 'IL_FAUT(editer_la_valeur_des_parametres_d_une_commande)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #if ( (defined(SYSTEME_DPX5000_SPIX_CC)) \ ) # TestADef BUG_SYSTEME_DPX_LC_PILE_1 \ /* Il y a apparemment un probleme dans la bibliotheque contenant les fonctions mathematiques */ \ /* qui fait que lorsque la pile est appelee a franchir une frontiere de page, pour arriver */ \ /* sur une page non encore allouee, l'allocation ne se fait pas, ce qui provoque une trappe */ \ /* 'Segmentation fault'. Ce probleme se rencontre, par exemple, avec une fonction recursive */ \ /* qui appelerait la fonction 'cos' avant de se rappeler elle-meme... */ #Aif ( (defined(SYSTEME_DPX5000_SPIX_CC)) \ ) #Eif ( (defined(SYSTEME_DPX5000_SPIX_CC)) \ ) #if ( (! defined(BUG_SYSTEME_DPX_LC_PILE_1)) \ ) # define INITIALISATION_DE_LA_PILE_DE_SAUVEGARDE_ET_D_ALLOCATION(longueur_de_la_pile) \ Bblock \ BLOC(VIDE;); \ Eblock \ /* Procedure d'initialisation de la pile de sauvegarde et d'allocation des variables */ \ /* locales... */ #Aif ( (! defined(BUG_SYSTEME_DPX_LC_PILE_1)) \ ) # define INITIALISATION_DE_LA_PILE_DE_SAUVEGARDE_ET_D_ALLOCATION(longueur_de_la_pile) \ Bblock \ BLOC(CALS(initialisation_de_la_pile_de_sauvegarde_et_d_allocation(longueur_de_la_pile))); \ Eblock \ /* Procedure d'initialisation de la pile de sauvegarde et d'allocation des variables */ \ /* locales. On notera que l'argument 'longueur_de_la_pile' n'est pas en realite le nombre */ \ /* de mots a initialiser dans la pile, mais lui est proportionnel... */ #Eif ( (! defined(BUG_SYSTEME_DPX_LC_PILE_1)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E C O N S T I T U T I O N D E L A C O M M A N D E C O U R A N T E : */ /* */ /*************************************************************************************************************************************/ #define RECONSTITUTION_DE_LA_COMMANDE_COURANTE(commande_courante) \ Bblock \ DEFV(Int,INIT(numero_d_argument_courant,UNDEF)); \ /* Donne en permanence le numero de l'argument courant. */ \ \ EGAp(commande_courante,chain_Acopie(C_VIDE)); \ /* Initialisation de la commande courante. */ \ \ gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_d_arguments \ ,BLOC(EGAL(commande_courante \ ,chain_Aconcaten3(commande_courante \ ,ITb1(arguments \ ,INDX(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ) \ ,COND(IFLT(compteur_des_arguments \ ,nombre_d_arguments \ ) \ ,C_BLANC \ ,C_VIDE \ ) \ ) \ ); \ /* Recuperation des arguments de la commande courante les uns apres les autres et dans */ \ /* l'ordre d'appel. On notera que le nom de la commande est considere comme etant le */ \ /* premier argument ('NUMERO_ARGUMENT_COMMANDE') et est donc bien recupere ici... */ \ ) \ ); \ Eblock \ /* Regeneration de la commande courante. On notera la presence d'un espace ('C_BLANC') */ \ /* derriere le dernier argument qui fut en fait supprime le 20060313145232 avec la mise */ \ /* en place de 'C_VIDE' lors de la derniere iteration... */ #define RECONSTITUTION_DE_LA_COMMANDE_COURANTE_AVEC_QUOTAGE(commande_courante) \ Bblock \ DEFV(Int,INIT(numero_d_argument_courant,UNDEF)); \ /* Donne en permanence le numero de l'argument courant. */ \ \ EGAp(commande_courante,chain_Acopie(C_VIDE)); \ /* Initialisation de la commande courante. */ \ \ gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS(nombre_d_arguments \ ,BLOC(EGAL(commande_courante \ ,chain_Aconcaten3(commande_courante \ ,COND(IFEQ(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ,chain_Aconcaten1 \ (ITb1(arguments \ ,INDX(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ) \ ) \ ,chain_Aconcaten9 \ (C_VERITABLE_QUOTE \ ,C_VERITABLE_APOSTROPHE \ ,C_VERITABLE_QUOTE \ ,C_VERITABLE_APOSTROPHE \ ,ITb1(arguments \ ,INDX(numero_d_argument_courant \ ,NUMERO_ARGUMENT_COMMANDE \ ) \ ) \ ,C_VERITABLE_APOSTROPHE \ ,C_VERITABLE_QUOTE \ ,C_VERITABLE_APOSTROPHE \ ,C_VERITABLE_QUOTE \ ) \ ) \ ,COND(IFLT(compteur_des_arguments \ ,nombre_d_arguments \ ) \ ,C_BLANC \ ,C_VIDE \ ) \ ) \ ); \ /* Recuperation des arguments de la commande courante les uns apres les autres et dans */ \ /* l'ordre d'appel. On notera que le nom de la commande est considere comme etant le */ \ /* premier argument ('NUMERO_ARGUMENT_COMMANDE') et est donc bien recupere ici... */ \ /* Les "vrais" arguments sont encadres par des '$K_QS's et des '$K_QD's afin d'en */ \ /* faciliter la gestion (par exemple : 'v $xci/genere$K commande_de_generation_corrigee'). */ \ /* On notera que l'on trouvera ainsi : */ \ /* */ \ /* '"ARGUMENT=PARTIE1 PARTIE2..."' */ \ /* */ \ /* dans le cas d'un argument ("ARGUMENT=") dont la valeur "PARTIE1 PARTIE2..." contient */ \ /* des espaces (au passage cette syntaxe est aussi celle que l'on rencontre lorsqu'il */ \ /* n'y a pas d'espaces -cas general en fait-...), et non pas : */ \ /* */ \ /* ARGUMENT='"PARTIE1 PARTIE2..."' */ \ /* */ \ /* comme on pourrait le souhaiter. En tout cas, je ne sais pas faire autrement et de toute */ \ /* facon cela marche parfaitement dans 'v $xci/genere$K commande_de_generation_corrigee' ou */ \ /* il est essentiel que les structures "ARGUMENT=VALEUR" soit traitees en une fois (qu'il */ \ /* y ait des espaces ou pas) par 'v $xig/fonct$vv$DEF gPARCOURS_DE_LA_LISTE_DES_ARGUMENTS'. */ \ /* */ \ /* Avant le 20070110091012, la sequence de "quotage" des arguments ci-dessus etait : */ \ /* */ \ /* ,ch_Aconc5(C_VERITABLE_APOSTROPHE \ */ \ /* ,C_VERITABLE_QUOTE \ */ \ /* ,ITb1(arguments \ */ \ /* ,INDX(numero_d_argument_courant \ */ \ /* ,NUMERO_ARGUMENT_COMMANDE \ */ \ /* ) \ */ \ /* ) \ */ \ /* ,C_VERITABLE_QUOTE \ */ \ /* ,C_VERITABLE_APOSTROPHE \ */ \ /* ) \ */ \ /* */ \ /* avec : */ \ /* */ \ /* #define ch_Aconc5(chaineA1,chaineA2,chaineA3,chaineA4,chaineA5) \ */ \ /* chain_Aconcaten5(chaineA1,chaineA2,chaineA3,chaineA4,chaineA5) */ \ /* */ \ /* Le 20070110091012, le "quotage" des arguments a donc ete modifie de facon a produire : */ \ /* */ \ /* "'"'ARGUMENT=PARTIE1 PARTIE2...'"'" */ \ /* */ \ /* de facon a resoudre le probleme decrit dans 'v $xci/genere$K 20070109101142'... */ \ ) \ ); \ Eblock \ /* Regeneration de la commande courante avec quotage des arguments. Cette procedure fut */ \ /* introduite le 20061225152154... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* Q U E L Q U E S P R I M I T I V E S U T I L E S A L A G E N E R A T I O N D E C O M M A N D E S : */ /* */ /*************************************************************************************************************************************/ #define gGENERATION_NOM_D_UNE_COMMANDE(directory_de_la_commande,nom_relatif_au_directory_de_la_commande,postfixe) \ EGAs(chain_Aconcaten4(directory_de_la_commande \ ,cSEPARATEUR_DES_PATHS \ ,nom_relatif_au_directory_de_la_commande \ ,postfixe \ ) \ ) \ /* Generation du nom absolu d'une commande quelconque (introduit le 20060313094131...). */ #define GENERATION_NOM_D_UNE_COMMANDE_X(directory_de_la_commande,nom_relatif_au_directory_de_la_commande) \ gGENERATION_NOM_D_UNE_COMMANDE(directory_de_la_commande \ ,nom_relatif_au_directory_de_la_commande \ ,GvarDefaut("X",".x") \ ) \ /* Generation du nom absolu d'une commande '$X'. Le 20020228164122, suite a l'introduction */ \ /* de 'v $xil/defi_K2$vv$DEF Direct_xci' et de 'v $xil/defi_K2$vv$DEF Direct__xT', il a */ \ /* fallu passer de 'Gvar(directory_de_la_commande)' a 'directory_de_la_commande' qui doit */ \ /* etre alors defini "a l'exterieur" par un 'GvarDefaut(...)' que l'on ne peut evidemment */ \ /* utiliser ici, 'GENERATION_NOM_D_UNE_COMMANDE(...)' ne connaissant pas la valeur par */ \ /* defaut. Par contre, il a ete possible d'introduire 'GvarDefaut(...)' pour "X"... */ \ /* */ \ /* Le 20060313094131 le nom de cette procedure 'GENERATION_NOM_D_UNE_COMMANDE(...)' a ete */ \ /* change en 'GENERATION_NOM_D_UNE_COMMANDE_X(...)' afin de permettre l'introduction de */ \ /* 'GENERATION_NOM_D_UNE_COMMANDE_Z(...)' a cette date... */ #define GENERATION_NOM_D_UNE_COMMANDE_Z(directory_de_la_commande,nom_relatif_au_directory_de_la_commande) \ gGENERATION_NOM_D_UNE_COMMANDE(directory_de_la_commande \ ,nom_relatif_au_directory_de_la_commande \ ,GvarDefaut("Z",".z") \ ) \ /* Generation du nom absolu d'une commande '$Z' (introduit le 20060313094131...). */ #define GENERATION_DE_CAL1_CAL2_CAL3_CAL4 \ EGAs(chain_Aconcaten12(C_BLANC,"CAL1=",ETAT_LOGIQUE(CAL1_____executer) \ ,C_BLANC,"CAL2=",ETAT_LOGIQUE(CAL2_____executer) \ ,C_BLANC,"CAL3=",ETAT_LOGIQUE(CAL3_____executer) \ ,C_BLANC,"CAL4=",ETAT_LOGIQUE(CAL4_____executer) \ ) \ ) \ /* Generation des differents "CALi="... */ #define GENERATION_DE_formatI \ EGAs(chain_Aconcaten2(C_BLANC \ ,Gvar("formatI") \ ) \ ) \ /* Generation de la variable '$formatI'. */ #define GENERATION_DE_formatI_Sdu \ EGAs(chain_Aconcaten2(C_BLANC \ ,Gvar("format_Sdu") \ ) \ ) \ /* Generation de la variable '$formatI' en mode 'Sdu'. Cette definition n'etait utile qu'a */ \ /* 'v $xci/filtre.01$K GENERATION_DE_formatI_', mais le 20120906183527 les extensions de */ \ /* format ont ete, via 'v $xci/filtre.01$K GENERATION_DE_formatI_Sxu', gerees de facon */ \ /* beaucoup plus generales. Cette definition est malgre tout conservee, on ne sait jamais... */ #define GENERATION_DE_formatR \ EGAs(chain_Aconcaten12(C_BLANC,"XminR=",EGAs(chain_Aentier(Xmin)) \ ,C_BLANC,"XmaxR=",EGAs(chain_Aentier(Xmax)) \ ,C_BLANC,"YminR=",EGAs(chain_Aentier(Ymin)) \ ,C_BLANC,"YmaxR=",EGAs(chain_Aentier(Ymax)) \ ) \ ) \ /* Generation de la variable '$formatR'. */ #define GENERATION_DE_formatR_Sdu \ EGAs(chain_Aconcaten2(C_BLANC \ ,Gvar("formatR_Sdu") \ ) \ ) \ /* Generation de la variable '$formatR' en mode 'Sdu'. Cette definition n'etait utile qu'a */ \ /* 'v $xci/filtre.01$K GENERATION_DE_formatR_', mais le 20120906183527 les extensions de */ \ /* format ont ete, via 'v $xci/filtre.01$K GENERATION_DE_formatR_Sxu', gerees de facon */ \ /* beaucoup plus generales. Cette definition est malgre tout conservee, on ne sait jamais... */ #ifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI /* Introduit le 20170712134325... */ # define GENERATION_DE_PasX_PasY_TraX_TraY \ EGAs(chain_Aconcaten12(C_BLANC,ENTREE_ARGUMENT_pasX,EGAs(chain_Aentier(PasX)) \ ,C_BLANC,ENTREE_ARGUMENT_pasY,EGAs(chain_Aentier(PasY)) \ ,C_BLANC,ENTREE_ARGUMENT_translationX,EGAs(chain_Aentier(TraX)) \ ,C_BLANC,ENTREE_ARGUMENT_translationY,EGAs(chain_Aentier(TraY)) \ ) \ ) \ /* Generation de {PasX,PasY,TraX,TraY}. */ #Aifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI # define GENERATION_DE_PasX_PasY_TraX_TraY \ EGAs(chain_Aconcaten6(C_BLANC,ENTREE_ARGUMENT_pasX,EGAs(chain_Aentier(PasX)) \ ,C_BLANC,ENTREE_ARGUMENT_pasY,EGAs(chain_Aentier(PasY)) \ ) \ ) \ /* Generation de {PasX,PasY,TraX,TraY}. */ #Eifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E L E R A T E U R D ' U N E F O N C T I O N A ' N ' A R G U M E N T S : */ /* */ /*************************************************************************************************************************************/ #define ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS__PREMIERE_ENTREE \ INDEX0 #define ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS__PONDERATEUR \ UN /* Parametres fondamentaux. */ /* */ /* Concernant la valeur de 'ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS__PONDERATEUR', on lira */ /* avec interet 'v $xiipf/fonction.2$FON 20120314091930'. Cela a provoque le remplacement */ /* ci-dessus de 'SEPT' par 'UN'... */ #define GENERATION_DE_L_ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS(accelerateur,nombre_d_entrees,listes_Arguments) \ /* Procedure introduite le 20120309181426... */ \ \ /* Avant le 20120310142011, il y avait ici : */ \ /* */ \ /* DEFV(Common,DEFV(Logical,INIT(accelerateur __@@__ _____utiliser_l_accelerateur,VRAI))); */ \ /* */ \ /* qui est supprime a cette date a cause de 'v $xcg/gen$EXT$Z'... */ \ /* */ \ /* Indique si l'accelerateur doit etre utilise ou pas (introduit le 20120310070411). */ \ /* */ \ /* Je note le 20120310132303 que cet indicateur pourrait aussi bien etre 'Local' car, en */ \ /* effet, 'v $xcg/gen$EXT$Z' ne peut l'atteindre. C'est pour cela que fut introduit */ \ /* 'v $xig/common$STR ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS____utiliser'le 20120310093347. */ \ /* Le 20120310142011, je le supprime a cause de cela... */ \ \ DEFV(Local,DEFV(Logical,INIT(accelerateur __@@__ _____initialiser_l_accelerateur,VRAI))); \ /* Indique si l'accelerateur doit etre initialise... */ \ \ DEFV(Local,DEFV(Logical,DdTb1(POINTERl \ ,accelerateur __@@__ _____entree_valide \ ,nombre_d_entrees \ ,ADRESSE_NON_ENCORE_DEFINIE \ ) \ ) \ ); \ /* Indique si l'entree courante est valide. */ \ \ DEFV(Local,DEFV(Int,DdTb1(POINTERi \ ,accelerateur __@@__ _____identite_de_la_fonction \ ,nombre_d_entrees \ ,ADRESSE_NON_ENCORE_DEFINIE \ ) \ ) \ ); \ /* Donne l'identite de l'objet (introduit le 20120316173122 afin de permettre a plusieurs */ \ /* fonctions d'utiliser le meme accelerateur...). */ \ \ DEFV(Local,DEFV(Int,DdTb1(POINTERi \ ,accelerateur __@@__ _____identite_de_l_objet \ ,nombre_d_entrees \ ,ADRESSE_NON_ENCORE_DEFINIE \ ) \ ) \ ); \ /* Donne l'identite de l'objet (introduit le 20120316160204 afin de lever une possible */ \ /* ambiguite lorsque cette identiete, avant cette date, etait "melangee" dans la clef */ \ /* de "hash-coding"...). */ \ \ BLOC(listes_Arguments); \ /* Donne les N (N=1,2,...) arguments de l'entree courante (si elle est valide...). */ \ \ DEFV(Local,DEFV(Float,DdTb1(POINTERf \ ,accelerateur __@@__ _____valeur_de_la_fonction \ ,nombre_d_entrees \ ,ADRESSE_NON_ENCORE_DEFINIE \ ) \ ) \ ); \ /* Donne la valeur de la fonction de l'entree courante (si elle est valide...). */ #define ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS(acc,ut,n_e,p_e,d_e,se_all,se_ini,p_Args,t_iden,se_maj,se_fal,val_f,se_cf,fonc,obj) \ /* Procedure introduite le 20120309181426... */ \ /* */ \ /* L'argument 'fonc' a ete introduit le 20120316154449, mais reste inutilise a cette */ \ /* date jusqu'au 20120316173122 ou il fut utilise... */ \ /* */ \ /* Definition des abbreviations utilisees pour les differents arguments : */ \ /* */ \ /* acc : accelerateur */ \ /* ut : utiliser */ \ /* n_e : nombre_d_entrees */ \ /* p_e : premiere_entree */ \ /* d_e : derniere_entree */ \ /* se_all : sequence_allocation */ \ /* se_ini : sequence_initialisation */ \ /* p_Args : polynome_Arguments */ \ /* t_iden : test_identite */ \ /* se_maj : sequence_mise_a_jour */ \ /* se_fal : sequence_desallocation ("FermerALlocateur") */ \ /* val_f : valeur_de_la_fonction */ \ /* se_cf : calcul_de_la_fonction */ \ /* fonc : fonction */ \ /* obj : objet */ \ /* */ \ /* Evidemment, cela est necessaire afin de reduire la longueur de la ligne de definition */ \ /* de 'ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS(...)' ci-dessus. */ \ /* */ \ /* Au passage, on notera que 'se_cf' (soit 'calcul_de_la_fonction') doit contenir entre */ \ /* autres choses : */ \ /* */ \ /* Bblock */ \ /* (...) */ \ /* EGAL(val_f,...); */ \ /* (...) */ \ /* Eblock */ \ /* */ \ /* mais que cela ne permet pas de se debarasser de 'val_f' (soit 'valeur_de_la_fonction') */ \ /* puisque 'val_f' est necessaire pour la mise a jour '_____valeur_de_la_fonction'... */ \ Bblock \ Test(IFET(IL_FAUT(ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS____utiliser) \ ,IL_FAUT(ut) \ ) \ ) \ /* Test introduit le 20120310070411... */ \ Bblock \ Test(IL_FAUT(acc __@@__ _____initialiser_l_accelerateur)) \ Bblock \ DEFV(Int,INIT(index_d_initialisation,UNDEF)); \ \ MdTb1(acc __@@__ _____entree_valide,n_e,Logical,ADRESSE_NON_ENCORE_DEFINIE); \ MdTb1(acc __@@__ _____identite_de_la_fonction,n_e,Int,ADRESSE_NON_ENCORE_DEFINIE); \ MdTb1(acc __@@__ _____identite_de_l_objet,n_e,Int,ADRESSE_NON_ENCORE_DEFINIE); \ MdTb1(acc __@@__ _____valeur_de_la_fonction,n_e,Float,ADRESSE_NON_ENCORE_DEFINIE); \ \ BLOC(se_all); \ /* Allocation de la memoire necessaire... */ \ \ DoIn(index_d_initialisation,p_e,d_e,I) \ Bblock \ EGAL(IdTb1(acc __@@__ _____entree_valide,INDX(index_d_initialisation,p_e),n_e),INVALIDE); \ EGAL(IdTb1(acc __@@__ _____identite_de_la_fonction,INDX(index_d_initialisation,p_e),n_e),UNDEF); \ EGAL(IdTb1(acc __@@__ _____identite_de_l_objet,INDX(index_d_initialisation,p_e),n_e),UNDEF); \ \ BLOC(se_ini); \ /* Initialisation des differentes listes des Arguments. */ \ \ EGAL(IdTb1(acc __@@__ _____valeur_de_la_fonction,INDX(index_d_initialisation,p_e),n_e),FLOT__UNDEF); \ /* Initialisation de l'accelerateur... */ \ Eblock \ EDoI \ \ EGAL(acc __@@__ _____initialiser_l_accelerateur,FAUX); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ begin_nouveau_block \ Bblock \ DEFV(Logical,INIT(le_calcul_de_la_fonction_peut_etre_accelere,FAUX)); \ /* A priori, l'acceleration est impossible... */ \ \ DEFV(Int,INIT(identite_de_la_fonction,INTE(IDENTITE(fonc)))); \ /* Definition et calcul de l'identite de la fonction... */ \ /* */ \ /* Jusqu'au 20120316225418, il y avait ci-dessus : */ \ /* */ \ /* DEFV(tf,INIT(afPOINTEUR(adresse_de_la_fonction),aFONCTION(fonc))); */ \ /* */ \ /* ('tf' designant le 'type_fonction', soit donc 'genere_p' et 'genere_Float' en ce qui */ \ /* concerne 'FAload_point_coordonnees_01(...)' et 'FAload_point_coordonnees_01(...)' */ \ /* respectivement), mais cela donnait le message : */ \ /* */ \ /* warning: initialization from incompatible pointer type */ \ /* */ \ /* de meme, au passage, que le simple programme : */ \ /* */ \ /* int fonction(char caractere) */ \ /* { */ \ /* int (*adresses)()=fonction; */ \ /* } */ \ /* */ \ /* le probleme disparaissant si le 'char' est remplace par n'importe quel autre type... */ \ /* */ \ /* La solution fut trouvee le 20120316225418 : 'afPOINTEUR(''')' et 'aFONCTION(...)' */ \ /* furent simplement remplaces par 'IDENTITE(...)'. */ \ /* */ \ /* On notera le 'INTE(...)' obligatoire pour eviter le message : */ \ /* */ \ /* warning: initialization makes integer from pointer without a cast */ \ /* */ \ DEFV(Int,INIT(identite_de_l_objet,INTE(IDENTITE(obj)))); \ /* Definition et calcul de l'identite de l'objet... */ \ /* */ \ /* On notera le 'INTE(...)' obligatoire pour eviter le message : */ \ /* */ \ /* warning: initialization makes integer from pointer without a cast */ \ /* */ \ \ DEFV(Float,INIT(codage_des_arguments,FLOT__UNDEF)); \ DEFV(Int,INIT(index_d_acceleration,UNDEF)); \ /* Parametres essentiels... */ \ \ EGAL(codage_des_arguments \ ,AXPB(FLOT(n_e) \ ,p_Args \ ,ADD2(FLOT(identite_de_la_fonction) \ ,FLOT(identite_de_l_objet) \ ) \ ) \ ); \ /* Calcul d'une fonction des 'N' arguments et de 'identite_de_l_objet'. Cette derniere */ \ /* composante" permet l'exploitation de plusieurs objets differents "simultanement" avec */ \ /* la meme fonction ('v $xiii/di_album$FON FAload_point_coordonnees_01' pour les fonctions */ \ /* du tye 'Iaccumulation_tri_dimensionnelle...(...)'). Le 20120317092022 fut ajoutee */ \ /* 'identite_de_la_fonction' au cas ou plusieurs fonctions "partageraient" le meme */ \ /* accelerateur... */ \ EGAL(index_d_acceleration \ ,ADD2(REST(INTE(ABSO(codage_des_arguments)) \ ,n_e \ ) \ ,p_e \ ) \ ); \ /* Conversion de la fonction des N (N=1,2,...) arguments en un index de "hash-coding"... */ \ \ Test(IFEXff(index_d_acceleration,p_e,d_e)) \ /* Test introduit le 20120929145125 suite a un probleme vu avec 'v $xiirv/STRU.H1' (lors */ \ /* d'une tentative de regeneration, des lignes verticales contenant des points parasites */ \ /* apparaissaient, ces points parasites etant au nombre de 989). Le probleme venait en */ \ /* fait de 'v $xiipf/fonction.2$FON 20120929165544'... */ \ Bblock \ PRINT_ERREUR("l'index d'acceleration est en dehors de ses bornes"); \ CAL1(Prer3("(l'index vaut %d et ses bornes sont [%d,%d])\n" \ ,index_d_acceleration \ ,p_e,d_e \ ) \ ); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(EST_VALIDE(IdTb1(acc __@@__ _____entree_valide,index_d_acceleration,n_e))) \ Bblock \ Test(IFEQ(IdTb1(acc __@@__ _____identite_de_l_objet,index_d_acceleration,n_e) \ ,identite_de_l_objet \ ) \ ) \ Bblock \ Test(IFEQ(IdTb1(acc __@@__ _____identite_de_la_fonction,index_d_acceleration,n_e) \ ,identite_de_la_fonction \ ) \ ) \ Bblock \ Test(t_iden) \ Bblock \ EGAL(le_calcul_de_la_fonction_peut_etre_accelere,VRAI); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(EST_VRAI(le_calcul_de_la_fonction_peut_etre_accelere)) \ Bblock \ EGAL(val_f,IdTb1(acc __@@__ _____valeur_de_la_fonction,index_d_acceleration,n_e)); \ /* Dans le cas ou c'est bien 'fonction(Argument1,Argument2,...)' qui est memorise */ \ /* dans l'accelerateur, sa valeur a deja ete calculee... */ \ Eblock \ ATes \ Bblock \ BLOC(se_cf); \ /* Dans le cas contraire, il faut calculer 'fonction(Argument1,Argument2,...)'... */ \ /* */ \ /* Au passage, on notera que 'se_cf' (soit 'calcul_de_la_fonction') doit contenir entre */ \ /* autres choses : */ \ /* */ \ /* Bblock */ \ /* (...) */ \ /* EGAL(val_f,...); */ \ /* (...) */ \ /* Eblock */ \ /* */ \ /* mais que cela ne permet pas de se debarasser de 'val_f' (soit 'valeur_de_la_fonction') */ \ /* puisque 'val_f' est necessaire pour la mise a jour '_____valeur_de_la_fonction'... */ \ \ EGAL(IdTb1(acc __@@__ _____entree_valide,index_d_acceleration,n_e),VALIDE); \ EGAL(IdTb1(acc __@@__ _____identite_de_la_fonction,index_d_acceleration,n_e) \ ,identite_de_la_fonction \ ); \ EGAL(IdTb1(acc __@@__ _____identite_de_l_objet,index_d_acceleration,n_e),identite_de_l_objet); \ \ BLOC(se_maj); \ /* Mise a jour des differentes listes des Arguments. */ \ \ EGAL(IdTb1(acc __@@__ _____valeur_de_la_fonction,index_d_acceleration,n_e),val_f); \ /* Puis, la valeur de 'fonction(Argument1,Argument2,...)' est memorisee... */ \ Eblock \ ETes \ Eblock \ end_nouveau_block \ \ Test(IL_FAUT(acc __@@__ _____fermer_l_accelerateur)) \ /* Test introduit le 20120311091641 en notant qu'a priori on ne passera certainement */ \ /* jamais par ici pour la bonne raison que l'on ne sait pas, en general, quand est le */ \ /* dernier appel. C'est introduit malgre tout par "symetrie"... */ \ Bblock \ BLOC(se_fal); \ \ FdTb1(acc __@@__ _____valeur_de_la_fonction,n_e,Float,ADRESSE_NON_ENCORE_DEFINIE); \ FdTb1(acc __@@__ _____identite_de_l_objet,n_e,Int,ADRESSE_NON_ENCORE_DEFINIE); \ FdTb1(acc __@@__ _____identite_de_la_fonction,n_e,Int,ADRESSE_NON_ENCORE_DEFINIE); \ FdTb1(acc __@@__ _____entree_valide,n_e,Logical,ADRESSE_NON_ENCORE_DEFINIE); \ /* Desallocation de la memoire necessaire... */ \ \ EGAL(acc __@@__ _____initialiser_l_accelerateur,VRAI); \ EGAL(acc __@@__ _____fermer_l_accelerateur,FAUX); \ /* Au cas ou l'accelerateur serait malgre tout de nouveau appele par la suite... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ BLOC(se_cf); \ /* Dans ce cas, la fonction est calculee sans tentative d'acceleration... */ \ Eblock \ ETes \ Eblock