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