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