/*************************************************************************************************************************************/
/* */
/* C A L C U L D E " C L E F S " A P A R T I R D ' U N F I C H I E R : */
/* */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * ** * * * * * ** * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * */
/* * * * * ** * * * * * ** */
/* * * * * * * * * * * * * * * * * * * * * * * */
/* */
/* */
/* ATTENTION : */
/* */
/* J'ai note le 20030814103149 (suite a */
/* 'v $xig/fonct$vv$FON 20030805111250') */
/* que le programme 'v $xcg/chiffrage.01$K' */
/* ne gerait pas explicitement les debordements. */
/* Cela fait que les clefs calculees n'ont en */
/* toute generalite qu'une validite locale et */
/* qu'exploitee autrement, elles peuvent induire */
/* des problemes de portabilite... */
/* */
/* */
/* Author of '$xcg/chiffrage.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1989??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
@define PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES
/* Introduit le 20061114154725 (car tres utile dans '$xE'...). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 BORNE_INFERIEURE \
UN
#define BORNE_SUPERIEURE \
MILLION
/* Pour limiter la croissane ces 'SOMME_N'... */
#define METTRE_UN_ESPACE \
VRAI
#define EDITER_LE_NUMERO_DU_CARACTERE_COURANT \
VRAI
#define EDITER_SOMME_0 \
VRAI
#define EDITER_SOMME_1 \
VRAI
#define EDITER_SOMME_2 \
VRAI
/* Controle de l'edition finale... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define LIMITE(x) \
MODU(x,borne_inferieure,borne_superieure) \
/* Pour limiter la croissane ces 'SOMME_N'... */
#define EDITER_UNE_SOMME(editer_la_somme,somme_a_editer) \
Bblock \
Test(IL_FAUT(mettre_un_espace)) \
Bblock \
CAL2(Prin0(" ")); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(editer_la_somme)) \
Bblock \
CAL2(Prin1("%d",somme_a_editer)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Edition d'une somme quelconque. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L D E " C L E F S " A P A R T I R D ' U N F I C H I E R : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Int,INIT(borne_inferieure,BORNE_INFERIEURE));
DEFV(Int,INIT(borne_superieure,BORNE_SUPERIEURE));
/* Pour limiter la croissane ces 'SOMME_N'... */
DEFV(Logical,INIT(mettre_un_espace,METTRE_UN_ESPACE));
DEFV(Logical,INIT(editer_le_numero_du_caractere_courant,EDITER_LE_NUMERO_DU_CARACTERE_COURANT));
DEFV(Logical,INIT(editer_somme_0,EDITER_SOMME_0));
DEFV(Logical,INIT(editer_somme_1,EDITER_SOMME_1));
DEFV(Logical,INIT(editer_somme_2,EDITER_SOMME_2));
/* Controle de l'edition finale... */
DEFV(Int,INIT(numero_du_caractere_courant,ZERO));
/* Numero du caractere courant. */
DEFV(Int,INIT(somme_0,ZERO));
/* Somme des caracteres, */
DEFV(Int,INIT(somme_1,ZERO));
/* Somme des caracteres pondere par leur numero, */
DEFV(Int,INIT(somme_2,ZERO));
/* Somme des caracteres pondere par le carre de leur numero. */
/* Nota : les trois sommes sont entieres afin d'eviter les overflows de conversion... */
DEFV(Char,INIT(caractere_courant,K_UNDEF));
/* Caractere courant. */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_I("inf=",borne_inferieure);
GET_ARGUMENT_I("sup=",borne_superieure);
GET_ARGUMENT_L("espace=",mettre_un_espace);
GET_ARGUMENT_L("numero=",editer_le_numero_du_caractere_courant);
GET_ARGUMENT_L("somme_0=",editer_somme_0);
GET_ARGUMENT_L("somme_1=",editer_somme_1);
GET_ARGUMENT_L("somme_2=",editer_somme_2);
)
);
Tant(GetcharT(caractere_courant))
Bblock
/* Le caractere courant de l'entree courante est recupere ; et on boucle */
/* sur cette recuperation tant que l'on n'est pas au bout du fichier. */
INCR(numero_du_caractere_courant,I);
/* Numero du caractere courant. */
INCR(somme_0,NEUT(caractere_courant));
/* Somme des caracteres, */
/* */
/* ATTENTION : le debordement eventuel de 'somme_0' n'est pas gere explicitement... */
INCR(somme_1,MUL2(NEUT(numero_du_caractere_courant),caractere_courant));
EGAL(somme_1,LIMITE(somme_1));
/* Somme des caracteres pondere par leur numero, */
/* */
/* ATTENTION : le debordement eventuel de 'somme_1' n'est pas gere explicitement... */
INCR(somme_2,MUL2(EXP2(numero_du_caractere_courant),caractere_courant));
EGAL(somme_2,LIMITE(somme_2));
/* Somme des caracteres pondere par le carre de leur numero. */
/* */
/* ATTENTION : le debordement eventuel de 'somme_2' n'est pas gere explicitement... */
Eblock
ETan
EDITER_UNE_SOMME(editer_le_numero_du_caractere_courant,numero_du_caractere_courant);
EDITER_UNE_SOMME(editer_somme_0,somme_0);
EDITER_UNE_SOMME(editer_somme_1,somme_1);
EDITER_UNE_SOMME(editer_somme_2,somme_2);
RETU_Commande;
Eblock
ECommande