/*************************************************************************************************************************************/
/* */
/* G E S T I O N D E S O P E R A T E U R S P O R T A N T S U R U N E S T R U C T U R E : */
/* */
/* */
/* Fonction : */
/* */
/* Cette commande est destinee a assurer */
/* des reecritures du type : */
/* */
/* XXXX)))).YYYY --> XXXX.YYYY)))) */
/* */
/* qui font donc passer des parentheses */
/* droites ")" derriere un morceau de */
/* structures. Cela permettra des ecritures */
/* du type : */
/* */
/* OPER(structure) */
/* */
/* ou 'OPER' designe un operateur quelconque */
/* (par exemple 'MUL2(x,...)'), et 'structure' */
/* une structure complete ou certains de ses */
/* sous-ensembles ; ainsi : */
/* */
/* #define MACRO(Vecteur) EGAL(Vx,ADD2(ASD1(Vecteur,x),FU)); */
/* EGAL(Vy,ADD2(ASD1(Vecteur,y),FU)); */
/* */
/* appele par : */
/* */
/* MACRO(MUL2(FDEUX,OPST(vecteur))); */
/* */
/* generera : */
/* */
/* EGAL(Vx,ADD2(ASD1(MUL2(FDEUX,(((vecteur)))),x),FU)); */
/* EGAL(Vy,ADD2(ASD1(MUL2(FDEUX,(((vecteur)))),y),FU)); */
/* */
/* puis, par cette commande : */
/* */
/* EGAL(Vx,ADD2(MUL2(FDEUX,(((ASD1(vecteur,x))))),FU)); */
/* EGAL(Vy,ADD2(MUL2(FDEUX,(((ASD1(vecteur,y))))),FU)); */
/* */
/* */
/* Author of '$xcp/op_structure$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 NOMBRE_MINIMAL_DE_PARENTHESES_DROITES \
SEIZE \
/* Nombre minimum de parentheses necessaire pour declencher le processus ; celui-ci est */ \
/* choisi pour fonctionner avec tous les fichiers sources... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E S T I O N D E S O P E R A T E U R S P O R T A N T S U R U N E S T R U C T U R E : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Positive,INIT(nombre_minimal_de_parentheses_droites,NOMBRE_MINIMAL_DE_PARENTHESES_DROITES));
/* Nombre minimal de parentheses necessaire pour declencher le processus... */
DEFV(Positive,INIT(nombre_courant_de_parentheses_droites,UNDEF));
/* Compteur des parentheses droites ")". */
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(il_faut_rechercher_les_PD,LUNDEF));
/* Cet indicateur indique s'il faut continuer a chercher les suites de ")". */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_I("nombre=""n=",nombre_minimal_de_parentheses_droites);
)
);
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,K_PD))
Bblock
CALS(Putchar(caractere_courant));
/* Lorsque le caractere courant n'est pas une parenthese gauche, on le reemet... */
CLIR(nombre_courant_de_parentheses_droites);
/* A priori, on remet a 0 le compteur des parentheses droites... */
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
Eblock
ATes
Bblock
Test(IFET(EST_FAUX(on_vient_de_rencontrer_une_quote)
,EST_FAUX(on_vient_de_rencontrer_une_apostrophe)
)
)
Bblock
EGAL(nombre_courant_de_parentheses_droites,UN);
/* On compte la parenthese droite courante... */
EGAL(il_faut_rechercher_les_PD,VRAI);
/* Afin de faire la boucle suivante au moins une fois... */
Tant(EST_VRAI(il_faut_rechercher_les_PD))
Bblock
EGAL(caractere_courant,Getchar());
Test(IFEQ(caractere_courant,K_PD))
Bblock
INCR(nombre_courant_de_parentheses_droites,I);
/* Le caractere courant de l'entree courante est recupere ; et on boucle */
/* sur cette recuperation tant que l'on trouve des ")" que l'on compte... */
Eblock
ATes
Bblock
Test(IFEQ(caractere_courant,K_BLANC))
Bblock
/* Dans les suites de ")",les 'ESPACE' sont ignores... */
Eblock
ATes
Bblock
EGAL(il_faut_rechercher_les_PD,FAUX);
/* On arrete la boucle si le caractere courant n'est ni un 'ESPACE' ni une ")"... */
Eblock
ETes
Eblock
ETes
Eblock
ETan
Test(IFOU(IFNE(caractere_courant,K_POINT)
,IFLT(nombre_courant_de_parentheses_droites,nombre_minimal_de_parentheses_droites)
)
)
Bblock
/* Lorsque le caractere courant n'est pas le ".", on va emettre les ")" en attente. */
Tant(IZNE(nombre_courant_de_parentheses_droites))
Bblock
CALS(Putchar(K_PD));
/* Emission des ")" en attente, */
DECR(nombre_courant_de_parentheses_droites,I);
/* Et decomptage des ")" emises. */
Eblock
ETan
CALS(Putchar(caractere_courant));
/* Puis on envoie le caractere coourant... */
Eblock
ATes
Bblock
/* Lorsque le caractere courant est le ".", on l'emet immediatement, et on differe */
/* l'emission des ")" en attente jusqu'a ce qu'il n'y ait plus de caracteres alpha- */
/* numeriques en attente, et c'est ensuite qu'on emet les ")" en attente... */
CALS(Putchar(K_POINT));
/* Emission immediat du "." courant... */
Tant(EST_VRAI(est_ce_alpha_numerique(EGAL(caractere_courant,Getchar()))))
Bblock
CALS(Putchar(caractere_courant));
/* Les caracteres alpha-numeriques sont renvoyes tel quels... */
Eblock
ETan
Tant(IZNE(nombre_courant_de_parentheses_droites))
Bblock
CALS(Putchar(K_PD));
/* Enfin, emission des ")" en attente, */
DECR(nombre_courant_de_parentheses_droites,I);
/* Et decomptage des ")" emises. */
Eblock
ETan
CALS(Putchar(caractere_courant));
/* Puis on envoie le caractere coourant... */
Eblock
ETes
Eblock
ATes
Bblock
CALS(Putchar(caractere_courant));
/* Lorsque le caractere courant est ")", entre quotes ou apostrophes, on l'emet... */
Eblock
ETes
Eblock
ETes
Eblock
ETan
RETU_Commande;
Eblock
ECommande