/*
*******************************************************************************
*
*   Copyright (C) 1999, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
*******************************************************************************
*
* File scsu.c
*
* Modification History:
*
*   Date        Name        Description
*   05/17/99    stephen	    Creation (ported from java UnicodeCompressor.java)
*   09/21/99    stephen     Updated to handle data splits on decompression.
*******************************************************************************
*/

#include "unicode/scsu.h"

#include "cmemory.h"

/* Generic window shift */
#define COMPRESSIONOFFSET 0x80

/* Indicates a window index is invalid */
#define INVALIDWINDOW -1

/* Indicates a character doesn't exist in input */
#define INVALIDCHAR -1

/* Compression modes */
#define SINGLEBYTEMODE 0
#define UNICODEMODE 1

/* Reserved index value */
#define RESERVEDINDEX 0x00

/* Indices for scripts which cross a half-block boundary */
#define LATININDEX 0xF9
#define IPAEXTENSIONINDEX 0xFA
#define GREEKINDEX 0xFB
#define ARMENIANINDEX 0xFC
#define HIRAGANAINDEX 0xFD
#define KATAKANAINDEX 0xFE
#define HALFWIDTHKATAKANAINDEX 0xFF

/* Single-byte mode tags */
#define SDEFINEX 0x0B
/* 0x0C is a reserved value*/
#define SRESERVED 0x0C
#define SQUOTEU 0x0E
#define SCHANGEU 0x0F

#define SQUOTE0 0x01
#define SQUOTE1 0x02
#define SQUOTE2 0x03
#define SQUOTE3 0x04
#define SQUOTE4 0x05
#define SQUOTE5 0x06
#define SQUOTE6 0x07
#define SQUOTE7 0x08

#define SCHANGE0 0x10
#define SCHANGE1 0x11
#define SCHANGE2 0x12
#define SCHANGE3 0x13
#define SCHANGE4 0x14
#define SCHANGE5 0x15
#define SCHANGE6 0x16
#define SCHANGE7 0x17

#define SDEFINE0 0x18
#define SDEFINE1 0x19
#define SDEFINE2 0x1A
#define SDEFINE3 0x1B
#define SDEFINE4 0x1C
#define SDEFINE5 0x1D
#define SDEFINE6 0x1E
#define SDEFINE7 0x1F

/* Unicode mode tags */
#define UCHANGE0 0xE0
#define UCHANGE1 0xE1
#define UCHANGE2 0xE2
#define UCHANGE3 0xE3
#define UCHANGE4 0xE4
#define UCHANGE5 0xE5
#define UCHANGE6 0xE6
#define UCHANGE7 0xE7

#define UDEFINE0 0xE8
#define UDEFINE1 0xE9
#define UDEFINE2 0xEA
#define UDEFINE3 0xEB
#define UDEFINE4 0xEC
#define UDEFINE5 0xED
#define UDEFINE6 0xEE
#define UDEFINE7 0xEF

#define UQUOTEU 0xF0
#define UDEFINEX 0xF1
/* 0xF2 is a reserved value*/
#define URESERVED 0xF2

/* Local function prototypes */
static int32_t scsu_makeIndex(int32_t c);
static UBool scsu_inDynamicWindow(const UnicodeCompressor *comp,
				   int32_t c, 
				   int32_t whichWindow);
static UBool scsu_inStaticWindow(int32_t c, 
				  int32_t whichWindow);
static UBool scsu_isCompressible(int32_t c);
static int32_t scsu_findDynamicWindow(const UnicodeCompressor *comp,
				      int32_t c);
static int32_t scsu_findStaticWindow(int32_t c);
static int32_t scsu_getLRDefinedWindow(const UnicodeCompressor *comp);

/* Static tables generated by CompressionTableGenerator */

/** For window offset mapping */
static int32_t sOffsetTable [] = { 
  0x0, 0x80, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380, 0x400, 0x480,
  0x500, 0x580, 0x600, 0x680, 0x700, 0x780, 0x800, 0x880, 0x900,
  0x980, 0xa00, 0xa80, 0xb00, 0xb80, 0xc00, 0xc80, 0xd00, 0xd80,
  0xe00, 0xe80, 0xf00, 0xf80, 0x1000, 0x1080, 0x1100, 0x1180,
  0x1200, 0x1280, 0x1300, 0x1380, 0x1400, 0x1480, 0x1500, 0x1580,
  0x1600, 0x1680, 0x1700, 0x1780, 0x1800, 0x1880, 0x1900, 0x1980,
  0x1a00, 0x1a80, 0x1b00, 0x1b80, 0x1c00, 0x1c80, 0x1d00, 0x1d80,
  0x1e00, 0x1e80, 0x1f00, 0x1f80, 0x2000, 0x2080, 0x2100, 0x2180,
  0x2200, 0x2280, 0x2300, 0x2380, 0x2400, 0x2480, 0x2500, 0x2580,
  0x2600, 0x2680, 0x2700, 0x2780, 0x2800, 0x2880, 0x2900, 0x2980,
  0x2a00, 0x2a80, 0x2b00, 0x2b80, 0x2c00, 0x2c80, 0x2d00, 0x2d80,
  0x2e00, 0x2e80, 0x2f00, 0x2f80, 0x3000, 0x3080, 0x3100, 0x3180,
  0x3200, 0x3280, 0x3300, 0x3380, 0xe000, 0xe080, 0xe100, 0xe180,
  0xe200, 0xe280, 0xe300, 0xe380, 0xe400, 0xe480, 0xe500, 0xe580,
  0xe600, 0xe680, 0xe700, 0xe780, 0xe800, 0xe880, 0xe900, 0xe980,
  0xea00, 0xea80, 0xeb00, 0xeb80, 0xec00, 0xec80, 0xed00, 0xed80,
  0xee00, 0xee80, 0xef00, 0xef80, 0xf000, 0xf080, 0xf100, 0xf180,
  0xf200, 0xf280, 0xf300, 0xf380, 0xf400, 0xf480, 0xf500, 0xf580,
  0xf600, 0xf680, 0xf700, 0xf780, 0xf800, 0xf880, 0xf900, 0xf980,
  0xfa00, 0xfa80, 0xfb00, 0xfb80, 0xfc00, 0xfc80, 0xfd00, 0xfd80,
  0xfe00, 0xfe80, 0xff00, 0xff80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x250, 0x370,
  0x530, 0x3040, 0x30a0, 0xff60  
};

