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