X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/374ca955a76ecab1204ca8bfa63ff9238d998416..ef6cf650f4a75c3f97de06b51fa104f2069b9ea2:/icuSources/common/rbbinode.cpp?ds=inline diff --git a/icuSources/common/rbbinode.cpp b/icuSources/common/rbbinode.cpp index b873f218..1468be9c 100644 --- a/icuSources/common/rbbinode.cpp +++ b/icuSources/common/rbbinode.cpp @@ -1,6 +1,6 @@ /* *************************************************************************** -* Copyright (C) 2002-2003 International Business Machines Corporation * +* Copyright (C) 2002-2016 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** */ @@ -33,8 +33,9 @@ U_NAMESPACE_BEGIN -int RBBINode::gLastSerial = 0; - +#ifdef RBBI_DEBUG +static int gLastSerial = 0; +#endif //------------------------------------------------------------------------- @@ -43,7 +44,9 @@ int RBBINode::gLastSerial = 0; // //------------------------------------------------------------------------- RBBINode::RBBINode(NodeType t) : UMemory() { +#ifdef RBBI_DEBUG fSerialNum = ++gLastSerial; +#endif fType = t; fParent = NULL; fLeftChild = NULL; @@ -53,6 +56,8 @@ RBBINode::RBBINode(NodeType t) : UMemory() { fLastPos = 0; fNullable = FALSE; fLookAheadEnd = FALSE; + fRuleRoot = FALSE; + fChainIn = FALSE; fVal = 0; fPrecedence = precZero; @@ -69,7 +74,9 @@ RBBINode::RBBINode(NodeType t) : UMemory() { RBBINode::RBBINode(const RBBINode &other) : UMemory(other) { +#ifdef RBBI_DEBUG fSerialNum = ++gLastSerial; +#endif fType = other.fType; fParent = NULL; fLeftChild = NULL; @@ -81,6 +88,8 @@ RBBINode::RBBINode(const RBBINode &other) : UMemory(other) { fLastPos = other.fLastPos; fNullable = other.fNullable; fVal = other.fVal; + fRuleRoot = FALSE; + fChainIn = other.fChainIn; UErrorCode status = U_ZERO_ERROR; fFirstPosSet = new UVector(status); // TODO - get a real status from somewhere fLastPosSet = new UVector(status); @@ -144,15 +153,20 @@ RBBINode *RBBINode::cloneTree() { n = this; } else { n = new RBBINode(*this); - if (fLeftChild != NULL) { - n->fLeftChild = fLeftChild->cloneTree(); - n->fLeftChild->fParent = n; - } - if (fRightChild != NULL) { - n->fRightChild = fRightChild->cloneTree(); - n->fRightChild->fParent = n; + // Check for null pointer. + if (n != NULL) { + if (fLeftChild != NULL) { + n->fLeftChild = fLeftChild->cloneTree(); + n->fLeftChild->fParent = n; + } + if (fRightChild != NULL) { + n->fRightChild = fRightChild->cloneTree(); + n->fRightChild->fParent = n; + } } } + n->fRuleRoot = this->fRuleRoot; + n->fChainIn = this->fChainIn; return n; } @@ -264,6 +278,12 @@ void RBBINode::findNodes(UVector *dest, RBBINode::NodeType kind, UErrorCode &s // //------------------------------------------------------------------------- #ifdef RBBI_DEBUG + +static int32_t serial(const RBBINode *node) { + return (node == NULL? -1 : node->fSerialNum); +} + + void RBBINode::printNode() { static const char * const nodeTypeNames[] = { "setRef", @@ -287,9 +307,10 @@ void RBBINode::printNode() { if (this==NULL) { RBBIDebugPrintf("%10p", (void *)this); } else { - RBBIDebugPrintf("%10p %12s %10p %10p %10p %4d %6d %d ", - (void *)this, nodeTypeNames[fType], (void *)fParent, (void *)fLeftChild, (void *)fRightChild, - fSerialNum, fFirstPos, fVal); + RBBIDebugPrintf("%10p %5d %12s %c%c %5d %5d %5d %6d %d ", + (void *)this, fSerialNum, nodeTypeNames[fType], fRuleRoot?'R':' ', fChainIn?'C':' ', + serial(fLeftChild), serial(fRightChild), serial(fParent), + fFirstPos, fVal); if (fType == varRef) { RBBI_DEBUG_printUnicodeString(fText); } @@ -320,11 +341,13 @@ U_CFUNC void RBBI_DEBUG_printUnicodeString(const UnicodeString &s, int minWidth) // //------------------------------------------------------------------------- #ifdef RBBI_DEBUG +void RBBINode::printNodeHeader() { + RBBIDebugPrintf(" Address serial type LeftChild RightChild Parent position value\n"); +} + void RBBINode::printTree(UBool printHeading) { if (printHeading) { - RBBIDebugPrintf( "-------------------------------------------------------------------\n" - " Address type Parent LeftChild RightChild serial position value\n" - ); + printNodeHeader(); } this->printNode(); if (this != NULL) {