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