dictionary_structure_with_buffer_policy_factory.cpp revision fb2bde5a688d93aa946e3dd923aa1e99588777fc
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" 2207e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/backward/v402/ver4_dict_buffers.h" 2307e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/backward/v402/ver4_dict_constants.h" 2407e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi#include "suggest/policyimpl/dictionary/structure/backward/v402/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" 34c0c674cdc0721a374e140ad5ee1409c0498b3262Keisuke Kuroyanagi#include "utils/byte_array_view.h" 352fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 362fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasanamespace latinime { 372fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 382fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr 39903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi DictionaryStructureWithBufferPolicyFactory::newPolicyForExistingDictFile( 40903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi const char *const path, const int bufOffset, const int size, 41903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi const bool isUpdatable) { 422fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa if (FileUtils::existsDir(path)) { 432fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // Given path represents a directory. 44903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi return newPolicyForDirectoryDict(path, isUpdatable); 452fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } else { 462fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa if (isUpdatable) { 472fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa AKLOGE("One file dictionaries don't support updating. path: %s", path); 482fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa ASSERT(false); 497116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return nullptr; 502fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 51903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi return newPolicyForFileDict(path, bufOffset, size); 522fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 532fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} 542fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 552fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr 56903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi DictionaryStructureWithBufferPolicyFactory:: newPolicyForOnMemoryDict( 57903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi const int formatVersion, const std::vector<int> &locale, 58903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap) { 59455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi FormatUtils::FORMAT_VERSION dictFormatVersion = FormatUtils::getFormatVersion(formatVersion); 60455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi switch (dictFormatVersion) { 6107e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi case FormatUtils::VERSION_4: { 6207e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi return newPolicyForOnMemoryV4Dict<backward::v402::Ver4DictConstants, 6307e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi backward::v402::Ver4DictBuffers, 6407e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi backward::v402::Ver4DictBuffers::Ver4DictBuffersPtr, 6507e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi backward::v402::Ver4PatriciaTriePolicy>( 667116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi dictFormatVersion, locale, attributeMap); 677116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi } 687116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi case FormatUtils::VERSION_4_ONLY_FOR_TESTING: 697116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi case FormatUtils::VERSION_4_DEV: { 707116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return newPolicyForOnMemoryV4Dict<Ver4DictConstants, Ver4DictBuffers, 717116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi Ver4DictBuffers::Ver4DictBuffersPtr, Ver4PatriciaTriePolicy>( 727116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi dictFormatVersion, locale, attributeMap); 73903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi } 74903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi default: 75903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi AKLOGE("DICT: dictionary format %d is not supported for on memory dictionary", 76903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi formatVersion); 77903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi break; 78903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi } 797116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return nullptr; 807116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi} 817116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi 827116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagitemplate<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> 837116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr 847116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi DictionaryStructureWithBufferPolicyFactory::newPolicyForOnMemoryV4Dict( 857116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi const FormatUtils::FORMAT_VERSION formatVersion, 867116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi const std::vector<int> &locale, 877116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi const DictionaryHeaderStructurePolicy::AttributeMap *const attributeMap) { 887116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi HeaderPolicy headerPolicy(formatVersion, locale, attributeMap); 897116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi DictBuffersPtr dictBuffers = DictBuffers::createVer4DictBuffers(&headerPolicy, 907116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi DictConstants::MAX_DICT_EXTENDED_REGION_SIZE); 917116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi if (!DynamicPtWritingUtils::writeEmptyDictionary( 927116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi dictBuffers->getWritableTrieBuffer(), 0 /* rootPos */)) { 937116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi AKLOGE("Empty ver4 dictionary structure cannot be created on memory."); 947116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return nullptr; 957116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi } 967116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return DictionaryStructureWithBufferPolicy::StructurePolicyPtr( 977116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi new StructurePolicy(std::move(dictBuffers))); 98903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi} 99903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi 100903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr 101903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi DictionaryStructureWithBufferPolicyFactory::newPolicyForDirectoryDict( 1022fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const char *const path, const bool isUpdatable) { 1032fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int headerFilePathBufSize = PATH_MAX + 1 /* terminator */; 1042fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa char headerFilePath[headerFilePathBufSize]; 1052fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa getHeaderFilePathInDictDir(path, headerFilePathBufSize, headerFilePath); 1062fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // Allocated buffer in MmapedBuffer::openBuffer() will be freed in the destructor of 1072fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // MmappedBufferPtr if the instance has the responsibility. 1087116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi MmappedBuffer::MmappedBufferPtr mmappedBuffer = 1097116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi MmappedBuffer::openBuffer(headerFilePath, isUpdatable); 1104ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi if (!mmappedBuffer) { 1117116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return nullptr; 1122fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 113455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi const FormatUtils::FORMAT_VERSION formatVersion = FormatUtils::detectFormatVersion( 1144fbb2148ee149ef647f3f43c615911455228f3afKeisuke Kuroyanagi mmappedBuffer->getReadOnlyByteArrayView()); 115455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi switch (formatVersion) { 1162fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa case FormatUtils::VERSION_2: 117fb2bde5a688d93aa946e3dd923aa1e99588777fcAkifumi Yoshimoto case FormatUtils::VERSION_201: 118fb2bde5a688d93aa946e3dd923aa1e99588777fcAkifumi Yoshimoto AKLOGE("Given path is a directory but the format is version 2 or 201. path: %s", path); 1192fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa break; 12007e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi case FormatUtils::VERSION_4: { 12107e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi return newPolicyForV4Dict<backward::v402::Ver4DictConstants, 12207e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi backward::v402::Ver4DictBuffers, 12307e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi backward::v402::Ver4DictBuffers::Ver4DictBuffersPtr, 12407e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi backward::v402::Ver4PatriciaTriePolicy>( 1257116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi headerFilePath, formatVersion, std::move(mmappedBuffer)); 1267116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi } 1277116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi case FormatUtils::VERSION_4_ONLY_FOR_TESTING: 1287116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi case FormatUtils::VERSION_4_DEV: { 1297116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return newPolicyForV4Dict<Ver4DictConstants, Ver4DictBuffers, 1307116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi Ver4DictBuffers::Ver4DictBuffersPtr, Ver4PatriciaTriePolicy>( 1317116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi headerFilePath, formatVersion, std::move(mmappedBuffer)); 1322fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 1332fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa default: 1342fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa AKLOGE("DICT: dictionary format is unknown, bad magic number. path: %s", path); 1352fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa break; 1362fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 1372fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa ASSERT(false); 1387116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return nullptr; 1397116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi} 1407116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi 1417116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagitemplate<class DictConstants, class DictBuffers, class DictBuffersPtr, class StructurePolicy> 1427116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr 1437116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi DictionaryStructureWithBufferPolicyFactory::newPolicyForV4Dict( 1447116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi const char *const headerFilePath, const FormatUtils::FORMAT_VERSION formatVersion, 1457116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi MmappedBuffer::MmappedBufferPtr &&mmappedBuffer) { 1467116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi const int dictDirPathBufSize = strlen(headerFilePath) + 1 /* terminator */; 1477116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi char dictPath[dictDirPathBufSize]; 1487116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi if (!FileUtils::getFilePathWithoutSuffix(headerFilePath, 1497116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi DictConstants::HEADER_FILE_EXTENSION, dictDirPathBufSize, dictPath)) { 1509f8c9a0161924f515c5ff9617db2317cdc1d01e2Keisuke Kuroyanagi AKLOGE("Dictionary file name is not valid as a ver4 dictionary. header path: %s", 1519f8c9a0161924f515c5ff9617db2317cdc1d01e2Keisuke Kuroyanagi headerFilePath); 1527116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi ASSERT(false); 1537116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return nullptr; 1547116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi } 1557116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi DictBuffersPtr dictBuffers = 1567116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi DictBuffers::openVer4DictBuffers(dictPath, std::move(mmappedBuffer), formatVersion); 1577116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi if (!dictBuffers || !dictBuffers->isValid()) { 1587116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi AKLOGE("DICT: The dictionary doesn't satisfy ver4 format requirements. path: %s", 1599f8c9a0161924f515c5ff9617db2317cdc1d01e2Keisuke Kuroyanagi dictPath); 1607116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi ASSERT(false); 1617116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return nullptr; 1627116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi } 1637116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return DictionaryStructureWithBufferPolicy::StructurePolicyPtr( 1647116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi new StructurePolicy(std::move(dictBuffers))); 1652fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} 1662fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 1672fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ DictionaryStructureWithBufferPolicy::StructurePolicyPtr 168903be5bbd33b664c7e691d8bee0dd4d6376947bcKeisuke Kuroyanagi DictionaryStructureWithBufferPolicyFactory::newPolicyForFileDict( 1692fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const char *const path, const int bufOffset, const int size) { 1702fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // Allocated buffer in MmapedBuffer::openBuffer() will be freed in the destructor of 1712fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa // MmappedBufferPtr if the instance has the responsibility. 1724ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi MmappedBuffer::MmappedBufferPtr mmappedBuffer( 1734ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi MmappedBuffer::openBuffer(path, bufOffset, size, false /* isUpdatable */)); 1744ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi if (!mmappedBuffer) { 1757116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return nullptr; 1762fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 1774fbb2148ee149ef647f3f43c615911455228f3afKeisuke Kuroyanagi switch (FormatUtils::detectFormatVersion(mmappedBuffer->getReadOnlyByteArrayView())) { 1782fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa case FormatUtils::VERSION_2: 179fb2bde5a688d93aa946e3dd923aa1e99588777fcAkifumi Yoshimoto case FormatUtils::VERSION_201: 1802fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa return DictionaryStructureWithBufferPolicy::StructurePolicyPtr( 1814ce480d5ce2d47f607448ce439aaf2cefba1bdd8Keisuke Kuroyanagi new PatriciaTriePolicy(std::move(mmappedBuffer))); 182455dc84cf2c6526329b535f30000ea45b7d4d4d7Keisuke Kuroyanagi case FormatUtils::VERSION_4_ONLY_FOR_TESTING: 1832fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa case FormatUtils::VERSION_4: 1847116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi case FormatUtils::VERSION_4_DEV: 1852fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa AKLOGE("Given path is a file but the format is version 4. path: %s", path); 1862fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa break; 1872fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa default: 1882fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa AKLOGE("DICT: dictionary format is unknown, bad magic number. path: %s", path); 1892fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa break; 1902fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa } 1912fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa ASSERT(false); 1927116ea98f4002b79b517a695e37e01a78c84e97eKeisuke Kuroyanagi return nullptr; 1932fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} 1942fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 1952fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa/* static */ void DictionaryStructureWithBufferPolicyFactory::getHeaderFilePathInDictDir( 1962fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const char *const dictDirPath, const int outHeaderFileBufSize, 1972fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa char *const outHeaderFilePath) { 1982fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa const int dictNameBufSize = strlen(dictDirPath) + 1 /* terminator */; 1992fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa char dictName[dictNameBufSize]; 2002fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa FileUtils::getBasename(dictDirPath, dictNameBufSize, dictName); 2012fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa snprintf(outHeaderFilePath, outHeaderFileBufSize, "%s/%s%s", dictDirPath, 2022fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa dictName, Ver4DictConstants::HEADER_FILE_EXTENSION); 2032fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} 2042fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa 2052fa3693c264a4c150ac307d9bb7f6f8f18cc4ffcKen Wakasa} // namespace latinime 206