Advertisement
Guest User

MTF generator bzip2

a guest
Mar 4th, 2021
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. #include <cassert>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. #define BZ_RUNA 0
  7. #define BZ_RUNB 1
  8.  
  9. void generateMTFValues(char* block) {
  10.     char yy[256];
  11.     int i, j;
  12.     int zPend;
  13.     int wr;
  14.     int EOB;
  15.  
  16.     // CONSTRUCTION
  17.     int nblock = strlen(block);
  18.     cout << "char count " << nblock << endl;
  19.  
  20.     unsigned int* ptr = (unsigned int*) malloc(sizeof(unsigned int) * nblock);
  21.     for (int i = 0; i < nblock; i++) {
  22.         ptr[i] = i + 1;
  23.     }
  24.  
  25.     // mtfv is the mtf output, which the decoder reads on the other side
  26.     unsigned int *mtfv = (unsigned int*) malloc(sizeof(unsigned int) * (nblock + 1));
  27.    
  28.     bool inUse[256] = {0};
  29.     char* ch = block;
  30.     while (*ch) {
  31.         inUse[*ch] = true;
  32.         ch++;
  33.     }
  34.     int unseqToSeq[256] = {0};
  35.     int mtfFreq[258] = {0};
  36.     // CONSTRUCTION END
  37.  
  38.     int nInUse = 0;
  39.     for (int i = 0; i < 256; i++)
  40.         if (inUse[i]) {
  41.             unseqToSeq[i] = nInUse;
  42.             nInUse++;
  43.         }
  44.     EOB = nInUse + 1;
  45.  
  46.     for (i = 0; i <= EOB; i++) mtfFreq[i] = 0;
  47.  
  48.     wr = 0;
  49.  
  50.     // this is the *running* frequency of the zero index in mtf
  51.     zPend = 0;
  52.     for (i = 0; i < nInUse; i++) yy[i] = (char) i;
  53.  
  54.     for (i = 0; i < nblock; i++) {
  55.         char ll_i;
  56.         // j is an index into the original block
  57.         j = ptr[i] - 1;
  58.         if (j < 0) j += nblock;
  59.         // get the mtf index of the j-th byte from the block
  60.         ll_i = unseqToSeq[block[j]];
  61.  
  62.         if (yy[0] == ll_i) {
  63.             zPend++;
  64.         } else {
  65.             if (zPend > 0) {
  66.                 // give the binary output of zPend
  67.                 zPend--;
  68.                 while (true) {
  69.                     if (zPend & 1) {
  70.                         mtfv[wr] = BZ_RUNB;
  71.                         wr++;
  72.                         mtfFreq[BZ_RUNB]++;
  73.                     } else {
  74.                         mtfv[wr] = BZ_RUNA;
  75.                         wr++;
  76.                         mtfFreq[BZ_RUNA]++;
  77.                     }
  78.                     if (zPend < 2) break;
  79.                     zPend = (zPend - 2) / 2;
  80.                 };
  81.                 zPend = 0;
  82.             }
  83.             {
  84.                 register char rtmp;
  85.                 register char *ryy_j;
  86.                 register char rll_i;
  87.  
  88.                 // shift all values to the right in yy
  89.                 // and pick the rightmost value to the front
  90.                 rtmp = yy[1];
  91.                 yy[1] = yy[0];
  92.                 ryy_j = &(yy[1]);
  93.                 rll_i = ll_i;
  94.                 while (rll_i != rtmp) {
  95.                     register char rtmp2;
  96.                     ryy_j++;
  97.                     rtmp2 = rtmp;
  98.                     rtmp = *ryy_j;
  99.                     *ryy_j = rtmp2;
  100.                 };
  101.                 yy[0] = rtmp;
  102.                 // ryy_j is the pointer index of rtmp in the live yy array
  103.                 j = ryy_j - &(yy[0]);
  104.                 // so j is the index
  105.                 // and j + 1 is the 1-offset position
  106.                 mtfv[wr] = j + 1;
  107.                 wr++;
  108.                 mtfFreq[j + 1]++;
  109.             }
  110.  
  111.         }
  112.     }
  113.  
  114.     if (zPend > 0) {
  115.         zPend--;
  116.         while (true) {
  117.             if (zPend & 1) {
  118.                 mtfv[wr] = BZ_RUNB;
  119.                 wr++;
  120.                 mtfFreq[BZ_RUNB]++;
  121.             } else {
  122.                 mtfv[wr] = BZ_RUNA;
  123.                 wr++;
  124.                 mtfFreq[BZ_RUNA]++;
  125.             }
  126.             if (zPend < 2) break;
  127.             zPend = (zPend - 2) / 2;
  128.         };
  129.         zPend = 0;
  130.     }
  131.  
  132.     mtfv[wr] = EOB;
  133.     wr++;
  134.     mtfFreq[EOB]++;
  135.  
  136.     // OUTPUT start
  137.     cout << "MTF Selectors" << endl;
  138.     for (int i = 0; i < wr; i++) {
  139.         cout << mtfv[i] << ", ";
  140.     }
  141.     cout << endl;
  142.  
  143.     cout << "Frequency" << endl;
  144.     for (int i = 0; i <= EOB; i++) {
  145.         cout << mtfFreq[i] << ", ";
  146.     }
  147.     cout << endl;
  148.     // OUTPUT end
  149. }
  150.  
  151. int main(int argc, char* argv[]) {
  152.     // pass string as second argument
  153.  
  154.     assert(argc == 2);
  155.  
  156.     generateMTFValues(argv[1]);
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement