16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2010-2012, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************* 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* file name: bytestrieiterator.cpp 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: 2010nov03 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/bytestrie.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/stringpiece.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "charstr.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "uvectr32.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBytesTrie::Iterator::Iterator(const void *trieBytes, int32_t maxStringLength, 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &errorCode) 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : bytes_(static_cast<const uint8_t *>(trieBytes)), 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_(bytes_), initialPos_(bytes_), 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_(-1), initialRemainingMatchLength_(-1), 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_(NULL), maxLength_(maxStringLength), value_(0), stack_(NULL) { 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // str_ and stack_ are pointers so that it's easy to turn bytestrie.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 BytesTrie itself, its Iterator performs memory allocations anyway 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // via the CharString and UVector32 implementations, so this additional 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // cost is minimal. 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_=new CharString(); 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_=new UVector32(errorCode); 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(errorCode) && (str_==NULL || stack_==NULL)) { 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_MEMORY_ALLOCATION_ERROR; 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBytesTrie::Iterator::Iterator(const BytesTrie &trie, int32_t maxStringLength, 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &errorCode) 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : bytes_(trie.bytes_), pos_(trie.pos_), initialPos_(trie.pos_), 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_(trie.remainingMatchLength_), 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org initialRemainingMatchLength_(trie.remainingMatchLength_), 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_(NULL), maxLength_(maxStringLength), value_(0), stack_(NULL) { 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_=new CharString(); 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_=new UVector32(errorCode); 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(str_==NULL || stack_==NULL) { 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_MEMORY_ALLOCATION_ERROR; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length=remainingMatchLength_; // Actual remaining match length minus 1. 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length>=0) { 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Pending linear-match node, append remaining bytes to str_. 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++length; 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(maxLength_>0 && length>maxLength_) { 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=maxLength_; // This will leave remainingMatchLength>=0 as a signal. 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_->append(reinterpret_cast<const char *>(pos_), length, errorCode); 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_+=length; 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_-=length; 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBytesTrie::Iterator::~Iterator() { 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete str_; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete stack_; 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBytesTrie::Iterator & 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBytesTrie::Iterator::reset() { 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_=initialPos_; 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_=initialRemainingMatchLength_; 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length=remainingMatchLength_+1; // Remaining match length. 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(maxLength_>0 && length>maxLength_) { 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=maxLength_; 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_->truncate(length); 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_+=length; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org remainingMatchLength_-=length; 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->setSize(0); 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return *this; 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBytesTrie::Iterator::hasNext() const { return pos_!=NULL || !stack_->isEmpty(); } 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBytesTrie::Iterator::next(UErrorCode &errorCode) { 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const uint8_t *pos=pos_; 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pos==NULL) { 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(stack_->isEmpty()) { 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Pop the state off the stack and continue with the next outbound edge of 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // the branch node. 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t stackSize=stack_->size(); 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length=stack_->elementAti(stackSize-1); 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=bytes_+stack_->elementAti(stackSize-2); 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->setSize(stackSize-2); 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_->truncate(length&0xffff); 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=(int32_t)((uint32_t)length>>16); 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length>1) { 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=branchNext(pos, length, errorCode); 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pos==NULL) { 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; // Reached a final value. 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_->append((char)*pos++, errorCode); 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(remainingMatchLength_>=0) { 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // We only get here if we started in a pending linear-match node 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // with more than maxLength remaining bytes. 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return truncateAndStop(); 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(;;) { 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t node=*pos++; 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(node>=kMinValueLead) { 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Deliver value for the byte sequence so far. 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isFinal=(UBool)(node&kValueIsFinal); 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value_=readValue(pos, node>>1); 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(isFinal || (maxLength_>0 && str_->length()==maxLength_)) { 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_=NULL; 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_=skipValue(pos, node); 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp_.set(str_->data(), str_->length()); 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(maxLength_>0 && str_->length()==maxLength_) { 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return truncateAndStop(); 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(node<kMinLinearMatch) { 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(node==0) { 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org node=*pos++; 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=branchNext(pos, node+1, errorCode); 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pos==NULL) { 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; // Reached a final value. 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Linear-match node, append length bytes to str_. 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length=node-kMinLinearMatch+1; 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(maxLength_>0 && str_->length()+length>maxLength_) { 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_->append(reinterpret_cast<const char *>(pos), 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org maxLength_-str_->length(), errorCode); 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return truncateAndStop(); 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_->append(reinterpret_cast<const char *>(pos), length, errorCode); 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos+=length; 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBytesTrie::Iterator::truncateAndStop() { 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_=NULL; 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp_.set(str_->data(), str_->length()); 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value_=-1; // no real value for str 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Branch node, needs to take the first outbound edge and push state for the rest. 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst uint8_t * 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgBytesTrie::Iterator::branchNext(const uint8_t *pos, int32_t length, UErrorCode &errorCode) { 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(length>kMaxBranchLinearSubNodeLength) { 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++pos; // ignore the comparison byte 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Push state for the greater-or-equal edge. 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->addElement((int32_t)(skipDelta(pos)-bytes_), errorCode); 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->addElement(((length-(length>>1))<<16)|str_->length(), errorCode); 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Follow the less-than edge. 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length>>=1; 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=jumpByDelta(pos); 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // List of key-value pairs where values are either final values or jump deltas. 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Read the first (key, value) pair. 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t trieByte=*pos++; 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t node=*pos++; 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isFinal=(UBool)(node&kValueIsFinal); 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t value=readValue(pos, node>>1); 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos=skipValue(pos, node); 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->addElement((int32_t)(pos-bytes_), errorCode); 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org stack_->addElement(((length-1)<<16)|str_->length(), errorCode); 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str_->append((char)trieByte, errorCode); 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(isFinal) { 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pos_=NULL; 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp_.set(str_->data(), str_->length()); 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value_=value; 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return pos+value; 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 211