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