/* 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; }