154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* 254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius******************************************************************************* 3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Copyright (C) 2014, International Business Machines 454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* Corporation and others. All Rights Reserved. 554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius******************************************************************************* 654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* dictionarydata.h 754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* 854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* created on: 2012may31 954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* created by: Markus W. Scherer & Maxime Serrano 1054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*/ 1154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 1254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "dictionarydata.h" 1354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/ucharstrie.h" 1454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/bytestrie.h" 1554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/udata.h" 1654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "cmemory.h" 1754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 1854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if !UCONFIG_NO_BREAK_ITERATION 1954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 2054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_NAMESPACE_BEGIN 2154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 2259d709d503bab6e2b61931737e662dd293b40578ccorneliusconst int32_t DictionaryData::TRIE_TYPE_BYTES = 0; 2359d709d503bab6e2b61931737e662dd293b40578ccorneliusconst int32_t DictionaryData::TRIE_TYPE_UCHARS = 1; 2459d709d503bab6e2b61931737e662dd293b40578ccorneliusconst int32_t DictionaryData::TRIE_TYPE_MASK = 7; 2559d709d503bab6e2b61931737e662dd293b40578ccorneliusconst int32_t DictionaryData::TRIE_HAS_VALUES = 8; 2654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 2759d709d503bab6e2b61931737e662dd293b40578ccorneliusconst int32_t DictionaryData::TRANSFORM_NONE = 0; 2859d709d503bab6e2b61931737e662dd293b40578ccorneliusconst int32_t DictionaryData::TRANSFORM_TYPE_OFFSET = 0x1000000; 2959d709d503bab6e2b61931737e662dd293b40578ccorneliusconst int32_t DictionaryData::TRANSFORM_TYPE_MASK = 0x7f000000; 3059d709d503bab6e2b61931737e662dd293b40578ccorneliusconst int32_t DictionaryData::TRANSFORM_OFFSET_MASK = 0x1fffff; 3159d709d503bab6e2b61931737e662dd293b40578ccornelius 3254dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusDictionaryMatcher::~DictionaryMatcher() { 3354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 3454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUCharsDictionaryMatcher::~UCharsDictionaryMatcher() { 3654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius udata_close(file); 3754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 3854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusint32_t UCharsDictionaryMatcher::getType() const { 4054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return DictionaryData::TRIE_TYPE_UCHARS; 4154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 4254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 43f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusint32_t UCharsDictionaryMatcher::matches(UText *text, int32_t maxLength, int32_t limit, 44f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t *lengths, int32_t *cpLengths, int32_t *values, 45f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t *prefix) const { 46f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 4754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UCharsTrie uct(characters); 48f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t startingTextIndex = utext_getNativeIndex(text); 49f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t wordCount = 0; 50f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t codePointsMatched = 0; 51f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 52f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for (UChar32 c = utext_next32(text); c >= 0; c=utext_next32(text)) { 53f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UStringTrieResult result = (codePointsMatched == 0) ? uct.first(c) : uct.next(c); 54f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t lengthMatched = utext_getNativeIndex(text) - startingTextIndex; 55f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius codePointsMatched += 1; 5654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (USTRINGTRIE_HAS_VALUE(result)) { 57f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (wordCount < limit) { 5854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (values != NULL) { 59f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius values[wordCount] = uct.getValue(); 60f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 61f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (lengths != NULL) { 62f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius lengths[wordCount] = lengthMatched; 63f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 64f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (cpLengths != NULL) { 65f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius cpLengths[wordCount] = codePointsMatched; 6654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 67f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius ++wordCount; 6854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 6954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (result == USTRINGTRIE_FINAL_VALUE) { 7054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 7154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 7254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 7354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius else if (result == USTRINGTRIE_NO_MATCH) { 7454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 7554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 76f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (lengthMatched >= maxLength) { 7754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 7854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 79f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 8054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 81f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (prefix != NULL) { 82f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *prefix = codePointsMatched; 8354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 84f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return wordCount; 8554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 8654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 8754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusBytesDictionaryMatcher::~BytesDictionaryMatcher() { 8854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius udata_close(file); 8954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 9054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 9154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUChar32 BytesDictionaryMatcher::transform(UChar32 c) const { 9254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if ((transformConstant & DictionaryData::TRANSFORM_TYPE_MASK) == DictionaryData::TRANSFORM_TYPE_OFFSET) { 9354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (c == 0x200D) { 9454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return 0xFF; 9554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if (c == 0x200C) { 9654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return 0xFE; 9754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 9854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t delta = c - (transformConstant & DictionaryData::TRANSFORM_OFFSET_MASK); 9954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (delta < 0 || 0xFD < delta) { 10054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return U_SENTINEL; 10154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 10254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return (UChar32)delta; 10354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 10454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return c; 10554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 10654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 10754dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusint32_t BytesDictionaryMatcher::getType() const { 10854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return DictionaryData::TRIE_TYPE_BYTES; 10954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 11054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 111f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusint32_t BytesDictionaryMatcher::matches(UText *text, int32_t maxLength, int32_t limit, 112f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t *lengths, int32_t *cpLengths, int32_t *values, 113f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t *prefix) const { 11454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius BytesTrie bt(characters); 115f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t startingTextIndex = utext_getNativeIndex(text); 116f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t wordCount = 0; 117f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t codePointsMatched = 0; 118f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 119f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for (UChar32 c = utext_next32(text); c >= 0; c=utext_next32(text)) { 120f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UStringTrieResult result = (codePointsMatched == 0) ? bt.first(transform(c)) : bt.next(transform(c)); 121f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t lengthMatched = utext_getNativeIndex(text) - startingTextIndex; 122f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius codePointsMatched += 1; 12354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (USTRINGTRIE_HAS_VALUE(result)) { 124f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (wordCount < limit) { 12554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (values != NULL) { 126f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius values[wordCount] = bt.getValue(); 127f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 128f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (lengths != NULL) { 129f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius lengths[wordCount] = lengthMatched; 130fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 131f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (cpLengths != NULL) { 132f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius cpLengths[wordCount] = codePointsMatched; 133f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 134f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius ++wordCount; 13554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 13654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (result == USTRINGTRIE_FINAL_VALUE) { 13754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 13854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 13954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 14054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius else if (result == USTRINGTRIE_NO_MATCH) { 14154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 14254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 143f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (lengthMatched >= maxLength) { 14454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 14554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 146f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 14754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 148f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (prefix != NULL) { 149f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *prefix = codePointsMatched; 15054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 151f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return wordCount; 15254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 15354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 15454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 15554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_NAMESPACE_END 15654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 15754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_NAMESPACE_USE 15854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 15954dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2 16054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusudict_swap(const UDataSwapper *ds, const void *inData, int32_t length, 16154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius void *outData, UErrorCode *pErrorCode) { 16254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius const UDataInfo *pInfo; 16354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t headerSize; 16454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius const uint8_t *inBytes; 16554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius uint8_t *outBytes; 16654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius const int32_t *inIndexes; 16754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t indexes[DictionaryData::IX_COUNT]; 16854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t i, offset, size; 16954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 17054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius headerSize = udata_swapDataHeader(ds, inData, length, outData, pErrorCode); 17154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (pErrorCode == NULL || U_FAILURE(*pErrorCode)) return 0; 17254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pInfo = (const UDataInfo *)((const char *)inData + 4); 17354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (!(pInfo->dataFormat[0] == 0x44 && 17454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pInfo->dataFormat[1] == 0x69 && 17554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pInfo->dataFormat[2] == 0x63 && 17654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pInfo->dataFormat[3] == 0x74 && 17754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pInfo->formatVersion[0] == 1)) { 17854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius udata_printError(ds, "udict_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as dictionary data\n", 17954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pInfo->dataFormat[0], pInfo->dataFormat[1], pInfo->dataFormat[2], pInfo->dataFormat[3], pInfo->formatVersion[0]); 18054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pErrorCode = U_UNSUPPORTED_ERROR; 18154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return 0; 18254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 18354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 18454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius inBytes = (const uint8_t *)inData + headerSize; 18554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius outBytes = (uint8_t *)outData + headerSize; 18654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 18754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius inIndexes = (const int32_t *)inBytes; 18854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (length >= 0) { 18954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius length -= headerSize; 19054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (length < (int32_t)(sizeof(indexes))) { 19154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius udata_printError(ds, "udict_swap(): too few bytes (%d after header) for dictionary data\n", length); 19254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; 19354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return 0; 19454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 19554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 19654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 19754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius for (i = 0; i < DictionaryData::IX_COUNT; i++) { 19854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius indexes[i] = udata_readInt32(ds, inIndexes[i]); 19954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 20054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 20154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius size = indexes[DictionaryData::IX_TOTAL_SIZE]; 20254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 20354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (length >= 0) { 20454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (length < size) { 20554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius udata_printError(ds, "udict_swap(): too few bytes (%d after header) for all of dictionary data\n", length); 20654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; 20754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return 0; 20854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 20954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 21054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (inBytes != outBytes) { 21154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius uprv_memcpy(outBytes, inBytes, size); 21254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 21354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 21454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius offset = 0; 21554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ds->swapArray32(ds, inBytes, sizeof(indexes), outBytes, pErrorCode); 21654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius offset = (int32_t)sizeof(indexes); 21754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t trieType = indexes[DictionaryData::IX_TRIE_TYPE] & DictionaryData::TRIE_TYPE_MASK; 21854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t nextOffset = indexes[DictionaryData::IX_RESERVED1_OFFSET]; 21954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 22054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (trieType == DictionaryData::TRIE_TYPE_UCHARS) { 22154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ds->swapArray16(ds, inBytes + offset, nextOffset - offset, outBytes + offset, pErrorCode); 22254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if (trieType == DictionaryData::TRIE_TYPE_BYTES) { 22354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // nothing to do 22454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 22554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius udata_printError(ds, "udict_swap(): unknown trie type!\n"); 22654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pErrorCode = U_UNSUPPORTED_ERROR; 22754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return 0; 22854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 22954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 23054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // these next two sections are empty in the current format, 23154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // but may be used later. 23254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius offset = nextOffset; 23354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius nextOffset = indexes[DictionaryData::IX_RESERVED2_OFFSET]; 23454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius offset = nextOffset; 23554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius nextOffset = indexes[DictionaryData::IX_TOTAL_SIZE]; 23654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius offset = nextOffset; 23754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 23854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return headerSize + size; 23954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 24054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 241