/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C O M P R E S S I O N / D E C O M P R E S S I O N  :                                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrC/CompressionDeCompression.01$vv$I' :                                                                        */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 20130926073743).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifndef   define_dimX_dimY
                                        /* Introduit le 20141024150620...                                                            */
#         undef     dimX
#         define    nodefine_dimX
int       dimX;

#         undef     dimY
#         define    nodefine_dimY
int       dimY;
                                        /* Introduit le 20131122152913 apres l'introduction de 'v $xrCMesures_CDC_seules.01$vv$Z'.   */
                                        /*                                                                                           */
                                        /* Le 20131212103838 {dimX,dimY} sont passes de '#define" a 'int' afin d'accelerer           */
                                        /* considerablement le processus...                                                          */
#else
                                        /* Introduit le 20131122152913 pour accelerer la decompression utilisant le programme        */
                                        /* 'v .xrC.EffectuerCompilations.01.vv.Z DeCompressionRunLengthEncoding.02$vv'...            */
#endif

#include  "images.01.vv.I"

extern    int       system();
extern    char      *getenv();

char      *Fgetenv(char *variable)
                                        /* Acces a une variable d'environnement...                                                   */
          {
          char      *valeur=getenv(variable);

          if        (valeur == 0)
                    {
                    fprintf(stderr,"Il manque un 'source    $xrC/Definitions.01$vv$Y' (pour la variable '%s').\n",variable);

                    exit(NOK);
                                        /* C'est beaucoup plus prudent...                                                            */
                    }
          else
                    {
                    }

          return(valeur);
          }

#define   cat                                                                                                                           \
                    "cat"
#define   CP                                                                                                                            \
                    "cp"
#define   MV                                                                                                                            \
                    "mv"
#define   DELETE                                                                                                                        \
                    "rm -f"
#define   ESPACE                                                                                                                        \
                    " "
#define   PIPE                                                                                                                          \
                    " | "
#define   REDIRECTION                                                                                                                   \
                    " > "
#define   IGNORER                                                                                                                       \
                    " > /dev/null 2>&1"
                                        /* Quelques commandes utiles...                                                              */
                                        /*                                                                                           */
                                        /* On notera le 20141009144749 l'espace indispensable ci-dessus devant les">"s et ce a      */
                                        /* cause du fichier 'v $xiMd/xrC_____CompressionDeCompression.01$vv$I.$m4' qui reference     */
                                        /* ce fichier d'includes...                                                                  */

int       EditerCommande=FAUX;
int       status;

int       CommandeSysteme(char *commande)
                                        /* Execution d'une commande systeme (fonction introduite le 20141011092502).                 */
          {
          if        (EditerCommande == VRAI)
                    {
                    fprintf(stderr,"commande : '%s'\n",commande);
                    }
          else
                    {
                    }

          status=system(commande);

          return(status);
          }

#define   FORCAGE___COMMANDE(commande)                                                                                                  \
                    CommandeSysteme(commande)

#define   EXECUTION_COMMANDE(commande)                                                                                                  \
                    {                                                                                                                   \
                    if        (FORCAGE___COMMANDE(commande) == OK)                                                                      \
                              {                                                                                                         \
                              }                                                                                                         \
                    else                                                                                                                \
                              {                                                                                                         \
                              fprintf(stderr,"Erreur d'execution (%d) de la commande '%s'.\n",status,commande);                         \
                              exit(NOK);                                                                                                \
                              }                                                                                                         \
                    }                                                                                                                   \
                                        /* Execution d'une commande quelconque sous '$SH'.                                           */

#define   NOM_DU_FICHIER                                                                                                                \
                    argv[1]
#define   DECOMPRESSEUR_ABSENT                                                                                                          \
                    ""

#ifdef    Genere_CDC_00
                                        /* Introduit le 20151123103407 pour plus de generalite...                                    */
#         define   Compresseur___00                                                                                                     \
                              Fgetenv("SCompresseur___00")
#         define   DeCompresseur___00                                                                                                   \
                              Fgetenv("SDeCompresseur_00")
#         define   PostFixe_CDC__00                                                                                                     \
                              Fgetenv("PostFixe_CDC__00")
                                        /* Definition du couple {compresseur,decompresseur} 0.                                       */
#else
#endif

#ifdef    Genere_CDC_01
#         define    Compresseur___01                                                                                                    \
                              Fgetenv("SCompresseur___01")
#         define    DeCompresseur___01                                                                                                  \
                              Fgetenv("SDeCompresseur_01")
#         define    PostFixe_CDC__01                                                                                                    \
                              Fgetenv("PostFixe_CDC__01")
                                        /* Definition du couple {compresseur,decompresseur} 1.                                       */
#else
#endif

#ifdef    Genere_CDC_02
#         define    Compresseur___02                                                                                                    \
                              Fgetenv("SCompresseur___02")
#         define    DeCompresseur___02                                                                                                  \
                              Fgetenv("SDeCompresseur_02")
#         define    PostFixe_CDC__02                                                                                                    \
                              Fgetenv("PostFixe_CDC__02")
                                        /* Definition du couple {compresseur,decompresseur} 2.                                       */
#else
#endif

#ifdef    Genere_CDC_03
#         define    BCompresseur___03                                                                                                   \
                              Fgetenv("BCompresseur___03")
#         define    BDeCompresseur___03                                                                                                 \
                              Fgetenv("BDeCompresseur_03")
                                        /* Definition du couple {compresseur,decompresseur} "Basique" 3.                             */
#         define    Compresseur___03                                                                                                    \
                              Fgetenv("SCompresseur___03")
#         define    DeCompresseur___03                                                                                                  \
                              Fgetenv("SDeCompresseur_03")
#         define    PostFixe_CDC__03                                                                                                    \
                              Fgetenv("PostFixe_CDC__03")
                                        /* Definition du couple {compresseur,decompresseur} 3 (introduit le 20130919212714).         */
#else
#         define    DeCompresseur___03                                                                                                  \
                              DECOMPRESSEUR_ABSENT
                                        /* Introduit le 20151123110447 a cause de la definition de 'DECOMPRESSION_2(...)' ci-apres.  */
