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