/*************************************************************************************************************************************/ /* */ /* T A B U L A T I O N R E C U R S I V E : */ /* */ /* */ /* Author of '$xcp/TabRecursive$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20101223082831). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 MARQUEUR_DE_DEBUT_ET_DE_FIN \ K_POUR_CENT \ /* Marqueur de debut et de fin de traitement. Jusqu'au 20101223172029 'K_A_ROND' etait */ \ /* utilise or, malheureusement c'est le caractere de decoupage utilise par l'alias 'use' */ \ /* ('v $Falias_use MaRqUeUr'). */ #define CONSERVER_LE_MARQUEUR_DE_DEBUT_ET_DE_FIN \ FAUX \ /* Faut-il conserver ('VRAI') ou pas ('FAUX') le marqueur de debut et de fin de traitement */ \ /* (introduit le 20101228184757). */ #define TABULATION_STANDARD_DE_DEBUT_DE_LIGNE \ VINGT #define TABULATION_STANDARD_ELEMENTAIRE \ CINQ /* Tabulations standards... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T A B U L A T I O N R E C U R S I V E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIT(marqueur_de_debut_et_de_fin,MARQUEUR_DE_DEBUT_ET_DE_FIN)); /* Marqueur de debut et de fin de traitement. Jusqu'au 20101223172029 'K_A_ROND' etait */ /* utilise or, malheureusement c'est le caractere de decoupage utilise par l'alias 'use' */ /* ('v $Falias_use MaRqUeUr'). */ DEFV(Logical,INIT(conserver_le_marqueur_de_debut_et_de_fin,CONSERVER_LE_MARQUEUR_DE_DEBUT_ET_DE_FIN)); /* Faut-il conserver ('VRAI') ou pas ('FAUX') le marqueur de debut et de fin de traitement */ /* (introduit le 20101228184757). */ DEFV(Positive,INIT(tabulation_standard_de_debut_de_ligne,TABULATION_STANDARD_DE_DEBUT_DE_LIGNE)); DEFV(Positive,INIT(tabulation_standard_elementaire,TABULATION_STANDARD_ELEMENTAIRE)); /* Tabulations standards... */ DEFV(Positive,INIT(compteur_de_couples_de_parentheses,ZERO)); /* Cet indicateur indique en permanence la profondeur de parentheses imbriquees. */ DEFV(Char,INIT(caractere_courant,K_UNDEF)); /* Caractere courant. */ DEFV(Char,INIT(le_traitement_est_en_cours,FAUX)); /* A priori, nous sommes hors de la sequence a traiter... */ /*..............................................................................................................................*/ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_I("tabulation_debut_ligne=""tab_ligne=""tdl=",tabulation_standard_de_debut_de_ligne); GET_ARGUMENT_I("tabulation_elementaire=""tab=""te=",tabulation_standard_elementaire); GET_ARGUMENT_K("marqueur=",marqueur_de_debut_et_de_fin); GET_ARGUMENT_L("conserver_marqueur=""conserver=""cons=" ,conserver_le_marqueur_de_debut_et_de_fin ); ) ); 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(IFEQ(caractere_courant,marqueur_de_debut_et_de_fin)) Bblock EGAL(le_traitement_est_en_cours,NOTL(le_traitement_est_en_cours)); /* On rentre ou on sort d'une sequence a traiter... */ Test(EST_VRAI(le_traitement_est_en_cours)) Bblock Repe(tabulation_standard_de_debut_de_ligne) Bblock CALS(Putchar(K_BLANC)); Eblock ERep Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(EST_VRAI(le_traitement_est_en_cours)) Bblock Test(IFET(IFNE(caractere_courant,K_ANTI_SLASH),IFNE(caractere_courant,K_LF))) Bblock Test(IFEQ(caractere_courant,K_PG)) Bblock INCR(compteur_de_couples_de_parentheses,I); /* Ouverture d'un couple de parentheses. */ Eblock ATes Bblock Eblock ETes Test(IFEQ(caractere_courant,K_VIRGULE)) Bblock CALS(Putchar(K_BLANC)); CALS(Putchar(K_ANTI_SLASH)); CALS(Putchar(K_LF)); Repe(ADD2(tabulation_standard_de_debut_de_ligne ,SOUS(MUL2(compteur_de_couples_de_parentheses,tabulation_standard_elementaire),UN) ) ) Bblock CALS(Putchar(K_BLANC)); Eblock ERep Eblock ATes Bblock Eblock ETes Test(IFEQ(caractere_courant,K_PD)) Bblock CALS(Putchar(K_BLANC)); CALS(Putchar(K_ANTI_SLASH)); CALS(Putchar(K_LF)); Repe(ADD2(tabulation_standard_de_debut_de_ligne ,NEUT(MUL2(compteur_de_couples_de_parentheses,tabulation_standard_elementaire)) ) ) Bblock CALS(Putchar(K_BLANC)); Eblock ERep DECR(compteur_de_couples_de_parentheses,I); /* Ouverture d'un couple de parentheses. */ Eblock ATes Bblock Eblock ETes Test(IFOU(IFNE(caractere_courant,marqueur_de_debut_et_de_fin) ,IFET(IFEQ(caractere_courant,marqueur_de_debut_et_de_fin) ,IL_FAUT(conserver_le_marqueur_de_debut_et_de_fin) ) ) ) Bblock CALS(Putchar(caractere_courant)); /* En temps normal, on transmet les caracteres a l'exception du marqueur de sequence... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Les 'K_LF' sont ignores... */ Eblock ETes Eblock ATes Bblock Test(IFOU(IFNE(caractere_courant,marqueur_de_debut_et_de_fin) ,IFET(IFEQ(caractere_courant,marqueur_de_debut_et_de_fin) ,IL_FAUT(conserver_le_marqueur_de_debut_et_de_fin) ) ) ) Bblock CALS(Putchar(caractere_courant)); /* En dehors de la sequence a traiter, les caracteres sont transmis tels quels a l'exception */ /* du marqueur de sequence... */ Eblock ATes Bblock Eblock ETes Eblock ETes Eblock ETan CALS(Putchar(K_LF)); /* Et on envoie un 'K_LF' a la fin... */ RETU_Commande; Eblock ECommande