Listing 2: expand.c Byte pair encoding decompression
/* expand.c -- Byte Pair Encoding decompression */
/* Copyright 1996 Philip Gage */
#include <stdio.h>
void decompress (FILE *in, FILE *out)
{
unsigned char stack[16], pair[128][2];
short c, top = 0;
/* Check for optional pair count and pair table */
if ((c = getc(in)) > 127)
fread(pair,2,c-128,in);
else
putc(c,out);
for (;;) {
/* Pop byte from stack or read byte from file */
if (top)
c = stack[--top];
else if ((c = getc(in)) == EOF)
break;
/* Push pair on stack or output byte to file */
if (c > 127) {
stack[top++] = pair[c-128][1];
stack[top++] = pair[c-128][0];
}
else
putc(c,out);
}
}
int main (int argc, char **argv)
{
FILE *in,*out;
if (argc != 3)
printf("Usage: expand inputfile outputfile\n");
else if ((in=fopen(argv[1],"rb"))==NULL)
printf("Error opening input %s\n",argv[1]);
else if ((out=fopen(argv[2],"wb"))==NULL)
printf("Error opening output %s\n",argv[2]);
else {
decompress(in,out);
fclose(out);
fclose(in);
}
return 0;
}/* End of File */