/*************************************************************************************************************************************/
/* */
/* A J O U T D E C A R A C T E R E S A P R E S C O M P T A G E : */
/* */
/* */
/* Definition : */
/* */
/* Ce programme est destine a compter sur */
/* chaque ligne le nombre d'occurences NO d'un */
/* certain caractere (par exemple ";") et */
/* d'ajouter au bout de chacune de ces lignes */
/* NR repetitions d'une certaine chaine (par */
/* exemple ";") de facon que NO+NR soit egal */
/* a un certain N donne... */
/* */
/* */
/* Author of '$xcg/ajout.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 19991123085855). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 CARACTERE_A_COMPTER \
K_POINT_VIRGULE \
/* Caractere a compter sur chaque ligne. */
#define NOMBRE_D_OCCURENCES_DU_CARACTERE_A_COMPTER \
UN \
/* Nombre d'occurence du caractere a compter sur chaque ligne permettant de determiner */ \
/* le nombre de fois que la chaine 'chaine_a_dupliquer' sera repetee au bout de chaque */ \
/* ligne. */
#define CHAINE_A_DUPLIQUER \
NOM_UNDEF_VIDE \
/* Chaine a repeter eventuellement plusieurs fois au bout de chaque ligne. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* A J O U T D E C A R A C T E R E S A P R E S C O M P T A G E : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Char,INIT(caractere_a_compter,CARACTERE_A_COMPTER));
/* Caractere a compter sur chaque ligne. */
DEFV(Int,INIT(nombre_d_occurences_du_caractere_a_compter,NOMBRE_D_OCCURENCES_DU_CARACTERE_A_COMPTER));
/* Nombre d'occurence du caractere a compter sur chaque ligne permettant de determiner */
/* le nombre de fois que la chaine 'chaine_a_dupliquer' sera repetee au bout de chaque */
/* ligne. */
DEFV(CHAR,INIC(POINTERc(chaine_a_dupliquer),CHAINE_A_DUPLIQUER));
/* Chaine a repeter eventuellement plusieurs fois au bout de chaque ligne. */
DEFV(Int,INIT(compteur_des_occurences_du_caractere_a_compter,ZERO));
/* Comptage sur chaque ligne du nombre d'occurences de 'caractere_a_compter'. */
DEFV(Int,INIT(debut_de_la_chaine_a_dupliquer,UNDEF));
DEFV(Int,INIT(fin_de_la_chaine_a_dupliquer,UNDEF));
/* Definition du debut et de la fin de la chaine a repeter. */
DEFV(Char,INIT(caractere_courant,K_UNDEF));
/* Caractere courant. */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_K("compter=""caractere=",caractere_a_compter);
GET_ARGUMENT_I("occurences=""nombre=",nombre_d_occurences_du_caractere_a_compter);
GET_ARGUMENT_C("dupliquer=""chaine=",chaine_a_dupliquer);
)
);
CALS(chain_Xtaille(chaine_a_dupliquer));
EGAL(debut_de_la_chaine_a_dupliquer,chain_Xtaille_____index_du_premier_caractere);
EGAL(fin_de_la_chaine_a_dupliquer,chain_Xtaille_____index_du_dernier_caractere);
/* Definition de la chaine a repeter. */
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,caractere_a_compter))
Bblock
INCR(compteur_des_occurences_du_caractere_a_compter,I);
/* Comptage sur chaque ligne du nombre d'occurences de 'caractere_a_compter'. */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFEQ(caractere_courant,K_LF))
Bblock
Repe(SOUS(nombre_d_occurences_du_caractere_a_compter,compteur_des_occurences_du_caractere_a_compter))
Bblock
DEFV(Int,INIT(index_de_la_chaine_a_dupliquer,UNDEF));
/* Index de parcours de 'chaine_a_dupliquer'. */
DoIn(index_de_la_chaine_a_dupliquer,debut_de_la_chaine_a_dupliquer,fin_de_la_chaine_a_dupliquer,I)
Bblock
CALS(Putchar(CARA(ITb0(chaine_a_dupliquer,index_de_la_chaine_a_dupliquer))));
/* On transmet la chaine a repeter... */
Eblock
EDoI
Eblock
ERep
CLIR(compteur_des_occurences_du_caractere_a_compter);
/* Et on remet le processus a zero... */
Eblock
ATes
Bblock
Eblock
ETes
CALS(Putchar(CARA(caractere_courant)));
/* On transmet l'octet courant systematiquement, mais evidemment apres avoir traiter */
/* eventuellement le cas de la fin de ligne car, il faut evidemment dupliquer la chaine */
/* avant de "fermer" la ligne avec 'K_LF'... */
Eblock
ETan
RETU_Commande;
Eblock
ECommande