#endif

#ifdef    Genere_CDC_04
#         define    BCompresseur___04                                                                                                   \
                              Fgetenv("BCompresseur___04")
#         define    BDeCompresseur___04                                                                                                 \
                              Fgetenv("BDeCompresseur_04")
                                        /* Definition du couple {compresseur,decompresseur} "Basique" 4. Ces definitions ont ete     */
                                        /* introduites le 20140123165006...                                                          */
#         define    Compresseur___04                                                                                                    \
                              Fgetenv("SCompresseur___04")
#         define    DeCompresseur___04                                                                                                  \
                              Fgetenv("SDeCompresseur_04")
#         define    PostFixe_CDC__04                                                                                                    \
                              Fgetenv("PostFixe_CDC__04")
                                        /* Definition du couple {compresseur,decompresseur} 4 (introduit le 20130920121800).         */
#else
#         define    DeCompresseur___04                                                                                                  \
                              DECOMPRESSEUR_ABSENT
                                        /* Introduit le 20151123110447 a cause de la definition de 'DECOMPRESSION_2(...)' ci-apres.  */
#endif

#ifdef    Genere_CDC_05
#         define    Compresseur___05                                                                                                    \
                              Fgetenv("SCompresseur___05")
#         define    DeCompresseur___05                                                                                                  \
                              Fgetenv("SDeCompresseur_05")
#         define    PostFixe_CDC__05                                                                                                    \
                              Fgetenv("PostFixe_CDC__05")
                                        /* Definition du couple {compresseur,decompresseur} 5 (introduit le 20130925103907).         */
#else
#endif

#ifdef    Genere_CDC_06
#         define    Compresseur___06                                                                                                    \
                              Fgetenv("SCompresseur___06")
#         define    DeCompresseur___06                                                                                                  \
                              Fgetenv("SDeCompresseur_06")
#         define    PostFixe_CDC__06                                                                                                    \
                              Fgetenv("PostFixe_CDC__06")
                                        /* Definition du couple {compresseur,decompresseur} 6 (introduit le 20130925103907).         */
#else
#endif

#ifdef    Genere_CDC_07
#         define    Compresseur___07                                                                                                    \
                              Fgetenv("SCompresseur___07")
#         define    DeCompresseur___07                                                                                                  \
                              Fgetenv("SDeCompresseur_07")
#         define    PostFixe_CDC__07                                                                                                    \
                              Fgetenv("PostFixe_CDC__07")
                                        /* Definition du couple {compresseur,decompresseur} 7 (introduit le 20130925103907).         */
#else
#endif

#ifdef    Genere_CDC_08
#         define    Compresseur___08                                                                                                    \
                              Fgetenv("SCompresseur___08")
#         define    DeCompresseur___08                                                                                                  \
                              Fgetenv("SDeCompresseur_08")
#         define    PostFixe_CDC__08                                                                                                    \
                              Fgetenv("PostFixe_CDC__08")
                                        /* Definition du couple {compresseur,decompresseur} 8 (introduit le 20130925103907).         */
#else
#endif

#ifdef    Genere_CDC_09
#         define    Compresseur___09                                                                                                    \
                              Fgetenv("SCompresseur___09")
#         define    DeCompresseur___09                                                                                                  \
                              Fgetenv("SDeCompresseur_09")
#         define    PostFixe_CDC__09                                                                                                    \
                              Fgetenv("PostFixe_CDC__09")
                                        /* Definition du couple {compresseur,decompresseur} 9 (introduit le 20130925103907).         */
#else
#endif

#ifdef    Genere_CDC_0A
#         define    Compresseur___0A                                                                                                    \
                              Fgetenv("SCompresseur___0A")
#         define    DeCompresseur___0A                                                                                                  \
                              Fgetenv("SDeCompresseur_0A")
#         define    PostFixe_CDC__0A                                                                                                    \
                              Fgetenv("PostFixe_CDC__0A")
                                        /* Definition du couple {compresseur,decompresseur} A (introduit le 20140424155328).         */
#else
#endif

#ifdef    Genere_CDC_0B
#         define    Compresseur___0B                                                                                                    \
                              Fgetenv("SCompresseur___0B")
#         define    DeCompresseur___0B                                                                                                  \
                              Fgetenv("SDeCompresseur_0B")
#         define    PostFixe_CDC__0B                                                                                                    \
                              Fgetenv("PostFixe_CDC__0B")
                                        /* Definition du couple {compresseur,decompresseur} B (introduit le 20140424155328).         */
#else
#endif

#ifdef    Genere_CDC_0C
#         define    Compresseur___0C                                                                                                    \
                              Fgetenv("SCompresseur___0C")
#         define    DeCompresseur___0C                                                                                                  \
                              Fgetenv("SDeCompresseur_0C")
#         define    PostFixe_CDC__0C                                                                                                    \
                              Fgetenv("PostFixe_CDC__0C")
                                        /* Definition du couple {compresseur,decompresseur} C (introduit le 20140424155328).         */
#else
#endif

#ifdef    Genere_CDC_0D
#         define    Compresseur___0D                                                                                                    \
                              Fgetenv("SCompresseur___0D")
#         define    DeCompresseur___0D                                                                                                  \
                              Fgetenv("SDeCompresseur_0D")
#         define    PostFixe_CDC__0D                                                                                                    \
                              Fgetenv("PostFixe_CDC__0D")
                                        /* Definition du couple {compresseur,decompresseur} D (introduit le 20140424155328).         */
#else
#endif

#ifdef    Genere_CDC_0E
#         define    Compresseur___0E                                                                                                    \
                              Fgetenv("SCompresseur___0E")
#         define    DeCompresseur___0E                                                                                                  \
                              Fgetenv("SDeCompresseur_0E")
#         define    PostFixe_CDC__0E                                                                                                    \
                              Fgetenv("PostFixe_CDC__0E")
                                        /* Definition du couple {compresseur,decompresseur} E (introduit le 20140424155328).         */
#else
#endif

