/*************************************************************************************************************************************/ /* */ /* S U B S T I T U T I O N D E C A R A C T E R E S D A N S U N F I C H I E R : */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* Il est tres delicat et donc tres */ /* dangereux de modifier ce programme */ /* car, en effet, il est utilise dans */ /* 'v $xcc/cpp$Z substitue.01$X' et donc */ /* en cas de probleme, il peut devenir */ /* impossible de le recompiler. D'une part, */ /* on n'oubliera pas qu'avant toute compilation */ /* d'un programme, son '$X' anterieur est sauvegarde */ /* dans '$xTG' et d'autre part, on pourra avoir */ /* interet a faire la mise au point en dupliquant */ /* '$xcp/substitue.01$K' dans un fichier provisoire */ /* qui sera detruit ulterieurement, lorsque tout */ /* marchera bien ; c'est ce fichier provisoire que */ /* l'on compilera et testera... */ /* */ /* */ /* Nota : */ /* */ /* Le caractere '$' de fin de ligne */ /* propre aux programmes de type '$SE' */ /* est remplace simplement ici par "\n" */ /* qui est le caractere de changement */ /* de ligne et donc designe la fin de */ /* ligne (notion qui n'existe plus ici */ /* puisque '$xcp/substitue.01$X' n'a */ /* pas cette notion et manipule les */ /* fichiers globalement, ce pour quoi */ /* il a ete ecrit...). */ /* */ /* Par contre, le caractere '^' de */ /* debut de ligne propre aux programmes */ /* de type '$SE' fonctionne correctement */ /* ici. On notera que l'on peut aussi */ /* utiliser "\n" pour caracteriser le */ /* debut d'une ligne sauf s'il s'agit de */ /* la premiere ligne du fichier (auquel */ /* cas elle n'est pas precedee de ce */ /* caractere...). */ /* */ /* Le 20230313102005 je note malgre tout */ /* que '^' et '$' continuent a jouer leur */ /* role habituel ainsi que le montre le */ /* test suivant realise avec le fichier : */ /* */ /* aaaa */ /* bbbb */ /* cccc */ /* */ /* En appliquant les substitutions suivantes : */ /* */ /* c01='^' s01='-' */ /* c02='$' s02='+' */ /* */ /* on obtient : */ /* */ /* -aaaa+ */ /* -bbbb+ */ /* -cccc+ */ /* */ /* ce qui prouve le bon fonctionnement de */ /* '^' et '$'... */ /* */ /* Une question se pose alors : comment reperer */ /* le DEBUT et la FIN d'un fichier ? On notera la */ /* solution 'v $xcc/cpp$Z FLiStE_ChEcK_FoRmAt.vide' */ /* malgre son cote tres specifique... */ /* */ /* */ /* Nota sur les references a des sous-expressions : */ /* */ /* Comme avec '$SE', des sous-expressions */ /* peuvent etre referencees grace au "\" */ /* suivi d'un numero compris entre 1 et 9. */ /* Cela signifie que l'on ne peut pas referencer */ /* plus de 9 sous-expressions... */ /* */ /* */ /* Utilisation avec des fichiers de commandes : */ /* */ /* Il est possible d'utiliser '$xcp/substitue.01$X' */ /* de la facon suivante : */ /* */ /* callX $xcp/substitue.01$X DoubleDefinition=... */ /* ParameterFile=... */ /* (...) */ /* */ /* ainsi qu'on peut le voir dans 'v $xcc/cpp$Z ParameterFile'. */ /* Un des interets de cette methode, est que les fichiers */ /* commandes ("ParameterFile") peuvent utiliser sans aucune */ /* difficulte des variables du "shell"... */ /* */ /* */ /* Utilisation du type '$EGRE' : */ /* */ /* Le 20170422120827, je rappelle que pour */ /* rechercher, par exemple, les chaines "CHAINE1" */ /* et "CHAINE2" dans le fichier 'FICHIER', on */ /* pourra faire : */ /* */ /* $CA FICHIER | \ */ /* $xcp/substitue.01$X \ */ /* c01="CHAINE1" \ */ /* c02="CHAINE2" \ */ /* (...) \ */ /* EGRE=VRAI trace=VRAI sortir=FAUX */ /* */ /* ce qui permettra de voir les numeros des lignes */ /* dans lesquelles les chaine recherchees apparaissent. */ /* L'interet evident, par rapport a 'EGRE', est qu'ici */ /* les chaines recherchees peuvent etre "a cheval" sur */ /* plusieurs lignes... */ /* */ /* */ /* Nouvelles fonctionnalites : */ /* */ /* Le 20090108094506 fut introduit la */ /* possibilite de permuter les minuscules */ /* et les majuscules dans les sous-expressions */ /* en ecrivant quelque chose du type : */ /* */ /* s01="...\M\1\m..." */ /* */ /* comme cela se voit, par exemple, dans */ /* 'v $xau/LACT18.12$K$sub ".1.M.2.m"'. */ /* Ainsi "\M" ouvre cette possibilite de */ /* permutation, alors que "\m" la ferme... */ /* */ /* On notera le 20090112172243 qu'il reste */ /* de nombreux codes "\X" inutilises et qui */ /* pourraient l'etre afin d'implementer de */ /* nouvelles fonctionnalites. Actuellement, */ /* seuls : */ /* */ /* K_M */ /* K_N */ /* K_b */ /* K_k */ /* K_m */ /* K_n */ /* K_r */ /* K_t */ /* */ /* semblent utilises... */ /* */ /* */ /* Insertion d'un compteur : */ /* */ /* Le 20160813080723 fut introduit un */ /* compteur qui est incremente a chaque */ /* reference. Ainsi : */ /* */ /* s01="...\1\k..." */ /* */ /* concatenera ce compteur apres la chaine */ /* courante "\1", puis l'incrementera... */ /* */ /* Le 20160815080520 ont ete introduits */ /* "\+" et "\-" qui permettent de respectivement */ /* incrementer et decrementer explicitement le */ /* compteur... */ /* */ /* */ /* Remplacement d'un caractere quelconque : */ /* */ /* Le 20230414134056, l'option "remplacer=" */ /* a ete "etendue" en faisant que le caractere */ /* "caractereA=" puisse etre quelconque et ce */ /* via l'option "caractere_quelconque=VRAI". */ /* Seuls alors, les 'K_LF's sont conserves... */ /* */ /* */ /* Nota sur les versions : */ /* */ /* Deux versions peuvent etre generees. */ /* Malheureusement, elles possedent des */ /* differences fonctionnelles, en particulier */ /* dans la gestion de '\{...\}'. En ce qui */ /* concerne 'EXPRESSION_REGULIERE_VERSION_01', */ /* la forme '\{...\}' ne peut que suivre un */ /* caractere seul et par exemple : */ /* */ /* ...X\{3,\5\}... */ /* */ /* pour reperer les occurences de 3 a 5 */ /* caracteres "X". Par contre en ce qui */ /* concerne 'EXPRESSION_REGULIERE_VERSION_02', */ /* la forme '\{...\}' peut suivre n'importe */ /* quelle sous-expression et par exemple : */ /* */ /* ...\(ABCDEFGHIJ\)\{3,\5\}... */ /* */ /* pour reperer les occurences de 3 a 5 */ /* chaines "ABCDEFGHIJ". */ /* */ /* Cela ne va pas sans poser quelques problemes, */ /* par exemple, au niveau des fichiers du type */ /* '$xcc/cpp$D/*$sub' puisqu'en effet ces derniers */ /* doivent etre independants de la version... */ /* */ /* On notera que la page 'www file://$DarchivesG/Mosaic/regex$HTML' */ /* donne des informations precieuses sur ce sujet... */ /* */ /* */ /* Author of '$xcp/substitue.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1996??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES @define PRAGMA_CL_____MODULE_NON_OPTIMISABLE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_MINI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define NOMBRE_D_ITERATIONS_DES_SUBSTITUTIONS \ UN \ /* Nombre d'iterations des substitutions (introduit le 20101227105651). */ #define LONGUEUR_MAXIMALE_DU_FICHIER_ARGUMENT \ MILLION \ /* Longueur maximale du fichier Argument. */ #define LONGUEUR_MAXIMALE_DE_L_EXPRESSION_REGULIERE_COMPILEE \ MILLE \ /* Longueur maximale de la chaine 'expression_reguliere' apres sa "compilation". On notera */ \ /* que ceci n'a en fait de sens qu'avec 'EXPRESSION_REGULIERE_VERSION_01'... */ #define FACTEUR_D_EXPANSION_DU_FICHIER_ARGUMENT \ GRO11(FRA10(FU)) \ /* Facteur de passage de la taille du fichier Argument a la taille du fichier Argument */ \ /* reellement utilisee. */ #define FACTEUR_D_EXPANSION_DU_FICHIER_RESULTAT \ GRO3(FRA2(FU)) \ /* Facteur de passage de la taille du fichier Argument a la taille du fichier Resultat. */ #define BACKSLASHER_LES_POINTS \ FAUX \ /* A priori, les "." ne devront pas etre remplaces par des "\." (fonctionnement de type */ \ /* '$SE') ; ceci a ete introduit le 20001227104156. Ce dispositif permet, en particulier, */ \ /* de manipuler des noms de fichiers, qui contiennent bien souvent des ".", sans ambiguite. */ #define CONSERVER_LES_K_LF_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES \ VRAI \ /* Ce dispositif a ete introduit le 20040514150215 afin de permettre d'eliminer les 'K_LF' */ \ /* qui sont contenus dans les sous-chaines defines par '\(...\)' et qui sont ensuite */ \ /* dupliquees par des ecritures du type '\1'. Cela permet, par exemple, de regrouper les */ \ /* arguments d'une fonction en utilisant cet indicateur a 'FAUX' et les arguments : */ \ /* */ \ /* conserver_les_K_LF=FAUX */ \ /* c01="\(Fonction([^)][^)]*)\)" s01="\1" */ \ /* */ \ /* Pour regrouper les arguments d'une fonction avec leurs definitions, on utilisera : */ \ /* */ \ /* conserver_les_K_LF=FAUX */ \ /* c01="\(Fonction([^{][^{]*\)\({\)" s01="\1\n\2" */ \ /* */ \ /* Evidemment, cela concerne des fichiers de type '$c'... */ #define CONSERVER_LES_K_BLANC_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES \ VRAI \ /* Ce dispositif a ete introduit le 20040526142735 afin de permettre d'eliminer les */ \ /* 'K_BLANC' dans les memes conditions que les 'K_LF' ci-dessus, mais cette fois en ce */ \ /* qui concerne des fichiers de type '$K' en utilisant cet indicateur a 'FAUX' (ainsi */ \ /* que celui relatif a 'K_LF') et les arguments : */ \ /* */ \ /* conserver_les_K_BLANC=FAUX */ \ /* conserver_les_K_LF=FAUX */ \ /* c01="^\(DEFV(Common,DEFV(Fonction[^;]*\)\n" s01="\1\n" */ \ /* */ \ /* Le 20040526161746, la commande 'v $xcg/LArgTypFo$vv$Z' a ete introduite pour automatiser */ \ /* ce type de modification... */ #define REMPLACER_UN_CARACTERE_CONTENU_DANS_LES_SOUS_CHAINES_DEFINIES \ FAUX #define LE_CARACTERE_A_REMPLACER_DANS_LES_SOUS_CHAINES_DEFINIES_EST_QUELCONQUE \ FAUX #define CARACTERE_A_REMPLACER_DANS_LES_SOUS_CHAINES_DEFINIES \ K_POINT_VIRGULE #define CARACTERE_DE_REMPLACEMENT_DANS_LES_SOUS_CHAINES_DEFINIES \ K_VIRGULE /* Ce dispositif a ete introduit le 20040601111701 afin de faciliter le passage de */ /* l'ecriture : */ /* */ /* type Fonction(arg1,arg2,...) */ /* type1 arg1; */ /* type2 arg2; */ /* (...) */ /* { */ /* */ /* a l'ecriture : */ /* */ /* type Fonction(type1 arg1,type2 arg2,...) */ /* { */ /* */ /* en utilisant specifiquement pour la fonction 'Fonction(...)' : */ /* */ /* conserver_les_K_BLANC=VRAI */ /* conserver_les_K_LF=FAUX */ /* remplacer_un_caractere=VRAI caractereA=";" caractereR="," */ /* c01="\([ \n]\)\(Fonction(\)[^)]*)\([^{][^{]*\)\({\)" s01="\1\2\3)\n\4" */ /* c02=", *\()\)" s02="\1" */ /* */ /* ou plus generalement (pour toutes les fonctions) ou 'DebutDeDefinitionDeFonction' est */ /* represente par 'Debut' (pour reduire la longueur des lignes ci-apres...) : */ /* */ /* conserver_les_K_BLANC=VRAI */ /* conserver_les_K_LF=FAUX */ /* remplacer_un_caractere=VRAI caractereA=";" caractereR="," */ /* c01="\n\(Debut [^(]*[^*](\)[^)]*)\([^{][^{]*\)\({\)" s01="\n\1\2)\n\3" */ /* c02="\n\(Debut [^(]*\*([^(]*(\)[^)]*))\([^{][^{]*\)\({\)" s02="\n\1\2))\n\3" */ /* c11=", *\()\)" s11="\1" */ /* */ /* Evidemment, cela concerne des fichiers de type '$c'... */ /* */ /* */ /* Le 20230414134056, fut donc introduite la bascule {\Q,\q} rendant quelconque le */ /* caractere a remplacer... */ #define VALEUR_INITIALE_DU_COMPTEUR \ ZERO #define INCREMENT_DU_COMPTEUR \ UN #define NOMBRE_DE_CHIFFRES_DU_COMPTEUR \ QUATRE /* Le compteur a ete introduit le 20160813080723... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H O I X D E L A V E R S I O N A G E N E R E R */ /* E T " A S T U C E S " D E C O M P A T I B I L I T E : */ /* */ /*************************************************************************************************************************************/ #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) # define __STDC__ \ UNDEF \ /* Pour permettre l'interpretation de '<regex.h>' sans engendrer d'erreurs dues au fait */ \ /* que la variable '__STDC__' n'est pas definie, alors que sa valeur est testee dans le */ \ /* fichier '/usr/include/regex$h' par un : */ \ /* */ \ /* #if __STDC__ */ \ /* */ \ /* alors qu'il semblerait que partout ailleurs, c'est son existence qui est testee, par */ \ /* exemple dans '/usr/include/ansidecl$h'... */ # if (nC_RELEASE >= 295040000) # define __restrict \ /* Pour permettre l'interpretation de '<regex.h>' sans engendrer d'erreurs dues au fait */ \ /* que la variable '__restrict' n'est pas definie, alors qu'une valeur vide permet */ \ /* d'assurer la compatibilite avec les versions anterieures au 20021212140844. Ceci a */ \ /* ete introduit a cette date lors de l'introduction de '$LACT15'... */ # Aif (nC_RELEASE >= 295040000) # Eif (nC_RELEASE >= 295040000) @ ifndef _STDLIB_H @ define _STDLIB_H \ UNDEF @ Aifndef _STDLIB_H @ Eifndef _STDLIB_H /* En effet, /usr/include/regexp$h' fait un include de '<stdlib.h>' qui alors definit les */ /* type de nombreuses fonctions comme 'getenv(...)' ; ces definitions rentrent alors en */ /* conflit avec les miennes, d'ou la definition de '_STDLIB_H' qui inhibera le contenu de */ /* '<stdlib.h>'... */ /* */ /* Le 20071121173341 furent introduits {ifndef,Aifndef,Eifndef} a cause de '$LACT18' et */ /* de 'SYSTEME_APC_LinuxUbuntu_GCC'... */ #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)) \ ) #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)) \ ) #if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) # if (nC_RELEASE >= 303040000) # define _SYS_TYPES_H \ /* Afin de bloquer l'include de '<sys/types.h>' qui est reference dans '<regex.h>'. Cela */ \ /* fut introduit le 20041206131906 lors du demarrage a froid de '$LACT17'... */ # define __restrict_arr \ /* Pour permettre l'interpretation de '<regex.h>' sans engendrer d'erreurs dues au fait */ \ /* que la variable '__restrict_arr' n'est pas definie, alors qu'une valeur vide permet */ \ /* d'assurer la compatibilite avec les versions anterieures au 20041206131906. Ceci a */ \ /* ete introduit a cette date lors de l'introduction de '$LACT17'... */ # Aif (nC_RELEASE >= 303040000) # Eif (nC_RELEASE >= 303040000) #Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) #Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) #if ( (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ ) # if (nC_RELEASE >= 303010000) # define _SYS_TYPES_H \ /* Afin de bloquer l'include de '<sys/types.h>' qui est reference dans '<regex.h>'. Cela */ \ /* fut introduit le 20031028121749 lors du demarrage a froid de '$LACT16'... */ # define __restrict_arr \ /* Pour permettre l'interpretation de '<regex.h>' sans engendrer d'erreurs dues au fait */ \ /* que la variable '__restrict_arr' n'est pas definie, alors qu'une valeur vide permet */ \ /* d'assurer la compatibilite avec les versions anterieures au 20031028121749. Ceci a */ \ /* ete introduit a cette date lors de l'introduction de '$LACT16'... */ # Aif (nC_RELEASE >= 303010000) # Eif (nC_RELEASE >= 303010000) # if (nC_RELEASE >= 805000000) # define _Restrict_ # define _Restrict_arr_ /* Introduit le 20220511093001 apres les mises a jour des serveurs de calcul de '$CMAP28' */ /* effectues au cours des semaines passees... */ # Aif (nC_RELEASE >= 805000000) # Eif (nC_RELEASE >= 805000000) #Aif ( (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ ) #Eif ( (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ ) #if ( (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ ) # define _SYS_STDSYMS_INCLUDED \ UNDEF \ /* Pour permettre l'interpretation de '<sys/stdsyms.h>' ci-apres dans '<regex.h>' sans */ \ /* engendrer d'erreurs dues au fait que certaines variables du pre-processeur n'ont pas */ \ /* ete definies sur 'SYSTEME_HP???_HPUX_C'. On evite ainsi le probleme du message suivant : */ \ /* */ \ /* Error : /usr/include/sys/stdsyms.h: 66: */ \ /* undef symbol _POSIX_C_SOURCE in preprocessor if */ \ /* */ \ /* car, en effet, le fichier '/usr/include/sys/stdsyms$h' contient la ligne : */ \ /* */ \ /* #if defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE > 1) */ \ /* */ \ /* qui est incorrecte si '_POSIX_C_SOURCE' n'existe pas... */ #Aif ( (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ ) #Eif ( (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ ) #if ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (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)) \ ) # define _SYS_TYPES_H \ UNDEF \ /* Pour permettre l'interpretation de '<sys/types.h>' ci-apres dans '<regex.h>' sans */ \ /* engendrer d'erreurs dues au fait que certaines variables du pre-processeur n'ont pas */ \ /* ete definies (par exemple '_MIPS_SIM', '_ABIN32',... sur 'SYSTEME_SGPCM801_IRIX_CC'). */ # if (nSYSTEM_RELEASE >= 605034800) # define _SGIAPI \ UNDEF # define _MIPS_SIM \ UNDEF # define _ABIN32 \ UNDEF # define _ABIAPI \ UNDEF /* Pour permettre l'interpretation de '<regex.h>' dans le '#Einclude' qui va suivre, sans */ /* engendrer d'erreurs dues au fait que ces symboles n'existent pas... */ # Aif (nSYSTEM_RELEASE >= 605034800) # Eif (nSYSTEM_RELEASE >= 605034800) #Aif ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (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)) \ ) #Eif ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (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)) \ ) #define regex_t \ regex_t_pour_regex #define regmatch_t \ regmatch_t_pour_regex #define regoff_t \ regoff_t_pour_regex #define regcomp \ regcomp_pour_regex #define regerror \ regerror_pour_regex #define regexec \ regexec_pour_regex #define regfree \ regfree_pour_regex #define active_reg_t \ active_reg_t_pour_regex #define re_compile_pattern \ re_compile_pattern_pour_regex #define re_compile_fastmap \ re_compile_fastmap_pour_regex #define re_match \ re_match_pour_regex #define re_match_2 \ re_match_2_pour_regex #define re_pattern_buffer \ re_pattern_buffer_pour_regex #define re_registers \ re_registers_pour_regex #define re_search \ re_search_pour_regex #define re_search_2 \ re_search_2_pour_regex #define re_set_registers \ re_set_registers_pour_regex #define reg_errcode_t \ reg_errcode_t_pour_regex #define reg_syntax_t \ reg_syntax_t_pour_regex #define s_reg_t \ s_reg_t_pour_regex #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)) \ ) /* A la date du 20210902101807, on passe ici sur '$LACT1A' et '$LACT1B'... */ # if ( (defined(LACT1B)) \ || (defined(CMAP28)) \ ) /* Introduit le 20210903064354. Dans le cas ou d'autres MACHINEs ayant le meme */ /* comportement que l'$LACT1B', il faudra ajouter ici des lignes du type : */ /* */ /* || (defined(MACHINE)) \ */ /* */ /* Le 20220511093001, 'CMAP28' a ete introduit ici apres les mises a jour des serveurs */ /* de calcul de '$CMAP28' effectues au cours des semaines passees... */ /* */ /* Ce test a donc ete introduit le 20210903064354 a cause de '$LACT1B' et son fichier */ /* 'v /usr/include/regex.h' dans lequel on trouve : */ /* */ /* typedef enum */ /* { */ /* _REG_ENOSYS=-1, */ /* _REG_NOERROR=0, */ /* (...) */ /* } reg_errcode_t; */ /* */ /* #define REG_ENOSYS _REG_ENOSYS */ /* #define REG_NOERROR _REG_NOERROR */ /* (...) */ /* */ /* alors que, par exemple, sur '$LACT19' on trouve uniquement : */ /* */ /* typedef enum */ /* { */ /* REG_ENOSYS=-1, */ /* REG_NOERROR=0, */ /* (...) */ /* } reg_errcode_t; */ /* */ /* De plus, un autre tres tres gros probleme a ete decouvert un peu plus tard (apres le */ /* 20210903071115) : 'v /usr/include/regex.h elif', la directive '#elif' n'etant pas */ /* reconnu par 'v $xcpp/beau_cpp$c' a cette date. Que faire ? */ # define _REG_ENOSYS \ _REG_ENOSYS_pour_regex # define _REG_NOERROR \ _REG_NOERROR_pour_regex # define _REG_NOMATCH \ _REG_NOMATCH_pour_regex # define _REG_BADPAT \ _REG_BADPAT_pour_regex # define _REG_ECOLLATE \ _REG_ECOLLATE_pour_regex # define _REG_ECTYPE \ _REG_ECTYPE_pour_regex # define _REG_EESCAPE \ _REG_EESCAPE_pour_regex # define _REG_ESUBREG \ _REG_ESUBREG_pour_regex # define _REG_EBRACK \ _REG_EBRACK_pour_regex # define _REG_EPAREN \ _REG_EPAREN_pour_regex # define _REG_EBRACE \ _REG_EBRACE_pour_regex # define _REG_BADBR \ _REG_BADBR_pour_regex # define _REG_ERANGE \ _REG_ERANGE_pour_regex # define _REG_ESPACE \ _REG_ESPACE_pour_regex # define _REG_BADRPT \ _REG_BADRPT_pour_regex # define _REG_EEND \ _REG_EEND_pour_regex # define _REG_ESIZE \ _REG_ESIZE_pour_regex # define _REG_ERPAREN \ _REG_ERPAREN_pour_regex # Aif ( (defined(LACT1B)) \ || (defined(CMAP28)) \ ) # define REG_NOERROR \ REG_NOERROR_pour_regex # define REG_NOMATCH \ REG_NOMATCH_pour_regex # define REG_BADPAT \ REG_BADPAT_pour_regex # define REG_ECOLLATE \ REG_ECOLLATE_pour_regex # define REG_ECTYPE \ REG_ECTYPE_pour_regex # define REG_EESCAPE \ REG_EESCAPE_pour_regex # define REG_ESUBREG \ REG_ESUBREG_pour_regex # define REG_EBRACK \ REG_EBRACK_pour_regex # define REG_EPAREN \ REG_EPAREN_pour_regex # define REG_EBRACE \ REG_EBRACE_pour_regex # define REG_BADBR \ REG_BADBR_pour_regex # define REG_ERANGE \ REG_ERANGE_pour_regex # define REG_ESPACE \ REG_ESPACE_pour_regex # define REG_BADRPT \ REG_BADRPT_pour_regex # define REG_EEND \ REG_EEND_pour_regex # define REG_ESIZE \ REG_ESIZE_pour_regex # define REG_ERPAREN \ REG_ERPAREN_pour_regex # Eif ( (defined(LACT1B)) \ || (defined(CMAP28)) \ ) #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)) \ ) #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)) \ ) /* Afin d'eliminer des problemes de double definition dus eventuellement a la double */ /* presence de '<regex.h>' via 'Einclude' et 'include'. Ainsi, lorsque, par exemple, */ /* 'regex_t' sera rencontre dans la premiere inclusion de '<regex.h>', il lui sera */ /* substitue 'regex_t_pour_regex', et adieu la double definition lors de la seconde */ /* de '<regex.h>'... */ /* */ /* {active_reg_t,re_pattern_buffer,re_registers,reg_errcode_t,reg_syntax_t,s_reg_t} ont */ /* ete introduits le 19990816123512 pour l'introduction de 'SYSTEME_APC_LinuxRedHat_GCC'. */ /* Il en va de meme des 'REG_.' qui partout ailleurs sont des '#define' et qui sont ici */ /* definis dans un 'enum(...)'. */ #if (defined(xREFERENCE)) # 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)) \ ) # nodefine GENERER_UNE_VERSION_BOOTSTRAPPABLE \ /* Malheureusement, il a fallu proceder ainsi le 20041021085548 car, a cette date, la */ \ /* MACHINE '$mREFERENCE' est '$LACT16' ('SYSTEME_APC_LinuxRedHat_GCC') et son fichier */ \ /* 'v /usr/include/regexp$h' ne definit pas {braslist,braelist}... */ # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) # define GENERER_UNE_VERSION_BOOTSTRAPPABLE \ /* ATTENTION, ce programme devant pouvoir faire partie des programmes "bootstrappables" */ \ /* de '$xcp' doit pouvoir utiliser la version la plus repandue (qui est aussi la plus */ \ /* ancienne...), c'est-a-dire 'EXPRESSION_REGULIERE_VERSION_01', d'ou cette definition */ \ /* sur '$mREFERENCE'... */ \ /* */ \ /* ATTENTION, cette version "bootstrappable" contiendra les symboles (via '<regexp.h>') : */ \ /* */ \ /* {braslist,braelist} */ \ /* */ \ /* si l'on est sur une version anterieure a 601000000, et les symboles (via '<regexp.h>') : */ \ /* */ \ /* {_braslist,_braelist} */ \ /* */ \ /* sinon. Cela peut donc creer des problemes de bootstrapping sur une nouvelle machine. */ \ /* Cela s'est vu le 19970213143915 sur '$LACT29' qui est en version 604000000, alors que */ \ /* '$LACT12' ('$mREFERENCE') est en 503000000. Il conviendra, si besoin est, de corriger */ \ /* "a la main" le fichier '$xcp/substitue.01$c' en ce qui concerne ces deux symboles... */ # 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)) \ ) #Aif (defined(xREFERENCE)) # nodefine GENERER_UNE_VERSION_BOOTSTRAPPABLE \ /* Sur les autres MACHINEs, la contrainte de "bootstrappabilite" n'existe pas... */ #Eif (defined(xREFERENCE)) #define __USE_GNU \ /* Introduit le 20100525132425 pour la procedure 'v /usr/include/regex$h __REPB_PREFIX' mal */ \ /* definie, probleme rencontre a cette date sur '$CMAP28' (="abbesses.polytechnique.fr")... */ #if ( (defined(LACT1B)) \ ) # Einclude regex_h__ #Aif ( (defined(LACT1B)) \ ) # Einclude <regex.h> #Eif ( (defined(LACT1B)) \ ) /* Cet include est en fait la uniquement pour tester l'existence du fichier '<regex.h>' sur */ /* ce SYSTEME. Si il est present, alors le symbole '_REGEX_H' est defini, ce que l'on va */ /* tester ci-apres... */ /* */ /* ATTENTION, cet include etant fait immediatement en '$PASSE_1' provoque l'insertion de */ /* declarations de fonctions externes. Cela a donc exige la mise en place d'un traitement */ /* special ('v $xcc/cpp$Z regex$h') afin de les faire disparaitre... */ #undef __USE_GNU /* A cause du '@include <regex.h>' qui est en '$PASSE_5' (et non pas en '$PASSE_1')... */ #if ( (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ ) # undef _SYS_STDSYMS_INCLUDED #Aif ( (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ ) #Eif ( (defined(SYSTEME_HP710_HPUX_CC)) \ || (defined(SYSTEME_HP720_HPUX_CC)) \ || (defined(SYSTEME_HP750_HPUX_CC)) \ || (defined(SYSTEME_HP755_HPUX_CC)) \ || (defined(SYSTEME_HP819_HPUX_CC)) \ ) #if ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (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)) \ ) # undef _SYS_TYPES_H #Aif ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (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)) \ ) #Eif ( (defined(SYSTEME_SG4D20G_IRIX_CC)) \ || (defined(SYSTEME_SG4D25TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D310VGX_IRIX_CC)) \ || (defined(SYSTEME_SG4D35TG_IRIX_CC)) \ || (defined(SYSTEME_SG4D85GT_IRIX_CC)) \ || (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)) \ ) #undef regex_t #undef regmatch_t #undef regoff_t #undef regcomp #undef regerror #undef regexec #undef regfree #undef active_reg_t #undef re_compile_pattern #undef re_compile_fastmap #undef re_match #undef re_match_2 #undef re_pattern_buffer #undef re_registers #undef re_search #undef re_search_2 #undef re_set_registers #undef reg_errcode_t #undef reg_syntax_t #undef s_reg_t #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)) \ ) # if ( (defined(LACT1B)) \ ) /* Introduit le 20210903064354. Dans le cas ou d'autres MACHINEs ayant le meme */ /* comportement que l'$LACT1B', il faudra ajouter ici des lignes du type : */ /* */ /* || (defined(MACHINE)) \ */ /* */ # Aif ( (defined(LACT1B)) \ ) # undef REG_NOERROR # undef REG_NOMATCH # undef REG_BADPAT # undef REG_ECOLLATE # undef REG_ECTYPE # undef REG_EESCAPE # undef REG_ESUBREG # undef REG_EBRACK # undef REG_EPAREN # undef REG_EBRACE # undef REG_BADBR # undef REG_ERANGE # undef REG_ESPACE # undef REG_BADRPT # undef REG_EEND # undef REG_ESIZE # undef REG_ERPAREN # Eif ( (defined(LACT1B)) \ ) #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)) \ ) #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)) \ ) /* Afin d'eliminer des problemes de double definition dus eventuellement a la double */ /* presence de '<regex.h>' via 'Einclude' et 'include'. Ainsi, lorsque, par exemple, */ /* 'regex_t' sera rencontre dans la premiere inclusion de '<regex.h>', il lui sera */ /* substitue 'regex_t_pour_regex', et adieu la double definition lors de la seconde */ /* de '<regex.h>'... */ #if ( (defined(_REGEX_H)) \ && (! defined(GENERER_UNE_VERSION_BOOTSTRAPPABLE)) \ && ( ( (! defined(SYSTEME_HP705_HPUX_CC)) \ && (! defined(SYSTEME_HP710_HPUX_CC)) \ && (! defined(SYSTEME_HP720_HPUX_CC)) \ && (! defined(SYSTEME_HP750_HPUX_CC)) \ && (! defined(SYSTEME_HP755_HPUX_CC)) \ && (! defined(SYSTEME_HP819_HPUX_CC)) \ ) \ && ( (! defined(LACT71)) \ && (! defined(LACT27)) \ && (! defined(LACT28)) \ && (! defined(LACT29)) \ ) \ ) \ ) # nodefine EXPRESSION_REGULIERE_VERSION_02 \ /* Version "moderne" avec '<regex.h>' de type 'POSIX' et donc limitee : en particulier la */ \ /* variable 're_syntax_options' n'est pas utilisee par la fonction 'regcomp(...)' et ce */ \ /* contrairement a la fonction 're_compile_pattern(...)' de type 'GNU'... */ # define EXPRESSION_REGULIERE_VERSION_03 \ /* Version "moderne" avec '<regex.h>' de type 'GNU' et donc beaucoup plus puissante. Elle */ \ /* a commence d'etre introduite le 20021205130954. En fait au lieu d'utiliser 'regcomp(...)' */ \ /* de type 'POSIX', elle utilise 're_compile_pattern(...)' de type 'GNU', mais ensuite */ \ /* continue d'utiliser, comme 'EXPRESSION_REGULIERE_VERSION_02' la fonction 'regexec(...)' */ \ /* de type 'POSIX'. Cette version a ete activee le 20021206163902... */ #Aif ( (defined(_REGEX_H)) \ && (! defined(GENERER_UNE_VERSION_BOOTSTRAPPABLE)) \ && ( ( (! defined(SYSTEME_HP705_HPUX_CC)) \ && (! defined(SYSTEME_HP710_HPUX_CC)) \ && (! defined(SYSTEME_HP720_HPUX_CC)) \ && (! defined(SYSTEME_HP750_HPUX_CC)) \ && (! defined(SYSTEME_HP755_HPUX_CC)) \ && (! defined(SYSTEME_HP819_HPUX_CC)) \ ) \ && ( (! defined(LACT71)) \ && (! defined(LACT27)) \ && (! defined(LACT28)) \ && (! defined(LACT29)) \ ) \ ) \ ) /* ATTENTION, j'ai essaye de mettre ci-apres : */ /* */ /* # define __STRING_H__ \ */ /* UNDEF */ /* */ /* pour permettre l'interpretation de '<string.h>' sur 'SYSTEME_SG...' ci-apres... */ /* */ /* # Einclude <regexp.h> */ /* */ /* cet include est en fait la uniquement pour tester l'existence du fichier '<regexp.h>' sur */ /* ce SYSTEME. Si il est present, alors le symbole '__REGEXP_H__' est defini, ce que l'on va */ /* tester ci-apres... */ /* */ /* # undef __STRING_H__ */ /* */ /* # ifdef __REGEXP_H__ */ /* # define EXPRESSION_REGULIERE_VERSION_01 \ */ /* */ /* version "ancienne" avec '<regexp.h>'. */ /* */ /* # Aifdef __REGEXP_H__ */ /* # message "gestion des expressions regulieres non disponible" */ /* # Eifdef __REGEXP_H__ */ /* */ /* mais malheureusement, cela implante le code utile une premiere fois et donc deux fois au */ /* total avec le deuxieme include qui suit en '$PASSE_5'... */ /* */ /* ATTENTION, on notera le cas particulier de 'SYSTEME_HP...' qui ne possede pas le mode */ /* 'REG_BASIC' mais uniquement 'REG_EXTENDED'... */ /* */ /* ATTENTION, on notera le cas particulier de 'SYSTEME_APC_LinuxRedHat...' qui ne possede */ /* pas le mode 'REG_BASIC' mais uniquement 'REG_EXTENDED' mais ce dernier etant equivalent */ /* au premier lorsque la variable 'POSIX' n'est pas definie... */ /* */ /* ATTENTION, on notera le cas particulier des MACHINEs 'LACT2?' qui ont visiblement des */ /* problemes de performances en 'EXPRESSION_REGULIERE_VERSION_02'. A titre d'exemple, sur */ /* '$LACT27' on observe les resultats suivants sur un fichier de 2081651 octets provenant */ /* de '$xbg/common$K' tel qu'il arrive a l'entree de la '$PASSE_1' de 'v $xcc/cpp$Z' : */ /* */ /* | "= define " | "# define " */ /* ----------------------------------------+-------------------+------------------- */ /* | | */ /* $SE | 01 seconde | 02 seconde */ /* | | */ /* ----------------------------------------+-------------------+------------------- */ /* | | */ /* $xcp/substitue.01$K | 03 secondes | 02 secondes */ /* ('EXPRESSION_REGULIERE_VERSION_01') | | */ /* | | */ /* ----------------------------------------+-------------------+------------------- */ /* | | */ /* $xcp/substitue.01$K | 27 secondes | 03 secondes */ /* ('EXPRESSION_REGULIERE_VERSION_02') | | */ /* | | */ /* */ /* et ce lors du remplacement de la chaine ". define " par n'importe quoi ("tutu" en */ /* l'occurence) le 19970103150000. Le 19970106085733, un test "grandeur nature" de */ /* compilation a ete fait sur '$LACT28' avec le module '$xbg/fonction$K' ; il a donne */ /* les resultats suivants : */ /* */ /* | */ /* $SE (mode 'sed') | 05:05 */ /* | */ /* ----------------------------------------+------------------- */ /* | */ /* $xcp/substitue.01$K (mode 'sub') | 06:18 */ /* ('EXPRESSION_REGULIERE_VERSION_01') | */ /* | */ /* ----------------------------------------+------------------- */ /* | */ /* $xcp/substitue.01$K (mode 'sub') | 22:01 */ /* ('EXPRESSION_REGULIERE_VERSION_02') | */ /* | */ /* */ /* d'ou la necessite evidente d'utiliser alors 'EXPRESSION_REGULIERE_VERSION_01'... */ # define EXPRESSION_REGULIERE_VERSION_01 \ /* Version "ancienne" avec '<regexp.h>'. */ #Eif ( (defined(_REGEX_H)) \ && (! defined(GENERER_UNE_VERSION_BOOTSTRAPPABLE)) \ && ( ( (! defined(SYSTEME_HP705_HPUX_CC)) \ && (! defined(SYSTEME_HP710_HPUX_CC)) \ && (! defined(SYSTEME_HP720_HPUX_CC)) \ && (! defined(SYSTEME_HP750_HPUX_CC)) \ && (! defined(SYSTEME_HP755_HPUX_CC)) \ && (! defined(SYSTEME_HP819_HPUX_CC)) \ ) \ && ( (! defined(LACT71)) \ && (! defined(LACT27)) \ && (! defined(LACT28)) \ && (! defined(LACT29)) \ ) \ ) \ ) /* Tout ceci est destine uniquement a savoir lequel de '<regex.h>' (version "moderne") ou de */ /* '<regexp.h>' (version "ancienne") on va utiliser... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A I D E A U P A R A M E T R A G E I N T R O D U I T L E 20021206174023 : */ /* */ /*************************************************************************************************************************************/ /* Le 20100320105316 tous les 'vrai_Positive_de_base's (dont finalement je ne vois pas */ /* vraiment l'utilite) ont ete remplace par des 'Positive's afin de ne plus creer de */ /* problemes de type dans les 'GET_ARGUMENT_Y(...)'s qui suivront et qui apparaissent */ /* dans le cas 'v $xil/defi_K1$vv$DEF 20100317125446'... */ #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) # define GET_ARGUMENT_I_D_AIDE_AU_PARAMETRAGE \ Bblock \ Eblock #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ ) DEFV(Local,DEFV(Positive,INIT(regcomp_REG_EXTENDED,REG_EXTENDED))); DEFV(Local,DEFV(Positive,INIT(regcomp_REG_ICASE,REG_ICASE))); DEFV(Local,DEFV(Positive,INIT(regcomp_REG_NEWLINE,REG_NEWLINE))); DEFV(Local,DEFV(Positive,INIT(regcomp_REG_NOSUB,REG_NOSUB))); DEFV(Local,DEFV(Positive,INIT(regexec_REG_NOTBOL,REG_NOTBOL))); DEFV(Local,DEFV(Positive,INIT(regexec_REG_NOTEOL,REG_NOTEOL))); # define GET_ARGUMENT_I_D_AIDE_AU_PARAMETRAGE \ Bblock \ GET_ARGUMENT_Y("regcomp_REG_EXTENDED=",regcomp_REG_EXTENDED); \ GET_ARGUMENT_Y("regcomp_REG_ICASE=",regcomp_REG_ICASE); \ GET_ARGUMENT_Y("regcomp_REG_NEWLINE=",regcomp_REG_NEWLINE); \ GET_ARGUMENT_Y("regcomp_REG_NOSUB=",regcomp_REG_NOSUB); \ \ GET_ARGUMENT_Y("regexec_REG_NOTBOL=",regexec_REG_NOTBOL); \ GET_ARGUMENT_Y("regexec_REG_NOTEOL=",regexec_REG_NOTEOL); \ Eblock #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_BACKSLASH_ESCAPE_IN_LISTS,RE_BACKSLASH_ESCAPE_IN_LISTS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_BK_PLUS_QM,RE_BK_PLUS_QM))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_CHAR_CLASSES,RE_CHAR_CLASSES))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_CONTEXT_INDEP_ANCHORS,RE_CONTEXT_INDEP_ANCHORS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_CONTEXT_INDEP_OPS,RE_CONTEXT_INDEP_OPS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_CONTEXT_INVALID_OPS,RE_CONTEXT_INVALID_OPS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_DOT_NEWLINE,RE_DOT_NEWLINE))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_DOT_NOT_NULL,RE_DOT_NOT_NULL))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_HAT_LISTS_NOT_NEWLINE,RE_HAT_LISTS_NOT_NEWLINE))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_INTERVALS,RE_INTERVALS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_LIMITED_OPS,RE_LIMITED_OPS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_NEWLINE_ALT,RE_NEWLINE_ALT))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_NO_BK_BRACES,RE_NO_BK_BRACES))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_NO_BK_PARENS,RE_NO_BK_PARENS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_NO_BK_REFS,RE_NO_BK_REFS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_NO_BK_VBAR,RE_NO_BK_VBAR))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_NO_EMPTY_RANGES,RE_NO_EMPTY_RANGES))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_UNMATCHED_RIGHT_PAREN_ORD,RE_UNMATCHED_RIGHT_PAREN_ORD))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_NO_POSIX_BACKTRACKING,RE_NO_POSIX_BACKTRACKING))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_NO_GNU_OPS,RE_NO_GNU_OPS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_DEBUG,RE_DEBUG))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_EMACS,RE_SYNTAX_EMACS))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_AWK,RE_SYNTAX_AWK))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_GNU_AWK,RE_SYNTAX_GNU_AWK))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_POSIX_AWK,RE_SYNTAX_POSIX_AWK))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_GREP,RE_SYNTAX_GREP))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_EGREP,RE_SYNTAX_EGREP))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_POSIX_EGREP,RE_SYNTAX_POSIX_EGREP))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_ED,RE_SYNTAX_ED))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_SED,RE_SYNTAX_SED))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern__RE_SYNTAX_POSIX_COMMON,_RE_SYNTAX_POSIX_COMMON))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_POSIX_BASIC,RE_SYNTAX_POSIX_BASIC))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_POSIX_MINIMAL_BASIC,RE_SYNTAX_POSIX_MINIMAL_BASIC))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_POSIX_EXTENDED,RE_SYNTAX_POSIX_EXTENDED))); DEFV(Local,DEFV(Positive,INIT(re_compile_pattern_RE_SYNTAX_POSIX_MINIMAL_EXTENDED,RE_SYNTAX_POSIX_MINIMAL_EXTENDED))); DEFV(Local,DEFV(Positive,INIT(regexec_REG_NOTBOL,REG_NOTBOL))); DEFV(Local,DEFV(Positive,INIT(regexec_REG_NOTEOL,REG_NOTEOL))); # define GET_ARGUMENT_I_D_AIDE_AU_PARAMETRAGE \ Bblock \ GET_ARGUMENT_Y("re_compile_pattern_RE_BACKSLASH_ESCAPE_IN_LISTS=" \ ,re_compile_pattern_RE_BACKSLASH_ESCAPE_IN_LISTS \ ); \ GET_ARGUMENT_Y("re_compile_pattern_RE_BK_PLUS_QM=",re_compile_pattern_RE_BK_PLUS_QM); \ GET_ARGUMENT_Y("re_compile_pattern_RE_CHAR_CLASSES=",re_compile_pattern_RE_CHAR_CLASSES); \ GET_ARGUMENT_Y("re_compile_pattern_RE_CONTEXT_INDEP_ANCHORS=",re_compile_pattern_RE_CONTEXT_INDEP_ANCHORS); \ GET_ARGUMENT_Y("re_compile_pattern_RE_CONTEXT_INDEP_OPS=",re_compile_pattern_RE_CONTEXT_INDEP_OPS); \ GET_ARGUMENT_Y("re_compile_pattern_RE_CONTEXT_INVALID_OPS=",re_compile_pattern_RE_CONTEXT_INVALID_OPS); \ GET_ARGUMENT_Y("re_compile_pattern_RE_DOT_NEWLINE=",re_compile_pattern_RE_DOT_NEWLINE); \ GET_ARGUMENT_Y("re_compile_pattern_RE_DOT_NOT_NULL=",re_compile_pattern_RE_DOT_NOT_NULL); \ GET_ARGUMENT_Y("re_compile_pattern_RE_HAT_LISTS_NOT_NEWLINE=",re_compile_pattern_RE_HAT_LISTS_NOT_NEWLINE); \ GET_ARGUMENT_Y("re_compile_pattern_RE_INTERVALS=",re_compile_pattern_RE_INTERVALS); \ GET_ARGUMENT_Y("re_compile_pattern_RE_LIMITED_OPS=",re_compile_pattern_RE_LIMITED_OPS); \ GET_ARGUMENT_Y("re_compile_pattern_RE_NEWLINE_ALT=",re_compile_pattern_RE_NEWLINE_ALT); \ GET_ARGUMENT_Y("re_compile_pattern_RE_NO_BK_BRACES=",re_compile_pattern_RE_NO_BK_BRACES); \ GET_ARGUMENT_Y("re_compile_pattern_RE_NO_BK_PARENS=",re_compile_pattern_RE_NO_BK_PARENS); \ GET_ARGUMENT_Y("re_compile_pattern_RE_NO_BK_REFS=",re_compile_pattern_RE_NO_BK_REFS); \ GET_ARGUMENT_Y("re_compile_pattern_RE_NO_BK_VBAR=",re_compile_pattern_RE_NO_BK_VBAR); \ GET_ARGUMENT_Y("re_compile_pattern_RE_NO_EMPTY_RANGES=",re_compile_pattern_RE_NO_EMPTY_RANGES); \ GET_ARGUMENT_Y("re_compile_pattern_RE_UNMATCHED_RIGHT_PAREN_ORD=" \ ,re_compile_pattern_RE_UNMATCHED_RIGHT_PAREN_ORD \ ); \ GET_ARGUMENT_Y("re_compile_pattern_RE_NO_POSIX_BACKTRACKING=",re_compile_pattern_RE_NO_POSIX_BACKTRACKING); \ GET_ARGUMENT_Y("re_compile_pattern_RE_NO_GNU_OPS=",re_compile_pattern_RE_NO_GNU_OPS); \ GET_ARGUMENT_Y("re_compile_pattern_RE_DEBUG=",re_compile_pattern_RE_DEBUG); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_EMACS=",re_compile_pattern_RE_SYNTAX_EMACS); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_AWK=",re_compile_pattern_RE_SYNTAX_AWK); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_GNU_AWK=",re_compile_pattern_RE_SYNTAX_GNU_AWK); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_POSIX_AWK=",re_compile_pattern_RE_SYNTAX_POSIX_AWK); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_GREP=",re_compile_pattern_RE_SYNTAX_GREP); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_EGREP=",re_compile_pattern_RE_SYNTAX_EGREP); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_POSIX_EGREP=",re_compile_pattern_RE_SYNTAX_POSIX_EGREP); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_ED=",re_compile_pattern_RE_SYNTAX_ED); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_SED=",re_compile_pattern_RE_SYNTAX_SED); \ GET_ARGUMENT_Y("re_compile_pattern__RE_SYNTAX_POSIX_COMMON=",re_compile_pattern__RE_SYNTAX_POSIX_COMMON); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_POSIX_BASIC=",re_compile_pattern_RE_SYNTAX_POSIX_BASIC); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_POSIX_MINIMAL_BASIC=" \ ,re_compile_pattern_RE_SYNTAX_POSIX_MINIMAL_BASIC \ ); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_POSIX_EXTENDED=",re_compile_pattern_RE_SYNTAX_POSIX_EXTENDED); \ GET_ARGUMENT_Y("re_compile_pattern_RE_SYNTAX_POSIX_MINIMAL_EXTENDED=" \ ,re_compile_pattern_RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ ); \ \ GET_ARGUMENT_Y("regexec_REG_NOTBOL=",regexec_REG_NOTBOL); \ GET_ARGUMENT_Y("regexec_REG_NOTEOL=",regexec_REG_NOTEOL); \ Eblock #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O M P T E U R : */ /* */ /*************************************************************************************************************************************/ DEFV(Int,INIT(valeur_courante_du_compteur,VALEUR_INITIALE_DU_COMPTEUR)); DEFV(Int,INIT(increment_du_compteur,INCREMENT_DU_COMPTEUR)); DEFV(Int,INIT(nombre_de_chiffres_du_compteur,NOMBRE_DE_CHIFFRES_DU_COMPTEUR)); /* Le compteur a ete introduit le 20160813080723... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define MARQUEUR_DE_DEBUT_DE_LIGNE \ K_CIRCONFLEXE \ /* Pour reperer le debut de ligne dans une expression reguliere (le 20021206090948). */ #define MARQUEUR_DE_FIN_DE_LIGNE \ K_DOLLAR \ /* Pour reperer la fin de ligne dans une expression reguliere (le 20021207105825). */ #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) INIT_ERROR; /* ATTENTION, la variable 'CODE_ERREUR' etant necessaire a 'ER ## ROR(code)' via la */ /* procedure 'CODE_ERROR(...)', le code de 'INIT_ERROR' doit etre defini avant ses */ /* references... */ DEFV(Local,DEFV(Char,INIT(POINTERc(expression_reguliere),ADRESSE_NON_ENCORE_DEFINIE))); /* Chaine recherchee dans le fichier Argument. ATTENTION, cette definition doit etre */ /* imperativement avant l'include de '<regexp.h>' parce qu'elle lui est utile via la */ /* definition du pointeur 'sp'. Cette chaine est, dans le jargon de '$SE', ce que l'on */ /* appelle une "expression reguliere"... */ /* */ /* ATTENTION, on ne peut ecrire : */ /* */ /* DEFV(Local,DEFV(CHAR,INIC(POINTERc(expression_reguliere),C_VIDE))); */ /* */ /* car 'INIC(...)' utilise 'Finitialisation_d_une_constante_chaine_de_caracteres(...)' ce */ /* qui est interdit dans l'initialisation d'une variable 'Local'... */ DEFV(Local,DEFV(Char,INIT(POINTERc(expression_reguliere_compilee),ADRESSE_NON_ENCORE_DEFINIE))); /* Chaine recherchee dans le fichier Argument apres sa "compilation"... */ @ define IN ## IT \ DEFV(Char,INIT(POINTERc(sp),expression_reguliere)); @ define GE ## TC() \ PARE(POINTEUR(SOUS(INCR(sp,I),I))) @ define PE ## EKC() \ PARE(POINTEUR(sp)) @ define UNG ## ETC(caractere) \ DECR(sp,I) @ define RET ## URN(pointeur) \ RETU(pointeur); @ define ER ## ROR(code) \ CODE_ERROR(code); /* ATTENTION, toutes les definitions ci-dessus sont transformees via l'operateur de */ /* concatenation ' ## ' afin qu'elles n'entrent pas en collision avec les miennes... */ @ define circf \ circf_pour_regexp /* En effet, cette variable est deja definie (eventuellement, suivant les SYSTEMEs...) dans */ /* '/usr/include/gl/gl$h', d'ou cette astuce... */ /* A la date du 20210902101807, on NE passe PAS ici sur '$LACT1A' et '$LACT1B'... */ @ include <regexp.h> /* ATTENTION cet include subit un traitement special ('v $xcc/cpp$Z regexp$h'). D'autre part */ /* differentes versions sont archivees dans '$DarchivesG/$ADMINISTRATEUR/?/usr/include/?/' */ /* au cas ou cette possibilite disparaitrait dans un avenir plus ou moins lointain (c'est */ /* ainsi annonce sur '$CMAP24' dans le manuel de 'regexp'...). */ /* */ /* ATTENTION : ci-dessus, les "*" ont ete remplacees par des '?' afin que le '/usr/include' */ /* ne ressemble pas a des commentaires... */ # if ( ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ ) # define DEBUT_EXPRESSION(numero_de_l_expression) \ ptCARA(ITb1(_braslist,TRMU(numero_de_l_expression))) # define SUITE_EXPRESSION(numero_de_l_expression) \ ptCARA(ITb1(_braelist,TRMU(numero_de_l_expression))) /* Pour acceder a une sous-expressions avec un numero dans [0,9]... */ # Aif ( ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ ) # define DEBUT_EXPRESSION(numero_de_l_expression) \ ptCARA(ITb1(braslist,TRMU(numero_de_l_expression))) # define SUITE_EXPRESSION(numero_de_l_expression) \ ptCARA(ITb1(braelist,TRMU(numero_de_l_expression))) /* Pour acceder a une sous-expressions avec un numero dans [0,9]... */ # Eif ( ((defined(SYSTEME_SG4D20G_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D25TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D310VGX_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D35TG_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SG4D85GT_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND308_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND324_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND3GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND408_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND424_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND4GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND508_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND524_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND5GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND808_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND824_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGIND8GA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGINDA08_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGINDA24_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGINDAGA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nSYSTEM_RELEASE >= 601000000)) \ ) # define DEBUT_DE_L_OCCURENCE_COURANTE \ ptCARA(loc1) # define SUITE_DE_L_OCCURENCE_COURANTE \ ptCARA(loc2) /* Pour disposer de symboles plus significatifs et convertis du type 'Char' en 'CHAR'. */ # define NOMBRE_DE_SOUS_EXPRESSIONS \ nbra \ /* Nombre de sous-expressions de type "\X" ou 'X' est un entier dans [0,9]. */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) @ define __USE_GNU /* Introduit le 20100525132425 pour la procedure 'v /usr/include/regex$h __REPB_PREFIX' mal */ /* definie, probleme rencontre a cette date sur '$CMAP28' (="abbesses.polytechnique.fr")... */ /* A la date du 20210902101807, on passe ici sur '$LACT1A' et '$LACT1B'... */ # if ( (defined(LACT1B)) \ ) @ include regex_h__ # Aif ( (defined(LACT1B)) \ ) @ include <regex.h> # Eif ( (defined(LACT1B)) \ ) /* ATTENTION, cet include subit un traitement special ('v $xcc/cpp$Z regex$h'). */ # 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)) \ ) # ifndef REG_BASIC # if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ ) @ define REG_BASIC \ REG_NEWLINE # Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ ) # Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ ) # if ( (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) @ define REG_BASIC \ RE_SYNTAX_SED # Aif ( (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) # Eif ( (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) /* ATTENTION, on notera le cas particulier de 'SYSTEME_APC_LinuxRedHat...' qui ne possede */ /* pas le mode 'REG_BASIC' mais uniquement des modes obtenus par combinaison de modes */ /* elementaires definis a partir de 'v /usr/include/regex.h REG_EXTENDED'. Certaines */ /* combinaisons sont predefinies telle 'v /usr/include/regex.h RE_SYNTAX_SED'... */ /* */ /* La variable 'RE_SYNTAX_SED' est definie comme un "ou logique" des indicateurs : */ /* */ /* RE_BK_PLUS_QM */ /* RE_CHAR_CLASSES */ /* RE_DOT_NEWLINE */ /* RE_DOT_NOT_NULL */ /* RE_INTERVALS */ /* RE_NO_EMPTY_RANGES */ /* */ /* le 19991207084551, en "release" 202050000. Malheureusement, ce mode ne gere pas les */ /* occurences "\n" dans les chaines Argument. Il a donc fallu introduire le 19991209094947 */ /* 'v $xig/fonct$vv$FON MOVE_CARACTERE_____substituer_K_LF_au_couple_K_ANTI_SLASH__K_n'. */ /* Au passage, je n'ai pas trouve de solution plus simple et ne faisant intervenir que */ /* '<regex.h>'... */ /* */ /* Le 20021108211604, j'ai efface l'indicateur 'REG_ICASE' qui, chose bizarre, contrairement */ /* a ce que l'on peut deduire de 'v /usr/include/regex$h REG_ICASE', semble faire partie de */ /* la definition de 'RE_SYNTAX_SED' (ou peut-etre est-il positionne par defaut dans la */ /* librairie correspondante...) car, en effet, avant cette date, les recherches de */ /* caracteres ignoraient les differences entre majuscules et minuscules ; cela a pu etre */ /* confirme et teste grace au programme 'v $xtc/regul_exp.31$c REG_ICASE'. Le 20021109232022 */ /* je suis passe de 'OUEX(...)' a 'MASQUE_RESET_BIT(...)' car, en effet, 'OUEX(...)' inverse */ /* le bit 'REG_ICASE' et si par malheur, dans une version future il etait a 0 (et non plus a */ /* 1 comme c'est le cas a cette date) le 'OUEX(...)' le positionnerait a 1... */ /* */ /* Le 20021202171344, j'ai essaye de remettre 'RE_DOT_NEWLINE' afin que le caractere "." */ /* puisse etre identifie a un "\n" dans une expression et ce via la definition : */ /* */ /* MASQUE___SET_BIT(MASQUE_RESET_BIT(RE_SYNTAX_SED,REG_ICASE),RE_DOT_NEWLINE) */ /* */ /* mais cela ne marche pas ; le "." ne represente jamais un "\n"... */ /* */ /* En fait, le 20021204141037, il semblerait que le probleme de 'REG_ICASE' resolu par : */ /* */ /* MASQUE_RESET_BIT(RE_SYNTAX_SED,REG_ICASE) */ /* */ /* et celui de 'RE_DOT_NEWLINE' soient resolus simultanement en utilisant 'ZERO' comme */ /* definition de 'REG_BASIC'. Le 20021204145824, je suis passe de 'ZERO' a la valeur */ /* 'REG_NEWLINE' afin que l'on puisse ecrire "^..." pour indiquer un debut de ligne. */ /* On notera au passage que le programme 'v $xtc/regul_exp.51$c' permet de connaitre la */ /* valeur en hexa-decimale de tous les parametres possibles... */ # Aifndef REG_BASIC # Eifndef REG_BASIC # 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)) \ ) # 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)) \ ) TypedefP(ExpressionReguliere,regex_t) TypedefP(ListeOccurence,regmatch_t) # define NOMBRE_D_OCCURENCES_RECHERCHEES \ SUCC(NEUF) \ /* Nombre d'occurences recherchees pour 'chaine_recherchee_dans_fichierA' ; 'NEUF' etant */ \ /* destine aux sous-expressions et 'SUCC(...)' aux eventuelles sous-expressions... */ # define OCCURENCE_COURANTE \ PRED(NUMERO_DE_L_EVENTUELLE_PREMIERE_SOUS_EXPRESSION) \ /* Numero de l'occurence courante. */ # define DEBUT_EXPRESSION(numero_de_l_expression) \ ADD2(sous_fichierA,ASD1(ITb1(liste_des_occurences,numero_de_l_expression),rm_so)) # define SUITE_EXPRESSION(numero_de_l_expression) \ ADD2(sous_fichierA,ASD1(ITb1(liste_des_occurences,numero_de_l_expression),rm_eo)) /* Pour acceder a une expression ou 'numero_de_l_expression' vaut 'OCCURENCE_COURANTE' pour */ /* l'occurence entiere, et un numero dans [0,9] pour les sous-expressions... */ # define DEBUT_DE_L_OCCURENCE_COURANTE \ DEBUT_EXPRESSION(OCCURENCE_COURANTE) # define SUITE_DE_L_OCCURENCE_COURANTE \ SUITE_EXPRESSION(OCCURENCE_COURANTE) /* Pour acceder a l'occurence courante... */ # define NOMBRE_DE_SOUS_EXPRESSIONS \ ASD1(expression_reguliere_compilee,re_nsub) \ /* Nombre de sous-expressions de type "\X" ou 'X' est un entier dans [0,9]. */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #define NUMERO_DE_L_EVENTUELLE_PREMIERE_SOUS_EXPRESSION \ UN \ /* Numero de la premiere sous-expression... */ #define SOUS_EXPRESSION_COURANTE \ est_ce_alpha_numerique_____valeur_numerique \ /* Numero de la sous-expression courante referencee par un "\X" ou 'X' est dans [1,9]. */ #define LONGUEUR_MAXIMALE_DE_L_EXPRESSION_REGULIERE \ DEUX_CENT_CINQUANTE_SIX \ /* Longueur maximale de la chaine 'expression_reguliere' avant sa "compilation"... */ \ /* ATTENTION, cette limite semble venir (uniquement ?) de 'SYSTEME_SG...' lorsque l'on */ \ /* est en 'EXPRESSION_REGULIERE_VERSION_02' ; mais pour des raisons de portabilite des */ \ /* differents utilitaires utilisant '$xcp/substitue.01$X', il est imperatif d'imposer cette */ \ /* limite a tout le monde... */ #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) # define GET_ARGUMENT_I_CONFIGURATION_DYNAMIQUE_DU_COMPORTEMENT \ Bblock \ Eblock #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) DEFV(Local,DEFV(Positive,INIT(configuration_de_compilation_des_expressions_anterieure,UNDEF))); DEFV(Local,DEFV(Positive,INIT(configuration_de_compilation_des_expressions,REG_BASIC))); DEFV(Local,DEFV(Positive,INIT(configuration_d_appariement_des_expressions,ZERO))); /* Afin de changer dynamiquement le comportement de '$xcp/substitue.01$K' (introduit le */ /* 20021204134841 et complete le 20021204155046). La version anterieure de la syntaxe */ /* 'configuration_de_compilation_des_expressions_anterieure' a ete introduite le */ /* 20021209122756 lors de l'introduction de la fonction 're_set_syntax(...)'... */ # define GET_ARGUMENT_I_CONFIGURATION_DYNAMIQUE_DU_COMPORTEMENT \ Bblock \ GET_ARGUMENT_X("compile=""compilation=",configuration_de_compilation_des_expressions); \ GET_ARGUMENT_X("matching=""appariement=",configuration_d_appariement_des_expressions); \ Eblock \ /* Parametrage dynamique de 'regcomp(...)' et de 'regexec(...)'. */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #define GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(numero) \ DEFV(CHAR,INIC(POINTERc(chaine`numero`recherchee_dans_fichierA),C_VIDE)); \ DEFV(CHAR,INIC(POINTERc(chaine`numero`a_substituer_dans_fichierR),C_VIDE)); \ /* Allocation de la memoire utiles aux differentes chaines... */ #define GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(nom,numero) \ Bblock \ \ DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ /* Introduit le 20070130102637 car, en effet, il manquait... */ \ \ GET_ARGUMENT_C("chercher"nom"=""cherchee"nom"=""c"nom"=",chaine`numero`recherchee_dans_fichierA); \ GET_ARGUMENT_C("substituer"nom"=""substituee"nom"=""s"nom"=",chaine`numero`a_substituer_dans_fichierR); \ \ FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \ /* Introduit le 20070130102637 car, en effet, il manquait... */ \ \ Eblock \ /* Entree d'une chaine a chercher et de celle a lui substituer... */ \ /* */ \ /* On notera le 20040630124810 que les chaines a rechercher et a substituer sont donc */ \ /* entrees via 'FconversionC(...)' qui fait ses lectures via le format 'FORMAT_CHAI' */ \ /* ('v $xig/fonct$vv$FON GENERE__FonctionC_FconversionC') or ce format contient "\t" */ \ /* et "\n" qui sont donc remplaces des cette lecture par leur valeurs "\011" et "\012" */ \ /* respectivement. Il est donc quasiment impossible de rentrer en tant que chaine a */ \ /* rechercher ou a substituer 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... */ #define CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(numero) \ CAse_SEQUENTIEL \ Bblock \ MISE_EN_PLACE_DES_CHAINES(chaine`numero`recherchee_dans_fichierA,chaine`numero`a_substituer_dans_fichierR); \ /* Mise en place des differentes chaines... */ \ Eblock \ ECAs_SEQUENTIEL \ /* Prise en compte d'une chaine a chercher et de celle a lui substituer... */ #define MISE_EN_PLACE_DES_CHAINES(chaine_NM_recherchee_dans_fichierA,chaine_NM_a_substituer_dans_fichierR) \ Bblock \ DEFV(Int,INIT(EnTete_de_sauvegardM ## MOVE_CARACTERE_____mettre_un_K_ANTI_SLASH_devant_chaque_K_POINT \ ,MOVE_CARACTERE_____mettre_un_K_ANTI_SLASH_devant_chaque_K_POINT \ ) \ ); \ \ Test(IFGT(chain_taille(chaine_NM_recherchee_dans_fichierA),LONGUEUR_MAXIMALE_DE_L_EXPRESSION_REGULIERE)) \ Bblock \ PRINT_ERREUR("une expression reguliere est trop longue"); \ CAL1(Prer1("expression reguliere = '%s'\n",chaine_NM_recherchee_dans_fichierA)); \ CAL1(Prer1("longueur............ = %d\n",chain_taille(chaine_NM_recherchee_dans_fichierA))); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(MOVE_CARACTERE_____mettre_un_K_ANTI_SLASH_devant_chaque_K_POINT,backslasher_les_points); \ EGAL(chaine_recherchee_dans_fichierA,chain_Acopie(chaine_NM_recherchee_dans_fichierA)); \ EGAL(MOVE_CARACTERE_____mettre_un_K_ANTI_SLASH_devant_chaque_K_POINT \ ,EnTete_de_sauvegardM ## MOVE_CARACTERE_____mettre_un_K_ANTI_SLASH_devant_chaque_K_POINT \ ); \ /* Copie de la chaine Argument avec substitution eventuelle des "." par des "\.". */ \ EGAL(chaine_a_substituer_dans_fichierR,chain_Acopie(chaine_NM_a_substituer_dans_fichierR)); \ /* Copie de la chaine Resultat. */ \ \ EGAL(index_de_fin_de_la_chaine_a_substituer_dans_fichierR \ ,LSTX(PREMIER_CARACTERE,chain_Xtaille(chaine_a_substituer_dans_fichierR)) \ ); \ Eblock \ /* Procedure de mise en place de la chaine recherchee dans le fichier Argument et de la */ \ /* chaine a lui substituer. */ #define veritable_fichierA \ COND(EST_VRAI(fichierA_vers_fichierR),fichierA,fichierR) #define veritable_fichierR \ COND(EST_VRAI(fichierA_vers_fichierR),fichierR,fichierA) /* Pour acceder aux fichiers courants 'fichierA' et 'fichierR'. */ #define STORE_FICHIER(caractere_courant,index_du_caractere_courant,veritable_fichier,longueur_maximale_du_fichier) \ Bblock \ Test(IFLE(index_du_caractere_courant,LSTX(PREMIER_CARACTERE,longueur_maximale_du_fichier))) \ Bblock \ /* Cas ou il y a encore de la place dans le fichier... */ \ Eblock \ ATes \ Bblock \ /* Cas ou il n'y a plus de place dans le fichier... */ \ DEFV(Int,INIT(index_d_extension,UNDEF)); \ DEFV(Int,INIT(longueur_maximale_du_veritable_fichier_etendu,DOUB(longueur_maximale_du_fichier))); \ DEFV(CHAR,INIT(POINTERc(veritable_fichier_etendu),CHAINE_UNDEF)); \ EGAL(veritable_fichier_etendu,kMalo(longueur_maximale_du_veritable_fichier_etendu)); \ /* Extension du fichier par doublement de sa longueur... */ \ DoIn(index_d_extension,PREMIER_CARACTERE,LSTX(PREMIER_CARACTERE,longueur_maximale_du_fichier),I) \ Bblock \ EGAL(ITb0(veritable_fichier_etendu,INDX(index_d_extension,PREMIER_CARACTERE)) \ ,ITb0(veritable_fichier,INDX(index_d_extension,PREMIER_CARACTERE)) \ ); \ /* Extension du fichier par duplication des caracteres deja possedes. */ \ Eblock \ EDoI \ \ CALZ(FreFF(veritable_fichier)); \ /* Puis liberation de l'espace possede anterieurement par le fichier. */ \ /* */ \ /* ATTENTION, on ne peut ecrire ici : */ \ /* */ \ /* CALZ_FreFF(veritable_fichier); */ \ /* */ \ /* car, en effet, 'veritable_fichier' n'est pas un "simple pointeur". Il s'agit en fait */ \ /* de 'veritable_fichierA' ou de 'veritable_fichierR' qui sont eux-memes des 'COND(...)'s... */ \ /* Mais il ne faut surtout pas faire ensuite : */ \ /* */ \ /* Test(EST_VRAI(fichierA_vers_fichierR)) \ */ \ /* Bblock \ */ \ /* EGAL(fichierA,ADRESSE_PLUS_DEFINIE); \ */ \ /* Eblock \ */ \ /* ATes \ */ \ /* Bblock \ */ \ /* EGAL(fichierR,ADRESSE_PLUS_DEFINIE); \ */ \ /* Eblock \ */ \ /* ETes \ */ \ /* */ \ /* car, en effet, 'fichierA' et 'fichierR' sont encore utiles et il ne seront "liberes" */ \ /* que tout a la fin par : */ \ /* */ \ /* CALZ_FreFF(fichierR); */ \ /* CALZ_FreFF(fichierA); */ \ /* */ \ \ Test(IFEQ(IDENTITE(veritable_fichier),IDENTITE(fichierA))) \ Bblock \ EGAL(IDENTITE(fichierA),IDENTITE(veritable_fichier_etendu)); \ Eblock \ ATes \ Bblock \ Test(IFEQ(IDENTITE(veritable_fichier),IDENTITE(fichierR))) \ Bblock \ EGAL(IDENTITE(fichierR),IDENTITE(veritable_fichier_etendu)); \ /* Et enfin substitution du fichier etendu au fichier courant. On notera que l'on ne */ \ /* peut malheureusement pas ecrire : */ \ /* */ \ /* EGAL(IDENTITE(veritable_fichier),IDENTITE(veritable_fichier_etendu)); */ \ /* */ \ /* d'ou ces tests... */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("un fichier 'inconnu' est en cours d'extension -1-"); \ Eblock \ ETes \ Eblock \ ETes \ \ Test(IFEQ(IDENTITE(longueur_maximale_du_fichier),IDENTITE(longueur_maximale_du_fichier_Argument))) \ /* Cette serie de deux tests sur 'longueur_maximale_du_fichier' ont ete introduits le */ \ /* 20051125104737 car ils manquaient... */ \ /* */ \ /* Le 20051128091042 je crois avoir compris pourquoi cette grave anomalie n'avait jamais */ \ /* provoque d'incidents. En effet, a cette date, je testais 'v $xcc/cpp$Z 20051124091557'. */ \ /* Pour ce faire, j'avais un petit fichier de test 'F1' a transformer qui faisait 288 */ \ /* octets. Le fichier '$U' de transformation etait un sous-ensemble du fichier */ \ /* 'v $xccp/PASSE_4.NomF$sub' (uniquement les transformations {c25,c26}). Le resultat de */ \ /* cette transformation faisait 331 octets. Les deux facteurs {fA,fR} valaient (valeurs */ \ /* par defaut) respectivement 1.1 et 1.5, d'ou des tailles etendues pour les fichiers */ \ /* 'A' et 'R' : */ \ /* */ \ /* fichierA : 288x1.1 = 316 ------ */ \ /* fichierR : 288x1.5 = 432 | */ \ /* | */ \ /* Ainsi : | */ \ /* | */ \ /* 331 > 316 <------------------- */ \ /* */ \ /* et donc il y avait debordement immediat. Cela ne s'etait donc jamais vu anterieurement */ \ /* car certainement jaimais aucun fichier n'avait eu un taux d'expansion (331/288 = 1.149) */ \ /* aussi eleve... */ \ Bblock \ EGAL(longueur_maximale_du_fichier_Argument,longueur_maximale_du_veritable_fichier_etendu); \ /* La longueur est enfin double au cas ou il faudrait de nouveau etendre.... */ \ Eblock \ ATes \ Bblock \ Test(IFEQ(IDENTITE(longueur_maximale_du_fichier),IDENTITE(longueur_maximale_du_fichier_Resultat))) \ Bblock \ EGAL(longueur_maximale_du_fichier_Resultat,longueur_maximale_du_veritable_fichier_etendu); \ /* La longueur est enfin double au cas ou il faudrait de nouveau etendre.... */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("un fichier 'inconnu' est en cours d'extension -2-"); \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ ETes \ \ EGAL(ITb0(veritable_fichier,INDX(index_du_caractere_courant,PREMIER_CARACTERE)),caractere_courant); \ /* Rangement du caractere courant du fichier. */ \ INCR(index_du_caractere_courant,I); \ /* Progression de l'index de rangement dans le fichier. */ \ Eblock #define GENERE_FICHIER_RESULTAT(caractere) \ Bblock \ STORE_FICHIER(caractere \ ,index_du_caractere_courant_de_fichierR \ ,veritable_fichierR \ ,longueur_maximale_du_fichier_Resultat \ ); \ Eblock \ /* Procedure de mise a jour du fichier Resultat. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E S ' K_LF ' S D E D E B U T E T D E F I N D E F I C H I E R */ /* I N T R O D U I T L E 20021213121628 : */ /* */ /*************************************************************************************************************************************/ #define AJOUTER_UN_K_LF_AU_DEBUT_DU_FICHIER_A_PRIORI \ FAUX #define AJOUTER_UN_K_LF_AU_DEBUT_DU_FICHIER_S_IL_MANQUE \ FAUX #define AJOUTER_UN_K_LF_A_LA_FIN_DU_FICHIER_A_PRIORI \ FAUX #define AJOUTER_UN_K_LF_A_LA_FIN_DU_FICHIER_S_IL_MANQUE \ FAUX DEFV(Local,DEFV(Logical,INIT(ajouter_un_K_LF_au_debut_du_fichier_a_priori,AJOUTER_UN_K_LF_AU_DEBUT_DU_FICHIER_A_PRIORI))); DEFV(Local,DEFV(Logical,INIT(ajouter_un_K_LF_au_debut_du_fichier_s_il_manque,AJOUTER_UN_K_LF_AU_DEBUT_DU_FICHIER_S_IL_MANQUE))); DEFV(Local,DEFV(Logical,INIT(ajouter_un_K_LF_a_la_fin_du_fichier_a_priori,AJOUTER_UN_K_LF_A_LA_FIN_DU_FICHIER_A_PRIORI))); DEFV(Local,DEFV(Logical,INIT(ajouter_un_K_LF_a_la_fin_du_fichier_s_il_manque,AJOUTER_UN_K_LF_A_LA_FIN_DU_FICHIER_S_IL_MANQUE))); /* Gestion des 'K_LF's au debut et a la fin du fichier... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T R A C E D E S S U B S T I T U T I O N S I N T R O D U I T L E 20021215084025 : */ /* */ /*************************************************************************************************************************************/ #define TRACER_LES_SUBSTITUTIONS \ FAUX DEFV(Local,DEFV(Logical,INIT(tracer_les_substitutions,TRACER_LES_SUBSTITUTIONS))); /* Afin de tracer les substitutions... */ #define EDITER_LES_OCCURENCES \ FAUX DEFV(Local,DEFV(Logical,INIT(editer_les_occurences,EDITER_LES_OCCURENCES))); /* Afin d'editer les occurences (introduit le 20040113142212) et permettre ainsi un */ /* fonctionnement de type '$EGRE' en conjonction avec l'utilisation du parametre */ /* 'IL_NE_FAUT_PAS(sortir_le_fichier_substitue)'. Pour ce faire, on utilisera la */ /* suite de parametres : */ /* */ /* sortir=FAUX */ /* tracer=VRAI */ /* EGRE=VRAI */ /* */ /* ou l'un de leurs synonymes... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N T R O L E D E L A S O R T I E I N T R O D U I T L E 20040113142212 : */ /* */ /*************************************************************************************************************************************/ #define SORTIR_LE_FICHIER_SUBSTITUE \ VRAI DEFV(Local,DEFV(Logical,INIT(sortir_le_fichier_substitue,SORTIR_LE_FICHIER_SUBSTITUE))); /* Doit-on sortir le fichier substitue ('VRAI') ou pas ('FAUX') ? Cela a ete introduit le */ /* 20040113142212 dans le but de permettre un usage du type '$EGRE'... */ #define SORTIE_D_UN_CARACTERE(caractere) \ Bblock \ Test(IL_FAUT(sortir_le_fichier_substitue)) \ Bblock \ CALS(Putchar(caractere)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Sortie eventuelle d'un caractere. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S U B S T I T U T I O N D E C A R A C T E R E S D A N S U N F I C H I E R : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) /* ATTENTION, la variable 'CODE_ERREUR' etant necessaire a 'ER ## ROR(code)' via la */ /* procedure 'CODE_ERROR(...)', le code de 'INIT_ERROR' doit etre defini avant ses */ /* references... */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) INIT_ERROR; #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) DEFV(Positive,INIT(nombre_d_iterations_des_substitutions,NOMBRE_D_ITERATIONS_DES_SUBSTITUTIONS)); /* Nombre d'iterations des substitutions (introduit le 20101227105651). */ DEFV(Logical,INIT(le_premier_caractere_du_fichier_a_ete_traite,FAUX)); /* Afin d'aider a la gestion des 'K_LF's au debut du fichier... */ DEFV(Logical,INIT(backslasher_les_points,BACKSLASHER_LES_POINTS)); /* A priori, les "." ne devront pas etre remplaces par des "\." (fonctionnement de type */ /* '$SE') ; ceci a ete introduit le 20001227104156. Ce dispositif permet, en particulier, */ /* de manipuler des noms de fichiers, qui contiennent bien souvent des ".", sans ambiguite. */ DEFV(Logical,INIT(conserver_les_K_LF_contenus_dans_les_sous_chaines_definies ,CONSERVER_LES_K_LF_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES ) ); /* Ce dispositif a ete introduit le 20040514150215 afin de permettre d'eliminer les 'K_LF' */ /* qui sont contenus dans les sous-chaines defines par '\(...\)' et qui sont ensuite */ /* dupliquees par des ecritures du type '\1'. Cela permet, par exemple, de regrouper les */ /* arguments d'une fonction en utilisant cet indicateur a 'FAUX' et les arguments : */ /* */ /* conserver_les_K_LF=FAUX */ /* c01="\(Fonction([^)][^)]*)\)" s01="\1" */ /* */ /* Pour regrouper les arguments d'une fonction avec leurs definitions, on utilisera : */ /* */ /* conserver_les_K_LF=FAUX */ /* c01="\(Fonction([^{][^{]*\)\({\)" s01="\1\n\2" */ /* */ /* Evidemment, cela concerne des fichiers de type '$c'... */ DEFV(Logical,INIT(conserver_les_K_BLANC_contenus_dans_les_sous_chaines_definies ,CONSERVER_LES_K_BLANC_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES ) ); /* Ce dispositif a ete introduit le 20040526142735 afin de permettre d'eliminer les */ /* 'K_BLANC' dans les memes conditions que les 'K_LF' ci-dessus, mais cette fois en ce */ /* qui concerne des fichiers de type '$K' en utilisant cet indicateur a 'FAUX' (ainsi */ /* que celui relatif a 'K_LF') et les arguments : */ /* */ /* conserver_les_K_BLANC=FAUX */ /* conserver_les_K_LF=FAUX */ /* c01="^\(DEFV(Common,DEFV(Fonction[^;]*\)\n" s01="\1\n" */ /* */ /* Le 20040526161746, la commande 'v $xcg/LArgTypFo$vv$Z' a ete introduite pour automatiser */ /* ce type de modification... */ DEFV(Logical,INIT(permuter_les_minuscules_et_les_majuscules,FAUX)); /* Ce dispositif a ete introduit le 20090108094506 afin de permettre de permuter les */ /* minuscules et les majuscules dans les sous chaines "\(...\)". */ DEFV(Logical,INIT(remplacer_un_caractere_contenu_dans_les_sous_chaines_definies ,REMPLACER_UN_CARACTERE_CONTENU_DANS_LES_SOUS_CHAINES_DEFINIES ) ); DEFV(Logical,INIT(le_caractere_a_remplacer_dans_les_sous_chaines_definies_est_quelconque ,LE_CARACTERE_A_REMPLACER_DANS_LES_SOUS_CHAINES_DEFINIES_EST_QUELCONQUE ) ); DEFV(Char,INIT(caractere_a_remplacer_dans_les_sous_chaines_definies ,CARACTERE_A_REMPLACER_DANS_LES_SOUS_CHAINES_DEFINIES ) ); DEFV(Char,INIT(caractere_de_remplacement_dans_les_sous_chaines_definies ,CARACTERE_DE_REMPLACEMENT_DANS_LES_SOUS_CHAINES_DEFINIES ) ); /* Ce dispositif a ete introduit le 20090108094506 afin de permettre de permuter les */ /* minuscules et les majuscules dans les sous chaines "\(...\)". */ /* Ce dispositif a ete introduit le 20040601111701 afin de faciliter le passage de */ /* l'ecriture : */ /* */ /* type Fonction(arg1,arg2,...) */ /* type1 arg1; */ /* type2 arg2; */ /* (...) */ /* { */ /* */ /* a l'ecriture : */ /* */ /* type Fonction(type1 arg1,type2 arg2,...) */ /* { */ /* */ /* en utilisant specifiquement pour la fonction 'Fonction(...)' : */ /* */ /* conserver_les_K_BLANC=VRAI */ /* conserver_les_K_LF=FAUX */ /* remplacer_un_caractere=VRAI caractereA=";" caractereR="," */ /* c01="\([ \n]\)\(Fonction(\)[^)]*)\([^{][^{]*\)\({\)" s01="\1\2\3)\n\4" */ /* c02=", *\()\)" s02="\1" */ /* */ /* ou plus generalement (pour toutes les fonctions) ou 'DebutDeDefinitionDeFonction' est */ /* represente par 'Debut' (pour reduire la longueur des lignes ci-apres...) : */ /* */ /* conserver_les_K_BLANC=VRAI */ /* conserver_les_K_LF=FAUX */ /* remplacer_un_caractere=VRAI caractereA=";" caractereR="," */ /* c01="\n\(Debut [^(]*[^*](\)[^)]*)\([^{][^{]*\)\({\)" s01="\n\1\2)\n\3" */ /* c02="\n\(Debut [^(]*\*([^(]*(\)[^)]*))\([^{][^{]*\)\({\)" s02="\n\1\2))\n\3" */ /* c11=", *\()\)" s11="\1" */ /* */ /* Evidemment, cela concerne des fichiers de type '$c'... */ /* */ /* */ /* Le 20230414134056, fut donc introduite la bascule {\Q,\q} rendant quelconque le */ /* caractere a remplacer... */ DEFV(Int,INIT(longueur_maximale_du_fichier_Argument,LONGUEUR_MAXIMALE_DU_FICHIER_ARGUMENT)); /* Longueur maximale du fichier Argument. */ DEFV(CHAR,INIT(POINTERc(fichierA),CHAINE_UNDEF)); /* Afin de creer dynamiquement le fichier Argument. */ DEFV(CHAR,INIT(POINTERc(sous_fichierA),CHAINE_UNDEF)); /* Afin de manipuler un sous-ensemble du fichier Argument. */ /* */ /* ATTENTION, a cause de l'appel : */ /* */ /* step(Cara(sous_fichierA),...) */ /* */ /* il est difficile de se passer de 'sous_fichierA' en tant que 'POINTERc(...)' qui varie */ /* au cours du temps. Il aurait ete preferable que sa valeur ne change pas, et que ne soit */ /* utilise qu'un index 'index_du_caractere_courant_de_sous_fichierA'... */ DEFV(Int,INIT(index_du_caractere_courant_de_fichierA,PREMIER_CARACTERE)); /* Index du caractere courant du fichier Argument. */ DEFV(Int,INIT(index_du_dernier_caractere_de_fichierA,UNDEF)); /* Index du dernier caractere du fichier Argument. */ DEFV(Float,INIT(facteur_d_expansion_du_fichier_Argument,FACTEUR_D_EXPANSION_DU_FICHIER_ARGUMENT)); /* Facteur de passage de la taille du fichier Argument a la taille du fichier Argument */ /* reellement utilisee. */ DEFV(Float,INIT(facteur_d_expansion_du_fichier_Resultat,FACTEUR_D_EXPANSION_DU_FICHIER_RESULTAT)); /* Facteur de passage de la taille du fichier Argument a la taille du fichier Resultat. */ DEFV(Int,INIT(longueur_maximale_du_fichier_Resultat,UNDEF)); /* Longueur maximale du fichier Resultat. */ DEFV(CHAR,INIT(POINTERc(fichierR),CHAINE_UNDEF)); /* Afin de creer dynamiquement le fichier Resultat. */ DEFV(Int,INIT(index_du_caractere_courant_de_fichierR,UNDEF)); /* Index du caractere courant du fichier Resultat. */ DEFV(Int,INIT(index_du_dernier_caractere_de_fichierR,UNDEF)); /* Index du dernier caractere du fichier Resultat. */ DEFV(Logical,INIT(transferer_le_fichierA_tel_quel,LUNDEF)); /* Pour transferer le fichier Argument lorsque il n'y a pas de substitution a faire ou */ /* bien lorsqu'il y une faute dans la syntaxe de la substitution... */ DEFV(Char,INIT(caractere_courant,K_UNDEF)); /* Caractere courant. */ DEFV(Logical,INIT(proceder_aux_substitutions,VRAI)); /* Pour indiquer qu'il faut faire les substitutions... */ DEFV(Logical,INIT(fichierA_vers_fichierR,VRAI)); /* Pour permettre la definition de 'veritable_fichierA' et 'veritable_fichierR'. */ DEFV(Logical,INIT(iterer_la_substitution,LUNDEF)); /* Pour controler l'iteration de substitution... */ DEFV(Int,INIT(numero_de_la_substitution,ZERO)); /* Numero de la substitution courante. */ GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(00); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(01); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(02); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(03); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(04); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(05); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(06); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(07); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(08); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(09); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(10); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(11); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(12); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(13); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(14); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(15); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(16); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(17); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(18); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(19); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(20); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(21); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(22); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(23); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(24); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(25); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(26); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(27); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(28); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(29); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(30); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(31); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(32); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(33); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(34); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(35); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(36); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(37); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(38); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(39); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(40); GENERATION_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(41); /* Generation des chaines recherchees dans le fichier Argument et des chaines a substituer. */ /* La chaine '41' a ete introduite le 20030303135638 pour 'v $xcc/cpp$Z c41='. */ DEFV(CHAR,INIC(POINTERc(chaine_recherchee_dans_fichierA),C_VIDE)); DEFV(CHAR,INIC(POINTERc(chaine_a_substituer_dans_fichierR),C_VIDE)); DEFV(Int,INIT(index_de_fin_de_la_chaine_a_substituer_dans_fichierR,UNDEF)); /* Chaine courante recherchee dans le fichier Argument et la chaine a lui substituer. */ #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) DEFV(Char,INIT(POINTERc(expression_reguliere),ADRESSE_NON_ENCORE_DEFINIE)); /* Chaine recherchee dans le fichier Argument. */ DEFV(ExpressionReguliere,expression_reguliere_compilee); /* Chaine recherchee dans le fichier Argument apres sa "compilation"... */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) DEFV(Int,INIT(longueur_maximale_de_l_expression_reguliere_compilee,LONGUEUR_MAXIMALE_DE_L_EXPRESSION_REGULIERE_COMPILEE)); /* Longueur maximale de la chaine 'expression_reguliere' apres sa "compilation". On notera */ /* que ceci n'a en fait de sens qu'avec 'EXPRESSION_REGULIERE_VERSION_01'... */ /*..............................................................................................................................*/ #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)) \ ) EGAL(MOVE_CARACTERE_____substituer_K_LF_au_couple_K_ANTI_SLASH__K_n,VRAI); /* Ceci a ete introduit le 19991209094947 afin de permettre la gestion correcte des */ /* codes "\n" dans les chaines Argument... */ #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)) \ ) #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)) \ ) EGAL(MOVE_CARACTERE_____substituer_K_TABULATION_au_couple_K_ANTI_SLASH__K_t,VRAI); /* Ceci a ete introduit le 20010109111515 afin de permettre la gestion systematique des */ /* codes "\t" dans les chaines Argument... */ #define GET_ARGUMENT_L_CONSERVER_LES_K_LF_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES \ "conserver_les_K_NL=""conserver_les_K_LF=""conserver_K_NL=""conserver_K_LF=""cons_K_NL=""cons_K_LF=" #define GET_ARGUMENT_N_CONSERVER_LES_K_LF_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES \ "supprimer_les_K_NL=""supprimer_les_K_LF=""supprimer_K_NL=""supprimer_K_LF=""sup_K_NL=""sup_K_LF=" /* Afin de raccourcir les lignes qui suivent (introduit le 20070223103454). */ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_I("nombre_iterations_substitutions=""iterations=""iter=",nombre_d_iterations_des_substitutions); /* Argument introduit le 20101227105651 pour 'v $xcc/cpp$Z nombre_iterations_substitutions'. */ GET_ARGUMENT_I("longueurA=""lA=""LA=",longueur_maximale_du_fichier_Argument); GET_ARGUMENT_F("facteurA=""fA=",facteur_d_expansion_du_fichier_Argument); GET_ARGUMENT_F("facteurR=""fR=""expansion=",facteur_d_expansion_du_fichier_Resultat); GET_ARGUMENT_I("longueurC=""lC=""LC=",longueur_maximale_de_l_expression_reguliere_compilee); GET_ARGUMENT_L("tracer=""trace=",tracer_les_substitutions); GET_ARGUMENT_L("occurences=""egrep=""EGRE=",editer_les_occurences); GET_ARGUMENT_N("substituer=""sub=""SUB=",editer_les_occurences); /* Les 'GET_ARGUMENT_N(...)' ont ete introduits le 20070111085108... */ GET_ARGUMENT_L("NLdf=""LFdf=""K_LF_debut_a_priori=",ajouter_un_K_LF_au_debut_du_fichier_a_priori); GET_ARGUMENT_L("NLd=""LFd=""K_LF_debut=",ajouter_un_K_LF_au_debut_du_fichier_s_il_manque); GET_ARGUMENT_L("NLff=""LFff=""K_LF_fin_a_priori=",ajouter_un_K_LF_a_la_fin_du_fichier_a_priori); GET_ARGUMENT_L("NLf=""LFf=""K_LF_fin=",ajouter_un_K_LF_a_la_fin_du_fichier_s_il_manque); GET_ARGUMENT_L("points=""backslasher_les_points=""backslash=",backslasher_les_points); GET_ARGUMENT_L(GET_ARGUMENT_L_CONSERVER_LES_K_LF_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES ,conserver_les_K_LF_contenus_dans_les_sous_chaines_definies ); GET_ARGUMENT_N(GET_ARGUMENT_N_CONSERVER_LES_K_LF_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES ,conserver_les_K_LF_contenus_dans_les_sous_chaines_definies ); GET_ARGUMENT_L("conserver_les_K_BLANC=""conserver_K_BLANC=""cons_K_BLANC=" ,conserver_les_K_BLANC_contenus_dans_les_sous_chaines_definies ); GET_ARGUMENT_N("supprimer_les_K_BLANC=""supprimer_K_BLANC=""sup_K_BLANC=" ,conserver_les_K_BLANC_contenus_dans_les_sous_chaines_definies ); /* Les 'GET_ARGUMENT_N(...)' ont ete introduits le 20070220122239... */ GET_ARGUMENT_L("remplacer_un_caractere=""remplacer=" ,remplacer_un_caractere_contenu_dans_les_sous_chaines_definies ); GET_ARGUMENT_L("caractere_quelconque=""cq=" ,le_caractere_a_remplacer_dans_les_sous_chaines_definies_est_quelconque ); /* Argument introduit le 20230414134056... */ GET_ARGUMENT_K("caractereA=""cA=""KA=",caractere_a_remplacer_dans_les_sous_chaines_definies); GET_ARGUMENT_K("caractereR=""cR=""KR=",caractere_de_remplacement_dans_les_sous_chaines_definies); GET_ARGUMENT_L("sortir=""out=",sortir_le_fichier_substitue); GET_ARGUMENT_I_D_AIDE_AU_PARAMETRAGE; GET_ARGUMENT_I_CONFIGURATION_DYNAMIQUE_DU_COMPORTEMENT; GET_ARGUMENT_I("compteur_initial=""ci=",valeur_courante_du_compteur); GET_ARGUMENT_I("increment_compteur=""ic=",increment_du_compteur); GET_ARGUMENT_I("nombre_chiffres_compteur=""ncc=",nombre_de_chiffres_du_compteur); /* Arguments introduits le 20160813080723... */ GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("00",00); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("01",01); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("02",02); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("03",03); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("04",04); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("05",05); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("06",06); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("07",07); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("08",08); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("09",09); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("10",10); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("11",11); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("12",12); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("13",13); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("14",14); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("15",15); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("16",16); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("17",17); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("18",18); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("19",19); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("20",20); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("21",21); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("22",22); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("23",23); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("24",24); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("25",25); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("26",26); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("27",27); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("28",28); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("29",29); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("30",30); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("31",31); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("32",32); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("33",33); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("34",34); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("35",35); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("36",36); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("37",37); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("38",38); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("39",39); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("40",40); GET_ARGUMENT_C_ENTREE_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER("41",41); ) ); #undef GET_ARGUMENT_L_CONSERVER_LES_K_LF_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES #undef GET_ARGUMENT_N_CONSERVER_LES_K_LF_CONTENUS_DANS_LES_SOUS_CHAINES_DEFINIES EGAL(longueur_maximale_du_fichier_Argument ,INTE(MUL2(facteur_d_expansion_du_fichier_Argument,FLOT(longueur_maximale_du_fichier_Argument))) ); /* Determination de la veritable longueur maximale du fichier Argument a utiliser */ /* initialement (en effet, elle peut ensuite augmenter par re-allocation...). */ EGAL(fichierA,kMalo(longueur_maximale_du_fichier_Argument)); /* Allocation de la memoire necessaire au fichier Argument. */ EGAL(longueur_maximale_du_fichier_Resultat ,INTE(MUL2(facteur_d_expansion_du_fichier_Resultat,FLOT(longueur_maximale_du_fichier_Argument))) ); EGAL(fichierR,kMalo(longueur_maximale_du_fichier_Resultat)); /* Allocation de la memoire necessaire au fichier Resultat en approximant grossierement ce */ /* dont il a besoin... */ Tant(GetcharT(caractere_courant)) Bblock /* Le caractere courant de l'entree courante est recupere ; et on boucle */ /* sur cette recuperation tant que l'on n'est pas au bout du fichier. */ Test(EST_FAUX(le_premier_caractere_du_fichier_a_ete_traite)) Bblock Test(IFOU(IL_FAUT(ajouter_un_K_LF_au_debut_du_fichier_a_priori) ,IFET(IL_FAUT(ajouter_un_K_LF_au_debut_du_fichier_s_il_manque) ,IFNE(caractere_courant,K_LF) ) ) ) Bblock STORE_FICHIER(K_LF ,index_du_caractere_courant_de_fichierA ,veritable_fichierA ,longueur_maximale_du_fichier_Argument ); /* Mise d'un 'K_LF' au debut du fichier Argument... */ Eblock ATes Bblock Eblock ETes EGAL(le_premier_caractere_du_fichier_a_ete_traite,VRAI); Eblock ATes Bblock Eblock ETes STORE_FICHIER(caractere_courant ,index_du_caractere_courant_de_fichierA ,veritable_fichierA ,longueur_maximale_du_fichier_Argument ); /* Rangement dans le fichier Argument avec extension eventuelle... */ Eblock ETan STORE_FICHIER(K_NULL ,index_du_caractere_courant_de_fichierA ,veritable_fichierA ,longueur_maximale_du_fichier_Argument ); /* Et enfin, "fermeture" du fichier Argument... */ EGAL(index_du_dernier_caractere_de_fichierA,PRED(index_du_caractere_courant_de_fichierA)); /* Afin de revenir sur le dernier caractere du fichier Argument. */ EGAL(index_du_dernier_caractere_de_fichierR,index_du_dernier_caractere_de_fichierA); /* Et ce au cas ou aucune substitution ne serait faite... */ Repe(nombre_d_iterations_des_substitutions) /* Possibilite introduite le 20101227105651... */ Bblock EGAL(proceder_aux_substitutions,VRAI); EGAL(numero_de_la_substitution,ZERO); /* Quelques [re-]initialisations necessaires depuis le 20101227105651... */ Tant(IL_FAUT(proceder_aux_substitutions)) Bblock INCR(numero_de_la_substitution,I); /* Numero de la substitution courante. */ gCHoi(numero_de_la_substitution,UN,I) /* Utilisation successive des differentes chaines declarees, de la premiere a la derniere, */ /* suivant le 'Tant(...)' et grace aux 'CAse_SEQUENTIEL' qui suivent.. */ Bblock CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(00) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(01) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(02) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(03) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(04) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(05) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(06) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(07) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(08) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(09) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(10) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(11) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(12) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(13) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(14) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(15) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(16) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(17) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(18) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(19) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(20) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(21) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(22) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(23) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(24) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(25) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(26) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(27) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(28) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(29) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(30) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(31) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(32) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(33) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(34) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(35) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(36) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(37) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(38) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(39) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(40) CAse_SEQUENTIEL_D_UNE_CHAINE_A_CHERCHER_ET_A_SUBSTITUER(41) DEfo Bblock EGAL(proceder_aux_substitutions,FAUX); /* Pour arreter le processus de substitution... */ Eblock EDEf Eblock EgCHo Test(IL_FAUT(proceder_aux_substitutions)) Bblock EGAL(transferer_le_fichierA_tel_quel,FAUX); /* A priori, il va y avoir substitution... */ EGAL(index_du_caractere_courant_de_fichierR,PREMIER_CARACTERE); /* Index du caractere courant du fichier Resultat. */ #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) Test(TOUJOURS_VRAI) /* Le 20021213121628, je n'arrive pas a faire fonctionner les expressions regulieres du */ /* dtype '^...'. Je les interdit donc provisoirement (?). */ Bblock Test(IFNE_chaine(chaine_recherchee_dans_fichierA,C_VIDE)) Bblock Test(IFEQ(ITb0(chaine_recherchee_dans_fichierA ,PREMIER_CARACTERE ) ,MARQUEUR_DE_DEBUT_DE_LIGNE ) ) Bblock /* Cas de l'expression reguliere '^...' : */ PRINT_ERREUR("une expression reguliere commence par '^' (marqueur inoperant), elle est ignoree"); CAL1(Prer1("expression reguliere = '%s'\n\n",chaine_recherchee_dans_fichierA)); EGAL(chaine_recherchee_dans_fichierA,C_VIDE); /* A la date du 20021213121628, je n'arrive pas a faire fonctionner les expressions */ /* regulieres du type '^...' ; je les interdit donc provisoirement... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(TOUJOURS_FAUX) /* Le 20021210162748, je crois avoir trouve la raison du probleme dans le fichier */ /* d'include 'v /usr/include/regexp$h _____dollar_____' dans lequel ce n'etait pas 'K_LF' */ /* qui etait teste, mais 'K_NULL'. J'ai apporte les modifications utiles sur les MACHINEs */ /* {$LACT12,$LACT27,$LACT29}. */ Bblock Test(IFNE_chaine(chaine_recherchee_dans_fichierA,C_VIDE)) Bblock DEFV(Logical,INIT(la_chaine_recherchee_dans_fichierA_n_a_pas_de_probleme,VRAI)); /* A priori, il n'y a pas de probleme avec l'expression reguliere courante... */ DEFV(Positive,INIT(taille_de_la_chaine_recherchee_dans_fichierA ,chain_Xtaille(Cara(chaine_recherchee_dans_fichierA)) ) ); /* Taille de l'expression reguliere courante... */ Test(IFEQ(ITb0(chaine_recherchee_dans_fichierA ,LSTX(PREMIER_CARACTERE,NEUT(taille_de_la_chaine_recherchee_dans_fichierA)) ) ,MARQUEUR_DE_FIN_DE_LIGNE ) ) Bblock /* Cas de l'expression reguliere '.*$' : */ Test(IFGT(taille_de_la_chaine_recherchee_dans_fichierA,UN)) Bblock Test(IFEQ(ITb0(chaine_recherchee_dans_fichierA ,LSTX(PREMIER_CARACTERE,PRED(taille_de_la_chaine_recherchee_dans_fichierA)) ) ,K_ANTI_SLASH ) ) /* Cas de l'expression reguliere '...\$' : */ Bblock Eblock ATes Bblock EGAL(la_chaine_recherchee_dans_fichierA_n_a_pas_de_probleme,FAUX); /* Cas de l'expression reguliere '...[^\]$'. */ Eblock ETes Eblock ATes Bblock EGAL(la_chaine_recherchee_dans_fichierA_n_a_pas_de_probleme,FAUX); /* Cas de l'expression reguliere '$'. */ Eblock ETes Eblock ATes Bblock Eblock ETes Test(EST_FAUX(la_chaine_recherchee_dans_fichierA_n_a_pas_de_probleme)) Bblock PRINT_ERREUR("une expression reguliere se termine par '$' (marqueur inoperant), elle est ignoree"); CAL1(Prer1("expression reguliere = '%s'\n\n",chaine_recherchee_dans_fichierA)); EGAL(chaine_recherchee_dans_fichierA,C_VIDE); /* A la date du 20021210122742, je n'arrive pas a faire fonctionner les expressions */ /* regulieres du type '...$' ; je les interdit donc provisoirement... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) Test(IFNE_chaine(chaine_recherchee_dans_fichierA,C_VIDE)) Bblock EGAL(expression_reguliere,Cara(chain_Acopie(chaine_recherchee_dans_fichierA))); /* Mise en place de l'expression reguliere... */ #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) EGAL(expression_reguliere_compilee ,Cara(Malo(longueur_maximale_de_l_expression_reguliere_compilee)) ); /* Et preparation de sa compilation... */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) Test(IFLE(SOUS(compile(expression_reguliere ,ADRESSE(ITb0(expression_reguliere_compilee ,INDX(PREMIER_CARACTERE,PREMIER_CARACTERE) ) ) ,ADRESSE(ITb0(expression_reguliere_compilee ,SUCC(LSTX(PREMIER_CARACTERE ,longueur_maximale_de_l_expression_reguliere_compilee ) ) ) ) ,END_OF_CHAIN ) ,expression_reguliere_compilee ) ,longueur_maximale_de_l_expression_reguliere_compilee ) ) #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ ) Test(PAS_D_ERREUR(regcomp(ADRESSE(expression_reguliere_compilee) ,ptCAST(cChar,expression_reguliere) ,configuration_de_compilation_des_expressions ) ) ) /* Une difference entre 'REG_BASIC' et 'REG_EXTENDED' c'est que dans le premier cas les */ /* parentheses delimitant les sous-expressions doivent etre "backslashees" : */ /* */ /* ...\(...\)... */ /* */ /* alors que dans le second cas, elles ne le sont pas : */ /* */ /* ...(...)... */ /* */ /* Afin que 'EXPRESSION_REGULIERE_VERSION_01' et 'EXPRESSION_REGULIERE_VERSION_02' soient */ /* compatibles, il faut donc choisir 'REG_BASIC'. */ /* */ /* Les seules configurations possibles ('configuration_de_compilation_des_expressions') */ /* en 'EXPRESSION_REGULIERE_VERSION_02' sont : */ /* */ /* REG_EXTENDED */ /* REG_ICASE */ /* REG_NEWLINE */ /* REG_NOSUB */ /* */ /* On notera au passage que le programme 'v $xtc/regul_exp.51$c' permet de connaitre la */ /* valeur en hexa-decimale de tous les parametres possibles... */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) EGAL(ASD1(expression_reguliere_compilee,buffer),ZERO); EGAL(ASD1(expression_reguliere_compilee,allocated),ZERO); /* Le 20051124133118, la valeur du champ 'buffer' est passe de 'ADRESSE_NON_ENCORE_DEFINIE' */ /* a 'ZERO' car, en effet, une valeur 'ZERO' pour les champs 'buffer' et 'allocated' */ /* provoque une allocation de memoire par 're_compile_pattern(...)' ci-apres. Or utiliser */ /* 'ADRESSE_NON_ENCORE_DEFINIE' fait l'hypothese implicite que ce symbole equivaut a 'ZERO' */ /* ce qui fait perdre de la generalite... */ EGAL(ASD1(expression_reguliere_compilee,fastmap),ADRESSE_NON_DEFINIE); EGAL(ASD1(expression_reguliere_compilee,translate),ADRESSE_NON_DEFINIE); EGAL(configuration_de_compilation_des_expressions_anterieure ,re_set_syntax(configuration_de_compilation_des_expressions) ); /* Avant le 20021209122756, il y avait ici : */ /* */ /* EGAL(re_syntax_options,configuration_de_compilation_des_expressions); */ /* */ /* mais l'usage de 're_syntax_options(...)' est peut-etre plus prudent par rapport a des */ /* evolutions futures de 'regex.h'... */ Test(PAS_D_ERREUR(re_compile_pattern(ptCAST(cChar,expression_reguliere) ,chain_Xtaille(Cara(expression_reguliere)) ,ADRESSE(expression_reguliere_compilee) ) ) ) /* On notera au passage que le programme 'v $xtc/regul_exp.51$c' permet de connaitre la */ /* valeur en hexa-decimale de tous les parametres possibles... */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) Bblock Test(PAS_D_ERREUR(CODE_ERREUR)) Bblock /* Cas ou 'compile(...)' a reussi a faire son travail... */ DEFV(Int,INIT(index_de_debut_de_substitution,PREMIER_CARACTERE)); DEFV(Int,INIT(index_de_fin_de_substitution,index_du_dernier_caractere_de_fichierA)); /* Index de debut et de fin de substitution. Ce dispositif a ete introduit le 20020206111439 */ /* afin de permettre (un jour...) de ne faire les substitutions, non pas sur la totalite du */ /* fichier Argument, mais uniquement sur un sous-ensemble de celui-ci... */ DEFV(CHAR,INIT(POINTERc(DEBUT_DE_L_OCCURENCE_COURANTE_precedente),ADRESSE_NON_ENCORE_DEFINIE)); DEFV(CHAR,INIT(POINTERc(SUITE_DE_L_OCCURENCE_COURANTE_precedente),ADRESSE_NON_ENCORE_DEFINIE)); /* Introduit le 20021214222435 afin de faire des verifications sur un eventuel bouclage... */ Test(IFGT(index_de_debut_de_substitution,PREMIER_CARACTERE)) /* A la date du 20020206111439, ce test est evidemment toujours FAUX... */ Bblock DoIn(index_du_caractere_courant_de_fichierA ,PREMIER_CARACTERE ,PRED(index_de_debut_de_substitution) ,I ) Bblock GENERE_FICHIER_RESULTAT(ITb0(veritable_fichierA ,INDX(index_du_caractere_courant_de_fichierA ,PREMIER_CARACTERE ) ) ); /* Transfert intact du debut du fichier Argument... */ Eblock EDoI Eblock ATes Bblock Eblock ETes EGAL(IDENTITE(sous_fichierA),IDENTITE(veritable_fichierA)); EGAL(index_du_caractere_courant_de_fichierA,index_de_debut_de_substitution); EGAL(iterer_la_substitution,VRAI); /* Initialisation du processus... */ Tant(I3ET(IL_FAUT(iterer_la_substitution) ,IFLE(index_du_caractere_courant_de_fichierA,index_de_fin_de_substitution) ,IFLT(index_du_caractere_courant_de_fichierA,index_du_dernier_caractere_de_fichierA) ) ) /* On peut dire (en simplifiant ?) que l'on fait autant d'iterations 'Tant(...)' que la */ /* chaine 'expression_reguliere' est rencontree ; pour chacune des occurences, il y aura */ /* un appel de type 'regexec(...)' ci-apres. */ /* */ /* Le test validant 'index_du_caractere_courant_de_fichierA' par rapport a */ /* 'index_du_dernier_caractere_de_fichierA' a ete introduit le 20021211171039 afin */ /* de prendre en compte le cas ou l'expression reguliere est un simple '^' et d'eviter */ /* ainsi qu'une ligne supplementaire soit ajoutee a la fin du fichier. On notera qu'il */ /* s'agit bien d'un 'IFLT(...)' et non d'un 'IFLE(...)', ce qui a ete decouvert de facon */ /* experimentale... */ Bblock #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) Test(IZNE(step(Cara(sous_fichierA),expression_reguliere_compilee))) /* On notera qu'une valeur nulle est renvoyee par 'step(...)' lorsqu'il n'y a plus de */ /* chaines satisfaisantes... */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) DEFV(ListeOccurence,DTb1(liste_des_occurences,NOMBRE_D_OCCURENCES_RECHERCHEES)); /* Pour recuperer en retour de 'regexec(...)' l'eventuelle occurence courante... */ Test(PAS_D_ERREUR(regexec(ptCAST(KONC(_const,ExpressionReguliere) ,ADRESSE(expression_reguliere_compilee) ) ,ptCAST(cChar,sous_fichierA) ,NOMBRE_D_OCCURENCES_RECHERCHEES ,liste_des_occurences ,configuration_d_appariement_des_expressions ) ) ) /* Les seules configurations possibles ('configuration_d_appariement_des_expressions') */ /* sont : */ /* */ /* REG_NOTBOL */ /* REG_NOTEOL */ /* */ /* On notera au passage que le programme 'v $xtc/regul_exp.51$c' permet de connaitre la */ /* valeur en hexa-decimale de tous les parametres possibles... */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) Bblock /* Cas ou l'on a trouve une occurence : celle-ci est definie par les deux variables */ /* 'DEBUT_DE_L_OCCURENCE_COURANTE' (debut) et 'SUITE_DE_L_OCCURENCE_COURANTE' (juste */ /* apres la fin). */ DEFV(Int,INIT(index_du_caractere_courant_de_substitution,PREMIER_CARACTERE)); /* Index du caractere courant de la chaine a substituer. */ DEFV(Logical,INIT(on_a_rencontre_un_K_ANTI_SLASH,FAUX)); /* Indicateur permettant de gerer les eventuels "\"... */ Test(IL_FAUT(tracer_les_substitutions)) Bblock Test(IL_NE_FAUT_PAS(editer_les_occurences)) Bblock CAL3(Prme2("CourantFichierA(%d)='%02x'" ,index_du_caractere_courant_de_fichierA ,ITb0(veritable_fichierA ,INDX(index_du_caractere_courant_de_fichierA ,PREMIER_CARACTERE ) ) ) ); CAL3(Prme2(" FinFichierA(%d)='%02x'" ,index_du_dernier_caractere_de_fichierA ,ITb0(veritable_fichierA ,INDX(index_du_dernier_caractere_de_fichierA ,PREMIER_CARACTERE ) ) ) ); CAL3(Prme1(" occurence('%s')",expression_reguliere)); CAL3(Prme2(" debut(%d)='%02x'" ,DEBUT_DE_L_OCCURENCE_COURANTE ,INDIRECT(DEBUT_DE_L_OCCURENCE_COURANTE) ) ); CAL3(Prme2(" fin(%d)='%02x'" ,SUITE_DE_L_OCCURENCE_COURANTE ,INDIRECT(SUITE_DE_L_OCCURENCE_COURANTE) ) ); Eblock ATes Bblock DEFV(Positive,INIT(compteur_des_lignes,ZERO)); DEFV(CHAR,INIT(POINTERc(recherche_des_lignes),veritable_fichierA)); DEFV(CHAR,INIT(POINTERc(edition_du_numero_de_ligne),CHAINE_UNDEF)); /* Afin de simuler un numero de ligne (introduit le 20061130162235). On notera que cela */ /* n'est pas tres optimise (euphemisme...) puisqu'en effet, on repart systematiquement du */ /* debut du fichier, mais en fait, je ne vois pas quoi faire d'autre de simple... */ DEFV(CHAR,INIT(POINTERc(occurence),DEBUT_DE_L_OCCURENCE_COURANTE)); /* Pour editer l'occurence elle-meme... */ Tant(IFLT(recherche_des_lignes,DEBUT_DE_L_OCCURENCE_COURANTE)) Bblock Test(IFEQ(INDIRECT(recherche_des_lignes),K_LF)) Bblock INCR(compteur_des_lignes,I); /* Ainsi, en coomptant les 'K_LF's, on compte les lignes... */ Eblock ATes Bblock Eblock ETes INCR(recherche_des_lignes,I); Eblock ETan INCR(compteur_des_lignes,I); /* Afin de trouver ainsi le numero de la premiere ligne de l'occurence courante (au cas ou */ /* celle-ci serait "a cheval" sur plusieurs lignes -en incluant un ou plusieurs 'K_LF's-). */ EGAL(edition_du_numero_de_ligne ,chain_Aconcaten3("OCCURENCE AU VOISINAGE DE LA LIGNE " ,chain_numero_exact(compteur_des_lignes) ," :" ) ); CAL3(Prme1("\n%s\n",edition_du_numero_de_ligne)); /* Edition d'un numero de ligne (introduit le 20061130162235). On notera que ce numero */ /* est en general approximatif et donne a epsilon pres (en particulier, pour bien faire */ /* il faudrait trouver le 'K_LF' qui suit l'occurence...). */ Repe(chain_Xtaille(edition_du_numero_de_ligne)) Bblock CALS(FPrme0("-")); /* Soulignage de "OCCURENCE AU VOISINAGE DE LA LIGNE nnnn :". */ Eblock ERep CALS(Fsauts_de_lignes(UN)); CALZ_FreCC(edition_du_numero_de_ligne); Tant(IFLT(occurence,SUITE_DE_L_OCCURENCE_COURANTE)) Bblock CAL3(Prme1("%c",INDIRECT(occurence))); /* Edition des caracteres de l'occurence un a un... */ INCR(occurence,I); Eblock ETan Eblock ETes CALS(Fsauts_de_lignes(UN)); Eblock ATes Bblock Eblock ETes #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) Test(TOUJOURS_VRAI) #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) Test(IFET(MASQUE_NTEST_BIT(configuration_d_appariement_des_expressions,REG_NOTBOL) ,MASQUE_NTEST_BIT(configuration_d_appariement_des_expressions,REG_NOTEOL) ) ) #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) Bblock Test(I3ET(IFEQ(PREMIER_CARACTERE_ITb0(expression_reguliere) ,MARQUEUR_DE_DEBUT_DE_LIGNE ) ,IFEQ(DERNIER_CARACTERE_ITb0(expression_reguliere) ,MARQUEUR_DE_FIN_DE_LIGNE ) ,IFEQ(chain_Xtaille(Cara(expression_reguliere)),DEUX) ) ) /* Cas d'une expression reguliere du type '^$' : */ Bblock Test(IFGT(index_du_caractere_courant_de_fichierA,PREMIER_CARACTERE)) /* Cas d'un fichier ayant plus d'un caractere : */ Bblock Test(IFET(IFEQ(INDIRECT(NEUT(SUITE_DE_L_OCCURENCE_COURANTE)),K_NULL) ,IFEQ(INDIRECT(PRED(SUITE_DE_L_OCCURENCE_COURANTE)),K_LF) ) ) /* Cas ou l'on est au bout du fichier et qu'il se termine par {K_LF,K_NULL}. */ Bblock EGAL(iterer_la_substitution,FAUX); /* On arrete d'iterer afin de ne pas creer une ligne supplementaire a la fin du fichier */ /* (ceci a ete introduit le 20021215084025). */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IFOU(IL_NE_FAUT_PAS(iterer_la_substitution) ,IFOU(IFLT(IDENTITE(SUITE_DE_L_OCCURENCE_COURANTE) ,IDENTITE(DEBUT_DE_L_OCCURENCE_COURANTE) ) ,IFOU(IFEQ(DEBUT_DE_L_OCCURENCE_COURANTE ,DEBUT_DE_L_OCCURENCE_COURANTE_precedente ) ,IFEQ(SUITE_DE_L_OCCURENCE_COURANTE ,SUITE_DE_L_OCCURENCE_COURANTE_precedente ) ) ) ) ) /* {DEBUT_DE_L_OCCURENCE_COURANTE_precedente,SUITE_DE_L_OCCURENCE_COURANTE_precedente} ont */ /* ete introduits le 20021214222435. */ Bblock Test(IL_FAUT(iterer_la_substitution)) Bblock PRINT_ERREUR("l'occurence trouvee est douteuse, la substitution est stoppee"); CAL1(Prer1("(pour l'occurence courante, le DEBUT est en %d " ,DEBUT_DE_L_OCCURENCE_COURANTE ) ); CAL1(Prer1("et la SUITE en %d)\n" ,SUITE_DE_L_OCCURENCE_COURANTE ) ); CAL1(Prer1("(pour l'occurence precedente, le DEBUT etait en %d " ,DEBUT_DE_L_OCCURENCE_COURANTE_precedente ) ); CAL1(Prer1("et la SUITE en %d)\n" ,SUITE_DE_L_OCCURENCE_COURANTE_precedente ) ); /* En 'EXPRESSION_REGULIERE_VERSION_02' et en 'EXPRESSION_REGULIERE_VERSION_03', ce */ /* message se rencontre, par exemple, avec : */ /* */ /* c01='$' s01="FinDe_ligne" */ /* */ /* cense ajouter "FinDe_ligne" au bout de chaque ligne. Pour faire, la meme chose, il */ /* suffira d'ecrire : */ /* */ /* c01='\(\n\)' s01="FinDe_ligne\1" */ /* */ /* A la date du 20021206165508, je ne sais pas corriger cette anomalie, d'autant plus */ /* que les valeurs 'SUITE_DE_L_OCCURENCE_COURANTE' et 'DEBUT_DE_L_OCCURENCE_COURANTE' */ /* sont renvoyees directement par 'regexec(...)' ; il n'y a donc aucun controle dessus. */ /* Au passage, j'ai essaye de remplacer le 'IFLE(...)' par un 'IFLT(...)' ; cela a eu pour */ /* effet de faire boucler le programme. Le 20021207105825, il me semble que le probleme */ /* est identique a celui du 20021205173903. Le probleme a ete finalement resolu le */ /* 20021207114526. */ EGAL(iterer_la_substitution,FAUX); /* On arrete d'iterer, c'est plus prudent... */ Eblock ATes Bblock /* Cas ou on a deja decide d'arreter d'iterer afin de ne pas creer une ligne supplementaire */ /* a la fin du fichier... */ Eblock ETes Eblock ATes Bblock DEFV(Int,INIT(index_de_fin_de_la_chaine_a_deplacer_depuis_fichierA ,ADD2(PREMIER_CARACTERE ,TRMU(SOUS(IDENTITE(DEBUT_DE_L_OCCURENCE_COURANTE) ,IDENTITE(veritable_fichierA) ) ) ) ) ); /* Afin de savoir jusqu'ou deplacer le fichier Argument... */ /* */ /* Le 'ADD2(PREMIER_CARACTERE,...)' a ete introduit le 20021205172017. */ EGAL(DEBUT_DE_L_OCCURENCE_COURANTE_precedente,DEBUT_DE_L_OCCURENCE_COURANTE); EGAL(SUITE_DE_L_OCCURENCE_COURANTE_precedente,SUITE_DE_L_OCCURENCE_COURANTE); /* Ceci a ete introduit le 20021214222435. */ Test(IFLE(index_de_fin_de_la_chaine_a_deplacer_depuis_fichierA ,index_de_fin_de_substitution ) ) Bblock DoIn(index_du_caractere_courant_de_fichierA ,index_du_caractere_courant_de_fichierA ,index_de_fin_de_la_chaine_a_deplacer_depuis_fichierA ,I ) Bblock GENERE_FICHIER_RESULTAT(ITb0(veritable_fichierA ,INDX(index_du_caractere_courant_de_fichierA ,PREMIER_CARACTERE ) ) ); /* Transfert intact du fichier Argument jusqu'a la prochaine occurence de la chaine */ /* recherchee... */ Eblock EDoI Eblock ATes Bblock PRINT_ERREUR("il y a debordement de l'index courant du fichier Argument"); Eblock ETes DoIn(index_du_caractere_courant_de_substitution ,PREMIER_CARACTERE ,index_de_fin_de_la_chaine_a_substituer_dans_fichierR ,I ) Bblock DEFV(CHAR,INIT(char_a_substituer_dans_fichierR ,ITb0(chaine_a_substituer_dans_fichierR ,INDX(index_du_caractere_courant_de_substitution ,PREMIER_CARACTERE ) ) ) ); /* Caractere courant a substituer... */ DEFV(CHAR,INIT(char_substitue_dans_fichierR,K_UNDEF)); /* Caractere courant a substituer reellement... */ EGAL(char_substitue_dans_fichierR ,char_a_substituer_dans_fichierR ); /* Caractere courant a substituer a priori... */ Test(EST_VRAI(on_a_rencontre_un_K_ANTI_SLASH)) Bblock /* Cas ou l'on a rencontre un "\" juste avant : */ #define alpha_numerique(caractere) \ est_ce_alpha_numerique(caractere) Test(IFOU(EST_VRAI(alpha_numerique(char_a_substituer_dans_fichierR)) ,IMEQ(char_a_substituer_dans_fichierR,K_PLUS,K_MOINS) ) ) /* Le 'IMEQ(...)' a ete introduit le 20160815081125... */ Bblock /* Cas ou un "\" est suivi par un numero : */ DEFV(Int,INIT(sous_expression_c,SOUS_EXPRESSION_COURANTE)); /* Numero de la sous-expression courante referencee par un "\X" ou 'X' est dans [1,9]. */ /* Cette variable fut introduite le 20090108102933 a cause de l'introduction de la fonction */ /* 'est_ce_alpha_numerique(...)' le 20090108094506 afin de faire l'eventuelle permutation */ /* "minuscule <--> majuscule" ci-apres. Alors 'SOUS_EXPRESSION_COURANTE' est modifiee a */ /* chacun des appels de 'est_ce_alpha_numerique(...)' ce qui empeche le bon fonctionnement */ /* du 'DoIn(...)' qui suit... */ /* */ /* On rappelle le 20090112172243 que si 'char_a_substituer_dans_fichierR' est un */ /* chiffre (dans [0,9]) alors 'SOUS_EXPRESSION_COURANTE' vaut ici sa valeur numerique (soit */ /* 'est_ce_alpha_numerique_____valeur_numerique') et que lorsque le caractere n'est pas */ /* numerique ceci vaut 'v $xig/fonct$vv$DEF VALEUR_NUMERIQUE_D_UN_CARACTERE_NON_HEXADECIMAL' */ /* c'est-a-dire moins l'infini qui ne peut etre un nombre valable de sous-epressions... */ Test(IFINff(sous_expression_c ,NUMERO_DE_L_EVENTUELLE_PREMIERE_SOUS_EXPRESSION ,NOMBRE_DE_SOUS_EXPRESSIONS ) ) Bblock /* Cas ou un "\" est suivi d'un numero dans [1,n], 'n' etant le nombre de sous-expressions : */ DEFV(Int,INIT(index_de_sous_expression,UNDEF)); /* Index de transfert de la sous-expression... */ DoIn(index_de_sous_expression ,ADD2(PREMIER_CARACTERE ,SOUS(IDENTITE(DEBUT_EXPRESSION(sous_expression_c)) ,IDENTITE(veritable_fichierA) ) ) ,ADD2(PREMIER_CARACTERE ,TRMU(SOUS(IDENTITE(SUITE_EXPRESSION(sous_expression_c)) ,IDENTITE(veritable_fichierA) ) ) ) ,I ) /* Les 'ADD2(PREMIER_CARACTERE,...)' ont ete introduits le 20021205172017. */ Bblock EGAL(char_substitue_dans_fichierR ,ITb0(veritable_fichierA ,INDX(index_de_sous_expression ,PREMIER_CARACTERE ) ) ); #define caractere_permute_minuscule_majuscule \ est_ce_alpha_numerique_____caractere_permute_minuscules_et_majuscules /* Pour raccourcir quelques unes des lignes suivantes... */ Test(IL_FAUT(permuter_les_minuscules_et_les_majuscules)) Bblock CALS(alpha_numerique(char_substitue_dans_fichierR)); EGAL(char_substitue_dans_fichierR ,caractere_permute_minuscule_majuscule ); /* Cette permutation "minuscule <--> majuscule" a ete introduite le 20090108094506... */ Eblock ATes Bblock Eblock ETes #undef caractere_permute_minuscule_majuscule #undef alpha_numerique #define remplacer_un_caractere \ remplacer_un_caractere_contenu_dans_les_sous_chaines_definies #define caractere_quelconque \ le_caractere_a_remplacer_dans_les_sous_chaines_definies_est_quelconque #define caractere_a_remplacer \ caractere_a_remplacer_dans_les_sous_chaines_definies #define caractere_de_remplacement \ caractere_de_remplacement_dans_les_sous_chaines_definies /* Pour raccourcir quelques unes des lignes suivantes... */ Test(IFET(IL_FAUT(remplacer_un_caractere) ,IFOU(IFET(EST_FAUX(caractere_quelconque) ,IFEQ(char_substitue_dans_fichierR ,caractere_a_remplacer ) ) ,IFET(EST_VRAI(caractere_quelconque) ,IFNE(char_substitue_dans_fichierR ,K_LF ) ) ) ) ) Bblock EGAL(char_substitue_dans_fichierR ,caractere_de_remplacement ); /* Ce remplacement a ete introduit le 20040601111701... */ Eblock ATes Bblock Eblock ETes #undef caractere_de_remplacement #undef caractere_a_remplacer #undef caractere_quelconque #undef remplacer_un_caractere #define conserver_K_LF_des_sous_chaines \ conserver_les_K_LF_contenus_dans_les_sous_chaines_definies #define conserver_K_BLANC_des_sous_chaines \ conserver_les_K_BLANC_contenus_dans_les_sous_chaines_definies /* Pour raccourcir quelques unes des lignes suivantes... */ Test(I3OU(IFET(IFNE(char_substitue_dans_fichierR ,K_LF ) ,IFNE(char_substitue_dans_fichierR ,K_BLANC ) ) ,IFET(IFEQ(char_substitue_dans_fichierR ,K_LF ) ,IL_FAUT(conserver_K_LF_des_sous_chaines) ) ,IFET(IFEQ(char_substitue_dans_fichierR ,K_BLANC ) ,IL_FAUT(conserver_K_BLANC_des_sous_chaines) ) ) ) Bblock GENERE_FICHIER_RESULTAT(char_substitue_dans_fichierR); /* Caractere courant a substituer reellement... */ Eblock ATes Bblock /* L'elimination eventuelle des 'K_LF' a ete introduite le 20040514150215... */ /* */ /* L'elimination eventuelle des 'K_BLANC' a ete introduite le 20040526142735... */ Eblock ETes #undef conserver_K_BLANC_des_sous_chaines #undef conserver_K_LF_des_sous_chaines Eblock EDoI Eblock ATes Bblock /* Cas ou un "\" est suivi d'un caractere qui n'est pas un numero de sous-expressions (soit */ /* ce n'est pas un chiffre, soit une sous-expression avec ce numero n'existe pas -par */ /* exemple "\9" alors qu'il n'y a que deux sous-expressions, auquel cas "\9" sera genere */ /* dans le 'fichierR' via le Defo(...)' ci-apres-) : */ Choi(char_a_substituer_dans_fichierR) /* Generation de quelques caracteres speciaux : */ Bblock Ca1e(K_b) Bblock GENERE_FICHIER_RESULTAT(K_BACKSPACE); Eblock ECa1 Ca1e(K_k) /* Le compteur a ete introduit le 20160813080723... */ Bblock DEFV(Int,INIT(index_du_compteur ,PREMIER_CARACTERE ) ); DEFV(Char,INIT(POINTERc(compteur) ,ADRESSE_NON_ENCORE_DEFINIE ) ); EGAL(compteur ,chain_numero(valeur_courante_du_compteur ,nombre_de_chiffres_du_compteur ) ); /* Conversion alpha-numerique du compteur. */ Repe(nombre_de_chiffres_du_compteur) Bblock GENERE_FICHIER_RESULTAT(ITb0(compteur ,index_du_compteur ) ); /* Remplacement de "\k" par le compteur... */ INCR(index_du_compteur,I); Eblock ERep CALZ_FreCC(compteur); INCR(valeur_courante_du_compteur ,increment_du_compteur ); /* Incrementation automatique du compteur... */ Eblock ECa1 Ca1e(K_PLUS) /* Possibilite introduite le 20160815080520... */ Bblock INCR(valeur_courante_du_compteur ,increment_du_compteur ); /* Incrementation explicite du compteur... */ Eblock ECa1 Ca1e(K_MOINS) /* Possibilite introduite le 20160815080520... */ Bblock DECR(valeur_courante_du_compteur ,increment_du_compteur ); /* Decrementation explicite du compteur... */ Eblock ECa1 Ca1e(K_n) Bblock GENERE_FICHIER_RESULTAT(K_LF); Eblock ECa1 Ca1e(K_t) Bblock GENERE_FICHIER_RESULTAT(K_TABULATION); Eblock ECa1 Ca1e(K_r) Bblock GENERE_FICHIER_RESULTAT(K_RC); Eblock ECa1 Ca1e(K_N) Bblock GENERE_FICHIER_RESULTAT(K_ANTI_SLASH); GENERE_FICHIER_RESULTAT(K_n); /* Pour resoudre le probleme evoque en '$xcp/substitue.01$K 20040630124810' il a ete */ /* introduit le 20040630131550 le code "\N" qui est un substitut de "\n" a utiliser a */ /* la place de ce dernier lorsque la chaine de deux caracteres "\n" doit etre utilisee */ /* en tant que telle... */ Eblock ECa1 Ca1e(K_M) Bblock EGAL(permuter_les_minuscules_et_les_majuscules,VRAI); /* Introduit le 20090108210327 : "\M" permet la substitution "majuscule <--> minuscule"... */ Eblock ECa1 Ca1e(K_m) Bblock EGAL(permuter_les_minuscules_et_les_majuscules,FAUX); /* Introduit le 20090108210327 : "\m" inhibe la substitution "majuscule <--> minuscule"... */ Eblock ECa1 Defo /* Cas standards : */ Bblock GENERE_FICHIER_RESULTAT(K_ANTI_SLASH); GENERE_FICHIER_RESULTAT(char_substitue_dans_fichierR); /* Dans les autres cas, on retransmets donc "\" suivi du caractere courant... */ Eblock EDef Eblock ECho Eblock ETes Eblock ATes Bblock /* Cas ou un "\" est suivi par un caractere non alpha-numerique : */ Choi(char_a_substituer_dans_fichierR) /* Generation de quelques caracteres speciaux : */ Bblock Ca1e(K_ANTI_SLASH) Bblock GENERE_FICHIER_RESULTAT(K_ANTI_SLASH); Eblock ECa1 Defo /* Cas standards : */ Bblock GENERE_FICHIER_RESULTAT(K_ANTI_SLASH); GENERE_FICHIER_RESULTAT(char_substitue_dans_fichierR); /* Substitution de la chaine recherchee dans le cas ou l'on a rencontre un "\" juste avant */ /* le caractere courant, alors que celui-ci doit etre reellement "backslashe"... */ Eblock EDef Eblock ECho Eblock ETes EGAL(on_a_rencontre_un_K_ANTI_SLASH,FAUX); Eblock ATes Bblock Test(IFET(IFEQ(char_a_substituer_dans_fichierR,K_ANTI_SLASH) ,IFLT(index_du_caractere_courant_de_substitution ,index_de_fin_de_la_chaine_a_substituer_dans_fichierR ) ) ) Bblock EGAL(on_a_rencontre_un_K_ANTI_SLASH,VRAI); /* On differe le traitement et l'emission eventuelle de 'K_ANTI_SLASH' sauf s'il apparait */ /* en derniere position... */ Eblock ATes Bblock /* Cas "standards" : */ GENERE_FICHIER_RESULTAT(char_substitue_dans_fichierR); /* Substitution de la chaine recherchee pour les cas "standards"... */ Eblock ETes Eblock ETes Eblock EDoI EGAL(IDENTITE(sous_fichierA),IDENTITE(SUITE_DE_L_OCCURENCE_COURANTE)); /* ATTENTION, le 20021205173903, j'ai decouvert une anomalie liee a cette facon de proceder. */ /* En effet, ainsi, lorsque l'on execute 'regexec(...)' on est toujours positionne au debut */ /* de 'sous_fichierA'. Si maintenant, il contient la ligne suivante : */ /* */ /* ABABABAB */ /* */ /* si l'expression reguliere courante est : */ /* */ /* ^AB */ /* */ /* et si enfin, on demande la substitution par "-+", alors la ligne precedente ("ABABABAB") */ /* deviendra : */ /* */ /* -+-+-+-+ */ /* */ /* et non pas : */ /* */ /* -+ABABAB */ /* */ /* comme il se doit car, en effet, etant toujours au debut du 'sous_fichierA', a chaque */ /* appel de regexec(...)' on voit successivement : */ /* */ /* ABABABAB */ /* | */ /* */ /* -+ABABAB */ /* | */ /* */ /* -+-+ABAB */ /* | */ /* */ /* -+-+-+AB */ /* | */ /* */ /* -+-+-+-+ */ /* */ /* ou "|" materialise le debut du 'sous_fichierA' courant... */ /* */ /* Que faire donc ? Ce probleme a ete finalement resolu le 20021207114526. */ EGAL(index_du_caractere_courant_de_fichierA ,ADD2(PREMIER_CARACTERE ,SOUS(IDENTITE(sous_fichierA),IDENTITE(veritable_fichierA)) ) ); /* Le 'ADD2(PREMIER_CARACTERE,...)' a ete introduit le 20021205172017. */ #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) Test(IFOU(IFEQ(PREMIER_CARACTERE_ITb0(expression_reguliere) ,MARQUEUR_DE_DEBUT_DE_LIGNE ) ,IFEQ(DERNIER_CARACTERE_ITb0(expression_reguliere) ,MARQUEUR_DE_FIN_DE_LIGNE ) ) ) #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) Test(IFOU(IFET(IFEQ(PREMIER_CARACTERE_ITb0(expression_reguliere) ,MARQUEUR_DE_DEBUT_DE_LIGNE ) ,MASQUE_NTEST_BIT(configuration_d_appariement_des_expressions ,REG_NOTBOL ) ) ,IFET(IFEQ(DERNIER_CARACTERE_ITb0(expression_reguliere) ,MARQUEUR_DE_FIN_DE_LIGNE ) ,MASQUE_NTEST_BIT(configuration_d_appariement_des_expressions ,REG_NOTEOL ) ) ) ) #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) Bblock /* Cas ou l'expression reguliere courante est du type "^...", il faut copier, sans tester */ /* cette expression reguliere, jusqu'au prochain 'K_LF' (ceci a ete introduit le */ /* 20021206090948 afin de corriger le probleme mis en evidence le 20021205173903 et */ /* decrit ci-apres). En ce qui concerne le cas du type '...$', il a ete etudie a compter */ /* du 20021207105825 et resolu le 20021207114526. */ DEFV(Logical,INIT(transferer_fichierA,VRAI)); /* Afin de se deplacer jusqu'au prochain 'K_LF'... */ DEFV(Logical,INIT(s_arreter_derriere_le_K_LF,FAUX)); /* Afin de traiter le cas de '...$' en fin de fichier. En effet, sans ce dispositif, */ /* une ligne vide fictive etait ajoutee a la fin du fichier et celle-ci subissait l'effet */ /* de l'expression reguliere courante... */ Tant(IL_FAUT(transferer_fichierA)) Bblock DEFV(CHAR,INIT(caractere_courant_de_fichierA ,ITb0(veritable_fichierA ,INDX(index_du_caractere_courant_de_fichierA ,PREMIER_CARACTERE ) ) ) ); GENERE_FICHIER_RESULTAT(caractere_courant_de_fichierA); /* Transfert du 'fichierA' jusqu'a trouver un changement de ligne ('K_LF'). */ INCR(index_du_caractere_courant_de_fichierA,I); Test(IFET(IFET(IFNE(caractere_courant_de_fichierA,K_LF) ,IFNE(caractere_courant_de_fichierA,END_OF_CHAIN) ) ,IFLE(index_du_caractere_courant_de_fichierA ,index_du_dernier_caractere_de_fichierA ) ) ) Bblock /* Le transfert va continuer tant que l'on n'est pas au bout de la chaine a copier dans le */ /* cas ou il ne s'agit pas d'une expression reguliere du type "^...". Dans le cas contraire */ /* (expression reguliere du type "^..."), on transfere jusqu'a ce l'on rencontre un */ /* changement de ligne ('K_LF') afin de corriger le probleme du 20021205173903 decrit */ /* ci-apres... */ Eblock ATes Bblock Test(I3ET(IFEQ(DERNIER_CARACTERE_ITb0(expression_reguliere) ,MARQUEUR_DE_FIN_DE_LIGNE ) ,IFGE(index_du_caractere_courant_de_fichierA ,NEUT(index_du_dernier_caractere_de_fichierA) ) ,EST_FAUX(s_arreter_derriere_le_K_LF) ) ) /* Dans le cas d'une expression reguliere du type '...$', il faut s'arreter non pas sur */ /* le 'K_LF', mais juste derriere... */ Bblock EGAL(s_arreter_derriere_le_K_LF,VRAI); /* On fait donc, grace a cet indicateur, un tour de plus... */ Eblock ATes Bblock EGAL(transferer_fichierA,FAUX); /* Il faut arreter le transfert... */ Eblock ETes Eblock ETes Eblock ETan EGAL(IDENTITE(sous_fichierA) ,IDENTITE(ADD2(veritable_fichierA ,SOUS(index_du_caractere_courant_de_fichierA ,PREMIER_CARACTERE ) ) ) ); /* Et on deplace ainsi l'origine de 'sous_fichierA'... */ Eblock ATes Bblock Eblock ETes Eblock ETes Eblock ATes Bblock /* Cas ou l'on n'a pas (ou plus) trouve d'occurence : */ EGAL(iterer_la_substitution,FAUX); /* On arrete d'iterer... */ Eblock ETes Eblock ETan DoIn(index_du_caractere_courant_de_fichierA ,index_du_caractere_courant_de_fichierA ,index_du_dernier_caractere_de_fichierA ,I ) Bblock GENERE_FICHIER_RESULTAT(ITb0(veritable_fichierA ,INDX(index_du_caractere_courant_de_fichierA,PREMIER_CARACTERE) ) ); /* Transfert intact de la fin du fichier Argument... */ Eblock EDoI EGAL(index_du_dernier_caractere_de_fichierR,PRED(index_du_caractere_courant_de_fichierR)); /* Afin de revenir sur le dernier caractere du fichier Resultat. */ Eblock ATes Bblock /* Cas ou 'compile(...)' n'a pas reussi a faire son travail... */ PRINT_ERREUR("l'expression reguliere est incorrecte"); EGAL(transferer_le_fichierA_tel_quel,VRAI); /* Dans le cas ou il y a erreur, il y a transfert tel quel... */ Eblock ETes Eblock ATes Bblock PRINT_ERREUR("l'expression reguliere est syntaxiquement incorrecte"); CAL1(Prer1("elle vaut '%s'\n" ,expression_reguliere ) ); PRINT_ERREUR("ou plus rarement, l'expression reguliere est trop volumineuse"); CAL1(Prer1("la longueur maximale courante est de %d octets\n" ,longueur_maximale_de_l_expression_reguliere_compilee ) ); EGAL(transferer_le_fichierA_tel_quel,VRAI); /* Dans le cas ou il y a erreur, il y a transfert tel quel... */ Eblock ETes #if ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) CALZ_FreDD(expression_reguliere_compilee); /* Liberation de l'espace memoire utile a 'expression_reguliere_compilee'... */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_01)) \ ) #if ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) CALS(regfree(ADRESSE(expression_reguliere_compilee))); /* Liberation de l'espace memoire utile a 'expression_reguliere_compilee'... */ #Aif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) #Eif ( (defined(EXPRESSION_REGULIERE_VERSION_02)) \ || (defined(EXPRESSION_REGULIERE_VERSION_03)) \ ) Eblock ATes Bblock EGAL(transferer_le_fichierA_tel_quel,VRAI); /* Dans le cas ou il n'y a pas de substitution, il y a transfert tel quel... */ Eblock ETes CALZ_FreDD(chaine_a_substituer_dans_fichierR); CALZ_FreDD(chaine_recherchee_dans_fichierA); /* Liberation de l'espace memoire utile aux chaines... */ Test(IL_FAUT(transferer_le_fichierA_tel_quel)) Bblock /* En fait, il n'y rien a faire, si ce n'est de ne pas faire la bascule... */ Eblock ATes Bblock /* Sion, il faut basculer les fichiers 'fichierA' et 'fichierR' : */ EGAL(index_du_dernier_caractere_de_fichierA,index_du_dernier_caractere_de_fichierR); /* Afin de preparer la bascule entre 'fichierA' et 'fichierR'... */ EGAL(fichierA_vers_fichierR,NOTL(fichierA_vers_fichierR)); iSWAP(longueur_maximale_du_fichier_Argument,longueur_maximale_du_fichier_Resultat); /* Bascule entre 'fichierA' et 'fichierR'... */ /* */ /* Le 'iSWAP(...)' a ete introduit le 20051125104737 car il manquait... */ Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ETan Eblock ERep EGAL(fichierA_vers_fichierR,NOTL(fichierA_vers_fichierR)); iSWAP(longueur_maximale_du_fichier_Argument,longueur_maximale_du_fichier_Resultat); /* Re-bascule entre 'fichierA' et 'fichierR'... */ /* */ /* Le 'iSWAP(...)' a ete introduit le 20051125104737 car il manquait... */ DoIn(index_du_caractere_courant_de_fichierR ,PREMIER_CARACTERE ,PRED(index_du_dernier_caractere_de_fichierR) ,I ) Bblock EGAL(caractere_courant ,ITb0(veritable_fichierR ,INDX(index_du_caractere_courant_de_fichierR,PREMIER_CARACTERE) ) ); SORTIE_D_UN_CARACTERE(caractere_courant); /* Transfert du fichier Resultat. Le 'PRED(index_du_dernier_caractere_de_fichierR)' est */ /* destine a eliminer le caractere 'K_NULL' qui avait ete mis a la fin du fichier Argument */ /* afin de pouvoir le manipuler comme une "vulgaire" chaine de caractere... */ Eblock EDoI Test(IFOU(IL_FAUT(ajouter_un_K_LF_a_la_fin_du_fichier_a_priori) ,IFET(IL_FAUT(ajouter_un_K_LF_a_la_fin_du_fichier_s_il_manque) ,IFNE(caractere_courant,K_LF) ) ) ) Bblock SORTIE_D_UN_CARACTERE(K_LF); /* Mise d'un 'K_LF' a la fin du fichier Resultat... */ Eblock ATes Bblock Eblock ETes CALZ_FreFF(fichierR); CALZ_FreFF(fichierA); /* Liberation de l'espace memoire utile aux fichiers... */ RETU_Commande; Eblock ECommande