ftp.nice.ch/pub/next/unix/archiver/freeze.2.3.N.bs.tar.gz#/freeze/bitio.c

This is bitio.c in view mode; [Download] [Up]

#include "freeze.h"
#include "bitio.h"

unsigned long getbuf = 0;       /* assume sizeof (unsigned long) >= 4 */
u_short putbuf;
uchar   bitlen = 0, __, crpt_flag = 0;

/* get N bits (N <= 16), returning in Bit(N-1)...Bit 0 */

short GetNBits (n)
	register u_short n;
{
	register unsigned long dx = getbuf;
	register uchar c;

	static u_short mask[17] = {
		0x0000,
		0x0001, 0x0003, 0x0007, 0x000f,
		0x001f, 0x003f, 0x007f, 0x00ff,
		0x01ff, 0x03ff, 0x07ff, 0x0fff,
		0x1fff, 0x3fff, 0x7fff, 0xffff };

	while (bitlen < n)
		{
			c = getchar ();
			dx |= (unsigned long) c << (BYSH - bitlen);
			bitlen += 8;
		}
	crpt_flag = feof(stdin);
	getbuf = dx << n;
	bitlen -= n;
	return (dx >> (bits(getbuf) - n)) & mask[n];
}

/* output `l' high bits of `c' */

void Putcode (l, c)
	register u_short l;
	u_short c;
{
	register u_short len = bitlen;
	register u_short b = (u_short)putbuf;
	b |= c >> len;
	if ((len += l) >= 8) {
		putchar ((int)(b >> 8));
		if ((len -= 8) >= 8) {
			putchar ((int)b);
			bytes_out += 2;
			len -= 8;
			b = c << (l - len);
		} else {
			b <<= 8;
			bytes_out++;
		}
	}
	if (ferror(stdout))
		writeerr();
	putbuf = b;
	bitlen = len;
}


/* Flushes the bit I/O buffers and check the state of stdout */

void EncodeEnd ()
{
	if (bitlen) {
		putchar((int)(putbuf >> 8));
		bytes_out++;
		if (ferror(stdout))
			writeerr();
	}
}

/* File too short or invalid header, print a message */

void crpt_message ( )
{
	fprintf ( stderr, "melt: corrupt input\n" );
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.