blob: 3fb812caef6af995abe16ae523094ec9518ff4e8 [file] [log] [blame]
/*
**********************************************************************
* 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"
//=======================================================================
// constructor
//=======================================================================
DictionaryBasedBreakIteratorTables::DictionaryBasedBreakIteratorTables(
const void* tablesImage,
char* dictionaryFilename,
UErrorCode &status)
: RuleBasedBreakIteratorTables(tablesImage),
dictionary(dictionaryFilename, status)
{
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;
}