1 /***********************************************************
3 ***********************************************************/
8 #define CRCPOLY 0xA001 /* ANSI CRC-16 */
11 FILE *arcfile, *infile, *outfile;
15 ushort crctable[UCHAR_MAX + 1];
16 static uint subbitbuf;
26 vfprintf(stderr, fmt, args);
37 for (i = 0; i <= UCHAR_MAX; i++) {
39 for (j = 0; j < CHAR_BIT; j++)
41 r = (r >> 1) ^ CRCPOLY;
50 { /* Shift bitbuf n bits left, read n bits */
52 while (n > bitcount) {
53 bitbuf |= subbitbuf << (n -= bitcount);
56 subbitbuf = (uchar) getc(arcfile);
62 bitbuf |= subbitbuf >> (bitcount -= n);
70 x = bitbuf >> (BITBUFSIZ - n);
76 putbits(int n, uint x)
77 { /* Write rightmost n bits of x */
79 subbitbuf |= x << (bitcount -= n);
82 if (compsize < origsize) {
83 putc(subbitbuf | (x >> (n -= bitcount)), outfile);
89 subbitbuf = x << (bitcount = CHAR_BIT - n);
92 if (compsize < origsize) {
93 putc(x >> (n - CHAR_BIT), outfile);
98 subbitbuf = x << (bitcount = 2 * CHAR_BIT - n);
104 fread_crc(uchar * p, int n, FILE * f)
108 i = n = fread(p, 1, n, f);
116 fwrite_crc(uchar * p, int n, FILE * f)
118 if (fwrite(p, 1, n, f) < n)
119 error("Unable to write");