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