#ifdef    Genere_CDC_0F
#         define    Compresseur___0F                                                                                                    \
                              Fgetenv("SCompresseur___0F")
#         define    DeCompresseur___0F                                                                                                  \
                              Fgetenv("SDeCompresseur_0F")
#         define    PostFixe_CDC__0F                                                                                                    \
                              Fgetenv("PostFixe_CDC__0F")
                                        /* Definition du couple {compresseur,decompresseur} F (introduit le 20140424155328).         */
#else
#endif

#ifdef    Genere_CDC_0G
#         define    Compresseur___0G                                                                                                    \
                              Fgetenv("SCompresseur___0G")
#         define    DeCompresseur___0G                                                                                                  \
                              Fgetenv("SDeCompresseur_0G")
#         define    PostFixe_CDC__0G                                                                                                    \
                              Fgetenv("PostFixe_CDC__0G")
                                        /* Definition du couple {compresseur,decompresseur} G (introduit le 20140424155328).         */
#else
#endif

#ifdef    Genere_CDC_0H
#         define    Compresseur___0H                                                                                                    \
                              Fgetenv("SCompresseur___0H")
#         define    DeCompresseur___0H                                                                                                  \
                              Fgetenv("SDeCompresseur_0H")
#         define    PostFixe_CDC__0H                                                                                                    \
                              Fgetenv("PostFixe_CDC__0H")
                                        /* Definition du couple {compresseur,decompresseur} H (introduit le 20140424155328).         */
#else
#endif

#ifdef    Genere_CDC_0I
#         define    Compresseur___0I                                                                                                    \
                              Fgetenv("SCompresseur___0I")
#         define    DeCompresseur___0I                                                                                                  \
                              Fgetenv("SDeCompresseur_0I")
#         define    PostFixe_CDC__0I                                                                                                    \
                              Fgetenv("PostFixe_CDC__0I")
                                        /* Definition du couple {compresseur,decompresseur} I (introduit le 20140424155328).         */
#else
#endif

#ifdef    Genere_CDC_0J
#         define    Compresseur___0J                                                                                                    \
                              Fgetenv("SCompresseur___0J")
#         define    DeCompresseur___0J                                                                                                  \
                              Fgetenv("SDeCompresseur_0J")
#         define    PostFixe_CDC__0J                                                                                                    \
                              Fgetenv("PostFixe_CDC__0J")
                                        /* Definition du couple {compresseur,decompresseur} J (introduit le 20140424155328).         */
#else
#endif

#define   PostFixe_CDC__0TMP                                                                                                            \
                    Fgetenv("PostFixe_CDC__0TMP")                                                                                       \
                                        /* Postfixe temporaire (introduit le 20131003151635). En effet, a cause de                   */ \
                                        /* 'v $xrC/CompressionPNG.01$vv$c' et de 'v $xrC/DeCompressionPNG.01$vv$c' qui ne            */ \
                                        /* savent pas gerer 'STDIN' et 'STDOUT', il n'est plus possible de programmer                */ \
                                        /* 'COMPRESSION(...)' selon :                                                                */ \
                                        /*                                                                                           */ \
                                        /*                  $CA       FICHIER   | COMPRESSION       > FICHIER.POSTFIXE               */ \
                                        /*                                                                                           */ \
                                        /* La solution est donc de sauvegarder le fichier avant la compression et de le              */ \
                                        /* restaurer ensuite. Il en est de meme avec 'DECOMPRESSION(...)'.                           */

#define   COMPRESSION(Compresseur,PostFixe)                                                                                             \
                    {                                                                                                                   \
                    char      *SPostFixe=SuppressionPostFixe(PostFixe);                                                                 \
                                        /* Ceci est du a la possibilite qu'un meme Compresseur/DeCompresseur soit utilise plusieurs  */ \
                                        /* fois sous plusieurs noms differents. Ainsi, par exemple :                                 */ \
                                        /*                                                                                           */ \
                                        /*   Compresseur___01    "bzip2 --best"                                                      */ \
                                        /*   Compresseur___08    "$Compresseur___01 ; $xrC/TransformationRotation_pPIs2.0@$vv$X"     */ \
                                        /*                                                                                           */ \
                                        /* Or dans les deux cas, 'bzip2' va creer des fichiers compresses de postfixes ".bz2". Il    */ \
                                        /* est donc necessaire de distinguer les deux fichiers compresses par un deuxieme postfixe   */ \
                                        /* (par exemple '$PrePost_Neutre' et '$PrePost_Rotation_PIs2') inclus dans '$PostFixe' et    */ \
                                        /* que l'on doit eliminer provisoirement pour acceder au resultat de la compresion...        */ \
                    EXECUTION_COMMANDE(CONCATENE_CHAINE_04(DELETE,ESPACE,NOM_DU_FICHIER,SPostFixe));                                    \
                    EXECUTION_COMMANDE(CONCATENE_CHAINE_04(DELETE,ESPACE,NOM_DU_FICHIER,PostFixe));                                     \
                    EXECUTION_COMMANDE(CONCATENE_CHAINE_06(CP,ESPACE,NOM_DU_FICHIER,ESPACE,NOM_DU_FICHIER,PostFixe_CDC__0TMP));         \
                    EXECUTION_COMMANDE(CONCATENE_CHAINE_03(Compresseur,ESPACE,NOM_DU_FICHIER));                                         \
                    FORCAGE___COMMANDE(CONCATENE_CHAINE_08(MV,ESPACE,NOM_DU_FICHIER,SPostFixe,ESPACE,NOM_DU_FICHIER,PostFixe,IGNORER)); \
                    EXECUTION_COMMANDE(CONCATENE_CHAINE_06(MV,ESPACE,NOM_DU_FICHIER,PostFixe_CDC__0TMP,ESPACE,NOM_DU_FICHIER));         \
                                                                                                                                        \
                    if        (FAUX)                                                                                                    \
                                        /* Ce ce qui suit a ete inhibe le 20140509074827...                                          */ \
                              {                                                                                                         \
                              if        (LongueurFichier(CONCATENE_CHAINE_02(NOM_DU_FICHIER,PostFixe),FAUX)                             \
                                         == TailleFichierCompresseLePlusCourt                                                           \
                                         )                                                                                              \
                                        {                                                                                               \
                                        fprintf(stderr,"Plusieurs compresseurs donnent la meme longueur de fichier compresse.\n");      \
                                        /* Je note le 20140125134512 que cette situation, si elle se rencontre, pose un probleme     */ \
                                        /* dans 'v $xrC/CompressionDeCompressionOptimale.01$vv$I NETTOYAGE' qui risque de conserver  */ \
                                        /* plusieurs fichiers compresses, alors qu'il n'en faut qu'un seul...                        */ \
                                        }                                                                                               \
                              else                                                                                                      \
                                        {                                                                                               \
                                        }                                                                                               \
                              }                                                                                                         \
                    else                                                                                                                \
                              {                                                                                                         \
                              }                                                                                                         \
                                                                                                                                        \
                    TailleFichierCompresseLePlusCourt=MIN2(TailleFichierCompresseLePlusCourt                                            \
                                                          ,LongueurFichier(CONCATENE_CHAINE_02(NOM_DU_FICHIER,PostFixe),FAUX)           \
                                                           );                                                                           \
                    }                                                                                                                   \
                                        /* Compresssion d'un fichier...                                                              */

