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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.