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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.