#define   DECOMPRESSION_1(DeCompresseur,PostFixe)                                                                                       \
                    {                                                                                                                   \
                    if        (LongueurFichier(CONCATENE_CHAINE_02(NOM_DU_FICHIER_sans_postfixe,PostFixe),FAUX) > 0)                    \
                              {                                                                                                         \
                              EXECUTION_COMMANDE(CONCATENE_CHAINE_03(DELETE,ESPACE,NOM_DU_FICHIER_sans_postfixe));                      \
                              FORCAGE___COMMANDE(CONCATENE_CHAINE_05(DeCompresseur,ESPACE                                               \
                                                                    ,NOM_DU_FICHIER_sans_postfixe,PostFixe                              \
                                                                    ,IGNORER                                                            \
                                                                     )                                                                  \
                                                 );                                                                                     \
                                                                                                                                        \
                              if        (status != OK)                                                                                  \
                                        {                                                                                               \
                                        /* Cas des commandes telles 'bzip2', 'gzip' ou encore 'lzma' qui n'acceptent pas d'autres    */ \
                                        /* postfixes que les leurs...                                                                */ \
                                        char      *SPostFixe=SuppressionPostFixe(PostFixe);                                             \
                                        /* Voir le commentaire de 'COMPRESSION(...)' ci-dessus.                                      */ \
                                        EXECUTION_COMMANDE(CONCATENE_CHAINE_04(DELETE,ESPACE,NOM_DU_FICHIER_sans_postfixe,SPostFixe));  \
                                        EXECUTION_COMMANDE(CONCATENE_CHAINE_07(MV,ESPACE                                                \
                                                                              ,NOM_DU_FICHIER_sans_postfixe,PostFixe,ESPACE             \
                                                                              ,NOM_DU_FICHIER_sans_postfixe,SPostFixe                   \
                                                                               )                                                        \
                                                           );                                                                           \
                                        EXECUTION_COMMANDE(CONCATENE_CHAINE_03(DELETE,ESPACE,NOM_DU_FICHIER_sans_postfixe));            \
                                        EXECUTION_COMMANDE(CONCATENE_CHAINE_04(DeCompresseur,ESPACE                                     \
                                                                              ,NOM_DU_FICHIER_sans_postfixe,SPostFixe                   \
                                                                               )                                                        \
                                                           );                                                                           \
                                        /* Je note le 20141009142630 que pour ces commandes l'execution de 'DeCompresseur' se        */ \
                                        /* fait donc deux fois. La consequence de cela se situe au niveau de la mesure du nombre     */ \
                                        /* d'instructions de decompression ('v $xrCD/CheckNIDC.01$vv$Y 20141009132226') qui sera     */ \
                                        /* donc pour ces commandes deux fois trop importante...                                      */ \
                                        }                                                                                               \
                              else                                                                                                      \
                                        {                                                                                               \
                                        /* Cas des commandes de '$xrC'...                                                            */ \
                                        FORCAGE___COMMANDE(CONCATENE_CHAINE_08(MV,ESPACE                                                \
                                                                              ,NOM_DU_FICHIER_sans_postfixe,PostFixe,".out",ESPACE      \
                                                                              ,NOM_DU_FICHIER_sans_postfixe                             \
                                                                              ,IGNORER                                                  \
                                                                               )                                                        \
                                                           );                                                                           \
                                        /* Mais en fait, il peut s'agir de 'bunzip2' sur '$CMAP28 -ex "picpus"-' qui alors           */ \
                                        /* accepte des fichiers de postfixe quelconque "FICHIER.POSTFIXE" et qui les decompresse     */ \
                                        /* en leur donnant le nom "FICHIER.POSTFIXE.out", d'ou ce 'MV' a priori qui s'il echoue      */ \
                                        /* ne peut pas faire de mal...                                                               */ \
                                        }                                                                                               \
                                                                                                                                        \
                              NombreDeFichiersDecompresses++;                                                                           \
                              }                                                                                                         \
                    else                                                                                                                \
                              {                                                                                                         \
                              }                                                                                                         \
                    }                                                                                                                   \
                                        /* DeCompresssion d'un fichier (methode 1)...                                                */
