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