/*************************************************************************************************************************************/ /* */ /* E X T R A C T I O N D ' O C T E T S D A N S U N F I C H I E R : */ /* */ /* */ /* Nota : */ /* */ /* On verra un exemple d'utilisation dans */ /* les commentaires relatifs a '$xcg/extract$K' */ /* dans 'v $xiii/Images$DEF extract'. */ /* */ /* */ /* Author of '$xcg/extract$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1993??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES /* Introduit le 20061116132430 (car tres utile dans 'v $Falias_v_1 .xcg.extract.X'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 NOMBRE_D_OCTETS_A_ELIMINER_EN_TETE \ ZERO \ /* Nombre de caracteres que l'on elimine en tete ; 'ZERO' signifie que l'on elimine rien... */ #define NOMBRE_D_OCTETS_A_CONSERVER_ENSUITE \ ZERO \ /* Nombre de caracteres que l'on conserve ensuite ; 'ZERO' signifie que l'on conserve tout. */ #define NOMBRE_D_OCTETS_A_CONSERVER_PAR_PAQUET \ UN \ /* Nombre de caracteres que l'on conserve dans chaque paquet. */ #define NOMBRE_D_OCTETS_A_ELIMINER_PAR_PAQUET \ ZERO \ /* Nombre de caracteres que l'on elimine dans chaque paquet. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E X T R A C T I O N D ' O C T E T S D A N S U N F I C H I E R : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /* Format du fichier argument : */ /* */ /* en-tete */ /* {debut de paquet,fin de paquet} */ /* {debut de paquet,fin de paquet} */ /* . */ /* . */ /* . */ /* {debut de paquet,fin de paquet} */ /* {debut de paquet,fin de paquet} */ /* queue */ /* */ /* dont on conserve : */ /* */ /* {debut de paquet} */ /* {debut de paquet} */ /* . */ /* . */ /* . */ /* {debut de paquet} */ /* {debut de paquet} */ /* */ DEFV(Int,INIT(nombre_d_octets_a_eliminer_en_tete,NOMBRE_D_OCTETS_A_ELIMINER_EN_TETE)); /* Nombre de caracteres que l'on elimine en tete ; 'ZERO' signifie que l'on elimine rien... */ DEFV(Int,INIT(nombre_d_octets_a_conserver_ensuite,NOMBRE_D_OCTETS_A_CONSERVER_ENSUITE)); /* Nombre de caracteres que l'on conserve ensuite ; 'ZERO' signifie que l'on conserve tout. */ DEFV(Int,INIT(nombre_d_octets_a_conserver_par_paquet,NOMBRE_D_OCTETS_A_CONSERVER_PAR_PAQUET)); /* Nombre de caracteres que l'on conserve dans chaque paquet. */ DEFV(Int,INIT(nombre_d_octets_a_eliminer_par_paquet,NOMBRE_D_OCTETS_A_ELIMINER_PAR_PAQUET)); /* Nombre de caracteres que l'on elimine dans chaque paquet. */ DEFV(Int,INIT(compteur_des_caracteres_dans_le_fichier,ZERO)); /* Ce compteur permet de compter les caracteres dans le fichier. */ DEFV(Int,INIT(compteur_des_caracteres_dans_un_paquet,ZERO)); /* Ce compteur permet de compter les caracteres dans le paquet courant. */ DEFV(Int,INIT(caractere_courant,UNDEF)); /* Caractere courant. ATTENTION, on utilise le type 'Int' et non pas 'Char' a cause de */ /* de l'usage qui sera fait ci-apres de 'GetcharQ(...)', et ce afin que le test de fin */ /* de fichier fonctionne correctement... */ /*..............................................................................................................................*/ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_I("eliminer=",nombre_d_octets_a_eliminer_en_tete); GET_ARGUMENT_I("conserver=",nombre_d_octets_a_conserver_ensuite); GET_ARGUMENT_I("debut=",nombre_d_octets_a_conserver_par_paquet); GET_ARGUMENT_I("fin=",nombre_d_octets_a_eliminer_par_paquet); ) ); Tant(GetcharQ(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. ATTENTION, on */ /* notera bien l'utilisation de 'GetcharQ(...)' et non pas de 'GetcharT(...)' afin de */ /* pouvoir utiliser cette commande avec n'importe qoui (des images par exemple...). */ INCR(compteur_des_caracteres_dans_le_fichier,I); /* Comptage des caracteres dans le fichier... */ Test(IFLE(compteur_des_caracteres_dans_le_fichier,nombre_d_octets_a_eliminer_en_tete)) Bblock /* Elimination d'un certain nombre de caracteres en tete du fichier. */ Eblock ATes Bblock /* Cas ou l'on a depasse la tete du fichier... */ Test(IFOU(IZEQ(nombre_d_octets_a_conserver_ensuite) ,IFLE(compteur_des_caracteres_dans_le_fichier ,ADD2(nombre_d_octets_a_eliminer_en_tete,nombre_d_octets_a_conserver_ensuite) ) ) ) Bblock INCR(compteur_des_caracteres_dans_un_paquet,I); /* Comptage des caracteres dans le paquet courant. Le fichier est decoupe en paquet dont */ /* on prend le debut, mais pas la fin... */ Test(IFLE(compteur_des_caracteres_dans_un_paquet,nombre_d_octets_a_conserver_par_paquet)) Bblock /* Cas ou l'on est au debut du paquet : on prend le caractere courant... */ CALS(Putchar(CARA(caractere_courant))); /* Cas ou les caracteres doivent etre conserves. ATTENTION, l'usage de 'CARA(...)' est */ /* obligatoire puisque 'caractere_courant' a le type 'Int'... */ Eblock ATes Bblock /* Cas ou l'on est a la fin du paquet : on ignore le caractere courant... */ Eblock ETes Test(IFEQ(compteur_des_caracteres_dans_un_paquet ,ADD2(nombre_d_octets_a_conserver_par_paquet,nombre_d_octets_a_eliminer_par_paquet) ) ) Bblock CLIR(compteur_des_caracteres_dans_un_paquet); /* Reinitialisation pour le paquet suivant lorsque l'on est au bout du paquet courant... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Cas ou des caracteres en fin de fichier doivent etre elimines... */ Eblock ETes Eblock ETes Eblock ETan RETU_Commande; Eblock ECommande