#define   DECOMPRESSION_2(DeCompresseur,PostFixe)                                                                                       \
                    {                                                                                                                   \
                    if        (LongueurFichier(CONCATENE_CHAINE_02(NOM_DU_FICHIER_sans_postfixe,PostFixe),FAUX) > 0)                    \
                              {                                                                                                         \
                              EXECUTION_COMMANDE(CONCATENE_CHAINE_03(DELETE,ESPACE,NOM_DU_FICHIER_sans_postfixe));                      \
                                                                                                                                        \
                              if        (         (CompareChaines(DeCompresseur,DeCompresseur___03) == FAUX)                            \
                                        &&        (CompareChaines(DeCompresseur,DeCompresseur___04) == FAUX)                            \
                                         )                                                                                              \
                                        {                                                                                               \
                                        EXECUTION_COMMANDE(CONCATENE_CHAINE_08(cat,ESPACE,NOM_DU_FICHIER_sans_postfixe,PostFixe         \
                                                                              ,PIPE                                                     \
                                                                              ,DeCompresseur                                            \
                                                                              ,REDIRECTION,NOM_DU_FICHIER_sans_postfixe                 \
                                                                               )                                                        \
                                                           );                                                                           \
                                        FORCAGE___COMMANDE(CONCATENE_CHAINE_04(DELETE,ESPACE,NOM_DU_FICHIER_sans_postfixe,PostFixe));   \
                                                                                                                                        \
                                        FORCAGE___COMMANDE(CONCATENE_CHAINE_08(MV,ESPACE                                                \
                                                                              ,NOM_DU_FICHIER_sans_postfixe,PostFixe,".out",ESPACE      \
                                                                              ,NOM_DU_FICHIER_sans_postfixe                             \
                                                                              ,IGNORER                                                  \
                                                                               )                                                        \
                                                           );                                                                           \
                                        }                                                                                               \
                              else                                                                                                      \
                                        {                                                                                               \
                                        FORCAGE___COMMANDE(CONCATENE_CHAINE_05(DeCompresseur,ESPACE                                     \
                                                                              ,NOM_DU_FICHIER_sans_postfixe,PostFixe                    \
                                                                              ,IGNORER                                                  \
                                                                               )                                                        \
                                                           );                                                                           \
                                        }                                                                                               \
                                                                                                                                        \
                              NombreDeFichiersDecompresses++;                                                                           \
                              }                                                                                                         \
                    else                                                                                                                \
                              {                                                                                                         \
                              }                                                                                                         \
                    }                                                                                                                   \
                                        /* DeCompresssion d'un fichier (methode 2)...                                                */

#define   DECOMPRESSION(DeCompresseur,PostFixe)                                                                                         \
                    {                                                                                                                   \
                    DECOMPRESSION_2(DeCompresseur,PostFixe);                                                                            \
                    }                                                                                                                   \
                                        /* DeCompresssion d'un fichier suivant la methode choisie (introduit le 20141011102105).     */

extern    int       atoi();

#define   LECTURE_FICHIER(Fichier,NombreOctets)                                                                                         \
                    {                                                                                                                   \
                    TypeImage *FichierV;                                                                                                \
                    int       NombreOctetsALire=NombreOctets;                                                                           \
                    int       NombreOctetsCourants=INFINI;                                                                              \
                    int       NombreOctetsLus=0;                                                                                        \
                                                                                                                                        \
                    FichierV=Fichier;                                                                                                   \
                                                                                                                                        \
                    while     ((NombreOctetsALire > 0) && (NombreOctetsCourants > 0))                                                   \
                              {                                                                                                         \
                              NombreOctetsCourants=read(DescripteurFichierA,FichierV,NombreOctetsALire);                                \
                                        /* On notera que 'NombreOctetsCourants' peut etre nul avant que 'NombreOctetsALire' soit     */ \
                                        /* lui-meme nul : c'est le cas en particulier des images "format bit" ou il y a huit         */ \
                                        /* fois moins d'octets a lire que pour les images "format octet"...                          */ \
                              NombreOctetsALire = NombreOctetsALire-NombreOctetsCourants;                                               \
                              NombreOctetsLus = NombreOctetsLus+NombreOctetsCourants;                                                   \
                              FichierV = FichierV+NombreOctetsCourants;                                                                 \
                              }                                                                                                         \
                                        /* ATTENTION : il n'y a pas de '}' afin que la variable 'NombreOctetsALire' puisse se        */ \
                                        /* propager jusqu'a 'ECRITURE_FICHIER(...)' si necessaire (comme c'est d'ailleurs le cas     */ \
                                        /* pour 'v $xrC/CompressionDeCompressionNeutre.01$vv$I NombreOctetsALire').                  */

#define   ECRITURE_FICHIER(Fichier,NombreOctets)                                                                                        \
                                        /* ATTENTION : il n'y a pas de '{' afin que la variable 'NombreOctetsALire' puisse se        */ \
                                        /* propager jusqu'a 'ECRITURE_FICHIER(...)' si necessaire (comme c'est d'ailleurs le cas     */ \
                                        /* pour 'v $xrC/CompressionDeCompressionNeutre.01$vv$I NombreOctetsALire').                  */ \
                              {                                                                                                         \
                              int       NombreOctetsAEcrire=NombreOctets;                                                               \
                              write(DescripteurFichierR,Fichier,NombreOctetsAEcrire);                                                   \
                              }                                                                                                         \
                    }

int       LongueurChaine(char chaine[])
                                        /* Longueur d'une chaine de caracteres non compris l'octet nul de fin de chaine...           */
          {
          int       index=0;
          int       longueur=0;

          while     (chaine[index] != EndOfChain)
                    {
                    index++;
                    longueur++;
                    }

          return(longueur);
          }

int       CompareChaines(char chaine1[],char chaine2[])
                                        /* Comparaison de deux chaines (introduit le 20141011102105).                                */
          {
          int       identiques=VRAI;
          int       longueur1=LongueurChaine(chaine1);
          int       longueur2=LongueurChaine(chaine2);

          if        (longueur1 == longueur2)
                    {
                    int       index=0;
                    while     (index < MIN2(longueur1,longueur2))
                              {
                              if        (chaine1[index] != chaine2[index])
                                        {
                                        identiques=FAUX;
                                        }
                              else
                                        {
                                        }
                              index++;
                              }
                    }
          else
                    {
                    identiques=FAUX;
                    }

          return(identiques);
          }

#define   CONCATENE_CHAINE_02(chaine1,chaine2)                                                                                          \
                    ChaineConcatene(chaine1,chaine2)
#define   CONCATENE_CHAINE_03(chaine1,chaine2,chaine3)                                                                                  \
                    CONCATENE_CHAINE_02(chaine1,CONCATENE_CHAINE_02(chaine2,chaine3))
