dictionary_structure_with_buffer_policy_factory.cpp revision 7116ea98f4002b79b517a695e37e01a78c84e97e
12fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/*
22fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Copyright (C) 2013 The Android Open Source Project
32fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa *
42fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Licensed under the Apache License, Version 2.0 (the "License");
52fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * you may not use this file except in compliance with the License.
62fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * You may obtain a copy of the License at
72fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa *
82fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa *      http://www.apache.org/licenses/LICENSE-2.0
92fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa *
102fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * Unless required by applicable law or agreed to in writing, software
112fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * distributed under the License is distributed on an "AS IS" BASIS,
122fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * See the License for the specific language governing permissions and
142fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa * limitations under the License.
152fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa */
162fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
172fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/structure/dictionary_structure_with_buffer_policy_factory.h"
182fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
192fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include <climits>
202fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
212fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "defines.h"
227116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_dict_buffers.h"
237116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_dict_constants.h"
247116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/backward/v401/ver4_patricia_trie_policy.h"
253b7984752c88bff157016a09158dc92d94ed401dKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/pt_common/dynamic_pt_writing_utils.h"
262fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/structure/v2/patricia_trie_policy.h"
272fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h"
282fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h"
292fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h"
303b7984752c88bff157016a09158dc92d94ed401dKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/utils/dict_file_writing_utils.h"
312fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/utils/file_utils.h"
322fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/utils/format_utils.h"
332fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa#include "suggest/policyimpl/dictionary/utils/mmapped_buffer.h"
342fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
352fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasanamespace latinime {
362fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
372fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr
38903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi        DictionaryStructureWithBufferPolicyFactory::newPolicyForExistingDictFile(
39903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi                const char *const path, const int bufOffset, const int size,
40903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi                const bool isUpdatable) {
412fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    if (FileUtils::existsDir(path)) {
422fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        // Given path represents a directory.
43903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi        return newPolicyForDirectoryDict(path, isUpdatable);
442fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    } else {
452fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        if (isUpdatable) {
462fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            AKLOGE("One file dictionaries don't support updating. path: %s", path);
472fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            ASSERT(false);
487116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            return nullptr;
492fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        }
50903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi        return newPolicyForFileDict(path, bufOffset, size);
512fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    }
522fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa}
532fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
542fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr
55903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi        DictionaryStructureWithBufferPolicyFactory:: newPolicyForOnMemoryDict(
56903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi                const int formatVersion, const std::vector<int> &locale,
57903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi                const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap) {
58455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi    FormatUtils::FORMAT_VERSION dictFormatVersion = FormatUtils::getFormatVersion(formatVersion);
59455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi    switch (dictFormatVersion) {
60903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi        case FormatUtils::VERSION_4: {
617116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            return newPolicyForOnMemoryV4Dict<backward::v401::Ver4DictConstants,
627116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                    backward::v401::Ver4DictBuffers,
637116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                    backward::v401::Ver4DictBuffers::Ver4DictBuffersPtr,
647116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                    backward::v401::Ver4PatriciaTriePolicy>(
657116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                            dictFormatVersion, locale, attributeMap);
667116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        }
677116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        case FormatUtils::VERSION_4_ONLY_FOR_TESTING:
687116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        case FormatUtils::VERSION_4_DEV: {
697116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            return newPolicyForOnMemoryV4Dict<Ver4DictConstants, Ver4DictBuffers,
707116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                    Ver4DictBuffers::Ver4DictBuffersPtr, Ver4PatriciaTriePolicy>(
717116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                            dictFormatVersion, locale, attributeMap);
72903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi        }
73903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi        default:
74903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi            AKLOGE("DICT: dictionary format %d is not supported for on memory dictionary",
75903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi                    formatVersion);
76903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi            break;
77903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi    }
787116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    return nullptr;
797116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi}
807116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi
817116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagitemplate<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy>
827116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr
837116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        DictionaryStructureWithBufferPolicyFactory::newPolicyForOnMemoryV4Dict(
847116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                const FormatUtils::FORMAT_VERSION formatVersion,
857116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                const std::vector<int> &locale,
867116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap) {
877116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    HeaderPolicy headerPolicy(formatVersion, locale, attributeMap);
887116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    DictBuffersPtr dictBuffers = DictBuffers::createVer4DictBuffers(&headerPolicy,
897116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            DictConstants::MAX_DICT_EXTENDED_REGION_SIZE);
907116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    if (!DynamicPtWritingUtils::writeEmptyDictionary(
917116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            dictBuffers->getWritableTrieBuffer(), 0 /* rootPos */)) {
927116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        AKLOGE("Empty ver4 dictionary structure cannot be created on memory.");
937116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        return nullptr;
947116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    }
957116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(
967116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            new StructurePolicy(std::move(dictBuffers)));
97903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi}
98903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi
99903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr
100903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi        DictionaryStructureWithBufferPolicyFactory::newPolicyForDirectoryDict(
1012fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                const char *const path, const bool isUpdatable) {
1022fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    const int headerFilePathBufSize = PATH_MAX + 1 /* terminator */;
1032fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    char headerFilePath[headerFilePathBufSize];
1042fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    getHeaderFilePathInDictDir(path, headerFilePathBufSize, headerFilePath);
1052fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    // Allocated buffer in MmapedBuffer::openBuffer() will be freed in the destructor of
1062fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    // MmappedBufferPtr if the instance has the responsibility.
1077116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    MmappedBuffer::MmappedBufferPtr mmappedBuffer =
1087116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            MmappedBuffer::openBuffer(headerFilePath, isUpdatable);
1094ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi    if (!mmappedBuffer) {
1107116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        return nullptr;
1112fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    }
112455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi    const FormatUtils::FORMAT_VERSION formatVersion = FormatUtils::detectFormatVersion(
113455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi            mmappedBuffer->getBuffer(), mmappedBuffer->getBufferSize());
114455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi    switch (formatVersion) {
1152fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        case FormatUtils::VERSION_2:
1162fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            AKLOGE("Given path is a directory but the format is version 2. path: %s", path);
1172fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            break;
1182fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        case FormatUtils::VERSION_4: {
1197116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            return newPolicyForV4Dict<backward::v401::Ver4DictConstants,
1207116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                    backward::v401::Ver4DictBuffers,
1217116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                    backward::v401::Ver4DictBuffers::Ver4DictBuffersPtr,
1227116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                    backward::v401::Ver4PatriciaTriePolicy>(
1237116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                            headerFilePath, formatVersion, std::move(mmappedBuffer));
1247116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        }
1257116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        case FormatUtils::VERSION_4_ONLY_FOR_TESTING:
1267116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        case FormatUtils::VERSION_4_DEV: {
1277116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            return newPolicyForV4Dict<Ver4DictConstants, Ver4DictBuffers,
1287116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                    Ver4DictBuffers::Ver4DictBuffersPtr, Ver4PatriciaTriePolicy>(
1297116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                            headerFilePath, formatVersion, std::move(mmappedBuffer));
1302fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        }
1312fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        default:
1322fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            AKLOGE("DICT: dictionary format is unknown, bad magic number. path: %s", path);
1332fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            break;
1342fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    }
1352fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    ASSERT(false);
1367116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    return nullptr;
1377116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi}
1387116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi
1397116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagitemplate<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy>
1407116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr
1417116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        DictionaryStructureWithBufferPolicyFactory::newPolicyForV4Dict(
1427116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                const char *const headerFilePath, const FormatUtils::FORMAT_VERSION formatVersion,
1437116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                MmappedBuffer::MmappedBufferPtr &&mmappedBuffer) {
1447116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    const int dictDirPathBufSize = strlen(headerFilePath) + 1 /* terminator */;
1457116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    char dictPath[dictDirPathBufSize];
1467116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    if (!FileUtils::getFilePathWithoutSuffix(headerFilePath,
1477116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            DictConstants::HEADER_FILE_EXTENSION, dictDirPathBufSize, dictPath)) {
1487116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        AKLOGE("Dictionary file name is not valid as a ver4 dictionary. path: %s", path);
1497116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        ASSERT(false);
1507116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        return nullptr;
1517116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    }
1527116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    DictBuffersPtr dictBuffers =
1537116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            DictBuffers::openVer4DictBuffers(dictPath, std::move(mmappedBuffer), formatVersion);
1547116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    if (!dictBuffers || !dictBuffers->isValid()) {
1557116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        AKLOGE("DICT: The dictionary doesn't satisfy ver4 format requirements. path: %s",
1567116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi                path);
1577116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        ASSERT(false);
1587116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        return nullptr;
1597116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    }
1607116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(
1617116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi            new StructurePolicy(std::move(dictBuffers)));
1622fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa}
1632fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
1642fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr
165903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi        DictionaryStructureWithBufferPolicyFactory::newPolicyForFileDict(
1662fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa                const char *const path, const int bufOffset, const int size) {
1672fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    // Allocated buffer in MmapedBuffer::openBuffer() will be freed in the destructor of
1682fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    // MmappedBufferPtr if the instance has the responsibility.
1694ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi    MmappedBuffer::MmappedBufferPtr mmappedBuffer(
1704ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi            MmappedBuffer::openBuffer(path, bufOffset, size, false /* isUpdatable */));
1714ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi    if (!mmappedBuffer) {
1727116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        return nullptr;
1732fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    }
1744ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi    switch (FormatUtils::detectFormatVersion(mmappedBuffer->getBuffer(),
1754ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi            mmappedBuffer->getBufferSize())) {
1762fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        case FormatUtils::VERSION_2:
1772fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            return DictionaryStructureWithBufferPolicy::StructurePolicyPtr(
1784ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi                    new PatriciaTriePolicy(std::move(mmappedBuffer)));
179455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi        case FormatUtils::VERSION_4_ONLY_FOR_TESTING:
1802fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        case FormatUtils::VERSION_4:
1817116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi        case FormatUtils::VERSION_4_DEV:
1822fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            AKLOGE("Given path is a file but the format is version 4. path: %s", path);
1832fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            break;
1842fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        default:
1852fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            AKLOGE("DICT: dictionary format is unknown, bad magic number. path: %s", path);
1862fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            break;
1872fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    }
1882fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    ASSERT(false);
1897116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi    return nullptr;
1902fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa}
1912fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
1922fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ void DictionaryStructureWithBufferPolicyFactory::getHeaderFilePathInDictDir(
1932fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        const char *const dictDirPath, const int outHeaderFileBufSize,
1942fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa        char *const outHeaderFilePath) {
1952fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    const int dictNameBufSize = strlen(dictDirPath) + 1 /* terminator */;
1962fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    char dictName[dictNameBufSize];
1972fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    FileUtils::getBasename(dictDirPath, dictNameBufSize, dictName);
1982fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa    snprintf(outHeaderFilePath, outHeaderFileBufSize, "%s/%s%s", dictDirPath,
1992fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa            dictName, Ver4DictConstants::HEADER_FILE_EXTENSION);
2002fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa}
2012fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa
2022fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} // namespace latinime
203