/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S E L E C T I O N   D ' E L E M E N T S   D A N S   C H A Q U E   L I G N E   D ' U N   F I C H I E R  :                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce programme est destine a supprimer                                                                           */
/*                  certains champs dans chaque ligne d'un                                                                           */
/*                  fichier. Ces champs sont delimites par                                                                           */
/*                  un caractere (par exemple ";"). La structure                                                                     */
/*                  des lignes est definie par une chaine de                                                                         */
/*                  caracteres, chacun d'entre-eux representant                                                                      */
/*                  le champ de meme rang. Les champs a conserver                                                                    */
/*                  sont representes par un code (par exemple "+")                                                                   */
/*                  et les champs a supprimer, par un autre (par                                                                     */
/*                  exemple "-").                                                                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota important :                                                                                                           */
/*                                                                                                                                   */
/*                    Lorsqu'il n'y a pas assez de marqueurs                                                                         */
/*                  par rapport au nombre de champs traites,                                                                         */
/*                  le dernier marqueur est virtuellement                                                                            */
/*                  repetes autant de fois que necessaire.                                                                           */
/*                  Ainsi, par exemple :                                                                                             */
/*                                                                                                                                   */
/*                                      echo "1;2;3;4;5;6;7;8;9;0;" | $xcg/selection.01$X structure="--+"                            */
/*                                                                                                                                   */
/*                                                                                                    /|\                            */
/*                                            - - + + + + + + + +                                      |                             */
/*                                                |____________________________________________________|                             */
/*                                                                                                                                   */
/*                  donnera :                                                                                                        */
/*                                                                                                                                   */
/*                                      3;4;5;6;7;8;9;0;                                                                             */
/*                                                                                                                                   */
/*                  (le dernier "+" etant donc duplique),                                                                            */
/*                  alors que :                                                                                                      */
/*                                                                                                                                   */
/*                                      echo "1;2;3;4;5;6;7;8;9;0;" | $xcg/selection.01$X structure="--+-"                           */
/*                                                                                                                                   */
/*                                                                                                     /|\                           */
/*                                            - - + - - - - - - -                                       |                            */
/*                                                  |___________________________________________________|                            */
/*                                                                                                                                   */
/*                  donnera :                                                                                                        */
/*                                                                                                                                   */
/*                                      3;                                                                                           */
/*                                                                                                                                   */
/*                  (le dernier "-" etant donc duplique).                                                                            */
/*                  On verra ainsi l'usage qui en est fait                                                                           */
/*                  dans 'v $xrF/files.01$vv$Y FTextract'.                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcg/selection.01$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19991122160023).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   MARQUEUR_DE_SELECTION                                                                                                         \
                    K_PLUS                                                                                                              \
                                        /* Marqueur indiquant les champs a conserver.                                                */
#define   MARQUEUR_DE_SUPPRESSION                                                                                                       \
                    K_MOINS                                                                                                             \
                                        /* Marqueur indiquant les champs a supprimer.                                                */
#define   SEPARATEUR_DES_CHAMPS                                                                                                         \
                    K_POINT_VIRGULE                                                                                                     \
                                        /* Separateur entre les champs.                                                              */