#define   CONCATENE_CHAINE_04(chaine1,chaine2,chaine3,chaine4)                                                                          \
                    CONCATENE_CHAINE_02(chaine1,CONCATENE_CHAINE_03(chaine2,chaine3,chaine4))
#define   CONCATENE_CHAINE_05(chaine1,chaine2,chaine3,chaine4,chaine5)                                                                  \
                    CONCATENE_CHAINE_02(chaine1,CONCATENE_CHAINE_04(chaine2,chaine3,chaine4,chaine5))
#define   CONCATENE_CHAINE_06(chaine1,chaine2,chaine3,chaine4,chaine5,chaine6)                                                          \
                    CONCATENE_CHAINE_02(chaine1,CONCATENE_CHAINE_05(chaine2,chaine3,chaine4,chaine5,chaine6))
#define   CONCATENE_CHAINE_07(chaine1,chaine2,chaine3,chaine4,chaine5,chaine6,chaine7)                                                  \
                    CONCATENE_CHAINE_02(chaine1,CONCATENE_CHAINE_06(chaine2,chaine3,chaine4,chaine5,chaine6,chaine7))
#define   CONCATENE_CHAINE_08(chaine1,chaine2,chaine3,chaine4,chaine5,chaine6,chaine7,chaine8)                                          \
                    CONCATENE_CHAINE_02(chaine1,CONCATENE_CHAINE_07(chaine2,chaine3,chaine4,chaine5,chaine6,chaine7,chaine8))
#define   CONCATENE_CHAINE_09(chaine1,chaine2,chaine3,chaine4,chaine5,chaine6,chaine7,chaine8,chaine9)                                  \
                    CONCATENE_CHAINE_02(chaine1,CONCATENE_CHAINE_08(chaine2,chaine3,chaine4,chaine5,chaine6,chaine7,chaine8,chaine9))

char      *ChaineConcatene(char chaine1[],char chaine2[])
                                        /* Concatenation de deux chaines.                                                            */
          {
          char      *chaine;
          int       Lchaine1=LongueurChaine(chaine1);
          int       Lchaine2=LongueurChaine(chaine2);
          int       index=0;
          int       index1=0;
          int       index2=0;

          chaine=malloc(Lchaine1+Lchaine2+1);
                                        /* On notera que le 'free(...)' correspondant est inexistant, mais cela n'est pas trop       */
                                        /* grave...                                                                                  */

          while     (chaine1[index1] != EndOfChain)
                    {
                    *(chaine+index)=chaine1[index1];
                    index++;
                    index1++;
                    }

          while     (chaine2[index2] != EndOfChain)
                    {
                    *(chaine+index)=chaine2[index2];
                    index++;
                    index2++;
                    }

          *(chaine+index)=EndOfChain;

          return(chaine);
          }

char      *SuppressionPostFixe(char chaine1[])
                                        /* Suppression d'un postfixe en bout de chaine.                                              */
          {
          char      *chaine;
          int       index;
          int       index1=LongueurChaine(chaine1)-1;

          while     ((chaine1[index1] != '.') && (index1 > 0))
                    {
                    index1--;
                    }

          chaine=malloc(index1+1);
                                        /* On notera que le 'free(...)' correspondant est inexistant, mais cela n'est pas trop       */
                                        /* grave...                                                                                  */

          for       (index=0 ; index < index1 ; index++)
                    {
                    *(chaine+index)=chaine1[index];
                    }

          *(chaine+index)=EndOfChain;

          return(chaine);
          }
char      *SuppressionPostFixes2(char chaine1[])
                                        /* Suppression de deux postfixes en bout de chaine.                                          */
          {
          return(SuppressionPostFixe(SuppressionPostFixe(chaine1)));
          }

#include <fcntl.h>
#include <sys/stat.h>

#define   INFINI                                                                                                                        \
                    2000000000

int       LongueurFichier(char nom[],int message)
                                        /* Longueur (en octets) d'un fichier.                                                        */
          {
          int       DescripteurFichier=-1;
          int       etat_fichier;
          struct    stat      file_status;
          int       longueur=0;

          DescripteurFichier=open(nom,O_RDONLY);

          if        (DescripteurFichier == -1)
                    {
                    if        (message == VRAI)
                              {
                              fprintf(stderr,"Probleme avec le fichier '%s' -1-.\n",nom);
                              }
                    else
                              {
                              }
                    }
          else
                    {
                    etat_fichier=fstat(DescripteurFichier,&file_status);

                    if        (etat_fichier != OK)
                              {
                              fprintf(stderr,"Probleme avec le fichier '%s' -2-.\n",nom);
                              }
                    else
                              {
                              longueur=file_status.st_size;
                              }

                    close(DescripteurFichier);
                    }

          return(longueur);
          }

#ifndef   define_dimX_dimY
                                        /* Introduit le 20141024150620...                                                            */
#         define    COMPRESSION_DECOMPRESSION_DIMENSIONS_IMAGES                                                                         \
                              {                                                                                                         \
                              dimX=atoi(getenv("dimX"));                                                                                \
                              dimY=atoi(getenv("dimY"));                                                                                \
                                                                                                                                        \
                              if        (FAUX)                                                                                          \
                                        /* Le 20140506161845 la validation suivante de {dimX,dimY} est (provisoirement) inhibee.     */ \
                                        /* On notera qu'elle est difficile a justifier puisque {dimX,dimY} sont variables et         */ \
                                        /* viennent de '$dimX' et de '$dimY'...                                                      */ \
                                        /*                                                                                           */ \
                                        /* En fait l'explication est dans 'v $xrC/CompressionDeCompression.01$vv$I 20131212103838'.  */ \
                                        {                                                                                               \
                                        if        ((dimX != dimXY) || (dimY != dimXY))                                                  \
                                                  {                                                                                     \
                                                  fprintf(stderr,"Les dimensions (Dx=%d ou Dy=%d) different de %d"                      \
                                                         ,dimX,dimY                                                                     \
                                                         ,dimXY                                                                         \
                                                          );                                                                            \
                                                  fprintf(stderr," ce qui peut poser probleme -1-");                                    \
                                                  fprintf(stderr," (peut-etre manque-t-il un 'Sdu').\n");                               \
                                                  exit(NOK);                                                                            \
                                        /* Plus prudent...                                                                           */ \
                                                  }                                                                                     \
                                        else                                                                                            \
                                                  {                                                                                     \
                                                  }                                                                                     \
                                        }                                                                                               \
                              else                                                                                                      \
                                        {                                                                                               \
                                        }                                                                                               \
                              }                                                                                                         \
                                        /* Introduit le 20140115174921...                                                            */
