home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume24 / yabbawhap / part03 / bitout.c next >
Encoding:
C/C++ Source or Header  |  1991-10-09  |  2.0 KB  |  102 lines

  1. /* Placed into the public domain by Daniel J. Bernstein. */
  2.  
  3. #include <stdio.h>
  4. #include "bitout.h"
  5.  
  6. static int twom1[9] = { 0,1,3,7,15,31,63,127,255 } ;
  7.  
  8. bitword bit_wbuf[BITBUFSIZE + 1];
  9. bitnum bit_bbuf[BITBUFSIZE + 1];
  10. int bit_bufsize = 0;
  11.  
  12. long bit_numout = 0;
  13.  
  14. static int savecurbyte = 0;
  15. static bitnum savecurbb8 = 8;
  16.  
  17. int bit_printbuf()
  18. {
  19.  register int curbyte = savecurbyte;
  20.  register bitnum curbb8 = savecurbb8;
  21.  register bitword curw;
  22.  register int i;
  23.  
  24.  /* XXX: should use registers & curbyte & so on better */
  25.  
  26.  for (i = 0;i < bit_bufsize;i++)
  27.   {
  28.    /* assumes bit_bbuf[i] <= 0 */
  29.    curw = bit_wbuf[i];
  30.    curbyte += ((curw & twom1[curbb8]) << (8 - curbb8));
  31. #ifdef BRAINDAMAGED
  32.    if (curbyte == 255)
  33.      (void) putchar((char) curbyte);
  34.    else
  35. #endif
  36.    if (putchar((char) curbyte) == EOF)
  37.      return EOF;
  38.    bit_numout++;
  39.    curw >>= curbb8;
  40.    curbb8 += bit_bbuf[i];
  41.  
  42.    /* just in case bit_bbuf[i] < -7 */
  43.    while (curbb8 <= 0)
  44.     {
  45. #ifdef BRAINDAMAGED
  46.      if (curw & 255 == 255)
  47.        (void) putchar((char) (curw & 255));
  48.      else
  49. #endif
  50.      if (putchar((char) (curw & 255)) == EOF)
  51.        return EOF;
  52.      bit_numout++;
  53.      curbb8 += 8;
  54.      curw >>= 8;
  55.     }
  56.    curbyte = (int) curw; /* does not lose accuracy */
  57.   }
  58.  savecurbyte = curbyte; /* ah, the joy of coroutines */
  59.  savecurbb8 = curbb8; /* better this way (double vars) for efficiency */
  60.  bit_bufsize = 0;
  61.  return 0;
  62. }
  63.  
  64. int bit_flushbuf()
  65. {
  66.  if (bit_printbuf() == EOF)
  67.    return EOF;
  68.  if (savecurbb8 < 8)
  69.   {
  70. #ifdef BRAINDAMAGED
  71.    if (savecurbyte == 255)
  72.      (void) putchar((char) savecurbyte);
  73.    else
  74. #endif
  75.    if (putchar((char) savecurbyte) == EOF)
  76.      return EOF;
  77.    bit_numout++;
  78.   }
  79.  savecurbyte = 0;
  80.  savecurbb8 = 8;
  81.  return 0;
  82. }
  83.  
  84. int bit_fillflush(x)
  85. int x;
  86. {
  87.  if (bit_printbuf() == EOF)
  88.    return EOF;
  89.  savecurbyte += (x << 8 - savecurbb8) & 255;
  90. #ifdef BRAINDAMAGED
  91.  if (savecurbyte == 255)
  92.    (void) putchar((char) savecurbyte);
  93.  else
  94. #endif
  95.  if (putchar((char) savecurbyte) == EOF)
  96.    return EOF;
  97.  bit_numout++;
  98.  savecurbyte = 0;
  99.  savecurbb8 = 8;
  100.  return 0;
  101. }
  102.