/*************************************************************************************************************************************/
/* */
/* P E R M U T A T I O N D E S O C T E T S 2 A 2 : */
/* */
/* */
/* Utilisation : */
/* */
/* Cette commande pourra etre utilisee, par */
/* exemple, pour permuter 8 a 8 les octets */
/* contenus dans une image "standard=FAUX" */
/* lors d'un echange entre une machine de */
/* type 'PC' et une autre machine qui n'est */
/* pas de ce type, et inversement... */
/* */
/* */
/* Author of '$xcg/SwapBytes.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20001005142729). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 TAILLE_DES_GROUPES_D_OCTETS_A_PERMUTER \
size_Float \
/* Taille des groupes d'octets a l'interieur desquels on procede a une permutation. */
#define PRENDRE_EN_COMPTE_LES_K_LF \
VRAI \
/* Doit-on prendre en compte ('VRAI') ou ignorer ('FAUX') les caracteres 'K_LF' (introduit */ \
/* le 20030929123850) ? La valeur par defaut assure la compatibilite anterieure... */ \
/* */ \
/* On notera le 20041201152208 que : */ \
/* */ \
/* echo 1234567890 | $xcg/SwapBytes.01$X K_LF=VRAI */ \
/* */ \
/* donne le resultat suivant : */ \
/* */ \
/* 87654321 */ \
/* 09 */ \
/* */ \
/* Il ne faut pas en deduire qu'un certain miracle fait que tous les huit caracteres, un */ \
/* 'K_LF' est insere. En fait, celui que l'on observe devant "09" est en fait celui qui */ \
/* est emis au bout de la chaine "1234567890" par le 'echo' et qui fait l'objet de la */ \
/* permutation, comme tous les autres caracteres... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define ACCES_A_L_OCTET_COURANT(index) \
IdTb1(groupe_d_octets_courant_a_permuter,INDX(index,PREMIER_CARACTERE),taille_des_groupes_d_octets_a_permuter) \
/* Indexation de l'octet courant. */
#define MEMORISATION_DE_L_OCTET_COURANT(octet) \
Bblock \
Test(IFOU(IFNE(octet,K_LF) \
,IFET(IFEQ(octet,K_LF),IL_FAUT(prendre_en_compte_les_K_LF)) \
) \
) \
/* Ceci a ete introduit le 20030929123850 pour faciliter la manipulation de fichiers */ \
/* de caracteres et surtout faire des petits tests ou l'on n'est pas derange par les */ \
/* caracteres 'K_LF'... */ \
Bblock \
EGAL(ACCES_A_L_OCTET_COURANT(index_de_l_octet_courant),octet); \
/* Rangement de l'octet courant. */ \
INCR(index_de_l_octet_courant,I); \
/* Progression de l'index lorsque le groupe courant n'est pas complet... */ \
\
Test(IFGT(index_de_l_octet_courant,LSTX(PREMIER_CARACTERE,taille_des_groupes_d_octets_a_permuter))) \
Bblock \
PERMUTATION_DU_GROUPE_COURANT_D_OCTETS; \
/* Permutation du groupe courant d'octets lorsqu'il est complet... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Rangement de l'octet courant avec permutation si necessaire... */
#define PERMUTATION_DU_GROUPE_COURANT_D_OCTETS \
Bblock \
Test(IFGT(index_de_l_octet_courant,PREMIER_CARACTERE)) \
Bblock \
Tant(IFGT(index_de_l_octet_courant,PREMIER_CARACTERE)) \
Bblock \
DECR(index_de_l_octet_courant,I); \
/* Progression de l'index tant que l'on n'est pas revenu en tete du groupe... */ \
CALS(Putchar(ACCES_A_L_OCTET_COURANT(index_de_l_octet_courant))); \
/* Sortie de l'octet courant. */ \
Eblock \
ETan \
\
EGAL(index_de_l_octet_courant,PREMIER_CARACTERE); \
/* Retour au debut du groupe... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Permutation du groupe courant d'octets. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P E R M U T A T I O N D E S O C T E T S 2 A 2 : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Positive,INIT(taille_des_groupes_d_octets_a_permuter,TAILLE_DES_GROUPES_D_OCTETS_A_PERMUTER));
/* Taille des groupes d'octets a l'interieur desquels on procede a une permutation. */
DEFV(Logical,INIT(prendre_en_compte_les_K_LF,PRENDRE_EN_COMPTE_LES_K_LF));
/* Doit-on prendre en compte ('VRAI') ou ignorer ('FAUX') les caracteres 'K_LF' (introduit */
/* le 20030929123850) ? La valeur par defaut assure la compatibilite anterieure... */
/* */
/* On notera le 20041201152208 que : */
/* */
/* echo 1234567890 | $xcg/SwapBytes.01$X K_LF=VRAI */
/* */
/* donne le resultat suivant : */
/* */
/* 87654321 */
/* 09 */
/* */
/* Il ne faut pas en deduire qu'un certain miracle fait que tous les huit caracteres, un */
/* 'K_LF' est insere. En fait, celui que l'on observe devant "09" est en fait celui qui */
/* est emis au bout de la chaine "1234567890" par le 'echo' et qui fait l'objet de la */
/* permutation, comme tous les autres caracteres... */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_I("taille=""groupes=",taille_des_groupes_d_octets_a_permuter);
GET_ARGUMENT_L("LF=""K_LF=",prendre_en_compte_les_K_LF);
)
);
begin_nouveau_block
Bblock
DEFV(Char,DdTb1(POINTERc
,groupe_d_octets_courant_a_permuter
,taille_des_groupes_d_octets_a_permuter
,cMalo(taille_des_groupes_d_octets_a_permuter)
)
);
/* Allocation du vecteur destine a memoriser le groupe d'octets courant. */
DEFV(Int,INIT(index_de_l_octet_courant,PREMIER_CARACTERE));
/* Index du premier octet. */
DEFV(Int,INIT(octet_courant,K_UNDEF));
/* Octet courant. ATTENTION, on utilise le type 'Int' et non pas 'Char' a */
/* cause de de l'usage qui sera fait ci-apres de 'GetcharQ(...)', et ce afin que le test */
/* de fin de fichier fonctionne correctement... */
Tant(GetcharQ(octet_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. */
MEMORISATION_DE_L_OCTET_COURANT(octet_courant);
/* Rangement de l'octet courant avec permutation si necessaire... */
Eblock
ETan
PERMUTATION_DU_GROUPE_COURANT_D_OCTETS;
/* Au cas ou le nombre d'octets total ne serait pas un multiple du parametre */
/* 'taille_des_groupes_d_octets_a_permuter'. */
Eblock
end_nouveau_block
RETU_Commande;
Eblock
ECommande