#else
#         define    COMPRESSION_DECOMPRESSION_DIMENSIONS_IMAGES                                                                         \
                              {                                                                                                         \
                              }                                                                                                         \
                                        /* Introduit le 20141024150620 pour accelerer la decompression utilisant le programme        */ \
                                        /* 'v .xrC.EffectuerCompilations.01.vv.Z DeCompressionRunLengthEncoding.02$vv'...            */
#endif

#define   COMPRESSION_DECOMPRESSION_FILES(GENERATION_DU_FICHIER_R,DetruireFichierA)                                                     \
                                        /* Avant le 20131003091513, le nom etait 'COMPRESSION_DECOMPRESSION(...)'.                   */ \
                                        /*                                                                                           */ \
                                        /* L'argument 'DetruireFichierA' a ete introduit le 20140115171628 a cause de l'utilisation  */ \
                                        /* de 'COMPRESSION_DECOMPRESSION_FILES(...)' pour les transformations...                     */ \
                    {                                                                                                                   \
                    COMPRESSION_DECOMPRESSION_DIMENSIONS_IMAGES;                                                                        \
                                                                                                                                        \
                    if        (argc > 2)                                                                                                \
                              {                                                                                                         \
                              fprintf(stderr,"Il y a trop d'arguments.\n");                                                             \
                              exit(NOK);                                                                                                \
                                        /* Plus prudent...                                                                           */ \
                              }                                                                                                         \
                    else                                                                                                                \
                              {                                                                                                         \
                              int       DescripteurFichierA=-1;                                                                         \
                              int       DescripteurFichierR=-1;                                                                         \
                                                                                                                                        \
                              if        (argc == 2)                                                                                     \
                                        /* Cas de la lecture d'un fichier :                                                          */ \
                                        {                                                                                               \
                                        int       etat_fichierA;                                                                        \
                                        struct    stat      file_statusA;                                                               \
                                        int       detruire_fichierA=FAUX;                                                               \
                                                                                                                                        \
                                        DescripteurFichierA=open(NOM_DU_FICHIER_A,O_RDONLY);                                            \
                                                                                                                                        \
                                        if        (DescripteurFichierA == -1)                                                           \
                                                  {                                                                                     \
                                                  fprintf(stderr,"Probleme avec le fichierA '%s' -3-.\n",NOM_DU_FICHIER_A);             \
                                                  exit(NOK);                                                                            \
                                        /* Plus prudent...                                                                           */ \
                                                  }                                                                                     \
                                        else                                                                                            \
                                                  {                                                                                     \
                                                  etat_fichierA=fstat(DescripteurFichierA,&file_statusA);                               \
                                                                                                                                        \
                                                  if        (etat_fichierA != OK)                                                       \
                                                            {                                                                           \
                                                            fprintf(stderr,"Probleme avec le fichierA '%s' -4-.\n",NOM_DU_FICHIER_A);   \
                                                            exit(NOK);                                                                  \
                                        /* Plus prudent...                                                                           */ \
                                                            }                                                                           \
                                                  else                                                                                  \
                                                            {                                                                           \
                                                            int       etat_fichierR;                                                    \
                                                            struct    stat      file_statusR;                                           \
                                                                                                                                        \
                                                            DescripteurFichierR=open(NOM_DU_FICHIER_R                                   \
                                                                                    ,O_WRONLY|O_CREAT                                   \
                                                                                    ,S_IRUSR|S_IWUSR                                    \
                                                                                     );                                                 \
                                                                                                                                        \
                                                            if        (DescripteurFichierR == -1)                                       \
                                                                      {                                                                 \
                                                                      fprintf(stderr,"Probleme avec le fichierR '%s' -5-.\n"            \
                                                                            ,NOM_DU_FICHIER_R                                           \
                                                                             );                                                         \
                                                                      exit(NOK);                                                        \
                                        /* Plus prudent...                                                                           */ \
                                                                      }                                                                 \
                                                            else                                                                        \
                                                                      {                                                                 \
                                                                      etat_fichierR=fstat(DescripteurFichierR,&file_statusR);           \
                                                                                                                                        \
                                                                      if        (etat_fichierR != OK)                                   \
                                                                                {                                                       \
                                                                                fprintf(stderr,"Probleme avec le fichierR '%s' -6-.\n"  \
                                                                                      ,NOM_DU_FICHIER_R                                 \
                                                                                       );                                               \
                                                                                exit(NOK);                                              \
                                        /* Plus prudent...                                                                           */ \
                                                                                }                                                       \
                                                                      else                                                              \
                                                                                {                                                       \
                                                                                int       longueur=file_statusA.st_size;                \
                                                                                                                                        \
                                                                                GENERATION_DU_FICHIER_R;                                \
                                                                                                                                        \
                                                                                detruire_fichierA=VRAI;                                 \
                                                                                }                                                       \
                                                                                                                                        \
                                                                      close(DescripteurFichierR);                                       \
                                                                      }                                                                 \
                                                            }                                                                           \
                                                                                                                                        \
                                                  close(DescripteurFichierA);                                                           \
                                                                                                                                        \
                                                  if        (DetruireFichierA == VRAI)                                                  \
                                                            {                                                                           \
                                                            if        (detruire_fichierA == VRAI)                                       \
                                                                      {                                                                 \
                                                                      unlink(NOM_DU_FICHIER_A);                                         \
                                                                      }                                                                 \
                                                            else                                                                        \
                                                                      {                                                                 \
                                                                      }                                                                 \
                                                            }                                                                           \
                                                  else                                                                                  \
                                                            {                                                                           \
                                                            }                                                                           \
                                                  }                                                                                     \
                                        }                                                                                               \
                              else                                                                                                      \
                                        {                                                                                               \
                                        /* Cas de l'entree standard :                                                                */ \
                                        int       longueur=atoi(getenv("tailleI"));                                                     \
                                        /* On notera que 'longueur' sera bien le nombre d'octets a transferer pour les images        */ \
                                        /* "format octet". Par contre, pour les images "format bit", cela sera 'longueur/8',         */ \
                                        /* mais ce fait n'est pas utilise. En effet, on 's'arrete des que 'read(...)' ne renvoie     */ \
                                        /* plus d'octets...                                                                          */ \
                                                                                                                                        \
                                        DescripteurFichierA=fileno(stdin);                                                              \
                                        DescripteurFichierR=fileno(stdout);                                                             \
                                                                                                                                        \
                                        GENERATION_DU_FICHIER_R;                                                                        \
                                        }                                                                                               \
                              }                                                                                                         \
                                                                                                                                        \
                    return(OK);                                                                                                         \
                                        /* A cause de 'v $xrC/CompressionDeCompressionOptimale.01$vv$I EXECUTION_COMMANDE'           */ \
                                        /* ce 'OK' est essentiel...                                                                  */ \
                    }

