/*************************************************************************************************************************************/ /* */ /* E L I M I N A T I O N D E S C H A N G E M E N T S D E L I G N E S P R E - M A R Q U E S : */ /* */ /* */ /* Fonction : */ /* */ /* Cette commande est destinee a assurer */ /* des reecritures du type : */ /* */ /* "XXXX...XXXX`" */ /* "YYYY...YYYY" */ /* */ /* en : */ /* */ /* "XXXX...XXXXYYYY...YYYY" */ /* */ /* Le 20020111150814, un nouveau mode de */ /* fonctionnement a ete introduit par l'option */ /* "reconstituer=VRAI". Elle permet de ne faire */ /* ces reecritures que pour les parties du */ /* fichier Argument situe entre deux occurences */ /* d'un marqueur ; supposant que celui-ci soit */ /* "@" ('v $xcc/cpp$Z reconstituer='), le */ /* fichier : */ /* */ /* "AAAA...AAAA`" */ /* "@BBBB...BBBB" */ /* "CCCC...CCCC@" */ /* "DDDD...DDDD" */ /* */ /* se reecrira : */ /* */ /* "AAAA...AAAA`" */ /* "@BBBB...BBBBCCCC...CCCC@" */ /* "DDDD...DDDD" */ /* */ /* le marqueur ("@") etant conserve. On notera */ /* au passage que ce marqueur n'occupe pas */ /* necessairement des emplacements privilegies */ /* (comme le debut ou la fin de ligne dans */ /* l'exemple ci-dessus...). */ /* */ /* */ /* Author of '$xcp/recollage$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 : */ /* */ /*************************************************************************************************************************************/ @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 RECONSTITUER_DES_GRANDES_LIGNES \ FAUX \ /* A priori, le mode de fonctionnement est le mode anterieur au 20020111150814. Il est */ \ /* possible d'avoir un nouveau mode de focntionnement utile a 'v $xcc/cpp$Z reconstituer=' */ \ /* permettant de reconstituer (provisoirement) des grandes lignes. */ #define MARQUEUR_DE_DELIMITAGE \ K_DOLLAR \ /* A priori, on utilise le premier 'SUBSTITUT_DE_L_UNDERSCORE' (voir '$Z_UNDERSCORE'), car */ \ /* en effet il a en general ete substitue au prealable (voir 'PASSE_1' dans $xcc/cpp$Z)... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E L I M I N A T I O N D E S C H A N G E M E N T S D E L I G N E S P R E - M A R Q U E S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Logical,INIT(reconstituer_des_grandes_lignes,RECONSTITUER_DES_GRANDES_LIGNES)); /* A priori, le mode de fonctionnement est le mode anterieur au 20020111150814. Il est */ /* possible d'avoir un nouveau mode de focntionnement utile a 'v $xcc/cpp$Z reconstituer=' */ /* permettant de reconstituer (provisoirement) des grandes lignes. */ DEFV(CHAR,INIT(marqueur_de_delimitage,MARQUEUR_DE_DELIMITAGE)); /* A priori, on utilise 'SUBSTITUT_DE_L_UNDERSCORE'... */ 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_vient_de_rencontrer_le_marqueur_de_delimitage,FAUX)); /* Cet indicateur indique en permanence si l'on vient de rencontrer le caractere */ /* de marquage... */ /*..............................................................................................................................*/ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("reconstituer=",reconstituer_des_grandes_lignes); GET_ARGUMENT_K("marqueur=""m=""caractere=""c=",marqueur_de_delimitage); ) ); 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,marqueur_de_delimitage)) Bblock Test(IFEQ(caractere_courant,K_LF)) Bblock Test(EST_VRAI(on_vient_de_rencontrer_le_marqueur_de_delimitage)) Bblock /* Les changements de lignes pre-marques sont ignores... */ Eblock ATes Bblock CALS(Putchar(caractere_courant)); /* Les changements de lignes non pre-marques sont transmis... */ Eblock ETes 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 CALS(Putchar(caractere_courant)); /* Lorsque le caractere courant n'est pas le changement de ligne, on le reemet... */ 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(IL_FAUT(reconstituer_des_grandes_lignes)) Bblock Eblock ATes Bblock EGAL(on_vient_de_rencontrer_le_marqueur_de_delimitage,FAUX); Eblock ETes Eblock ATes Bblock Test(IFET(EST_FAUX(on_vient_de_rencontrer_une_quote) ,EST_FAUX(on_vient_de_rencontrer_une_apostrophe) ) ) Bblock Test(IL_FAUT(reconstituer_des_grandes_lignes)) Bblock EGAL(on_vient_de_rencontrer_le_marqueur_de_delimitage ,NOTL(on_vient_de_rencontrer_le_marqueur_de_delimitage) ); /* Gestion "parenthesee" du marqueur... */ Eblock ATes Bblock EGAL(on_vient_de_rencontrer_le_marqueur_de_delimitage,VRAI); /* Le marqueur n'est pas transmis... */ Eblock ETes Eblock ATes Bblock Test(IL_FAUT(reconstituer_des_grandes_lignes)) Bblock Eblock ATes Bblock CALS(Putchar(caractere_courant)); /* Lorsque le caractere "marqueur" est entre quotes ou apostrophes, on l'emet... */ Eblock ETes Eblock ETes Test(IL_FAUT(reconstituer_des_grandes_lignes)) Bblock CALS(Putchar(caractere_courant)); /* Le caractere "marqueur" est conserve en toutes circonstances... */ Eblock ATes Bblock Eblock ETes Eblock ETes Eblock ETan RETU_Commande; Eblock ECommande