/*
******************************************************************************
*
*   Copyright (C) 1999-2001, 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 const 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 const 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 const 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 const 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;
}
