/*************************************************************************************************************************************/
/* */
/* A P P A R I E M E N T D E P A R E N T H E S E S E T A U T R E S */
/* C A R A C T E R E S D U M E M E T Y P E : */
/* */
/* */
/* Fonction : */
/* */
/* Cette commande est destinee a reproduire */
/* le fichier Argument jusqu'a la "fermeture" */
/* d'un certain caractere ou bien l'inverse, */
/* c'est-a-dire ne pas reproduire le fichier */
/* jusqu'a la "fermeture" d'un certain caractere. */
/* */
/* Ainsi : */
/* */
/* xxxx(yyyy(...)zzzz)tttt */
/* */
/* deviendra : */
/* */
/* xxxx(yyyy(...)zzzz) */
/* */
/* */
/* Author of '$xcp/appariement$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19990309105636). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 INVERSES_LE_PROCESSUS_D_APPARIEMENT \
FAUX \
/* En temps "normal" ('FAUX') la sortie a lieu du debut du fichier jusqu'au caractere */ \
/* "apparie" inclus ; l'inversion ('VRAI') permet de ne sortir que ce qui suit le caractere */ \
/* "apparie" (introduit le 20020206134816). */
#define SYMBOLE_GAUCHE \
K_PG \
/* Symbole gauche assurant l'ouverture... */
#define SYMBOLE_DROITE \
K_PD \
/* Symbole droite assurant la fermeture... */
#define NOMBRE_DE_CARACTERES_A_CONSERVER_DERRIERE_LE_SYMBOLE_DROITE_FERMANT \
ZERO \
/* Nombre de caracteres a conserver derriere le symbole droite "fermant". Ceci a ete */ \
/* introduit le 20041206091340... */
#define IGNORER_LES_APOSTROPHES_ET_LES_QUOTES \
VRAI \
/* Permet de controler les apostrophes et les quotes dans le fichier. Cet indicateur a ete */ \
/* introduit le 19990309131650 a cause de 'v $xiMo/CONTENTS$Z appariement' ou des quotes */ \
/* peuvent apparaitre dans des titres sans pour cela encadrer des chaines de caracteres ; */ \
/* cela peut aussi se retrouver evidemment dans des "abstracts"... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* A P P A R I E M E N T D E P A R E N T H E S E S E T A U T R E S */
/* C A R A C T E R E S D U M E M E T Y P E : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Logical,INIT(inverser_le_processus_d_appariement,INVERSES_LE_PROCESSUS_D_APPARIEMENT));
/* En temps "normal" ('FAUX') la sortie a lieu du debut du fichier jusqu'au caractere */
/* "apparie" inclus ; l'inversion ('VRAI') permet de ne sortie que ce qui suit le caractere */
/* "apparie" (introduit le 20020206134816). */
DEFV(CHAR,INIT(symbole_gauche,SYMBOLE_GAUCHE));
/* Symbole gauche assurant l'ouverture... */
DEFV(CHAR,INIT(symbole_droite,SYMBOLE_DROITE));
/* Symbole droite assurant la fermeture... */
DEFV(Int,INIT(nombre_de_caracteres_a_conserver_derriere_le_symbole_droite_fermant
,NOMBRE_DE_CARACTERES_A_CONSERVER_DERRIERE_LE_SYMBOLE_DROITE_FERMANT
)
);
/* Nombre de caracteres a conserver derriere le symbole droite "fermant". Ceci a ete */
/* introduit le 20041206091340... */
DEFV(Logical,INIT(ignorer_les_apostrophes_et_les_quotes,IGNORER_LES_APOSTROPHES_ET_LES_QUOTES));
/* Permet de controler les apostrophes et les quotes dans le fichier. Cet indicateur a ete */
/* introduit le 19990309131650 a cause de 'v $xiMo/CONTENTS$Z appariement' ou des quotes */
/* peuvent apparaitre dans des titres sans pour cela encadrer des chaines de caracteres ; */
/* cela peut aussi se retrouver evidemment dans des "abstracts"... */
DEFV(Char,INIT(caractere_courant,K_UNDEF));
/* Caractere courant. */
DEFV(Logical,INIT(on_vient_de_rencontrer_une_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_une_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_a_rencontre_au_moins_un_symbole_gauche,FAUX));
/* Cet indicateur indique en permanence si l'on a rencontre au moins un symbole "gauche". */
DEFV(Int,INIT(compteur_d_imbrication,ZERO));
/* Afin de compter les imbrications de {symbole_gauche,symbole_droite}. */
DEFV(Int,INIT(numero_du_caractere_courant,ZERO));
DEFV(Int,INIT(numero_du_symbole_droite_fermant,UNDEF));
/* Afin de numeroter le 'symbole_droite' fermant (introduit le 20041206091340). */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_L("inverser=",inverser_le_processus_d_appariement);
GET_ARGUMENT_K("ouverture=""gauche=",symbole_gauche);
GET_ARGUMENT_L("quotes=""quote=""ignorer=""apostrophes=""apostrophe="
,ignorer_les_apostrophes_et_les_quotes
);
GET_ARGUMENT_I("derriere=""conserver="
,nombre_de_caracteres_a_conserver_derriere_le_symbole_droite_fermant
);
)
);
Choi(symbole_gauche)
Bblock
Ca1e(K_PG)
Bblock
EGAL(symbole_droite,K_PD);
/* Association "(" --> ")". */
Eblock
ECa1
Ca1e(K_CG)
Bblock
EGAL(symbole_droite,K_CD);
/* Association "[" --> "]". */
Eblock
ECa1
Ca1e(K_AG)
Bblock
EGAL(symbole_droite,K_AD);
/* Association "{" --> "}". */
Eblock
ECa1
Defo
Bblock
PRINT_ERREUR("le caractere d'ouverture demande n'est pas reconnu");
EGAL(symbole_gauche,SYMBOLE_GAUCHE);
EGAL(symbole_droite,SYMBOLE_DROITE);
/* Association "(" --> ")". */
Eblock
EDef
Eblock
ECho
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(IFET(EST_VRAI(on_a_rencontre_au_moins_un_symbole_gauche)
,IZLE(compteur_d_imbrication)
)
)
Bblock
/* Lorsque l'on a trouve l'appariement, on ne sort plus les caracteres courants du fichier, */
/* sauf si le processus doit etre inverse... */
Test(IL_FAUT(inverser_le_processus_d_appariement))
Bblock
Test(IFLE(SOUS(numero_du_caractere_courant,numero_du_symbole_droite_fermant)
,nombre_de_caracteres_a_conserver_derriere_le_symbole_droite_fermant
)
)
/* Introduit le 20041207140358 afin de sauter quleques caracteres apres l'appariement... */
Bblock
Eblock
ATes
Bblock
CALS(Putchar(caractere_courant));
/* A partir du moment ou l'appariement a ete trouve, on sort les caracteres courants du */
/* fichier dans le cas du "processus inverse"... */
Eblock
ETes
Eblock
ATes
Bblock
Test(IFLE(SOUS(numero_du_caractere_courant,numero_du_symbole_droite_fermant)
,nombre_de_caracteres_a_conserver_derriere_le_symbole_droite_fermant
)
)
Bblock
CALS(Putchar(caractere_courant));
/* Introduit le 20041206091340 afin de garder, par exemple, un caractere ";" derriere */
/* une ")"... */
/* */
/*Le 20041207091348, je donne le code utile pour verifier la bonne fermeture par un ";" */
/*des 'GET_ARGUMENTS?(...)' : */
/* */
/* */
/* :Debut_listG_FermetureDes_GET_ARGUMENTS_Par_K_POINT_VIRGULE: */
/* */
/* $Z set FiLe_TmP=`GetXTmp` */
/* $Z $DELETE $FiLe_TmP */
/* */
/* $Z set VaLiDe=`$CA $FiLeA | $GRE '^ *GET_ARGUMENTS.('` */
/* */
/* $Z if ("$VaLiDe" != "$K_VIDE") then */
/* $Z $CA $FiLeA | \ */
/* $Z $SE -e "s/\( GET_ARGUMENTS\).(/\1x /" | \ */
/* $Z $AW " /GET_ARGUMENTSx/,/ECommande/ " | \ */
/* $Z $SE -e "s/GET_ARGUMENTSx/GET_ARGUMENTSx(/" | \ */
/* $Z $xcp/appariement$X \ */
/* $Z conserver=1 \ */
/* $Z > $FiLe_TmP */
/* $Z */
/* $Z set ErReUr=`$CA $FiLe_TmP | $GRE '^ *);$'` */
/* $Z */
/* $Z if ("$ErReUr" != "$K_VIDE") then */
/* $Z echo "ERREUR : $FiLeA" */
/* $Z else */
/* $Z endif */
/* $Z */
/* $Z unset ErReUr */
/* $Z else */
/* $Z endif */
/* $Z */
/* $Z unset VaLiDe */
/* */
/* $Z $DELETE $FiLe_TmP */
/* $Z unset FiLe_TmP */
/* */
/* :Fin_listG_FermetureDes_GET_ARGUMENTS_Par_K_POINT_VIRGULE: */
/* */
/* */
/* ou '$FiLeA' designe le fichier Argument a valider... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
Eblock
ATes
Bblock
/* Lorsque l'on a pas encore trouve l'appariement : */
Test(IL_FAUT(inverser_le_processus_d_appariement))
Bblock
Eblock
ATes
Bblock
CALS(Putchar(caractere_courant));
/* Tant que l'appariement n'est pas trouve, on sort les caracteres courants du fichier */
/* dans le cas du "processus normal"... */
Eblock
ETes
Test(IFET(IFEQ(caractere_courant,K_QUOTE),EST_FAUX(on_vient_de_rencontrer_une_apostrophe)))
Bblock
EGAL(on_vient_de_rencontrer_une_quote,NOTL(on_vient_de_rencontrer_une_quote));
/* On gere les quotes comme des parentheses... */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFET(IFEQ(caractere_courant,K_APOSTROPHE),EST_FAUX(on_vient_de_rencontrer_une_quote)))
Bblock
EGAL(on_vient_de_rencontrer_une_apostrophe,NOTL(on_vient_de_rencontrer_une_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_une_apostrophe,FAUX);
EGAL(on_vient_de_rencontrer_une_quote,FAUX);
/* Au changement de ligne, on reinitialise la gestion des quotes et apostrophes... */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFOU(IL_FAUT(ignorer_les_apostrophes_et_les_quotes)
,IFET(IL_NE_FAUT_PAS(ignorer_les_apostrophes_et_les_quotes)
,IFET(EST_FAUX(on_vient_de_rencontrer_une_quote)
,EST_FAUX(on_vient_de_rencontrer_une_apostrophe)
)
)
)
)
Bblock
Test(IFEQ(caractere_courant,symbole_gauche))
Bblock
INCR(compteur_d_imbrication,I);
EGAL(on_a_rencontre_au_moins_un_symbole_gauche,VRAI);
/* Cas d'un symbole "ouvrant". */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFEQ(caractere_courant,symbole_droite))
Bblock
DECR(compteur_d_imbrication,I);
/* Cas d'un symbole "fermant". */
Test(IZEQ(compteur_d_imbrication))
Bblock
EGAL(numero_du_symbole_droite_fermant,numero_du_caractere_courant);
/* Reperage du 'symbole_droite' fermant... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
INCR(numero_du_caractere_courant,I);
Eblock
ETan
RETU_Commande;
Eblock
ECommande