home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 642a.lha / huffman_v1.0 / bits.c < prev    next >
C/C++ Source or Header  |  1992-01-18  |  3KB  |  188 lines

  1. /*
  2.  * bits.c - bit manipulation function
  3.  *
  4.  * Lucia Darsa & Bruno Costa - 14 Sep 90 - 14 Sep 90
  5.  */
  6.  
  7. #define DEBUG 1
  8.  
  9. #include <stdio.h>
  10. #include "bits.h"
  11.  
  12. #define TRUE  1
  13. #define FALSE 0
  14.  
  15. int lshiftn (bitstream *bits, int n, unsigned long int *carry)
  16. {
  17.  int carrylen = 0;
  18.  
  19.  *carry = bits->data[0] >> (32 - n);
  20.  bits->data[0] = (bits->data[0] << n) | (bits->data[1] >> (32 - n));
  21.  bits->data[1] = (bits->data[1] << n) | (bits->data[2] >> (32 - n));
  22.  bits->data[2] = (bits->data[2] << n) | (bits->data[3] >> (32 - n));
  23.  bits->data[3] = (bits->data[3] << n);
  24.  
  25.  bits->len += n;
  26.  if (bits->len > 128)
  27.  {
  28.    carrylen = bits->len % 128;
  29.    bits->len = 128;
  30.  }
  31.  
  32.  return (carrylen);
  33. }
  34.  
  35.  
  36. void rshiftn (bitstream *bits, int n)
  37. {
  38.  bits->data[3] = (bits->data[3] >> n) | (bits->data[2] << (32 - n));
  39.  bits->data[2] = (bits->data[2] >> n) | (bits->data[1] << (32 - n));
  40.  bits->data[1] = (bits->data[1] >> n) | (bits->data[0] << (32 - n));
  41.  bits->data[0] = (bits->data[0] >> n);
  42.  
  43.  bits->len -= n;
  44.  if (bits->len < 0)
  45.    bits->len = 0;
  46. }
  47.  
  48.  
  49. int lshift (bitstream *bits)
  50. {
  51.  bits->data[0] = (bits->data[0] << 1) | (bits->data[1] >> 31);
  52.  bits->data[1] = (bits->data[1] << 1) | (bits->data[2] >> 31);
  53.  bits->data[2] = (bits->data[2] << 1) | (bits->data[3] >> 31);
  54.  bits->data[3] = (bits->data[3] << 1);
  55.  
  56.  bits->len++;
  57.  if (bits->len > 128)
  58.  {
  59.    bits->len = 128;
  60.    return (1);
  61.  }
  62.  return (0);
  63. }
  64.  
  65.  
  66. void rshift (bitstream *bits)
  67. {
  68.  bits->data[3] = (bits->data[3] >> 1) | (bits->data[2] << 31);
  69.  bits->data[2] = (bits->data[2] >> 1) | (bits->data[1] << 31);
  70.  bits->data[1] = (bits->data[1] >> 1) | (bits->data[0] << 31);
  71.  bits->data[0] = (bits->data[0] >> 1);
  72.  
  73.  bits->len--;
  74.  if (bits->len < 0)
  75.    bits->len = 0;
  76. }
  77.  
  78.  
  79. int putbit (int bit, FILE *f)
  80. {
  81.  static unsigned char leftover = 0;
  82.  static int nbits = 0;
  83.  
  84.  if (bit == EOF)
  85.  {
  86.    if (nbits)
  87.      putc (leftover, f);
  88.    leftover = 0;
  89.    nbits = 0;
  90.    return (TRUE);
  91.  }
  92.  
  93.  leftover |= bit << (7 - nbits);
  94.  
  95.  if (++nbits == 8)
  96.  {
  97.    putc (leftover, f);
  98.    nbits = 0;
  99.    leftover = 0;
  100.  }
  101.  return (TRUE);
  102. }
  103.  
  104.  
  105. int getbit (FILE *f, unsigned long int maxsize)
  106. {
  107.  static int byte = 0;
  108.  static int nbits = 0;
  109.  static int size = 0;
  110.  int bit;
  111.  
  112.  if (nbits == 0)
  113.  {
  114.    byte = getc (f);
  115.    if (maxsize == size || byte == EOF)
  116.    {
  117.      byte = 0;
  118.      nbits = 0;
  119.      size = 0;
  120.      return (EOF);
  121.    }
  122.    else if (maxsize - size < 8)
  123.      nbits = maxsize - size;
  124.    else
  125.      nbits = 8;
  126.    size += nbits;
  127.  }
  128.  
  129.  bit = byte & 0x80;
  130.  byte <<= 1;
  131.  nbits--;
  132.  
  133.  return (bit ? 1 : 0);
  134. }
  135.  
  136.  
  137. int writebits (bitstream *code, FILE *f)
  138. {
  139.  unsigned long int bit;
  140.  int word;
  141.  
  142.  word = 3 - ((code->len - 1) / 32);
  143.  for (bit = 1UL << ((code->len - 1) % 32); bit; bit >>= 1)
  144.    putbit ((code->data[word] & bit) != 0, f);
  145.  
  146.  for (word++; word < 4; word++)
  147.    for (bit = 0x80000000UL; bit; bit >>= 1)
  148.      putbit ((code->data[word] & bit) != 0, f);
  149.  
  150.  return (TRUE);
  151. }
  152.  
  153.  
  154. int writebyte (int data, FILE *f)
  155. {
  156.  putc ((unsigned char)data, f);
  157.  return TRUE;
  158. }
  159.  
  160.  
  161. int readbyte (FILE *f)
  162. {
  163.  return (getc (f));
  164. }
  165.  
  166.  
  167. int writelong (unsigned long int data, FILE *f)
  168. {
  169.  putc ((unsigned char)(data >> 24), f);         /* MSB first */
  170.  putc ((unsigned char)(data >> 16), f);
  171.  putc ((unsigned char)(data >> 8), f);
  172.  putc ((unsigned char)(data), f);
  173.  return TRUE;
  174. }
  175.  
  176.  
  177. unsigned long int readlong (FILE *f)
  178. {
  179.  unsigned long int data;
  180.  
  181.  data  = (unsigned long) getc (f) << 24;
  182.  data |= (unsigned long) getc (f) << 16;
  183.  data |= (unsigned long) getc (f) << 8;
  184.  data |= (unsigned long) getc (f);
  185.  
  186.  return (data);
  187. }
  188.