/*
**********************************************************************
*   Copyright (C) 1999-2000 IBM Corp. All rights reserved.
**********************************************************************
*   Date        Name        Description
*   12/1/99    rgillam     Complete port from Java.
*   01/13/2000 helena      Added UErrorCode to ctors.
**********************************************************************
*/

#include "ucmp8.h"
#include "dbbi_tbl.h"
#include "unicode/dbbi.h"

U_NAMESPACE_BEGIN

//=======================================================================
// constructor
//=======================================================================

DictionaryBasedBreakIteratorTables::DictionaryBasedBreakIteratorTables(
                                 UDataMemory* tablesMemory,
                                 const char* dictionaryFilename, 
                                 UErrorCode &status)
: RuleBasedBreakIteratorTables(tablesMemory),
  dictionary(dictionaryFilename, status)
{
    if(tablesMemory != 0) {
        const void* tablesImage = udata_getMemory(tablesMemory);
        if(tablesImage != 0) {
            if (U_FAILURE(status)) return;
            const int32_t* tablesIdx = (int32_t*) tablesImage;
            const int8_t* dbbiImage = ((const int8_t*)tablesImage + tablesIdx[8]);
            // we know the offset into the memory image where the DBBI stuff
            // starts is stored in element 8 of the array.  There should be
            // a way for the RBBI constructor to give us this, but there's
            // isn't a good one.
            const int32_t* dbbiIdx = (const int32_t*)dbbiImage;
            
            categoryFlags = (int8_t*)((const int8_t*)dbbiImage + (int32_t)dbbiIdx[0]);
        }
    }
}

//=======================================================================
// boilerplate
//=======================================================================

/**
 * Destructor
 */
DictionaryBasedBreakIteratorTables::~DictionaryBasedBreakIteratorTables() {
    if (ownTables)
        delete [] categoryFlags;
}

int32_t
DictionaryBasedBreakIteratorTables::lookupCategory(UChar c,
                                                   BreakIterator* bi) const {
    // this override of lookupCategory() exists only to keep track of whether we've
    // passed over any dictionary characters.  It calls the inherited lookupCategory()
    // to do the real work, and then checks whether its return value is one of the
    // categories represented in the dictionary.  If it is, bump the dictionary-
    // character count.
    int32_t result = RuleBasedBreakIteratorTables::lookupCategory(c, bi);
    if (result != RuleBasedBreakIterator::IGNORE && categoryFlags[result]) {
        ((DictionaryBasedBreakIterator*)bi)->bumpDictionaryCharCount();
    }
    return result;
}

U_NAMESPACE_END

/* eof */
