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