/** For quick identification of a byte as a single-byte mode tag */
static UBool sSingleTagTable [] = {
  FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE,
  FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
  TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE 
};

/** For quick identification of a byte as a unicode mode tag */
static UBool sUnicodeTagTable [] = {
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
  TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE,
  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
  FALSE
};

/** Static compression window offsets */
static int32_t sOffsets [] = {
  0x0000,   /* for quoting single-byte mode tags*/
  0x0080,   /* Latin-1 Supplement*/
  0x0100,   /* Latin Extended-A*/
  0x0300,   /* Combining Diacritical Marks*/
  0x2000,   /* General Punctuation*/
  0x2080,   /* Curency Symbols*/
  0x2100,   /* Letterlike Symbols and Number Forms*/
  0x3000    /* CJK Symbols and Punctuation*/
};


void
scsu_init(UnicodeCompressor *comp)
{
  /* initialize to defaults*/
  scsu_reset(comp);
}

void
scsu_compress(UnicodeCompressor *comp,
	      uint8_t           **target,
	      const uint8_t     *targetLimit,
	      const UChar       **source,
	      const UChar       *sourceLimit,
	      UErrorCode        *status)
{
  /* the current position in the source unichar buffer*/
  const UChar *unicharBuffer = *source;

    /* the current position in the target byte buffer*/
  uint8_t *byteBuffer = *target;
    
  /* the current unicode character from the source buffer*/
  int32_t curUC = INVALIDCHAR;
  
  /* the index for the current character*/
  int32_t curIndex = -1;
        
  /* look ahead*/
  int32_t nextUC = INVALIDCHAR;
  int32_t forwardUC = INVALIDCHAR;

    /* temporary for window searching*/
  int32_t whichWindow = 0;
      
  /* high and low bytes of the current unicode character*/
  int32_t hiByte = 0;
  int32_t loByte = 0;


    /* verify we weren't passed a failing error code */
  if(U_FAILURE(*status)) {
    return;
  }
  /* verify the target buffer can hold at least 4 bytes */
  else if(targetLimit - byteBuffer < 4) {
    *status = U_ILLEGAL_ARGUMENT_ERROR;
    return;
  }

 mainLoop:
  while( unicharBuffer < sourceLimit && byteBuffer < targetLimit) {
    switch( comp->fMode ) {
	    
      /* main single byte mode compression loop*/
    case SINGLEBYTEMODE:
      while( unicharBuffer < sourceLimit && byteBuffer < targetLimit ) {

	/* get current char*/
	curUC = *unicharBuffer++;
		
	/* get next char*/
	if( unicharBuffer < sourceLimit ) 
	  nextUC = *unicharBuffer;
	else
	  nextUC = INVALIDCHAR;
		
	/* chars less than 0x0080 (excluding tags) go straight in
	   stream */
	if( curUC < 0x0080 ) {
	  loByte = curUC;
		    
	  /* we need to check and make sure we don't
	     accidentally write a single byte mode tag to
	     the stream unless it's quoted */
	  if(sSingleTagTable[loByte]) {
	    /* make sure there is enough room to write
	       both bytes and if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 1) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    /* since we know the byte is less than 0x80, SQUOTE0
	       will use static window 0, or Latin-1*/
	    *byteBuffer++ = (uint8_t) SQUOTE0;
	  }
		    
	  *byteBuffer++ = (uint8_t) loByte;
	}
		
	/* if the char belongs to current window, convert it
	   to a byte by adding the generic compression offset
	   and subtracting the window's offset*/
	else if(scsu_inDynamicWindow(comp, 
				     curUC, comp->fCurrentWindow) ) {
	  *byteBuffer++ = (uint8_t) 
	    (curUC - comp->fOffsets[ comp->fCurrentWindow ] 
	     + COMPRESSIONOFFSET);
	}
	    
	/* if char is not in compressible range, either switch
	   to or quote from unicode*/
	else if( ! scsu_isCompressible(curUC) ) {
	  /* only check next character if it is valid*/
	  if(nextUC != INVALIDCHAR && scsu_isCompressible(nextUC)) {
	    /* make sure there is enough room to write all
	       three bytes if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 2) >= targetLimit) {
	      --unicharBuffer; 
	      goto finish;
	    }
		    
	    *byteBuffer++ = (uint8_t) SQUOTEU;
	    *byteBuffer++ = (uint8_t) (curUC >> 8);
	    *byteBuffer++ = (uint8_t) curUC;
	  }
	  else {
	    /* make sure there is enough room to write all
	       four bytes and if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 3) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
		    
	    *byteBuffer++  = (uint8_t) SCHANGEU;
			
	    hiByte = curUC >> 8;
	    loByte = curUC;
			
	    /* add quote Unicode tag */
	    if( sUnicodeTagTable[hiByte] )
	      *byteBuffer++ = (uint8_t) UQUOTEU;  
			
	    *byteBuffer++ = (uint8_t) hiByte;
	    *byteBuffer++ = (uint8_t) loByte;
			
	    comp->fMode = UNICODEMODE;

	    /* use a goto here for speed, to avoid having
	       to check fMode in the while loop at the top
	       of the case */
	    goto mainLoop;
	  }
	}
	    
	/* if the char is in a currently defined dynamic
	   window, figure out which one, and either switch to
	   it or quote from it*/
	else if( (whichWindow = scsu_findDynamicWindow(comp, curUC)) 
		 != INVALIDWINDOW ) {
	  /* look ahead*/
	  if( (unicharBuffer + 1) < sourceLimit )
	    forwardUC = *(unicharBuffer + 1);
	  else
	    forwardUC = INVALIDCHAR;
		    
	  /* all three chars in same window, switch to that
	     window- inDynamicWindow will return FALSE for
	     INVALIDCHAR*/
	  if( scsu_inDynamicWindow(comp, nextUC, whichWindow) 
	      && scsu_inDynamicWindow(comp, forwardUC, whichWindow)){
	    /* make sure there is enough room to write
	       both bytes and if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 1) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    *byteBuffer++ = (uint8_t) (SCHANGE0 + whichWindow);
	    *byteBuffer++ = (uint8_t) 
	      (curUC - comp->fOffsets[whichWindow] 
	       + COMPRESSIONOFFSET);
	    comp->fTimeStamps [ whichWindow ] = ++(comp->fTimeStamp);
	    comp->fCurrentWindow  = whichWindow;
	  }
		    
	  /* either only next char or neither in same
	     window, so quote*/
	  else {
	    /* make sure there is enough room to write
	       both bytes and if not, rewind the source stream
	       and break out*/
	    if( (byteBuffer + 1) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
		    
	    *byteBuffer++ = (uint8_t) (SQUOTE0 + whichWindow);
	    *byteBuffer++ = (uint8_t) 
	      (curUC - comp->fOffsets[whichWindow] 
	       + COMPRESSIONOFFSET);
	  }
	}
		
	/* if a static window is defined, and the following
	   character is not in that static window, quote from
	   the static window Note: to quote from a static
	   window, don't add 0x80*/
	else if( (whichWindow = scsu_findStaticWindow(curUC)) 
		 != INVALIDWINDOW 
		 && ! scsu_inStaticWindow(nextUC, whichWindow) ) {
	  /* make sure there is enough room to write both
	     bytes if not, rewind the source stream and
	     break out*/
	  if( (byteBuffer + 1) >= targetLimit) { 
	    --unicharBuffer; 
	    goto finish;
	  }
		
	  *byteBuffer++ = (uint8_t) (SQUOTE0 + whichWindow);
	  *byteBuffer++ = (uint8_t) (curUC - sOffsets[whichWindow]);
	}
	    
	/* if a window is not defined, decide if we want to
	   define a new one or switch to unicode mode*/
	else {
	  /* determine index for current char (char is
	     compressible)*/
	  curIndex = scsu_makeIndex(curUC);
	  comp->fIndexCount[curIndex]++;
		    
	  /* look ahead*/
	  if( (unicharBuffer + 1) < sourceLimit )
	    forwardUC = *(unicharBuffer + 1);
	  else
	    forwardUC = INVALIDCHAR;
		    
	  /* if we have encountered this index at least once
	     before, define a new window*/
	  if( comp->fIndexCount[curIndex] > 1 ) {
	    /* make sure there is enough room to write all
	       three bytes and if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 2) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }

	    /* get least recently defined window*/
	    whichWindow = scsu_getLRDefinedWindow(comp);
			
	    *byteBuffer++ = (uint8_t) (SDEFINE0 + whichWindow);
	    *byteBuffer++ = (uint8_t) curIndex;
	    *byteBuffer++ = (uint8_t) 
	      (curUC - sOffsetTable[curIndex] 
	       + COMPRESSIONOFFSET);
			
	    comp->fOffsets[whichWindow] = sOffsetTable[curIndex];
	    comp->fCurrentWindow = whichWindow;
	    comp->fTimeStamps [whichWindow] = ++(comp->fTimeStamp);
	  }
		
	  /* three chars in a row with same index, define a
	     new window- makeIndex will return RESERVEDINDEX
	     for INVALIDCHAR*/
	  else if( curIndex == scsu_makeIndex(nextUC) 
		   && curIndex == scsu_makeIndex(forwardUC) ) {
	    /* make sure there is enough room to write all
	       three bytes if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 2) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }

	    whichWindow = scsu_getLRDefinedWindow(comp);
		    
	    *byteBuffer++ = (uint8_t) (SDEFINE0 + whichWindow);
	    *byteBuffer++ = (uint8_t) curIndex;
	    *byteBuffer++ = (uint8_t) 
	      (curUC - sOffsetTable[curIndex] 
	       + COMPRESSIONOFFSET);
			
	    comp->fOffsets[whichWindow] = sOffsetTable[curIndex];
	    comp->fCurrentWindow = whichWindow;
	    comp->fTimeStamps [whichWindow] = ++(comp->fTimeStamp);
	  }
		
	  /* only two chars in a row with same index, so
	     switch to unicode mode makeIndex will return
	     RESERVEDINDEX for INVALIDCHAR*/
	  else if( curIndex == scsu_makeIndex(nextUC) 
		   && curIndex != scsu_makeIndex(forwardUC) ) {
	    /* make sure there is enough room to write all
	       four bytes if not, rewind the source stream
	       and break out*/
	    if( (byteBuffer + 3) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    *byteBuffer++ = (uint8_t) SCHANGEU;
			
	    hiByte = curUC >> 8;
	    loByte = curUC;
			
	    /* add quote Unicode tag */
	    if( sUnicodeTagTable[hiByte] )
	      *byteBuffer++ = (uint8_t) UQUOTEU;
			
	    *byteBuffer++ = (uint8_t) hiByte;
	    *byteBuffer++ = (uint8_t) loByte;
			
	    comp->fMode = UNICODEMODE;

	    /* use a goto here for speed, to avoid having
	       to check fMode in the while loop at the top
	       of the case */
	    goto mainLoop;
	  }
		    
	  /* three chars have different indices, so switch
	     to unicode mode*/
	  else {
	    /* make sure there is enough room to write all
	       four bytes and if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 3) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
		    
	    *byteBuffer++ = (uint8_t) SCHANGEU;
			
	    hiByte = curUC >> 8;
	    loByte = curUC;
			
	    /* add quote Unicode tag*/
	    if( sUnicodeTagTable[ hiByte ] )
	      *byteBuffer++ = (uint8_t) UQUOTEU;
			
	    *byteBuffer++ = (uint8_t) hiByte;
	    *byteBuffer++ = (uint8_t) loByte;
			
	    comp->fMode = UNICODEMODE;

	    /* use a goto here for speed, to avoid having
	       to check fMode in the while loop at the top
	       of the case */
	    goto mainLoop;
	  }
	}
      }
      break;
	    
      /* main unicode mode compression loop*/
    case UNICODEMODE:
      while(unicharBuffer < sourceLimit && byteBuffer < targetLimit) {

	/* get current char*/
	curUC = *unicharBuffer++;  
		
	/* get next char*/
	if( unicharBuffer < sourceLimit )
	  nextUC = *unicharBuffer;
	else
	  nextUC = INVALIDCHAR;
		
	/* if we have two uncompressible unichars in a row,
	   put the current char's bytes in the stream*/
	if( ! scsu_isCompressible(curUC) 
	    || (nextUC != INVALIDCHAR 
		&& ! scsu_isCompressible(nextUC)) ) {
	  /* make sure there is enough room to write all
	     three bytes and if not, rewind the source
	     stream and break out*/
	  if( (byteBuffer + 2) >= targetLimit) { 
	    --unicharBuffer; 
	    goto finish;
	  }
		    
	  hiByte = curUC >> 8;
	  loByte = curUC;
		    
	  /* add quote Unicode tag*/
	  if( sUnicodeTagTable[ hiByte ] )
	    *byteBuffer++   = (uint8_t) UQUOTEU;  
		    
	  *byteBuffer++ = (uint8_t) hiByte;
	  *byteBuffer++ = (uint8_t) loByte;
	}
		
	/* bytes less than 0x80 can go straight in the stream,
	   but in single-byte mode*/
	else if( curUC < 0x0080 ) {
	  loByte = curUC;
		    
	  /* if two chars in a row below 0x80 and the
	     current char is not a single-byte mode tag,
	     switch to single-byte mode*/
	  if(nextUC != INVALIDCHAR 
	     && nextUC < 0x0080 && ! sSingleTagTable[ loByte ] ) {
	    /* make sure there is enough room to write
	       both bytes and if not, rewind the source stream
	       and break out*/
	    if( (byteBuffer + 1) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    /* use window 0, but any would work*/
	    *byteBuffer++ = (uint8_t) UCHANGE0;
	    *byteBuffer++ = (uint8_t) loByte;
			
	    comp->fCurrentWindow = 0;
	    comp->fTimeStamps [0] = ++(comp->fTimeStamp);
	    comp->fMode = SINGLEBYTEMODE;

	    /* use a goto here for speed, to avoid having
	       to check fMode in the while loop at the top
	       of the case */
	    goto mainLoop;
	  }
		    
	  /* otherwise, just write the bytes to the stream
	     (this will cover the case of only 1 char less
	     than 0x80 and single-byte mode tags)*/
	  else {
	    /* make sure there is enough room to write
	       both bytes and if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 1) >= targetLimit) {
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    /* since the character is less than 0x80, the
	       high byte is always 0x00 - no need for
	       (curUC >> 8)*/
	    *byteBuffer++ = (uint8_t) 0x00;
	    *byteBuffer++ = (uint8_t) loByte;
	  }
	}
		
	/* figure out if the current unichar is in a defined
	   window*/
	else if( (whichWindow = scsu_findDynamicWindow(comp, curUC)) 
		 != INVALIDWINDOW ) {
	  /* if two chars in a row in the same window,
	     switch to that window and go to single-byte
	     mode inDynamicWindow will return FALSE for
	     INVALIDCHAR*/
	  if( scsu_inDynamicWindow(comp, nextUC, whichWindow) ) {
	    /* make sure there is enough room to write
	       both bytes if not, rewind the source stream
	       and break out*/
	    if( (byteBuffer + 1) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    *byteBuffer++ = (uint8_t) (UCHANGE0 + whichWindow);
	    *byteBuffer++ = (uint8_t) 
	      (curUC - comp->fOffsets[whichWindow] 
	       + COMPRESSIONOFFSET);
			
	    comp->fTimeStamps[whichWindow] = ++(comp->fTimeStamp);
	    comp->fCurrentWindow = whichWindow;
	    comp->fMode = SINGLEBYTEMODE;

	    /* use a goto here for speed, to avoid having
	       to check fMode in the while loop at the top
	       of the case */
	    goto mainLoop;
	  }

	  /* otherwise, just quote the unicode for the
	     char*/
	  else {
	    /* make sure there is enough room to write all
	       three bytes and if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 2) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    hiByte = curUC >> 8;
	    loByte = curUC;
			
	    /* add quote Unicode tag*/
	    if( sUnicodeTagTable[ hiByte ] )
	      *byteBuffer++ = (uint8_t) UQUOTEU;
			
	    *byteBuffer++ = (uint8_t) hiByte;
	    *byteBuffer++ = (uint8_t) loByte;
	  }
	}
		
	/* char is not in a defined window*/
	else {
	  /* determine index for current char (char is
	     compressible)*/
	  curIndex = scsu_makeIndex(curUC);
	  comp->fIndexCount[curIndex]++;
		    
	  /* look ahead*/
	  if( (unicharBuffer + 1) < sourceLimit )
	    forwardUC = *unicharBuffer;
	  else
	    forwardUC = INVALIDCHAR;
		    
	  /* if we have encountered this index at least once
	     before, define a new window for it that hasn't
	     previously been redefined*/
	  if( comp->fIndexCount[curIndex] > 1 ) {
	    /* make sure there is enough room to write all
	       three bytes if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 2) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    /* get least recently defined window*/
	    whichWindow = scsu_getLRDefinedWindow(comp);
			
	    *byteBuffer++ = (uint8_t) (UDEFINE0 + whichWindow);
	    *byteBuffer++ = (uint8_t) curIndex;
	    *byteBuffer++ = (uint8_t) 
	      (curUC - sOffsetTable[curIndex] 
	       + COMPRESSIONOFFSET);
			
	    comp->fOffsets[whichWindow] = sOffsetTable[curIndex];
	    comp->fCurrentWindow = whichWindow;
	    comp->fTimeStamps[whichWindow] = ++(comp->fTimeStamp);
	    comp->fMode = SINGLEBYTEMODE;

	    /* use a goto here for speed, to avoid having
	       to check fMode in the while loop at the top
	       of the case */
	    goto mainLoop;
	  }
		
	  /* if three chars in a row with the same index,
	     define a new window makeIndex will return
	     RESERVEDINDEX for INVALIDCHAR*/
	  else if( curIndex == scsu_makeIndex(nextUC) 
		   && curIndex == scsu_makeIndex(forwardUC) ) {
	    /* make sure there is enough room to write all
	       three bytes if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 2) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    whichWindow = scsu_getLRDefinedWindow(comp);
			
	    *byteBuffer++ = (uint8_t) (UDEFINE0 + whichWindow);
	    *byteBuffer++ = (uint8_t) curIndex;
	    *byteBuffer++ = (uint8_t) 
	      (curUC - sOffsetTable[curIndex] 
	       + COMPRESSIONOFFSET);
			
	    comp->fOffsets[whichWindow] = sOffsetTable[curIndex];
	    comp->fCurrentWindow = whichWindow;
	    comp->fTimeStamps[whichWindow] = ++(comp->fTimeStamp);
	    comp->fMode = SINGLEBYTEMODE;

	    /* use a goto here for speed, to avoid having
	       to check fMode in the while loop at the top
	       of the case */
	    goto mainLoop;
	  }
		    
	  /* otherwise just quote the unicode, and save our
	     windows for longer runs*/
	  else {
	    /* make sure there is enough room to write all
	       three bytes and if not, rewind the source
	       stream and break out*/
	    if( (byteBuffer + 2) >= targetLimit) { 
	      --unicharBuffer; 
	      goto finish;
	    }
			
	    hiByte = curUC >> 8;
	    loByte = curUC;
			
	    /* add quote Unicode tag*/
	    if( sUnicodeTagTable[ hiByte ] )
	      *byteBuffer++ = (uint8_t) UQUOTEU;
			
	    *byteBuffer++ = (uint8_t) hiByte;
	    *byteBuffer++ = (uint8_t) loByte;
	  }
	}
      }
    }  /* end switch*/
  }
    
 finish:
    
    /* fill in output parameters*/
  *target = byteBuffer;
  *source = unicharBuffer;

  if(unicharBuffer < sourceLimit)
    *status = U_BUFFER_OVERFLOW_ERROR;
}

void 
scsu_decompress(UnicodeCompressor *comp,
		UChar             **target,
		const UChar       *targetLimit,
		const uint8_t     **source,
		const uint8_t     *sourceLimit,
		UErrorCode        *status)
{
  /* the current position in the source byte buffer*/
  const uint8_t *byteBuffer = *source;

  /* the current position in the target unichar buffer*/
  UChar *unicharBuffer = *target;

  /* the current byte from the source buffer*/
  int32_t aByte  = 0x00;

  /* temporary for calculating surrogate pairs */
  int32_t normalizedBase;
   
  /* temporary used for look-ahead */
  int32_t dByte;


  /* verify we weren't passed a failing error code */
  if(U_FAILURE(*status)) {
    return; 
  }
  /* verify the target buffer can hold at least 1 UChar */
  else if(targetLimit - unicharBuffer < sizeof(UChar)) {
    *status = U_ILLEGAL_ARGUMENT_ERROR;
    return;
  }

  /* if our internal buffer isn't empty, flush its contents
       to the output buffer before doing any more decompression */
  if(comp->fBufferLength > 0) {

    int32_t newBytes = 0;
    const uint8_t *newSource = comp->fBuffer;
    const uint8_t *newSourceLimit = comp->fBuffer + USCSU_BUFSIZE;

    /* fill the buffer completely, to guarantee one full character */
    if(comp->fBufferLength != USCSU_BUFSIZE) {
      newBytes = USCSU_BUFSIZE - comp->fBufferLength;

      /* verify there are newBytes bytes in byteBuffer */
      if(sourceLimit - byteBuffer < newBytes)
	newBytes = sourceLimit - byteBuffer;

      uprv_memcpy(comp->fBuffer + comp->fBufferLength, byteBuffer, newBytes);
    }

    /* reset buffer length to 0 before recursive call */
    comp->fBufferLength = 0;

    /* call self recursively to decompress the buffer */
    scsu_decompress(comp, &unicharBuffer, targetLimit,
		    &newSource, newSourceLimit, status);

    /* update the positions into the arrays */
    /* unicharBuffer was updated by the call to decompress above */
    byteBuffer += newBytes;
  }

  /* the main decompression loop*/
 mainLoop:
  while(byteBuffer < sourceLimit && unicharBuffer < targetLimit) {

    switch(comp->fMode) {  

      /* single-byte mode decompression loop*/
    case SINGLEBYTEMODE:
      while(byteBuffer < sourceLimit && unicharBuffer < targetLimit) {
		
	/* get the next byte */
	aByte = *byteBuffer++;
		
	switch(aByte) {
	  /* All bytes from 0x80 through 0xFF are remapped to
	     chars or surrogate pairs according to the currently
	     active window */
	case 0x80: case 0x81: case 0x82: case 0x83: case 0x84:
	case 0x85: case 0x86: case 0x87: case 0x88: case 0x89:
	case 0x8A: case 0x8B: case 0x8C: case 0x8D: case 0x8E:
	case 0x8F: case 0x90: case 0x91: case 0x92: case 0x93:
	case 0x94: case 0x95: case 0x96: case 0x97: case 0x98:
	case 0x99: case 0x9A: case 0x9B: case 0x9C: case 0x9D:
	case 0x9E: case 0x9F: case 0xA0: case 0xA1: case 0xA2:
	case 0xA3: case 0xA4: case 0xA5: case 0xA6: case 0xA7:
	case 0xA8: case 0xA9: case 0xAA: case 0xAB: case 0xAC:
	case 0xAD: case 0xAE: case 0xAF: case 0xB0: case 0xB1:
	case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6:
	case 0xB7: case 0xB8: case 0xB9: case 0xBA: case 0xBB:
	case 0xBC: case 0xBD: case 0xBE: case 0xBF: case 0xC0:
	case 0xC1: case 0xC2: case 0xC3: case 0xC4: case 0xC5:
	case 0xC6: case 0xC7: case 0xC8: case 0xC9: case 0xCA:
	case 0xCB: case 0xCC: case 0xCD: case 0xCE: case 0xCF:
	case 0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4:
	case 0xD5: case 0xD6: case 0xD7: case 0xD8: case 0xD9:
	case 0xDA: case 0xDB: case 0xDC: case 0xDD: case 0xDE:
	case 0xDF: case 0xE0: case 0xE1: case 0xE2: case 0xE3:
	case 0xE4: case 0xE5: case 0xE6: case 0xE7:  case 0xE8:
	case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xED:
	case 0xEE: case 0xEF: case 0xF0: case 0xF1: case 0xF2:
	case 0xF3: case 0xF4: case 0xF5: case 0xF6: case 0xF7:
	case 0xF8: case 0xF9: case 0xFA: case 0xFB: case 0xFC:
	case 0xFD: case 0xFE: case 0xFF: 
		    
	  /* For offsets <= 0xFFFF, convert to a single char by
	     adding the window's offset and subtracting the
	     generic compression offset*/
	  if(comp->fOffsets[ comp->fCurrentWindow ] <= 0xFFFF) {
	    *unicharBuffer++ = (UChar) 
	      (aByte + comp->fOffsets[comp->fCurrentWindow] 
	       - COMPRESSIONOFFSET);
	  }
	  /* For offsets > 0x10000, convert to a surrogate pair by 
	     normBase = window's offset - 0x10000
	     high surrogate = 0xD800 + (normBase >> 10)
	     low  surrogate = 0xDC00 + (normBase & 0x3FF) 
	     + (byte & 0x7F) */
	  else {
	    /* make sure there is enough room to write
	       both characters 
	       if not, save state and break out */
	    if((unicharBuffer + 1) >= targetLimit) {
	      --byteBuffer;
	      uprv_memcpy(comp->fBuffer, byteBuffer, 
			 sourceLimit - byteBuffer);
	      comp->fBufferLength = sourceLimit - byteBuffer;
	      byteBuffer += comp->fBufferLength;
	      goto finish;
	    }
		    
	    normalizedBase = comp->fOffsets[comp->fCurrentWindow] 
	      - 0x10000;
	    *unicharBuffer++ = 
	      (UChar) (0xD800 + (normalizedBase >> 10));
	    *unicharBuffer++ = (UChar) 
	      (0xDC00 + (normalizedBase & 0x3FF) 
	       + (aByte & 0x7F));
	  }
	  break;
		    
	  /* bytes from 0x20 through 0x7F are treated as ASCII
	     and are remapped to chars by padding the high byte
	     (this is the same as quoting from static window 0)
	     NUL (0x00), HT (0x09), CR (0x0A), LF (0x0D) are
	     treated as ASCII as well*/
	case 0x00: case 0x09: case 0x0A: case 0x0D:
	case 0x20: case 0x21: case 0x22: case 0x23: case 0x24:
	case 0x25: case 0x26: case 0x27: case 0x28: case 0x29:
	case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2E:
	case 0x2F: case 0x30: case 0x31: case 0x32: case 0x33:
	case 0x34: case 0x35: case 0x36: case 0x37: case 0x38:
	case 0x39: case 0x3A: case 0x3B: case 0x3C: case 0x3D:
	case 0x3E: case 0x3F: case 0x40: case 0x41: case 0x42:
	case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
	case 0x48: case 0x49: case 0x4A: case 0x4B: case 0x4C:
	case 0x4D: case 0x4E: case 0x4F: case 0x50: case 0x51:
	case 0x52: case 0x53: case 0x54: case 0x55: case 0x56:
	case 0x57: case 0x58: case 0x59: case 0x5A: case 0x5B:
	case 0x5C: case 0x5D: case 0x5E: case 0x5F: case 0x60:
	case 0x61: case 0x62: case 0x63: case 0x64: case 0x65:
	case 0x66: case 0x67: case 0x68: case 0x69: case 0x6A:
	case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F:
	case 0x70: case 0x71: case 0x72: case 0x73: case 0x74:
	case 0x75: case 0x76: case 0x77: case 0x78: case 0x79:
	case 0x7A: case 0x7B: case 0x7C: case 0x7D: case 0x7E:
	case 0x7F: 
	  *unicharBuffer++ = (UChar) aByte;
	  break;
		    
	  /* quote unicode*/
	case SQUOTEU:
	  /* verify we have two bytes following tag and if not,
	     rewind the source stream and break out */
	  if( (byteBuffer + 1) >= sourceLimit ) {
	    --byteBuffer;
	    uprv_memcpy(comp->fBuffer, byteBuffer, 
		       sourceLimit - byteBuffer);
	    comp->fBufferLength = sourceLimit - byteBuffer;
	    byteBuffer += comp->fBufferLength;
	    goto finish;
	  }
		    
	  aByte = *byteBuffer++;
	  *unicharBuffer++ = 
	    (UChar) (aByte << 8 | *byteBuffer++);
	  break;
		    
	  /* switch to Unicode mode*/
	case SCHANGEU:
	  comp->fMode = UNICODEMODE;
	  /* use a goto here for speed, to avoid having to check
	     fMode in the while loop at the top of the case */
	  goto mainLoop;
	  break;
		    
	  /* handle all quote tags*/
	case SQUOTE0:   case SQUOTE1:   case SQUOTE2:  case SQUOTE3:
	case SQUOTE4:   case SQUOTE5:   case SQUOTE6:  case SQUOTE7:
	  /* verify there is a byte following the tag and if
	     not, rewind the source stream and break out*/
	  if( byteBuffer >= sourceLimit ) { 
	    --byteBuffer;
	    uprv_memcpy(comp->fBuffer, byteBuffer, 
		       sourceLimit - byteBuffer);
	    comp->fBufferLength = sourceLimit - byteBuffer;
	    byteBuffer += comp->fBufferLength;
	    goto finish;
	  }
		    
	  /* if the byte is in the range 0x00 - 0x7F, use static
	     window n- otherwise, use dynamic window n */
	  dByte = *byteBuffer++;
	  *unicharBuffer++ = (UChar) 
	    (dByte + (dByte >= 0x00 && dByte < 0x80 
		      ? sOffsets[aByte - SQUOTE0] 
		      : (comp->fOffsets[aByte - SQUOTE0] 
			 - COMPRESSIONOFFSET))); 
	  break;
		    
	  /* handle all change tags*/
	case SCHANGE0: case SCHANGE1: case SCHANGE2: case SCHANGE3: 
	case SCHANGE4: case SCHANGE5: case SCHANGE6: case SCHANGE7:
	  comp->fCurrentWindow = (aByte - SCHANGE0);
	  break;
		    
	  /* handle all define tags*/
	case SDEFINE0: case SDEFINE1: case SDEFINE2: case SDEFINE3:
	case SDEFINE4: case SDEFINE5: case SDEFINE6: case SDEFINE7:
	  /* verify there is a byte following the tag and if
	     not, rewind the source stream and break out*/
	  if( byteBuffer >= sourceLimit ) {
	    --byteBuffer;
	    uprv_memcpy(comp->fBuffer, byteBuffer, 
		       sourceLimit - byteBuffer);
	    comp->fBufferLength = sourceLimit - byteBuffer;
	    byteBuffer += comp->fBufferLength;
	    goto finish;
	  }
		    
	  comp->fCurrentWindow = (aByte - SDEFINE0);
	  comp->fOffsets[comp->fCurrentWindow] = 
	    sOffsetTable[*byteBuffer++];
	  break;
		    
	  /* handle define extended tag*/
	case SDEFINEX:
	  /* verify we have two bytes following tag and if not,
	     rewind the source stream and break out*/
	  if( (byteBuffer + 1) >= sourceLimit ) {
	    --byteBuffer;
	    uprv_memcpy(comp->fBuffer, byteBuffer, 
		       sourceLimit - byteBuffer);
	    comp->fBufferLength = sourceLimit - byteBuffer;
	    byteBuffer += comp->fBufferLength;
	    goto finish;
	  }
		    
	  aByte = *byteBuffer++;
	  comp->fCurrentWindow  = (aByte & 0xE0) >> 5;
	  comp->fOffsets[comp->fCurrentWindow] = 0x10000 
	    + (0x80 
	       * (((aByte & 0x1F) << 8) | *byteBuffer++));
	  break;
		    
	  /* reserved, shouldn't happen*/
	case SRESERVED:
	  break;
		    
	} /* end switch*/
      } /* end while*/
      break;
	    
      /* unicode mode decompression loop*/
    case UNICODEMODE:
      while( byteBuffer < sourceLimit && unicharBuffer < targetLimit ) {

	/* get the next byte */
	aByte = *byteBuffer++;
	    
	switch( aByte ) {
	  /* handle all define tags*/
	case UDEFINE0: case UDEFINE1: case UDEFINE2: case UDEFINE3:
	case UDEFINE4: case UDEFINE5: case UDEFINE6: case UDEFINE7:
	  /* verify there is a byte following tag and if not,
	     rewind the source stream and break out*/
	  if( byteBuffer >= sourceLimit ) { 
	    --byteBuffer;
	    uprv_memcpy(comp->fBuffer, byteBuffer, 
		       sourceLimit - byteBuffer);
	    comp->fBufferLength = sourceLimit - byteBuffer;
	    byteBuffer += comp->fBufferLength;
	    goto finish;
	  }
  
	  comp->fCurrentWindow = (aByte - UDEFINE0);
	  comp->fOffsets[comp->fCurrentWindow] = 
	    sOffsetTable[*byteBuffer++];
	  comp->fMode = SINGLEBYTEMODE;
	  /* use a goto here for speed, to avoid having to check
	     fMode in the while loop at the top of the case */
	  goto mainLoop;
	  break;
		    
	  /* handle define extended tag*/
	case UDEFINEX:
	  /* verify we have two bytes following tag if not,
	     rewind the source stream and break out*/
	  if( (byteBuffer + 1) >= sourceLimit ) {
	    --byteBuffer;
	    uprv_memcpy(comp->fBuffer, byteBuffer, 
		       sourceLimit - byteBuffer);
	    comp->fBufferLength = sourceLimit - byteBuffer;
	    byteBuffer += comp->fBufferLength;
	    goto finish;
	  }
  
	  aByte  = *byteBuffer++;
	  comp->fCurrentWindow = (aByte & 0xE0) >> 5;
	  comp->fOffsets[comp->fCurrentWindow] = 0x10000 
	    + (0x80 
	       * (((aByte & 0x1F) << 8) | *byteBuffer++));
	  comp->fMode = SINGLEBYTEMODE;
	  /* use a goto here for speed, to avoid having to check
	     fMode in the while loop at the top of the case */
	  goto mainLoop;
	  break;
		
	  /* handle all change tags*/
	case UCHANGE0: case UCHANGE1: case UCHANGE2: case UCHANGE3:
	case UCHANGE4: case UCHANGE5: case UCHANGE6: case UCHANGE7:
	  comp->fCurrentWindow = (aByte - UCHANGE0);
	  comp->fMode  = SINGLEBYTEMODE;
	  /* use a goto here for speed, to avoid having to check
	     fMode in the while loop at the top of the case */
	  goto mainLoop;
	  break;
		    
	  /* quote unicode*/
	case UQUOTEU:
	  /* verify we have two bytes following tag if not,
	     rewind the source stream and break out*/
	  if( byteBuffer >= sourceLimit  - 1) { 
	    --byteBuffer;
	    uprv_memcpy(comp->fBuffer, byteBuffer, 
		       sourceLimit - byteBuffer);
	    comp->fBufferLength = sourceLimit - byteBuffer;
	    byteBuffer += comp->fBufferLength;
	    goto finish;
	  }
		    
	  aByte = *byteBuffer++;
	  *unicharBuffer++ = (UChar) 
	    (aByte << 8 | *byteBuffer++);
	  break;

	default:
	  /* verify there is a byte following tag if not, rewind
	     the source stream and break out*/
	  if( byteBuffer >= sourceLimit ) { 
	    --byteBuffer;
	    uprv_memcpy(comp->fBuffer, byteBuffer, 
		       sourceLimit - byteBuffer);
	    comp->fBufferLength = sourceLimit - byteBuffer;
	    byteBuffer += comp->fBufferLength;
	    goto finish;
	  }

	  *unicharBuffer++ = (UChar) (aByte << 8 | *byteBuffer++);
	  break;
		
	} /* end switch*/
      } /* end while*/
      break;

    } /* end switch( comp->fMode )*/
  } /* end while*/

    
 finish:

  /* fill in return values*/
  *target = unicharBuffer;
  *source = byteBuffer;

  if(byteBuffer < sourceLimit)
    *status = U_BUFFER_OVERFLOW_ERROR;
}

/** Reset the compressor to its initial state. */
void 
scsu_reset(UnicodeCompressor *comp)
{
  int32_t i;

  /* reset dynamic windows*/
  comp->fOffsets[0] = 0x0080;  /* Latin-1*/
  comp->fOffsets[1] = 0x00C0;  /* Latin-1 Supplement + Latin Extended-A*/
  comp->fOffsets[2] = 0x0400;  /* Cyrillic*/
  comp->fOffsets[3] = 0x0600;  /* Arabic*/
  comp->fOffsets[4] = 0x0900;  /* Devanagari*/
  comp->fOffsets[5] = 0x3040;  /* Hiragana*/
  comp->fOffsets[6] = 0x30A0;  /* Katakana*/
  comp->fOffsets[7] = 0xFF00;  /* Fullwidth ASCII*/
    
  /* reset time stamps*/
  for(i = 0; i < USCSU_NUM_WINDOWS; i++) {
    comp->fTimeStamps[i]          = 0;
  }
    
  /* reset count of seen indices*/
  for( i = 0; i <= USCSU_MAX_INDEX; i++ ) {
    comp->fIndexCount[i] = 0;
  }
    
  comp->fTimeStamp      = 0;              /* Reset current time stamp*/
  comp->fCurrentWindow  = 0;              /* Make current window Latin-1*/
  comp->fMode           = SINGLEBYTEMODE; /* Start in single-byte mode*/
  comp->fBufferLength   = 0;              /* Empty buffer */
}

/**
 * Create the index value for a character.
 * For more information on this function, refer to table X-3
 * <A HREF="http://www.unicode.org/unicode/reports/tr6">UTR6</A>.
 * @param c The character in question.
 * @return An index for c
 */
static int32_t 
scsu_makeIndex(int32_t c)
{
  /* check the predefined indices*/
  if( c >= 0x00C0 && c < 0x0140)
    return LATININDEX;
  else if( c >= 0x0250 && c < 0x02D0 )
    return IPAEXTENSIONINDEX;
  else if( c >= 0x0370 && c < 0x03F0 )
    return GREEKINDEX;
  else if( c >= 0x0530 && c < 0x0590 )
    return ARMENIANINDEX;
  else if( c >= 0x3040 && c < 0x30A0 )
    return HIRAGANAINDEX;
  else if( c >= 0x30A0 && c < 0x3120)
    return KATAKANAINDEX;
  else if( c >= 0xFF60 && c < 0xFF9F )
    return HALFWIDTHKATAKANAINDEX;
    
    /* calculate index*/
  else if( c >= 0x0080 && c < 0x3400 )
    return (c / 0x80) & 0xFF;
  else if( c >= 0xE000 && c <= 0xFFFF )
    return ((c - 0xAC00) / 0x80) & 0xFF;
    
    /* should never happen*/
  else {
    return RESERVEDINDEX;
  }
}

/**
 * Determine if a character is in a dynamic window.  
 * @param c The character to test 
 * @param whichWindow The dynamic window the test
 * @return TRUE if <TT>c</TT> will fit in <TT>whichWindow</TT>, FALSE
 * otherwise.  
 */
static UBool 
scsu_inDynamicWindow(const UnicodeCompressor *comp,
		     int32_t c, 
		     int32_t whichWindow)
{
  return (UBool)(c >= comp->fOffsets[whichWindow] 
	  && c < (comp->fOffsets[whichWindow] + 0x80));
}

/**
 * Determine if a character is in a static window.
 * @param c The character to test
 * @param whichWindow The static window the test
 * @return TRUE if <TT>c</TT> will fit in <TT>whichWindow</TT>, FALSE 
 * otherwise.
 */
static UBool 
scsu_inStaticWindow(int32_t c, 
		    int32_t whichWindow)
{
  return (UBool)(c >= sOffsets[whichWindow] && c < (sOffsets[whichWindow] + 0x80));
}

/**
 * Determine if a character is compressible.
 * @param c The character to test.
 * @return TRUE if the <TT>c</TT> is compressible, FALSE otherwise.
 */
static UBool 
scsu_isCompressible(int32_t c)
{
  return (UBool)(c < 0x3400 || c >= 0xE000);
}

/**
 * Determine if a dynamic window for a certain character is defined
 * @param c The character in question
 * @return The dynamic window containing <TT>c</TT>, or INVALIDWINDOW if 
 * not defined.
 */
static int32_t 
scsu_findDynamicWindow(const UnicodeCompressor *comp,
		       int32_t c)
{
  int32_t i;
    
  for(i = 0; i < USCSU_NUM_WINDOWS; i++) {
    if(scsu_inDynamicWindow(comp, c, i)) {
      return i;
    }
  }
    
  return INVALIDWINDOW;
}

/**
 * Determine if a static window for a certain character is defined
 * @param c The character in question
 * @return The static window containing <TT>c</TT>, or INVALIDWINDOW if 
 * not defined.
 */
static int32_t 
scsu_findStaticWindow(int32_t c)
{
  int32_t i;
    
  for(i = 0; i < USCSU_NUM_STATIC_WINDOWS; i++) {
    if(scsu_inStaticWindow(c, i)) {
      return i;
    }
  }
    
  return INVALIDWINDOW;
}

/** Find the least-recently defined window */
static int32_t 
scsu_getLRDefinedWindow(const UnicodeCompressor *comp)
{
  int32_t leastRU         = INT32_MAX;
  int32_t whichWindow     = INVALIDWINDOW;
  int32_t i;
  
  /* find least recently used window*/
  for(i = 0; i < USCSU_NUM_WINDOWS; i++ ) {
    if(comp->fTimeStamps[i] < leastRU) {
      leastRU = comp->fTimeStamps[i];
      whichWindow = i;
    }
  }
    
  return whichWindow;
}
