/*************************************************************************************************************************************/
/* */
/* C O M P T A G E D E S B I T S 0 E T 1 : */
/* */
/* */
/* Author of '$xcg/CompteBits$vv$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20130627090714). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 EDITER_LE_NOMBRE_DE_BITS_0_ \
FAUX
#define EDITER_LE_NOMBRE_DE_BITS__1 \
FAUX
#define EDITER_LE_NOMBRE_DE_BITS_01 \
FAUX
#define EDITER_LA_FRACTION_DE_BITS_0_ \
VRAI
#define EDITER_LA_FRACTION_DE_BITS__1 \
FAUX
#define EDITER_LES_MESSAGES_D_EN_TETE \
VRAI
/* Que faut-il editer ? */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define EDITER_UNE_VALEUR(valeur,editer_cette_valeur,message_d_en_tete,format) \
Bblock \
Test(IL_FAUT(editer_cette_valeur)) \
Bblock \
Test(IL_FAUT(editer_les_messages_d_en_tete)) \
Bblock \
CAL3(Prme1("%s = ",message_d_en_tete)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
CAL3(Prme1(format,valeur)); \
CALS(Fsauts_de_lignes(UN)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Procedure d'edition conditionnelle (introduite le 20130627131410). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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(Logical,INIT(editer_le_nombre_de_bits_0_,EDITER_LE_NOMBRE_DE_BITS_0_));
DEFV(Logical,INIT(editer_le_nombre_de_bits__1,EDITER_LE_NOMBRE_DE_BITS__1));
DEFV(Logical,INIT(editer_le_nombre_de_bits_01,EDITER_LE_NOMBRE_DE_BITS_01));
DEFV(Logical,INIT(editer_la_fraction_de_bits_0_,EDITER_LA_FRACTION_DE_BITS_0_));
DEFV(Logical,INIT(editer_la_fraction_de_bits__1,EDITER_LA_FRACTION_DE_BITS__1));
DEFV(Logical,INIT(editer_les_messages_d_en_tete,EDITER_LES_MESSAGES_D_EN_TETE));
/* Que faut-il editer ? */
DEFV(Positive,INIT(compteur_des_bits_0_,ZERO));
DEFV(Positive,INIT(compteur_des_bits__1,ZERO));
DEFV(Positive,INIT(compteur_des_bits_01,ZERO));
/* Differents compteurs... */
/*..............................................................................................................................*/
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_L("editer_0=""e0=",editer_le_nombre_de_bits_0_);
GET_ARGUMENT_L("editer_1=""e1=",editer_le_nombre_de_bits__1);
GET_ARGUMENT_L("editer_01=""e01=",editer_le_nombre_de_bits_01);
GET_ARGUMENT_L("editer_fraction_0=""ef0=",editer_la_fraction_de_bits_0_);
GET_ARGUMENT_L("editer_fraction_1=""ef1=",editer_la_fraction_de_bits__1);
GET_ARGUMENT_L("messages=""message=""Men_tete=",editer_les_messages_d_en_tete);
)
);
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
Repe(NBITOC)
Bblock
DEFV(Char,INIT(bit_courant,ETLO(caractere_courant_non_signe,BIT)));
INCR(compteur_des_bits_0_,COND(IFEQ(bit_courant,ZERO),I,ZERO));
INCR(compteur_des_bits__1,COND(IFEQ(bit_courant,UN),I,ZERO));
INCR(compteur_des_bits_01,I);
/* Differents comptages... */
EGAL(caractere_courant_non_signe,SLRS(caractere_courant_non_signe,BIT));
/* Decalage du caractere courant... */
Eblock
ERep
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(compteur_des_bits_01,ADD2(compteur_des_bits_0_,compteur_des_bits__1)))
Bblock
PRINT_ERREUR("le comptage des bits est incoherents");
Eblock
ATes
Bblock
Eblock
ETes
EDITER_UNE_VALEUR(compteur_des_bits_0_,editer_le_nombre_de_bits_0_,"NombreBits_0","%d");
EDITER_UNE_VALEUR(compteur_des_bits__1,editer_le_nombre_de_bits__1,"NombreBits_1","%d");
EDITER_UNE_VALEUR(compteur_des_bits_01,editer_le_nombre_de_bits_01,"NombreBits_01","%d");
EDITER_UNE_VALEUR(DIVI(FLOT(compteur_des_bits_0_),FLOT(compteur_des_bits_01))
,editer_la_fraction_de_bits_0_
,"FractionBits_0"
,"%f"
);
EDITER_UNE_VALEUR(DIVI(FLOT(compteur_des_bits__1),FLOT(compteur_des_bits_01))
,editer_la_fraction_de_bits__1
,"FractionBits_1"
,"%f"
);
RETU_Commande;
Eblock
ECommande