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