//
/*
***************************************************************************
-* Copyright (C) 2002-2003 International Business Machines Corporation *
+* Copyright (C) 2002-2004 International Business Machines Corporation *
* and others. All rights reserved. *
***************************************************************************
*/
// Initialize the process by creating a single range encompassing all characters
// that is in no sets.
//
- fRangeList = new RangeDescriptor(*fStatus);
+ fRangeList = new RangeDescriptor(*fStatus); // will check for status here
fRangeList->fStartChar = 0;
fRangeList->fEndChar = 0x10ffff;
+ if (U_FAILURE(*fStatus)) {
+ return;
+ }
//
// Find the set of non-overlapping ranges of characters
// over
if (rlRange->fStartChar < inputSetRangeBegin) {
rlRange->split(inputSetRangeBegin, *fStatus);
+ if (U_FAILURE(*fStatus)) {
+ return;
+ }
continue;
}
// wholly inside the Unicode set.
if (rlRange->fEndChar > inputSetRangeEnd) {
rlRange->split(inputSetRangeEnd+1, *fStatus);
+ if (U_FAILURE(*fStatus)) {
+ return;
+ }
}
// The current rlRange is now entirely within the UnicodeSet range.
// Add this unicode set to the list of sets for this rlRange
if (rlRange->fIncludesSets->indexOf(usetNode) == -1) {
rlRange->fIncludesSets->addElement(usetNode, *fStatus);
+ if (U_FAILURE(*fStatus)) {
+ return;
+ }
}
// Advance over ranges that we are finished with.
NULL, // Data array (utrie will allocate one)
100000, // Max Data Length
0, // Initial value for all code points
+ 0, // Lead surrogate unit value
TRUE); // Keep Latin 1 in separately
// getTrieSize() Return the size that will be required to serialize the Trie.
//
//-----------------------------------------------------------------------------------
-int32_t RBBISetBuilder::getTrieSize() {
+int32_t RBBISetBuilder::getTrieSize() /*const*/ {
fTrieSize = utrie_serialize(fTrie,
NULL, // Buffer
0, // Capacity
// getNumOutputSets
//
//------------------------------------------------------------------------
-int32_t RBBISetBuilder::getNumCharCategories() {
+int32_t RBBISetBuilder::getNumCharCategories() const {
return fGroupCount + 1;
}
+//------------------------------------------------------------------------
+//
+// getFirstChar Given a runtime RBBI character category, find
+// the first UChar32 that is in the set of chars
+// in the category.
+//------------------------------------------------------------------------
+UChar32 RBBISetBuilder::getFirstChar(int32_t category) const {
+ RangeDescriptor *rlRange;
+ UChar32 retVal = (UChar32)-1;
+ for (rlRange = fRangeList; rlRange!=0; rlRange=rlRange->fNext) {
+ if (rlRange->fNum == category) {
+ retVal = rlRange->fStartChar;
+ break;
+ }
+ }
+ return retVal;
+}
+
+
+
//------------------------------------------------------------------------
//
// printRanges A debugging function.
// dump out all of the range definitions.
//
//------------------------------------------------------------------------
-void RBBISetBuilder::printRanges() {
#ifdef RBBI_DEBUG
+void RBBISetBuilder::printRanges() {
RangeDescriptor *rlRange;
int i;
for (i=0; i<rlRange->fIncludesSets->size(); i++) {
RBBINode *usetNode = (RBBINode *)rlRange->fIncludesSets->elementAt(i);
- UnicodeString setName = "anon";
+ UnicodeString setName = UNICODE_STRING("anon", 4);
RBBINode *setRef = usetNode->fParent;
if (setRef != NULL) {
RBBINode *varRef = setRef->fParent;
setName = varRef->fText;
}
}
- RBBINode::printUnicodeString(setName); RBBIDebugPrintf(" ");
+ RBBI_DEBUG_printUnicodeString(setName); RBBIDebugPrintf(" ");
}
RBBIDebugPrintf("\n");
}
-#endif
}
+#endif
//------------------------------------------------------------------------
// dump out all of the range groups.
//
//------------------------------------------------------------------------
+#ifdef RBBI_DEBUG
void RBBISetBuilder::printRangeGroups() {
RangeDescriptor *rlRange;
RangeDescriptor *tRange;
for (i=0; i<rlRange->fIncludesSets->size(); i++) {
RBBINode *usetNode = (RBBINode *)rlRange->fIncludesSets->elementAt(i);
- UnicodeString setName = "anon";
+ UnicodeString setName = UNICODE_STRING("anon", 4);
RBBINode *setRef = usetNode->fParent;
if (setRef != NULL) {
RBBINode *varRef = setRef->fParent;
setName = varRef->fText;
}
}
- RBBINode::printUnicodeString(setName); RBBIDebugPrintf(" ");
+ RBBI_DEBUG_printUnicodeString(setName); RBBIDebugPrintf(" ");
}
i = 0;
}
RBBIDebugPrintf("\n");
}
-
+#endif
//------------------------------------------------------------------------
// dump out all of the set definitions.
//
//------------------------------------------------------------------------
-void RBBISetBuilder::printSets() {
#ifdef RBBI_DEBUG
+void RBBISetBuilder::printSets() {
int i;
RBBIDebugPrintf("\n\nUnicode Sets List\n------------------\n");
}
RBBIDebugPrintf("%3d ", i);
- setName = "anonymous";
+ setName = UNICODE_STRING("anonymous", 9);
setRef = usetNode->fParent;
if (setRef != NULL) {
varRef = setRef->fParent;
setName = varRef->fText;
}
}
- RBBINode::printUnicodeString(setName);
+ RBBI_DEBUG_printUnicodeString(setName);
RBBIDebugPrintf(" ");
- RBBINode::printUnicodeString(usetNode->fText);
+ RBBI_DEBUG_printUnicodeString(usetNode->fText);
RBBIDebugPrintf("\n");
if (usetNode->fLeftChild != NULL) {
- usetNode->fLeftChild->printTree();
+ usetNode->fLeftChild->printTree(TRUE);
}
}
RBBIDebugPrintf("\n");
-#endif
}
+#endif
this->fEndChar = other.fEndChar;
this->fNum = other.fNum;
this->fNext = NULL;
+ UErrorCode oldstatus = status;
this->fIncludesSets = new UVector(status);
+ if (U_FAILURE(oldstatus)) {
+ status = oldstatus;
+ }
+ if (U_FAILURE(status)) {
+ return;
+ }
/* test for NULL */
if (this->fIncludesSets == 0) {
status = U_MEMORY_ALLOCATION_ERROR;
this->fEndChar = 0;
this->fNum = 0;
this->fNext = NULL;
+ UErrorCode oldstatus = status;
this->fIncludesSets = new UVector(status);
+ if (U_FAILURE(oldstatus)) {
+ status = oldstatus;
+ }
+ if (U_FAILURE(status)) {
+ return;
+ }
/* test for NULL */
if(this->fIncludesSets == 0) {
status = U_MEMORY_ALLOCATION_ERROR;
void RangeDescriptor::split(UChar32 where, UErrorCode &status) {
U_ASSERT(where>fStartChar && where<=fEndChar);
RangeDescriptor *nr = new RangeDescriptor(*this, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
/* test for NULL */
if(nr == 0) {
status = U_MEMORY_ALLOCATION_ERROR;
setName = varRef->fText;
}
}
- if (setName.compare("dictionary") == 0) { // TODO: no string literals.
+ if (setName.compare(UNICODE_STRING("dictionary", 10)) == 0) { // TODO: no string literals.
this->fNum |= 0x4000;
break;
}