16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2010-2011, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* file name: ucharstrieiterator.h 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* encoding: US-ASCII 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* tab size: 8 (not used) 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* indentation:4 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created on: 2010nov15 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created by: Markus W. Scherer 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucharstrie.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uvectr32.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharsTrie::Iterator::Iterator(const UChar *trieUChars, int32_t maxStringLength, 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &errorCode) 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : uchars_(trieUChars), 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_(uchars_), initialPos_(uchars_), 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_(-1), initialRemainingMatchLength_(-1), 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org skipValue_(FALSE), 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org maxLength_(maxStringLength), value_(0), stack_(NULL) { 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // stack_ is a pointer so that it's easy to turn ucharstrie.h into 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // a public API header for which we would want it to depend only on 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // other public headers. 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Unlike UCharsTrie itself, its Iterator performs memory allocations anyway 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // via the UnicodeString and UVector32 implementations, so this additional 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // cost is minimal. 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_=new UVector32(errorCode); 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(stack_==NULL) { 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_MEMORY_ALLOCATION_ERROR; 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharsTrie::Iterator::Iterator(const UCharsTrie &trie, int32_t maxStringLength, 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &errorCode) 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : uchars_(trie.uchars_), pos_(trie.pos_), initialPos_(trie.pos_), 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_(trie.remainingMatchLength_), 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org initialRemainingMatchLength_(trie.remainingMatchLength_), 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org skipValue_(FALSE), 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org maxLength_(maxStringLength), value_(0), stack_(NULL) { 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_=new UVector32(errorCode); 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(stack_==NULL) { 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_MEMORY_ALLOCATION_ERROR; 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length=remainingMatchLength_; // Actual remaining match length minus 1. 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length>=0) { 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Pending linear-match node, append remaining UChars to str_. 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++length; 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(maxLength_>0 && length>maxLength_) { 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=maxLength_; // This will leave remainingMatchLength>=0 as a signal. 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_.append(pos_, length); 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_+=length; 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_-=length; 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharsTrie::Iterator::~Iterator() { 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete stack_; 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharsTrie::Iterator & 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharsTrie::Iterator::reset() { 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_=initialPos_; 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_=initialRemainingMatchLength_; 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org skipValue_=FALSE; 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length=remainingMatchLength_+1; // Remaining match length. 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(maxLength_>0 && length>maxLength_) { 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=maxLength_; 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_.truncate(length); 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_+=length; 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_-=length; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->setSize(0); 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return *this; 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharsTrie::Iterator::hasNext() const { return pos_!=NULL || !stack_->isEmpty(); } 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharsTrie::Iterator::next(UErrorCode &errorCode) { 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *pos=pos_; 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pos==NULL) { 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(stack_->isEmpty()) { 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Pop the state off the stack and continue with the next outbound edge of 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // the branch node. 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t stackSize=stack_->size(); 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length=stack_->elementAti(stackSize-1); 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=uchars_+stack_->elementAti(stackSize-2); 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->setSize(stackSize-2); 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_.truncate(length&0xffff); 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=(int32_t)((uint32_t)length>>16); 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length>1) { 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=branchNext(pos, length, errorCode); 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pos==NULL) { 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; // Reached a final value. 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_.append(*pos++); 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(remainingMatchLength_>=0) { 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // We only get here if we started in a pending linear-match node 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // with more than maxLength remaining units. 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return truncateAndStop(); 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(;;) { 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t node=*pos++; 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(node>=kMinValueLead) { 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(skipValue_) { 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=skipNodeValue(pos, node); 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org node&=kNodeTypeMask; 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org skipValue_=FALSE; 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Deliver value for the string so far. 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isFinal=(UBool)(node>>15); 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(isFinal) { 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value_=readValue(pos, node&0x7fff); 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value_=readNodeValue(pos, node); 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(isFinal || (maxLength_>0 && str_.length()==maxLength_)) { 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_=NULL; 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // We cannot skip the value right here because it shares its 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // lead unit with a match node which we have to evaluate 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // next time. 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Instead, keep pos_ on the node lead unit itself. 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_=pos-1; 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org skipValue_=TRUE; 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(maxLength_>0 && str_.length()==maxLength_) { 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return truncateAndStop(); 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(node<kMinLinearMatch) { 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(node==0) { 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org node=*pos++; 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=branchNext(pos, node+1, errorCode); 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pos==NULL) { 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; // Reached a final value. 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Linear-match node, append length units to str_. 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length=node-kMinLinearMatch+1; 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(maxLength_>0 && str_.length()+length>maxLength_) { 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_.append(pos, maxLength_-str_.length()); 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return truncateAndStop(); 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_.append(pos, length); 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos+=length; 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Branch node, needs to take the first outbound edge and push state for the rest. 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UChar * 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharsTrie::Iterator::branchNext(const UChar *pos, int32_t length, UErrorCode &errorCode) { 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(length>kMaxBranchLinearSubNodeLength) { 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++pos; // ignore the comparison unit 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Push state for the greater-or-equal edge. 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->addElement((int32_t)(skipDelta(pos)-uchars_), errorCode); 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->addElement(((length-(length>>1))<<16)|str_.length(), errorCode); 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Follow the less-than edge. 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length>>=1; 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=jumpByDelta(pos); 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // List of key-value pairs where values are either final values or jump deltas. 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Read the first (key, value) pair. 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar trieUnit=*pos++; 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t node=*pos++; 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isFinal=(UBool)(node>>15); 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t value=readValue(pos, node&=0x7fff); 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=skipValue(pos, node); 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->addElement((int32_t)(pos-uchars_), errorCode); 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->addElement(((length-1)<<16)|str_.length(), errorCode); 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_.append(trieUnit); 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(isFinal) { 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_=NULL; 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value_=value; 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return pos+value; 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 214