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