1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Copyright (C) 2001-2014, International Business Machines 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File ucoleitr.cpp 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History: 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 02/15/2001 synwee Modified all methods to process its own function 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* instead of calling the equivalent c++ api (coleitr.h) 14fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* 2012-2014 markus Rewritten in C++ again. 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************/ 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/coleitr.h" 22fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/tblcoll.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucoleitr.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/sortkey.h" 26c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/uobject.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 28fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "usrchimp.h" 29fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 30fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_USE 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define BUFFER_LENGTH 100 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 36c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define DEFAULT_BUFFER_SIZE 16 37c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define BUFFER_GROW 8 38c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 39c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) 40c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 41c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0]) 42c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 43c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define NEW_ARRAY(type, count) (type *) uprv_malloc((count) * sizeof(type)) 44c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 45c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define GROW_ARRAY(array, newSize) uprv_realloc((void *) (array), (newSize) * sizeof (array)[0]) 46c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 47c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define DELETE_ARRAY(array) uprv_free((void *) (array)) 48c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 49c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustruct RCEI 50c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 51c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uint32_t ce; 52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t low; 53c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t high; 54c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}; 55c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 56c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_NAMESPACE_BEGIN 57c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 58c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustruct RCEBuffer 59c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 60c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru RCEI defaultBuffer[DEFAULT_BUFFER_SIZE]; 61c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru RCEI *buffer; 62c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t bufferIndex; 63c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t bufferSize; 64c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 65c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru RCEBuffer(); 66c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ~RCEBuffer(); 67c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 68c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool empty() const; 69c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru void put(uint32_t ce, int32_t ixLow, int32_t ixHigh); 70c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const RCEI *get(); 71c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}; 72c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 73c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruRCEBuffer::RCEBuffer() 74c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 75c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer = defaultBuffer; 76c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru bufferIndex = 0; 77fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius bufferSize = LENGTHOF(defaultBuffer); 78c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 79c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 80c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruRCEBuffer::~RCEBuffer() 81c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 82c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (buffer != defaultBuffer) { 83c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DELETE_ARRAY(buffer); 84c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 85c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 86c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 87c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUBool RCEBuffer::empty() const 88c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 89c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return bufferIndex <= 0; 90c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 91c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 92c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid RCEBuffer::put(uint32_t ce, int32_t ixLow, int32_t ixHigh) 93c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 94c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (bufferIndex >= bufferSize) { 95c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru RCEI *newBuffer = NEW_ARRAY(RCEI, bufferSize + BUFFER_GROW); 96c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 97c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ARRAY_COPY(newBuffer, buffer, bufferSize); 98c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 99c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (buffer != defaultBuffer) { 100c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DELETE_ARRAY(buffer); 101c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 102c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 103c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer = newBuffer; 104c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru bufferSize += BUFFER_GROW; 105c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 106c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 107c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer[bufferIndex].ce = ce; 108c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer[bufferIndex].low = ixLow; 109c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer[bufferIndex].high = ixHigh; 110c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 111c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru bufferIndex += 1; 112c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 113c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 114c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst RCEI *RCEBuffer::get() 115c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 116c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (bufferIndex > 0) { 117c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return &buffer[--bufferIndex]; 118c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 119c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 120c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return NULL; 121c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 122c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 123c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruPCEBuffer::PCEBuffer() 124c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 125c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer = defaultBuffer; 126c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru bufferIndex = 0; 127fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius bufferSize = LENGTHOF(defaultBuffer); 128c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 129c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 130c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruPCEBuffer::~PCEBuffer() 131c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 132c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (buffer != defaultBuffer) { 133c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DELETE_ARRAY(buffer); 134c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 136c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid PCEBuffer::reset() 138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru bufferIndex = 0; 140c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 141c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 142c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUBool PCEBuffer::empty() const 143c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 144c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return bufferIndex <= 0; 145c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 146c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 147c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid PCEBuffer::put(uint64_t ce, int32_t ixLow, int32_t ixHigh) 148c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 149c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (bufferIndex >= bufferSize) { 150c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru PCEI *newBuffer = NEW_ARRAY(PCEI, bufferSize + BUFFER_GROW); 151c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 152c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ARRAY_COPY(newBuffer, buffer, bufferSize); 153c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 154c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (buffer != defaultBuffer) { 155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru DELETE_ARRAY(buffer); 156c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 158c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer = newBuffer; 159c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru bufferSize += BUFFER_GROW; 160c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 161c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 162c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer[bufferIndex].ce = ce; 163c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer[bufferIndex].low = ixLow; 164c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer[bufferIndex].high = ixHigh; 165c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 166c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru bufferIndex += 1; 167c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 168c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst PCEI *PCEBuffer::get() 170c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 171c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (bufferIndex > 0) { 172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return &buffer[--bufferIndex]; 173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return NULL; 176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 178fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUCollationPCE::UCollationPCE(UCollationElements *elems) { init(elems); } 179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 180fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUCollationPCE::UCollationPCE(CollationElementIterator *iter) { init(iter); } 181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 182fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid UCollationPCE::init(UCollationElements *elems) { 183fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius init(CollationElementIterator::fromUCollationElements(elems)); 184fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} 185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 186fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid UCollationPCE::init(CollationElementIterator *iter) 187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 188fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius cei = iter; 189fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius init(*iter->rbc_); 190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 192fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid UCollationPCE::init(const Collator &coll) 193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 196fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius strength = coll.getAttribute(UCOL_STRENGTH, status); 197fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius toShift = coll.getAttribute(UCOL_ALTERNATE_HANDLING, status) == UCOL_SHIFTED; 198c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru isShifted = FALSE; 199fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius variableTop = coll.getVariableTop(status); 200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 202c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUCollationPCE::~UCollationPCE() 203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // nothing to do 205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 207fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusuint64_t UCollationPCE::processCE(uint32_t ce) 208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uint64_t primary = 0, secondary = 0, tertiary = 0, quaternary = 0; 210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // This is clean, but somewhat slow... 212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // We could apply the mask to ce and then 213c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // just get all three orders... 214fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius switch(strength) { 215c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru default: 216c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru tertiary = ucol_tertiaryOrder(ce); 217c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* note fall-through */ 218c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 219c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case UCOL_SECONDARY: 220c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru secondary = ucol_secondaryOrder(ce); 221c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* note fall-through */ 222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case UCOL_PRIMARY: 224c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru primary = ucol_primaryOrder(ce); 225c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 226c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // **** This should probably handle continuations too. **** 228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // **** That means that we need 24 bits for the primary **** 229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // **** instead of the 16 that we're currently using. **** 230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // **** So we can lay out the 64 bits as: 24.12.12.16. **** 231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // **** Another complication with continuations is that **** 232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // **** the *second* CE is marked as a continuation, so **** 233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // **** we always have to peek ahead to know how long **** 234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // **** the primary is... **** 235fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if ((toShift && variableTop > ce && primary != 0) 236fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (isShifted && primary == 0)) { 237c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 238c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (primary == 0) { 239c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return UCOL_IGNORABLE; 240c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 241c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 242fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (strength >= UCOL_QUATERNARY) { 243c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru quaternary = primary; 244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 245c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 246c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru primary = secondary = tertiary = 0; 247fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius isShifted = TRUE; 248c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 249fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (strength >= UCOL_QUATERNARY) { 250c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru quaternary = 0xFFFF; 251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 252c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 253fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius isShifted = FALSE; 254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 255c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 256c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return primary << 48 | secondary << 32 | tertiary << 16 | quaternary; 257c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 258c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 259fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_END 260c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* public methods ---------------------------------------------------- */ 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UCollationElements* U_EXPORT2 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_openElements(const UCollator *coll, 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *text, 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t textLength, 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(*status)) { 270c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return NULL; 271c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 272fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (coll == NULL || (text == NULL && textLength != 0)) { 273fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *status = U_ILLEGAL_ARGUMENT_ERROR; 274fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return NULL; 275fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 276fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius const RuleBasedCollator *rbc = RuleBasedCollator::rbcFromUCollator(coll); 277fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (rbc == NULL) { 278fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *status = U_UNSUPPORTED_ERROR; // coll is a Collator but not a RuleBasedCollator 279c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return NULL; 280c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 28150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 282fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius UnicodeString s((UBool)(textLength < 0), text, textLength); 283fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius CollationElementIterator *cei = rbc->createCollationElementIterator(s); 284fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (cei == NULL) { 285fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *status = U_MEMORY_ALLOCATION_ERROR; 286fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return NULL; 287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 289fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return cei->toUCollationElements(); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_closeElements(UCollationElements *elems) 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 296fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius delete CollationElementIterator::fromUCollationElements(elems); 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_reset(UCollationElements *elems) 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 302fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius CollationElementIterator::fromUCollationElements(elems)->reset(); 303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_next(UCollationElements *elems, 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(*status)) { 310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return UCOL_NULLORDER; 311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 313fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return CollationElementIterator::fromUCollationElements(elems)->next(*status); 314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 316fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_BEGIN 317fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 318fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusint64_t 319fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUCollationPCE::nextProcessed( 320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t *ixLow, 321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t *ixHigh, 322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) 323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int64_t result = UCOL_IGNORABLE; 325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uint32_t low = 0, high = 0; 326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(*status)) { 328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return UCOL_PROCESSED_NULLORDER; 329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 330c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 331fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pceBuffer.reset(); 332c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 333c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru do { 334fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius low = cei->getOffset(); 335fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius int32_t ce = cei->next(*status); 336fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius high = cei->getOffset(); 337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 338fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (ce == UCOL_NULLORDER) { 339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result = UCOL_PROCESSED_NULLORDER; 340c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 341c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 343fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = processCE((uint32_t)ce); 344c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } while (result == UCOL_IGNORABLE); 345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ixLow != NULL) { 347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *ixLow = low; 348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ixHigh != NULL) { 351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *ixHigh = high; 352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 354c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return result; 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 357fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_END 358fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_previous(UCollationElements *elems, 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 363c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(U_FAILURE(*status)) { 364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return UCOL_NULLORDER; 365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 366fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return CollationElementIterator::fromUCollationElements(elems)->previous(*status); 367c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 368c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 369fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_BEGIN 370fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 371fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusint64_t 372fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUCollationPCE::previousProcessed( 373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t *ixLow, 374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t *ixHigh, 375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) 376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int64_t result = UCOL_IGNORABLE; 378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t low = 0, high = 0; 379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(*status)) { 381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return UCOL_PROCESSED_NULLORDER; 382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 384fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // pceBuffer.reset(); 385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 386fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius while (pceBuffer.empty()) { 387c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // buffer raw CEs up to non-ignorable primary 388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru RCEBuffer rceb; 389fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius int32_t ce; 390c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // **** do we need to reset rceb, or will it always be empty at this point **** 392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru do { 393fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius high = cei->getOffset(); 394fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ce = cei->previous(*status); 395fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius low = cei->getOffset(); 396c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 397fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (ce == UCOL_NULLORDER) { 398c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (! rceb.empty()) { 399c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 400c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru goto finish; 403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 405fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius rceb.put((uint32_t)ce, low, high); 406fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } while ((ce & UCOL_PRIMARYORDERMASK) == 0 || isContinuation(ce)); 407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 408c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // process the raw CEs 409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru while (! rceb.empty()) { 410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const RCEI *rcei = rceb.get(); 411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 412fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius result = processCE(rcei->ce); 413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (result != UCOL_IGNORABLE) { 415fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pceBuffer.put(result, rcei->low, rcei->high); 416c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querufinish: 421fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (pceBuffer.empty()) { 422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // **** Is -1 the right value for ixLow, ixHigh? **** 423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ixLow != NULL) { 424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *ixLow = -1; 425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ixHigh != NULL) { 428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *ixHigh = -1 429c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ; 430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return UCOL_PROCESSED_NULLORDER; 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 434fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius const PCEI *pcei = pceBuffer.get(); 435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ixLow != NULL) { 437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *ixLow = pcei->low; 438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (ixHigh != NULL) { 441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *ixHigh = pcei->high; 442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return pcei->ce; 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 447fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_END 448fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_getMaxExpansion(const UCollationElements *elems, 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t order) 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 453fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return CollationElementIterator::fromUCollationElements(elems)->getMaxExpansion(order); 454c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 455fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // TODO: The old code masked the order according to strength and then did a binary search. 456fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // However this was probably at least partially broken because of the following comment. 457fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // Still, it might have found a match when this version may not. 458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // FIXME: with a masked search, there might be more than one hit, 460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // so we need to look forward and backward from the match to find all 461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // of the hits... 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 463fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_setText( UCollationElements *elems, 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *text, 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t textLength, 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(*status)) { 471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 474fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if ((text == NULL && textLength != 0)) { 475fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *status = U_ILLEGAL_ARGUMENT_ERROR; 476fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return; 47750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 478fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius UnicodeString s((UBool)(textLength < 0), text, textLength); 479fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return CollationElementIterator::fromUCollationElements(elems)->setText(s, *status); 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_getOffset(const UCollationElements *elems) 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 485fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return CollationElementIterator::fromUCollationElements(elems)->getOffset(); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_setOffset(UCollationElements *elems, 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t offset, 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(*status)) { 494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 497fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius CollationElementIterator::fromUCollationElements(elems)->setOffset(offset, *status); 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_primaryOrder (int32_t order) 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 503fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return (order >> 16) & 0xffff; 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_secondaryOrder (int32_t order) 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 509fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return (order >> 8) & 0xff; 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_tertiaryOrder (int32_t order) 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 515fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return order & 0xff; 516b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 517b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */ 519