Gemini

Untitled

Jun 25th, 2011
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.61 KB | None | 0 0
  1. void Lzss_Compression (char *dir, int fich)
  2. {
  3.     // Fichier d'entrée
  4.     FILE *in_f;
  5.     // Fichiers Lzss
  6.     Bin_TFich *lzss_out_f,*lzss_in_f;
  7.     char lzss_nom[LZSS_NOM_MAX];
  8.     char *lzss_nom2;
  9.     char lzss_nom_complet[LZSS_NOM_MAX];
  10.     // Nom du dossier
  11.     char dossier[LZSS_NOM_MAX];
  12.     // Entete/taille du fichier LZSS décompressé
  13.     unsigned _int32 taille,inconnu;
  14.     // Position d'écriture
  15.     unsigned _int32 pos_f;
  16.     // Informations de codage
  17.     unsigned _int8 longueur;
  18.     unsigned _int16 position,p,pos;
  19.     unsigned _int16 l;
  20.     // Buffer de recherche
  21.     unsigned char buffer[LZSS_BUFFER];
  22.     /*unsigned char c;
  23.     unsigned int buf_t;
  24.     // Indice
  25.     int i;*/
  26.  
  27.     sprintf(lzss_nom,"%04d",fich);
  28.     // Ouverture du fichier à compresser
  29.     sprintf(dossier,"%s%s",DIR_FICH_OUT,dir);
  30.     Fichier_Cherche(dossier,lzss_nom,EXT_SCENAR,&lzss_nom2);
  31.     sprintf(lzss_nom_complet,"%s%s",dossier,lzss_nom2);
  32.     in_f=fopen(lzss_nom_complet,"rb");
  33.     // Ouverture du fichier LZSS d'origine
  34.     sprintf(dossier,"%s%s",DIR_FICH_IN,dir);
  35.     Fichier_Cherche(dossier,lzss_nom,EXT_LZSS,&lzss_nom2);
  36.     sprintf(lzss_nom_complet,"%s%s",dossier,lzss_nom2);
  37.     lzss_in_f=Bopen(lzss_nom_complet,"rb");
  38.  
  39.     // Fichier existant ?
  40.     if (lzss_in_f==NULL || in_f==NULL)
  41.         Main_Message_S("Impossible d'ouvrir le fichier.\n","",ER);
  42.     else {
  43.         // Ouverture du fichier LZSS de sortie
  44.         sprintf(dossier,"%s%s",DIR_FICH_OUT,dir);
  45.         sprintf(lzss_nom_complet,"%s%s",dossier,lzss_nom2);
  46.         lzss_out_f=Bopen(lzss_nom_complet,"wb");
  47.         // Copie du début d'entête de l'original
  48.         taille=Bread_M(32,lzss_in_f);
  49.         Bwrite_M(taille,32,lzss_out_f);
  50.         // Taille finale du fichier
  51.         Bread_I(32,lzss_in_f);
  52.         fseek(in_f,0,SEEK_END);
  53.         taille=ftell(in_f);
  54.         fseek(in_f,0,SEEK_SET);
  55.         Bwrite_I(taille,32,lzss_out_f);
  56.         // Copie de la portion inconnue
  57.         inconnu=Bread_M(8*LZSS_INCONNU,lzss_in_f);
  58.         Bwrite_M(inconnu,8*LZSS_INCONNU,lzss_out_f);
  59.         /* Version réduite, on ne compresse même pas
  60.         // (ça ira d'autant plus vite à l'exécution)
  61.         c=fgetc(in_f);
  62.         while(!feof(in_f)) {
  63.             Bwrite_M((_int32)OCTET,1,lzss_out_f);
  64.             Bwrite_M((_int32)c,8,lzss_out_f);
  65.             c=fgetc(in_f);
  66.         }*/
  67.         /* Version intégrale compressée 1
  68.         // Chargement du buffer
  69.         while((buf_t=fread(buffer,sizeof(char),LZSS_BUFFER,in_f))!=0) {
  70.             pos=0;
  71.             // Parcours du buffer côté lecture
  72.             while(pos<buf_t) {
  73.                 // Parcours du buffer côté recherche
  74.                 longueur=LZSS_LG_MIN-1;
  75.                 for(p=0;p<pos;p++) {
  76.                     // Recherche de chaine similaire maximale
  77.                     l=0;
  78.                     while(l<LZSS_CHAINE && p+l<pos && pos+l<buf_t
  79.                       && buffer[p+l]==buffer[pos+l])
  80.                         l++;
  81.                     if (l>=longueur) {
  82.                         longueur=(_int8)l;
  83.                         position=p;
  84.                     }
  85.                 }
  86.                 // Cas d'une chaine à coder
  87.                 if (longueur>=LZSS_LG_MIN) {
  88.                     Bwrite_M((_int32)CODE,1,lzss_out_f);
  89.                     Bwrite_M((_int32)(position+1),12,lzss_out_f);
  90.                     Bwrite_M((_int32)(longueur-LZSS_LG_MIN),4,lzss_out_f);
  91.                 // Cas d'un caractère simple
  92.                 } else {
  93.                     longueur=1;
  94.                     Bwrite_M((_int32)OCTET,1,lzss_out_f);
  95.                     Bwrite_M((_int32)buffer[pos],8,lzss_out_f);
  96.                 };
  97.                 // On avance
  98.                 pos+=longueur;
  99.             }
  100.         }*/
  101.         /* Version intégrale compressée 2 */
  102.         // Parcours du fichier d'entrée
  103.         buffer[0]=fgetc(in_f);
  104.         do {
  105.             pos_f = ftell(in_f);
  106.             pos=(_int16)(pos_f-1)%LZSS_BUFFER;
  107.             // Longueur de chaîne minimale à trouver
  108.             longueur=0;
  109.             // Recherche de chaine similaire maximale
  110.             // avec chargement des caractères en buffer
  111.             for(p=__max(0,((signed)pos_f-LZSS_BUFFER+LZSS_CHAINE));
  112.                 p<pos_f-1;
  113.                 p++)
  114.             {
  115.                 l=0;
  116.                 while(l<LZSS_CHAINE && pos+l<LZSS_BUFFER && p%LZSS_BUFFER<LZSS_BUFFER-2
  117.                     && buffer[(p+l)%LZSS_BUFFER]==buffer[(pos+l)%LZSS_BUFFER] && feof(in_f)==0) {
  118.                     l++;
  119.                     if (l>longueur)
  120.                         buffer[(pos+l)%LZSS_BUFFER]=fgetc(in_f);
  121.                     if (feof(in_f)!=0)
  122.                         Btell(lzss_out_f);
  123.                 }
  124.                 if (l>=longueur) {
  125.                     longueur=(_int8)l;
  126.                     position=p%LZSS_BUFFER;
  127.                 }
  128.             }
  129.             // Cas d'une chaine à coder
  130.             if (longueur>=LZSS_LG_MIN) {
  131.                 Bwrite_M((_int32)CODE,1,lzss_out_f);
  132.                 Bwrite_M((_int32)(position+1),12,lzss_out_f);
  133.                 Bwrite_M((_int32)(longueur-LZSS_LG_MIN),4,lzss_out_f);
  134.             // Cas d'un caractère simple
  135.             } else {
  136.                 if (longueur==0)
  137.                     buffer[pos+1]=fgetc(in_f);
  138.                 longueur=1;
  139.                 Bwrite_M((_int32)OCTET,1,lzss_out_f);
  140.                 Bwrite_M((_int32)buffer[pos],8,lzss_out_f);
  141.             };
  142.         } while(feof(in_f)==0);
  143.  
  144.         // Fin du fichier
  145.         Bacheve(lzss_out_f);
  146.         Bwrite_M(0x0000,16,lzss_out_f);
  147.         while(Btell(lzss_out_f)%8!=5)
  148.             Bwrite_M(0x00,8,lzss_out_f);
  149.         Bwrite_M(0x7777,16,lzss_out_f);
  150.         // Fermeture des fichiers
  151.         Bclose(lzss_out_f,IN);
  152.         Bclose(lzss_in_f,OUT);
  153.         fclose(in_f);
  154.     }
  155. }
Advertisement
Add Comment
Please, Sign In to add comment