#define   STRUCTURE_D_UNE_LIGNE                                                                                                         \
                    C_PLUS                                                                                                              \
                                        /* Definition de la structure d'une ligne.                                                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S E L E C T I O N   D ' E L E M E N T S   D A N S   C H A Q U E   L I G N E   D ' U N   F I C H I E R  :                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Char,INIT(marqueur_de_selection,MARQUEUR_DE_SELECTION));
                                        /* Marqueur indiquant les champs a conserver.                                                */
     DEFV(Char,INIT(marqueur_de_suppression,MARQUEUR_DE_SUPPRESSION));
                                        /* Marqueur indiquant les champs a supprimer.                                                */
     DEFV(Char,INIT(separateur_des_champs,SEPARATEUR_DES_CHAMPS));
                                        /* Separateur entre les champs.                                                              */
     DEFV(CHAR,INIC(POINTERc(structure_d_une_ligne),STRUCTURE_D_UNE_LIGNE));
                                        /* Definition de la structure d'une ligne.                                                   */

     DEFV(Int,INIT(debut_de_la_structure,UNDEF));
     DEFV(Int,INIT(fin_de_la_structure,UNDEF));
                                        /* Definition du debut et de la fin de la structure.                                         */
     DEFV(Int,INIT(index_de_la_structure,UNDEF));
                                        /* Definition de l'index courant de la structure.                                            */

     DEFV(Int,INIT(supprimer_le_champ_courant,LUNDEF));
                                        /* Permet de savoir si le champ courant est a supprimer ou a conserver...                    */

     DEFV(Char,INIT(caractere_courant,K_UNDEF));
                                        /* Caractere courant.                                                                        */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_K("selection=",marqueur_de_selection);
                         GET_ARGUMENT_K("suppression=",marqueur_de_suppression);
                         GET_ARGUMENT_K("separateur=",separateur_des_champs);
                         GET_ARGUMENT_C("structure=""ligne=",structure_d_une_ligne);
                         )
                    );

     Test(IFEQ(marqueur_de_selection,marqueur_de_suppression))
          Bblock
          PRINT_ERREUR("les marqueurs de selection et de suppression sont identiques");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     CALS(chain_Xtaille(structure_d_une_ligne));
     EGAL(debut_de_la_structure,chain_Xtaille_____index_du_premier_caractere);
     EGAL(fin_de_la_structure,chain_Xtaille_____index_du_dernier_caractere);
     EGAL(index_de_la_structure,debut_de_la_structure);
                                        /* Definition de la structure.                                                               */

     Test(IFLT(fin_de_la_structure,debut_de_la_structure))
          Bblock
          PRINT_ERREUR("la definition de la structure des lignes est vide");
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     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.                        */
          DEFV(Char,INIT(marqueur_courant,ITb0(structure_d_une_ligne,index_de_la_structure)));
                                        /* Marqueur courant dans la structure.                                                       */

          Test(IFEQ(marqueur_courant,marqueur_de_suppression))
               Bblock
               EGAL(supprimer_le_champ_courant,VRAI);
                                        /* Cas ou le champ courant est a supprimer...                                                */
               Eblock
          ATes
               Bblock
               Test(IFEQ(marqueur_courant,marqueur_de_selection))
                    Bblock
                    EGAL(supprimer_le_champ_courant,FAUX);
                                        /* Cas ou le champ courant doit etre conserve...                                             */
                    Eblock
               ATes
                    Bblock
                    PRINT_ERREUR("le marqueur utilise n'est pas l'un des deux marqueurs declares");
                    CAL1(Prer1("marqueur utilise.......='%c'\n",marqueur_courant));
                    CAL1(Prer1("marqueur de suppression='%c'\n",marqueur_de_suppression));
                    CAL1(Prer1("marqueur de selection..='%c'\n",marqueur_de_selection));
                    EGAL(supprimer_le_champ_courant,FAUX);
                    Eblock
               ETes
               Eblock
          ETes

          Test(IL_FAUT(supprimer_le_champ_courant))
               Bblock
                                        /* Cas ou le champ doit etre supprime.                                                       */
               Eblock
          ATes
               Bblock
               CALS(Putchar(CARA(caractere_courant)));
                                        /* On transmet l'octet courant dans le cas ou le champ doit etre conserve.                   */
               Eblock
          ETes

          Test(IFOU(IFEQ(caractere_courant,separateur_des_champs),IFEQ(caractere_courant,K_LF)))
               Bblock
               Test(IFLT(index_de_la_structure,fin_de_la_structure))
                    Bblock
                    INCR(index_de_la_structure,I);
                                        /* Progression de l'index dans la structure.                                                 */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFEQ(caractere_courant,K_LF))
               Bblock
               Test(IL_FAUT(supprimer_le_champ_courant))
                    Bblock
                    CALS(Putchar(CARA(caractere_courant)));
                                        /* Cas ou le champ doit etre supprime, il faut transmettre 'K_LF' malgre tout...             */
                    Eblock
               ATes
                    Bblock
                                        /* Lorsque le champ doit etre conserve, 'K_LF' a deja ete transmis...                        */
                    Eblock
               ETes

               EGAL(index_de_la_structure,debut_de_la_structure);
                                        /* A chaque nouvelle ligne, on revient au debut de la strcuture...                           */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          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.