#define   COMPRESSION_DECOMPRESSION_STREAMS(GENERATION_DU_FICHIER_R)                                                                    \
                                        /* Introduit le 20131003094437...                                                            */ \
                    {                                                                                                                   \
                    COMPRESSION_DECOMPRESSION_DIMENSIONS_IMAGES;                                                                        \
                                                                                                                                        \
                    if        (argc != 2)                                                                                               \
                              {                                                                                                         \
                              fprintf(stderr,"Il y a %d arguments, alors qu'il en faut un et un seul (le nom d'un fichier).\n",argc-1); \
                              exit(NOK);                                                                                                \
                                        /* Plus prudent...                                                                           */ \
                              }                                                                                                         \
                    else                                                                                                                \
                              {                                                                                                         \
                              FILE      *DescripteurFichierA;                                                                           \
                              FILE      *DescripteurFichierR;                                                                           \
                                                                                                                                        \
                              int       etat_fichierA;                                                                                  \
                              struct    stat      file_statusA;                                                                         \
                              int       detruire_fichierA=FAUX;                                                                         \
                                                                                                                                        \
                              DescripteurFichierA=fopen(NOM_DU_FICHIER_A,"r");                                                          \
                                                                                                                                        \
                              if        (DescripteurFichierA == PointeurNULL)                                                           \
                                        {                                                                                               \
                                        fprintf(stderr,"Probleme avec le fichierA '%s' -7-.\n",NOM_DU_FICHIER_A);                       \
                                        exit(NOK);                                                                                      \
                                        /* Plus prudent...                                                                           */ \
                                        }                                                                                               \
                              else                                                                                                      \
                                        {                                                                                               \
                                        etat_fichierA=fstat(fileno(DescripteurFichierA),&file_statusA);                                 \
                                                                                                                                        \
                                        if        (etat_fichierA != OK)                                                                 \
                                                  {                                                                                     \
                                                  fprintf(stderr,"Probleme avec le fichierA '%s' -8-.\n",NOM_DU_FICHIER_A);             \
                                                  exit(NOK);                                                                            \
                                        /* Plus prudent...                                                                           */ \
                                                  }                                                                                     \
                                        else                                                                                            \
                                                  {                                                                                     \
                                                  int       etat_fichierR;                                                              \
                                                  struct    stat      file_statusR;                                                     \
                                                                                                                                        \
                                                  DescripteurFichierR=fopen(NOM_DU_FICHIER_R,"w+");                                     \
                                                                                                                                        \
                                                  if        (DescripteurFichierR == PointeurNULL)                                       \
                                                            {                                                                           \
                                                            fprintf(stderr,"Probleme avec le fichierR '%s' -9-.\n"                      \
                                                                  ,NOM_DU_FICHIER_R                                                     \
                                                                   );                                                                   \
                                                            exit(NOK);                                                                  \
                                        /* Plus prudent...                                                                           */ \
                                                            }                                                                           \
                                                  else                                                                                  \
                                                            {                                                                           \
                                                            etat_fichierR=fstat(fileno(DescripteurFichierR),&file_statusR);             \
                                                                                                                                        \
                                                            if        (etat_fichierR != OK)                                             \
                                                                      {                                                                 \
                                                                      fprintf(stderr,"Probleme avec le fichierR '%s' -10-.\n"           \
                                                                            ,NOM_DU_FICHIER_R                                           \
                                                                             );                                                         \
                                                                      exit(NOK);                                                        \
                                        /* Plus prudent...                                                                           */ \
                                                                      }                                                                 \
                                                            else                                                                        \
                                                                      {                                                                 \
                                                                      int       longueur=file_statusA.st_size;                          \
                                                                                                                                        \
                                                                      GENERATION_DU_FICHIER_R;                                          \
                                                                                                                                        \
                                                                      detruire_fichierA=VRAI;                                           \
                                                                      }                                                                 \
                                                                                                                                        \
                                                            fclose(DescripteurFichierR);                                                \
                                                            }                                                                           \
                                                  }                                                                                     \
                                                                                                                                        \
                                        fclose(DescripteurFichierA);                                                                    \
                                                                                                                                        \
                                        if        (detruire_fichierA == VRAI)                                                           \
                                                  {                                                                                     \
                                                  unlink(NOM_DU_FICHIER_A);                                                             \
                                                  }                                                                                     \
                                        else                                                                                            \
                                                  {                                                                                     \
                                                  }                                                                                     \
                                        }                                                                                               \
                              }                                                                                                         \
                                                                                                                                        \
                    return(OK);                                                                                                         \
                    }



Copyright © Jean-François Colonna, 2013-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2013-2021.