/*************************************************************************************************************************************/ /* */ /* G E S T I O N D U L I M I T E U R " ` " D E ' C P P ' : */ /* */ /* */ /* Fonction : */ /* */ /* Cette commande est destinee a assurer */ /* un nouveau limiteur necessaire a 'cpp'. */ /* */ /* Ainsi : */ /* */ /* #define MACRO(NOM) NOM`XXXX */ /* */ /* appele par : */ /* */ /* MACRO(nom) */ /* */ /* generera : */ /* */ /* nom`XXXX */ /* */ /* puis, par cette commande : */ /* */ /* nom_XXXX */ /* */ /* */ /* Nota : */ /* */ /* Il est important de noter que '$xcp/underscore$X' */ /* equivaut a '$R', mais avec une particularite tres */ /* importante, voire essentielle, c'est qu'il ne fait */ /* le remplacement que si le caractere n'est pas dans */ /* une chaine quotee... */ /* */ /* */ /* Author of '$xcp/underscore$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1989??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 SUBSTITUER_A_L_INTERIEUR_DES_CHAINES_DE_CARACTERES_K_QUOTE \ FAUX #define SUBSTITUER_A_L_INTERIEUR_DES_CHAINES_DE_CARACTERES_K_APOSTROPHE \ FAUX /* Faut-il substituer aussi a l'interieur d'une chaine de caracteres ('VRAI') ou pas */ /* ('FAUX') ? Ceci fut introduit le 20060317112122 et la valeur par defaut a ete choisie */ /* de facon a assurer la compatibilite anterieure. L'introduction de ce dispositif est du, */ /* en particulier, a la compilation de 'v $xcp/substitue.01$K chaine.numero.a_substituer_' */ /* pour lequel les 'vq' generes par 'v $xcc/cpp$Z .xccp/BlancParametres.sed' indiquaient, */ /* par exemple, "vq ':chaine`00`a_substituer_dans_fichierR:'" alors qu'evidemment etait */ /* attendu "vq ':chaine_00_a_substituer_dans_fichierR:'"... */ /* */ /* Le 20060317194936, il a fallu introduire une distinction entre 'K_QUOTE' et */ /* 'K_APOSTROPHE' car en effet, ces deux caracteres peuvent apparaitre dans les sources, */ /* par exemple dans 'v $xig/fonct$vv$FON K_QUOTE' et 'v $xiii/alphabets$FON K_QUOTE'... */ #define SUPPRIMER_LES_ESPACE_DERRIERE_LE_LIMITEUR \ FAUX \ /* Faut-il supprimer les espaces derriere le limiteur ('VRAI') ou les conserver ('FAUX') ? */ \ /* Cette option fut introduite le 20060412150408... */ #define SUBSTITUT_DE_L_UNDERSCORE \ K_ANTI_QUOTE \ /* Caractere utilise comme nouveau limiteur par 'cpp'. */ #define VRAI_UNDERSCORE \ K_UNDERSCORE \ /* Caractere utilise a la place pour le compilateur afin de simuler la concatenation de */ \ /* de morceaux de symboles... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D U L I M I T E U R " ` " D E ' C P P ' : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Logical,INIT(substituer_a_l_interieur_des_chaines_de_caracteres_K_QUOTE ,SUBSTITUER_A_L_INTERIEUR_DES_CHAINES_DE_CARACTERES_K_QUOTE ) ); DEFV(Logical,INIT(substituer_a_l_interieur_des_chaines_de_caracteres_K_APOSTROPHE ,SUBSTITUER_A_L_INTERIEUR_DES_CHAINES_DE_CARACTERES_K_APOSTROPHE ) ); /* Faut-il substituer aussi a l'interieur d'une chaine de caracteres ('VRAI') ou pas */ /* ('FAUX') ? Ceci fut introduit le 20060317112122 et la valeur par defaut a ete choisie */ /* de facon a assurer la compatibilite anterieure. L'introduction de ce dispositif est du, */ /* en particulier, a la compilation de 'v $xcp/substitue.01$K chaine.numero.a_substituer_' */ /* pour lequel les 'vq' generes par 'v $xcc/cpp$Z .xccp/BlancParametres.sed' indiquaient, */ /* par exemple, "vq ':chaine`00`a_substituer_dans_fichierR:'" alors qu'evidemment etait */ /* attendu "vq ':chaine_00_a_substituer_dans_fichierR:'"... */ /* */ /* Le 20060317194936, il a fallu introduire une distinction entre 'K_QUOTE' et */ /* 'K_APOSTROPHE' car en effet, ces deux caracteres peuvent apparaitre dans les sources, */ /* par exemple dans 'v $xig/fonct$vv$FON K_QUOTE' et 'v $xiii/alphabets$FON K_QUOTE'... */ DEFV(Logical,INIT(supprimer_les_espace_derriere_le_limiteur,SUPPRIMER_LES_ESPACE_DERRIERE_LE_LIMITEUR)); /* Faut-il supprimer les espaces derriere le limiteur ('VRAI') ou les conserver ('FAUX') ? */ /* Cette option fut introduite le 20060412150408... */ DEFV(CHAR,INIT(limiteur_pour_le_pre_processeur,SUBSTITUT_DE_L_UNDERSCORE)); /* Caractere utilise comme nouveau limiteur par 'cpp'. */ DEFV(CHAR,INIT(remplacement_du_limiteur,VRAI_UNDERSCORE)); /* Caractere utilise a la place pour le compilateur afin de simuler la concatenation de */ /* de morceaux de symboles... */ DEFV(Char,INIT(caractere_courant,K_UNDEF)); /* Caractere courant. */ DEFV(Logical,INIT(on_vient_de_rencontrer_immediatement_le_limiteur,FAUX)); /* Cet indicateur indique en permanence si l'on vient de rencontrer immediatement le */ /* limiteur (introduit le 20060412150408)... */ DEFV(Logical,INIT(on_vient_de_rencontrer_K_APOSTROPHE,FAUX)); /* Cet indicateur indique en permanence si l'on vient de rencontrer */ /* immediatement une apostrophe (') : */ /* */ /* VRAI : apres la premiere rencontree, */ /* FAUX : apres la seconde, */ /* */ /* cet indicateur fonctionnant en bascule, puisque les apostrophes forment */ /* des couples de parentheses... */ DEFV(Logical,INIT(on_vient_de_rencontrer_K_QUOTE,FAUX)); /* Cet indicateur indique en permanence si l'on vient de rencontrer */ /* immediatement une quote (") : */ /* */ /* VRAI : apres la premiere rencontree, */ /* FAUX : apres la seconde, */ /* */ /* cet indicateur fonctionnant en bascule, puisque les quotes forment */ /* des couples de parentheses... */ DEFV(Logical,INIT(on_vient_de_rencontrer_K_ANTI_SLASH,FAUX)); /* Cet indicateur indique en permanence si l'on vient de rencontrer immediatement un "\". */ /* Ceci fut introduit le 20071109093318 a cause de la nouvelle procedure 'SINS(...)' (voir */ /* 'v $xil/defi_c1$vv$DEF SINS' utilise dans 'v $xig/common$STR FORMAT_CHAR_EDITION_____'... */ /*..............................................................................................................................*/ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("substituer_K_QUOTE=""chaines_K_QUOTE=""chaine_K_QUOTE=""K_QUOTE=""K_QD=" ,substituer_a_l_interieur_des_chaines_de_caracteres_K_QUOTE ); GET_ARGUMENT_L("substituer_K_APOSTROPHE=""chaines_K_APOSTROPHE=""chaine_K_APOSTROPHE=""K_QS=""K_APOSTROPHE=" ,substituer_a_l_interieur_des_chaines_de_caracteres_K_APOSTROPHE ); GET_ARGUMENT_L("espaces=""blancs=""K_BLANC=",supprimer_les_espace_derriere_le_limiteur); GET_ARGUMENT_K("ancien=""a=",limiteur_pour_le_pre_processeur); GET_ARGUMENT_K("nouveau=""n=",remplacement_du_limiteur); ) ); 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(IFNE(caractere_courant,limiteur_pour_le_pre_processeur)) Bblock Test(I3ET(IFEQ(caractere_courant,K_BLANC) ,EST_VRAI(on_vient_de_rencontrer_immediatement_le_limiteur) ,IL_FAUT(supprimer_les_espace_derriere_le_limiteur) ) ) Bblock /* Cas ou les espaces ne sont pas reemis (introduit le 20060412150408)... */ Eblock ATes Bblock CALS(Putchar(caractere_courant)); /* Lorsque le caractere courant n'est pas l'anti-quote "`", on le reemet... */ EGAL(on_vient_de_rencontrer_immediatement_le_limiteur,FAUX); Eblock ETes Test(I3ET(IFEQ(caractere_courant,K_QUOTE) ,EST_FAUX(on_vient_de_rencontrer_K_APOSTROPHE) ,EST_FAUX(on_vient_de_rencontrer_K_ANTI_SLASH) ) ) Bblock EGAL(on_vient_de_rencontrer_K_QUOTE,NOTL(on_vient_de_rencontrer_K_QUOTE)); /* On gere les quotes comme des parentheses... */ Eblock ATes Bblock Eblock ETes Test(I3ET(IFEQ(caractere_courant,K_APOSTROPHE) ,EST_FAUX(on_vient_de_rencontrer_K_QUOTE) ,EST_FAUX(on_vient_de_rencontrer_K_ANTI_SLASH) ) ) Bblock EGAL(on_vient_de_rencontrer_K_APOSTROPHE,NOTL(on_vient_de_rencontrer_K_APOSTROPHE)); /* On gere les apostrophes comme des parentheses... */ Eblock ATes Bblock Eblock ETes Test(IFEQ(caractere_courant,K_LF)) Bblock EGAL(on_vient_de_rencontrer_K_APOSTROPHE,FAUX); EGAL(on_vient_de_rencontrer_K_QUOTE,FAUX); /* Au changement de ligne, on reinitialise la gestion des quotes et apostrophes... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock DEFV(Logical,INIT(remplacer_le_limiteur,VRAI)); /* Ceci fut introduit le 20060317112122 et complete le 20060318004902... */ Test(IFET(IL_FAUT(substituer_a_l_interieur_des_chaines_de_caracteres_K_QUOTE) ,EST_VRAI(on_vient_de_rencontrer_K_QUOTE) ) ) Bblock /* Cas ou l'on vient de rencontrer une 'K_QUOTE' et que la substitution est autorisee. */ Eblock ATes Bblock Test(IFET(IL_FAUT(substituer_a_l_interieur_des_chaines_de_caracteres_K_APOSTROPHE) ,EST_VRAI(on_vient_de_rencontrer_K_APOSTROPHE) ) ) Bblock /* Cas ou l'on vient de rencontrer une 'K_APOSTROPHE' et que la substitution est autorisee. */ Eblock ATes Bblock Test(IFET(EST_FAUX(on_vient_de_rencontrer_K_QUOTE) ,EST_FAUX(on_vient_de_rencontrer_K_APOSTROPHE) ) ) Bblock /* Cas ou l'on n'a rencontre ni 'K_QUOTE', ni 'K_APOSTROPHE'. */ Eblock ATes Bblock EGAL(remplacer_le_limiteur,FAUX); /* Dans tous les autres cas, on ne peut pas substituer... */ Eblock ETes Eblock ETes Eblock ETes Test(IL_FAUT(remplacer_le_limiteur)) Bblock CALS(Putchar(remplacement_du_limiteur)); /* Les caracteres "`" non quotes par """ ou "'" sont transformes en caractere "_"... */ EGAL(on_vient_de_rencontrer_immediatement_le_limiteur,VRAI); /* Et on memorise cette rencontre-remplacement... */ Eblock ATes Bblock CALS(Putchar(caractere_courant)); /* Lorsque le caractere courant est "`", entre quotes ou apostrophes, on l'emet... */ Eblock ETes Eblock ETes EGAL(on_vient_de_rencontrer_K_ANTI_SLASH,IFEQ(caractere_courant,K_ANTI_SLASH)); /* On memorise les "\" pour reperer les quotes "backslashees" (introduit le 20071109093318). */ Eblock ETan RETU_Commande; Eblock ECommande