home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_04 / ross / compress.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-09  |  1.3 KB  |  73 lines

  1.  
  2. Figure 3
  3. --------
  4.  
  5. functions that compress a data record using Huffman encoding.
  6.  
  7.  
  8. #include "hufftree.h"
  9.  
  10. /*
  11.      ----------------------------- compress ---------------------------------
  12. */
  13.  
  14. void compress(int inlen, char *bufin, int *outlen, char *bufout)
  15. {
  16.   int c, i;
  17.  
  18.   bufout[(*outlen)++] = inlen;
  19.   for (i=0; i<inlen; i++)
  20.   { c = bufin[i];
  21.     encode((c & 255), 0, outlen, bufout);
  22.   }
  23.   emit(-1, outlen, bufout);
  24.  
  25. }
  26.  
  27.  
  28. /*
  29.    --------------------------------- encode -----------------------------
  30. */
  31.  
  32. void encode(short h, short child, int *outlen, char *bufout)
  33. {
  34.   if (ht[h].parent != 0)
  35.     encode(ht[h].parent, h, outlen, bufout);
  36.   if (child)
  37.   { if (child == ht[h].right)
  38.       emit(0, outlen, bufout);
  39.     else if (child == ht[h].left)
  40.       emit(1, outlen, bufout);
  41.   }
  42. }
  43.  
  44.  
  45. static char byt;
  46. static int cnt;
  47.  
  48. /*
  49.    --------------------------------- emit -----------------------------
  50. */
  51.  
  52. void emit(int bit, int *outlen, char *bufout)
  53. {
  54.   if (bit == -1)
  55.   { while (cnt != 8)
  56.     { byt = byt << 1;
  57.       cnt++;
  58.     }
  59.     bufout[(*outlen)++] = byt;
  60.     byt = 0;
  61.     cnt = 0;
  62.     return;
  63.   }
  64.   if (cnt == 8)
  65.   { bufout[(*outlen)++] = byt;
  66.     byt = 0;
  67.     cnt = 0;
  68.   }
  69.   byt = (byt << 1) | bit;
  70.   cnt++;
  71. }
  72.  
  73.