/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E X T R A C T I O N   D ' U N   B I T   P A R   C A R A C T E R E  :                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcg/SelectBits$vv$K' :                                                                                         */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20130705155044).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   FORCER_LA_LONGUEUR_DU_FICHIER                                                                                                 \
                    FAUX
#define   LONGUEUR_FORCEE_DU_FICHIER                                                                                                    \
                    UN
                                        /* Afin d'outrepasser 'GetcharT(...)' si besoin est...                                       */

#define   RANG_DU_BIT_A_EXTRAIRE                                                                                                        \
                    BIT7                                                                                                                \
                                        /* Rang du bit a extraire...                                                                 */

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O M P T A G E   D E S   B I T S   0   E T   1  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(forcer_la_longueur_du_fichier,FORCER_LA_LONGUEUR_DU_FICHIER));
     DEFV(Positive,INIT(longueur_forcee_du_fichier,LONGUEUR_FORCEE_DU_FICHIER));
     DEFV(Positive,INIT(nombre_de_caracteres_recuperes,ZERO));
     DEFV(Logical,INIT(boucler_sur_le_fichier,VRAI));
                                        /* Afin d'outrepasser 'GetcharT(...)' si besoin est...                                       */

     DEFV(Positive,INIT(rang_du_bit_a_extraire,RANG_DU_BIT_A_EXTRAIRE));
                                        /* Rang du bit a extraire...                                                                 */
     DEFV(Int,INIT(rang_du_bit_a_memoriser,BIT0));
     DEFV(CHAR,INIT(caractere_courant_a_assembler,K_NULL));
                                        /* On notera que 'rang_du_bit_a_memoriser' doit etre un 'Int' et non pas un 'Positive'       */
                                        /* a cause du test 'IFLT(...)' qui le concerne ci-apres...                                   */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("forcer_longueur=""forcer=""fl=",forcer_la_longueur_du_fichier);
                         GET_ARGUMENT_I("longueur_fichier=""longueur=""lf=",longueur_forcee_du_fichier);

                         GET_ARGUMENT_I("rang=""bit=",rang_du_bit_a_extraire);
                         )
                    );

     Test(NINCff(rang_du_bit_a_extraire,BIT0,BIT7))
          Bblock
          PRINT_ERREUR("le rang du bit a extraire est incorrect");
          CAL1(Prer3("(la valeur %d etait demandee (non dans [%d,%d]) "
                    ,rang_du_bit_a_extraire
                    ,BIT0,BIT7
                     )
               );

          EGAL(rang_du_bit_a_extraire,RANG_DU_BIT_A_EXTRAIRE);

          CAL1(Prer1("et la valeur par defaut %d est donc retablie)\n",rang_du_bit_a_extraire));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     Tant(IL_FAUT(boucler_sur_le_fichier))
          Bblock
          DEFV(Char,INIT(caractere_courant,Getchar()));
          DEFV(CHAR,INIT(caractere_courant_non_signe,caractere_courant));
                                        /* Caractere courant de l'entree courante...                                                 */

          INCR(nombre_de_caracteres_recuperes,I);
                                        /* Le comptage doit avoir lieu avant le test 'PROBLEMES' ci-dessous si l'on veut que         */
                                        /* test d'arret portant sur 'nombre_de_caracteres_recuperes' fonctionne correctement...      */

          Test(IFOU(IFET(IL_NE_FAUT_PAS(forcer_la_longueur_du_fichier)
                        ,IFNE(caractere_courant,PROBLEMES)
                         )
                   ,IL_FAUT(forcer_la_longueur_du_fichier)
                    )
               )
               Bblock
               EGAL(caractere_courant_a_assembler
                   ,CBITo(caractere_courant_a_assembler
                         ,rang_du_bit_a_memoriser
                         ,TBITo(caractere_courant_non_signe,rang_du_bit_a_extraire)
                          )
                    );
               INCR(rang_du_bit_a_memoriser,I);

               Test(IFGT(rang_du_bit_a_memoriser,BIT7))
                    Bblock
                    CALS(Putchar(caractere_courant_a_assembler));

                    EGAL(rang_du_bit_a_memoriser,BIT0);
                    EGAL(caractere_courant_a_assembler,K_NULL);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IFOU(IFET(IL_NE_FAUT_PAS(forcer_la_longueur_du_fichier)
                        ,IFEQ(caractere_courant,PROBLEMES)
                         )
                   ,IFET(IL_FAUT(forcer_la_longueur_du_fichier)
                        ,IFGE(nombre_de_caracteres_recuperes,longueur_forcee_du_fichier)
                         )
                    )
               )
               Bblock
               EGAL(boucler_sur_le_fichier,FAUX);
                                        /* On arrete lorsque l'on a recupere tout ce l'on souhaitait...                              */
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ETan

     Test(IFNE(rang_du_bit_a_memoriser,BIT0))
          Bblock
          PRINT_ERREUR("Le nombre total de bits a recuperer n'est pas divisible par 'NBITOC'");

          CALS(Putchar(caractere_courant_a_assembler));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     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.