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