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



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.