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