efl/src/bin/embryo/embryo_cc_scexpand.c

54 lines
1.2 KiB
C

/* expand.c -- Byte Pair Encoding decompression */
/* Copyright 1996 Philip Gage */
/* Byte Pair Compression appeared in the September 1997
* issue of C/C++ Users Journal. The original source code
* may still be found at the web site of the magazine
* (www.cuj.com).
*
* The decompressor has been modified by me (Thiadmer
* Riemersma) to accept a string as input, instead of a
* complete file.
*/
#include "embryo_cc_sc.h"
#define STACKSIZE 16
int
strexpand(char *dest, unsigned char *source, int maxlen, unsigned char pairtable[128][2])
{
unsigned char stack[STACKSIZE];
short c, top = 0;
int len;
len = 1; /* already 1 byte for '\0' */
for (;;)
{
/* Pop byte from stack or read byte from the input string */
if (top)
c = stack[--top];
else if ((c = *(unsigned char *)source++) == '\0')
break;
/* Push pair on stack or output byte to the output string */
if (c > 127)
{
stack[top++] = pairtable[c - 128][1];
stack[top++] = pairtable[c - 128][0];
}
else
{
len++;
if (maxlen > 1)
{
*dest++ = (char)c;
maxlen--;
}
}
}
*dest = '\0';
return len;
}