#include <stdio.h>
#include <stdlib.h>

char datbuf[4096];
int db = 4096-18; /* Initial buffer pos */

FILE *in,*out;

void putbyte(char c)
{
	putc(c,out);
	datbuf[db++] = c;
	db = db % 4096;
}

char getbyte()
{
	int i;
	i = fgetc(in);
	if (i == EOF)
	{
		fclose(in);
		fclose(out);
		exit(0);
	}
	return i;
}

void compressed()
{
	int a,b;
	int start,end;
	a = getbyte();
	b = getbyte();
	start = ((b & 0xF0) << 4) | a;
	end = (b & 0xF)+3+start;
	do {
		putbyte(datbuf[(start++) & 0xFFF]);
	} while (start < end);
}

int main(int argc,char **argv)
{
	int flags,bit;
	if (argc < 3)
	{
		fprintf(stderr,"Usage: BBExplode <infile> <outfile>\n");
		exit(1);
	}
	in = fopen(argv[1],"rb");
	if (in == 0)
	{
		fprintf(stderr,"Unable to open input\n");
		exit(1);
	}
	out = fopen(argv[2],"wb");
	if (out == 0)
	{
		fclose(in);
		fprintf(stderr,"Unable to open output\n");
		exit(1);
	}
	memset(datbuf,0,4096); /* Clear data buffer */
	while (1) {
		flags = getbyte();
		for (bit=1;bit<256;bit*=2)
			if (flags & bit)
				putbyte(getbyte());
			else
				compressed();
	}
	fclose(in);
	fclose(out);
	return 0;
}
