/*************************************************************************************************************************************/
/* */
/* D E P L A C E M E N T D E V I R G U L E S D ' U N E L I G N E A L ' A U T R E : */
/* */
/* */
/* Nota : */
/* */
/* Ce programme permet de transporter */
/* les virgules situees au bout des lignes, */
/* au debut des lignes suivantes, et ce apres */
/* l'eventuelle suite d'espaces de tabulation. */
/* Pour resoudre le probleme des lignes de '#define', */
/* sur lesquelles les virgules d'extremite sont */
/* en general suivies d'espaces de tabulation */
/* avant '\', ce programme s'utilise conjointement */
/* avec '$SE' de la facon suivante : */
/* */
/* $CA <fichier> | $SE -f $xcp/adjustK$D/virgule$sed | $xcp/adjustK.04$X */
/* */
/* Mais ATTENTION, il resoud mal les trois */
/* problemes suivants : */
/* */
/* 1-des lignes commentaires inserees a l'interieur */
/* d'une liste (par exemple un 'DenumerXX(...)'. */
/* La solution est alors, apres cette passe, de */
/* rechercher les lignes commentaires dont le */
/* premier caractere '/' (avant '*') est precede */
/* immediatement d'une virgule, et de faire les */
/* corrections a la main, qui consistent d'une */
/* part a la remplacer par un espace, et la placer */
/* sur la premiere ligne non commentaire qui suit */
/* et ce devant le premier "symbole". Par exemple : */
/* */
/* ,SYMBOLE1 */
/* ,/* commentaire... */
/* /* commentaire... */
/* /* commentaire... */
/* SYMBOLE2 */
/* */
/* deviendra ("a la main") : */
/* */
/* ,SYMBOLE1 */
/* /* commentaire... */
/* /* commentaire... */
/* /* commentaire... */
/* ,SYMBOLE2 */
/* */
/* */
/* 2-des zones du type ', ' qui ne sont pas uniques */
/* sur une meme ligne. Par exemple : */
/* */
/* FU, FZERO,FZERO, \ */
/* FZERO,FU, FZERO, \ */
/* FZERO,FZERO,FU \ */
/* */
/* donnera : */
/* */
/* FU FZERO,FZERO, \, */
/* FZERO,FU FZERO, \, */
/* FZERO,FZERO,FU \ */
/* */
/* Il faudra donc la aussi faire une retouche */
/* "a la main", en recherchant les lignes contenant */
/* encore ', *\\'... */
/* */
/* */
/* 3-des 'CAL2(Prin1("\n...' sur plusieurs lignes */
/* donnent des resultats bizarres, ainsi : */
/* */
/* CAL2(Prin1("\n x=%d", \ */
/* abscisse \ */
/* ) \ */
/* ); \ */
/* */
/* donnera : */
/* */
/* CAL2(Prin1("\,n x=%d" \ */
/* abscisse \ */
/* ) \ */
/* ); \ */
/* */
/* Il faudra donc rechercher "a la main" les */
/* lignes contenant '\\,n' et corriger... */
/* */
/* */
/* Author of '$xcp/adjustK.04$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1990??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 LIMITEUR \
K_VIRGULE \
/* Definition du caractere que l'on va deplacer d'une ligne a la suivante... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define CHANGEMENT_DE_LIGNE \
Bblock \
EGAL(on_vient_de_rencontrer_une_apostrophe,FAUX); \
EGAL(on_vient_de_rencontrer_une_quote,FAUX); \
/* Apres chaque 'LINE-FEED', on reinitialise les detecteurs de quotes et d'apostrophes. */ \
EGAL(on_est_sur_les_espaces_de_debut_de_ligne,VRAI); \
/* Apres chaque 'LINE-FEED', on reinitialise le detecteur d'espace. */ \
CLIR(nombre_d_espaces_au_debut_de_la_ligne); \
/* Reinitialisation du compteur des espaces en debut de ligne */ \
Eblock
#define EMISSION_DU_LIMITEUR \
Bblock \
CALS(Putchar(limiteur)); \
/* Emission du limiteur en attente, */ \
EGAL(on_vient_de_rencontrer_un_limiteur,FAUX); \
/* Et on reinitialise... */ \
Eblock
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E P L A C E M E N T D E V I R G U L E S D ' U N E L I G N E A L ' A U T R E : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIT(limiteur,LIMITEUR));
/* Afin de choisir le caractere de declenchement de generation des "(" et ")". */
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(Int,INIT(nombre_d_espaces_au_debut_de_la_ligne,ZERO));
/* Compteur des espaces en debut de ligne (ne peut etre un 'Positive' a cause du */
/* 'Repe(PRED())' que l'on fait sur lui... */
DEFV(Logical,INIT(on_est_sur_les_espaces_de_debut_de_ligne,VRAI));
/* Cet indicateur indique en permanence si l'on se trouve sur les espaces situes */
/* immediatement au debut d'une ligne : */
/* */
/* VRAI : tant qu'il y a des espaces en debut de ligne, */
/* FAUX : des qu'on a rencontre tout autre caractere (jusqu'au bout de */
/* la ligne). */
/* */
DEFV(Logical,INIT(on_vient_de_rencontrer_un_limiteur,FAUX));
/* Cet indicateur indique en permanence si l'on vient de rencontrer */
/* immediatement le limiteur courant : */
/* */
/* VRAI : apres la premiere rencontree, */
/* FAUX : apres tout autre caractere. */
/* */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(VIDE;
)
);
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_FAUX(on_est_sur_les_espaces_de_debut_de_ligne)
,IFEQ(caractere_courant,limiteur)
)
)
Bblock
Test(IFET(EST_FAUX(on_vient_de_rencontrer_une_quote)
,EST_FAUX(on_vient_de_rencontrer_une_apostrophe)
)
)
Bblock
Test(EST_VRAI(on_vient_de_rencontrer_un_limiteur))
Bblock
/* Cas ou l'on rencontre plusieurs limiteurs les uns a la suite des autres : */
CALS(Putchar(limiteur));
/* Le limiteur precedent n'etant pas en fin de ligne (puisqu'il precede un autre limiteur), */
/* on l'emet... */
Eblock
ATes
Bblock
/* Cas ou l'on rencontre un premier limiteur apres un caractere quelconque : */
EGAL(on_vient_de_rencontrer_un_limiteur,VRAI);
/* On memorise que l'on vient de rencontrer le limiteur hors d'une chaine... */
Eblock
ETes
Eblock
ATes
Bblock
EMISSION_DU_LIMITEUR;
/* Le limiteur etant dans une chaine, on l'ignore, et donc on le transmet... */
Eblock
ETes
Eblock
ATes
Bblock
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
/* Cas du changement de ligne : */
CHANGEMENT_DE_LIGNE;
Eblock
ATes
Bblock
/* Cas ou l'on ne change pas de ligne : */
Test(IFET(EST_FAUX(on_est_sur_les_espaces_de_debut_de_ligne)
,EST_VRAI(on_vient_de_rencontrer_un_limiteur)
)
)
Bblock
/* Cas ou l'on ne situe pas dans les espaces de debut de ligne, et ou un limiteur */
/* est en attente : */
EMISSION_DU_LIMITEUR;
/* Le limiteur precedent n'etant pas en fin de ligne, on l'emet... */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
Test(IFET(EST_VRAI(on_est_sur_les_espaces_de_debut_de_ligne)
,IFEQ(caractere_courant,K_BLANC)
)
)
Bblock
/* Cas ou l'on situe dans les espaces de debut de ligne, et qu'un nouvel espace arrive, */
/* 'on_est_sur_les_espaces_de_debut_de_ligne' conserve sa valeur courante... */
INCR(nombre_d_espaces_au_debut_de_la_ligne,I);
/* On compte le nombre d'espaces au debut de chaque ligne. */
Eblock
ATes
Bblock
/* Cas ou l'on est soit hors de la zone des premiers espaces, soit le caractere courant */
/* n'est pas un espace : */
Test(IFNE(caractere_courant,K_LF))
Bblock
Test(EST_VRAI(on_est_sur_les_espaces_de_debut_de_ligne))
Bblock
/* Cas ou l'on est en train de quitter la zone des premiers espaces : */
Test(EST_VRAI(on_vient_de_rencontrer_un_limiteur))
Bblock
/* Cas ou l'on est en train de quitter la zone des premiers espaces et qu'il y a un */
/* limiteur en attente : */
Repe(PRED(nombre_d_espaces_au_debut_de_la_ligne))
Bblock
CALS(Putchar(K_BLANC));
/* Emission des espaces de debut de ligne, sauf le dernier. */
Eblock
ERep
EMISSION_DU_LIMITEUR;
/* Emission du limiteur qui remplace le dernier espace rencontre. */
Eblock
ATes
Bblock
/* Cas ou l'on est en train de quitter la zone des premiers espaces et qu'il n'y a */
/* pas de limiteur en attente : */
Repe(nombre_d_espaces_au_debut_de_la_ligne)
Bblock
CALS(Putchar(K_BLANC));
/* Emission de tous les espaces de debut de ligne lorsqu'il n'y a pas de limiteur */
/* en attente. */
Eblock
ERep
Eblock
ETes
CLIR(nombre_d_espaces_au_debut_de_la_ligne);
/* Par pure proprete... */
EGAL(on_est_sur_les_espaces_de_debut_de_ligne,FAUX);
/* Ainsi, on sait qu'on n'est certainement plus sur les espaces de debut de ligne. */
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
CALS(Putchar(caractere_courant));
/* Enfin, le caractere courant (sauf les blancs de debut de ligne et l'eventuel limiteur */
/* en attente) est emis... */
Eblock
ETes
Eblock
ETes
Eblock
ETan
RETU_Commande;
Eblock
ECommande