home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume17 / freeze / part01 / bitio.c next >
C/C++ Source or Header  |  1991-03-25  |  2KB  |  93 lines

  1. #include "freeze.h"
  2. #include "huf.h"
  3.  
  4. /* get one byte */
  5. /* returning in Bit7...0 */
  6.  
  7. short GetByte ()
  8. {
  9.     register u_short dx = getbuf;
  10.     register u_short c;
  11.  
  12.     if (getlen <= 8) {
  13.         c = getchar ();
  14.         if ((short)c < 0) {
  15.  
  16. /* Frozen file is too short. This is fatal error.
  17.  * Really the second absent byte indicates a error.
  18.  * ("Packed file is corrupt." :-) )
  19.  */
  20.             if (corrupt_flag)
  21.             corrupt_message();
  22.             corrupt_flag = 1;
  23.             c = 0;
  24.         }
  25.         dx |= c << (8 - getlen);
  26.         getlen += 8;
  27.     }
  28.     getbuf = dx << 8;
  29.     getlen -= 8;
  30.     return (dx >> 8) & 0xff;
  31. }
  32.  
  33. /* get N bit */
  34. /* returning in Bit(N-1)...Bit 0 */
  35.  
  36. short GetNBits (n)
  37.     register u_short n;
  38. {
  39.     register u_short dx = getbuf;
  40.     register u_short c;
  41.  
  42.     static u_short mask[17] = {
  43.         0x0000,
  44.         0x0001, 0x0003, 0x0007, 0x000f,
  45.         0x001f, 0x003f, 0x007f, 0x00ff,
  46.         0x01ff, 0x03ff, 0x07ff, 0x0fff,
  47.         0x1fff, 0x3fff, 0x7fff, 0xffff };
  48.  
  49.     static u_short shift[17] = {
  50.         16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
  51.     };
  52.  
  53.     if (getlen <= 8)
  54.         {
  55.             c = getchar ();
  56.             if ((short)c < 0) {
  57.                 if (corrupt_flag)
  58.                 corrupt_message();
  59.                 corrupt_flag = 1;
  60.                 c = 0;
  61.             }
  62.             dx |= c << (8 - getlen);
  63.             getlen += 8;
  64.         }
  65.     getbuf = dx << n;
  66.     getlen -= n;
  67.     return (dx >> shift[n]) & mask[n];
  68. }
  69.  
  70. /* output C bits */
  71. Putcode (l, c)
  72.     register u_short l;
  73.     u_short c;
  74. {
  75.     register u_short len = putlen;
  76.     register u_short b = putbuf;
  77.     b |= c >> len;
  78.     if ((len += l) >= 8) {
  79.         if (putchar ((int)(b >> 8)) == EOF) writeerr();
  80.         if ((len -= 8) >= 8) {
  81.             putchar ((int)b);
  82.             bytes_out += 2;
  83.             len -= 8;
  84.             b = c << (l - len);
  85.         } else {
  86.             b <<= 8;
  87.             bytes_out++;
  88.         }
  89.     }
  90.     putbuf = b;
  91.     putlen = len;
  92. }
  93.