1be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi/* 2be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * Copyright (C) 2014, The Android Open Source Project 3be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * 4be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License"); 5be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * you may not use this file except in compliance with the License. 6be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * You may obtain a copy of the License at 7be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * 8be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * http://www.apache.org/licenses/LICENSE-2.0 9be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * 10be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software 11be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS, 12be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * See the License for the specific language governing permissions and 14be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi * limitations under the License. 15be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi */ 16be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi 1788bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/v2/ver2_pt_node_array_reader.h" 18be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi 1988bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/pt_common/patricia_trie_reading_utils.h" 20be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi 21be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanaginamespace latinime { 22be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi 23be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagibool Ver2PtNodeArrayReader::readPtNodeArrayInfoAndReturnIfValid(const int ptNodeArrayPos, 24be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi int *const outPtNodeCount, int *const outFirstPtNodePos) const { 25a892628fa3f1de35ebcff02f9ed55eae71daa1ebKeisuke Kuroyanagi if (ptNodeArrayPos < 0 || ptNodeArrayPos >= static_cast<int>(mBuffer.size())) { 26be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi // Reading invalid position because of a bug or a broken dictionary. 27a892628fa3f1de35ebcff02f9ed55eae71daa1ebKeisuke Kuroyanagi AKLOGE("Reading PtNode array info from invalid dictionary position: %d, dict size: %zd", 28a892628fa3f1de35ebcff02f9ed55eae71daa1ebKeisuke Kuroyanagi ptNodeArrayPos, mBuffer.size()); 29be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi ASSERT(false); 30be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi return false; 31be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi } 32be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi int readingPos = ptNodeArrayPos; 33be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi const int ptNodeCountInArray = PatriciaTrieReadingUtils::getPtNodeArraySizeAndAdvancePosition( 34a892628fa3f1de35ebcff02f9ed55eae71daa1ebKeisuke Kuroyanagi mBuffer.data(), &readingPos); 35be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi *outPtNodeCount = ptNodeCountInArray; 36be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi *outFirstPtNodePos = readingPos; 37be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi return true; 38be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi} 39be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi 40be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagibool Ver2PtNodeArrayReader::readForwardLinkAndReturnIfValid(const int forwordLinkPos, 41be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi int *const outNextPtNodeArrayPos) const { 42a892628fa3f1de35ebcff02f9ed55eae71daa1ebKeisuke Kuroyanagi if (forwordLinkPos < 0 || forwordLinkPos >= static_cast<int>(mBuffer.size())) { 43be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi // Reading invalid position because of bug or broken dictionary. 44a892628fa3f1de35ebcff02f9ed55eae71daa1ebKeisuke Kuroyanagi AKLOGE("Reading forward link from invalid dictionary position: %d, dict size: %zd", 45a892628fa3f1de35ebcff02f9ed55eae71daa1ebKeisuke Kuroyanagi forwordLinkPos, mBuffer.size()); 46be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi ASSERT(false); 47be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi return false; 48be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi } 49be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi // Ver2 dicts don't have forward links. 50be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi *outNextPtNodeArrayPos = NOT_A_DICT_POS; 51be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi return true; 52be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi} 53be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi 54be6117058840492c2862f8ae9f7dc95c29f3a8f3Keisuke Kuroyanagi} // namespace latinime 55