/* 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 <assert.h>
#include <stdio.h>
#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;
}
