| Index: source/common/rbbiscan.cpp
|
| diff --git a/source/common/rbbiscan.cpp b/source/common/rbbiscan.cpp
|
| index dd33aaeb46db71d51495f8299ec65661236c8bfa..1dc6b704d01094c7233e9d3d5f3b19566b7d5b3e 100644
|
| --- a/source/common/rbbiscan.cpp
|
| +++ b/source/common/rbbiscan.cpp
|
| @@ -1,8 +1,7 @@
|
| -
|
| //
|
| // file: rbbiscan.cpp
|
| //
|
| -// Copyright (C) 2002-2014, International Business Machines Corporation and others.
|
| +// Copyright (C) 2002-2015, International Business Machines Corporation and others.
|
| // All Rights Reserved.
|
| //
|
| // This file contains the Rule Based Break Iterator Rule Builder functions for
|
| @@ -211,6 +210,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| fixOpStack(RBBINode::precOpCat);
|
| RBBINode *operandNode = fNodeStack[fNodeStackPtr--];
|
| RBBINode *orNode = pushNewNode(RBBINode::opOr);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| orNode->fLeftChild = operandNode;
|
| operandNode->fParent = orNode;
|
| }
|
| @@ -225,6 +227,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| fixOpStack(RBBINode::precOpCat);
|
| RBBINode *operandNode = fNodeStack[fNodeStackPtr--];
|
| RBBINode *catNode = pushNewNode(RBBINode::opCat);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| catNode->fLeftChild = operandNode;
|
| operandNode->fParent = catNode;
|
| }
|
| @@ -320,6 +325,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| RBBINode *thisRule = fNodeStack[fNodeStackPtr];
|
| RBBINode *endNode = pushNewNode(RBBINode::endMark);
|
| RBBINode *catNode = pushNewNode(RBBINode::opCat);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| fNodeStackPtr -= 2;
|
| catNode->fLeftChild = thisRule;
|
| catNode->fRightChild = endNode;
|
| @@ -347,6 +355,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| RBBINode *thisRule = fNodeStack[fNodeStackPtr];
|
| RBBINode *prevRules = *destRules;
|
| RBBINode *orNode = pushNewNode(RBBINode::opOr);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| orNode->fLeftChild = prevRules;
|
| prevRules->fParent = orNode;
|
| orNode->fRightChild = thisRule;
|
| @@ -387,6 +398,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| {
|
| RBBINode *operandNode = fNodeStack[fNodeStackPtr--];
|
| RBBINode *plusNode = pushNewNode(RBBINode::opPlus);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| plusNode->fLeftChild = operandNode;
|
| operandNode->fParent = plusNode;
|
| }
|
| @@ -396,6 +410,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| {
|
| RBBINode *operandNode = fNodeStack[fNodeStackPtr--];
|
| RBBINode *qNode = pushNewNode(RBBINode::opQuestion);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| qNode->fLeftChild = operandNode;
|
| operandNode->fParent = qNode;
|
| }
|
| @@ -405,6 +422,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| {
|
| RBBINode *operandNode = fNodeStack[fNodeStackPtr--];
|
| RBBINode *starNode = pushNewNode(RBBINode::opStar);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| starNode->fLeftChild = operandNode;
|
| operandNode->fParent = starNode;
|
| }
|
| @@ -418,6 +438,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| // sets that just happen to contain only one character.
|
| {
|
| n = pushNewNode(RBBINode::setRef);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| findSetFor(UnicodeString(fC.fChar), n);
|
| n->fFirstPos = fScanIndex;
|
| n->fLastPos = fNextIndex;
|
| @@ -429,6 +452,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| // scanned a ".", meaning match any single character.
|
| {
|
| n = pushNewNode(RBBINode::setRef);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| findSetFor(UnicodeString(TRUE, kAny, 3), n);
|
| n->fFirstPos = fScanIndex;
|
| n->fLastPos = fNextIndex;
|
| @@ -439,6 +465,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| case doSlash:
|
| // Scanned a '/', which identifies a look-ahead break position in a rule.
|
| n = pushNewNode(RBBINode::lookAhead);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| n->fVal = fRuleNum;
|
| n->fFirstPos = fScanIndex;
|
| n->fLastPos = fNextIndex;
|
| @@ -450,6 +479,9 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| case doStartTagValue:
|
| // Scanned a '{', the opening delimiter for a tag value within a rule.
|
| n = pushNewNode(RBBINode::tag);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + break;
|
| + }
|
| n->fVal = 0;
|
| n->fFirstPos = fScanIndex;
|
| n->fLastPos = fNextIndex;
|
| @@ -560,7 +592,7 @@ UBool RBBIRuleScanner::doParseActions(int32_t action)
|
| returnVal = FALSE;
|
| break;
|
| }
|
| - return returnVal;
|
| + return returnVal && U_SUCCESS(*fRB->fStatus);
|
| }
|
|
|
|
|
| @@ -1051,6 +1083,9 @@ void RBBIRuleScanner::parse() {
|
| if (fRB->fReverseTree == NULL) {
|
| fRB->fReverseTree = pushNewNode(RBBINode::opStar);
|
| RBBINode *operand = pushNewNode(RBBINode::setRef);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + return;
|
| + }
|
| findSetFor(UnicodeString(TRUE, kAny, 3), operand);
|
| fRB->fReverseTree->fLeftChild = operand;
|
| operand->fParent = fRB->fReverseTree;
|
| @@ -1103,6 +1138,9 @@ void RBBIRuleScanner::printNodeStack(const char *title) {
|
| //
|
| //------------------------------------------------------------------------------
|
| RBBINode *RBBIRuleScanner::pushNewNode(RBBINode::NodeType t) {
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + return NULL;
|
| + }
|
| fNodeStackPtr++;
|
| if (fNodeStackPtr >= kStackSize) {
|
| error(U_BRK_INTERNAL_ERROR);
|
| @@ -1192,6 +1230,9 @@ void RBBIRuleScanner::scanSet() {
|
| RBBINode *n;
|
|
|
| n = pushNewNode(RBBINode::setRef);
|
| + if (U_FAILURE(*fRB->fStatus)) {
|
| + return;
|
| + }
|
| n->fFirstPos = startPos;
|
| n->fLastPos = fNextIndex;
|
| fRB->fRules.extractBetween(n->fFirstPos, n->fLastPos, n->fText);
|
|
|