ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
{
  LEErrorCode success = LE_NO_ERROR; // todo- make a param?
  const IndicRearrangementStateEntry *entry = entryTable.getAlias(index,success);
    ByteOffset newState = SWAPW(entry->newStateOffset);
    IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags);

    if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) {
       success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
       return 0;
    }

    if (flags & irfMarkFirst) {
        firstGlyph = (le_uint32)currGlyph;
    }

    if (flags & irfMarkLast) {
        lastGlyph = (le_uint32)currGlyph;
    }

    doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);

    if (!(flags & irfDontAdvance)) {
        // XXX: Should handle reverse too...
        currGlyph += 1;
    }

    return newState;
}
le_uint16 IndicRearrangementProcessor2::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph,
                                                          EntryTableIndex2 index, LEErrorCode &success)
{
    const IndicRearrangementStateEntry2 *entry = entryTable.getAlias(index, success);
    if (LE_FAILURE(success)) return 0; // TODO - what to return in bad state?
    le_uint16 newState = SWAPW(entry->newStateIndex); // index to the new state
    IndicRearrangementFlags  flags =  (IndicRearrangementFlags) SWAPW(entry->flags);

    if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) {
       success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
       return 0;
    }

    if (flags & irfMarkFirst) {
        firstGlyph = (le_uint32)currGlyph;
    }

    if (flags & irfMarkLast) {
        lastGlyph = (le_uint32)currGlyph;
    }

    doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);

    if (!(flags & irfDontAdvance)) {
        currGlyph += dir;
    }

    return newState; // index to new state
}
le_uint16 IndicRearrangementProcessor2::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex2 index)
{
    const IndicRearrangementStateEntry2 *entry = &entryTable[index];
    le_uint16 newState = SWAPW(entry->newStateIndex); // index to the new state
    IndicRearrangementFlags  flags =  (IndicRearrangementFlags) SWAPW(entry->flags);
    
    if (flags & irfMarkFirst) {
        firstGlyph = currGlyph;
    }

    if (flags & irfMarkLast) {
        lastGlyph = currGlyph;
    }

    doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask));

    if (!(flags & irfDontAdvance)) {
        currGlyph += dir;
    }
    
    return newState; // index to new state
}
ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
{
    const IndicRearrangementStateEntry *entry = &entryTable[index];
    ByteOffset newState = SWAPW(entry->newStateOffset);
    IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags);

    if (flags & irfMarkFirst) {
        firstGlyph = currGlyph;
    }

    if (flags & irfMarkLast) {
        lastGlyph = currGlyph;
    }

    doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask));

    if (!(flags & irfDontAdvance)) {
        // XXX: Should handle reverse too...
        currGlyph += 1;
    }

    return newState;
}