16bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi/* 26bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * Copyright (C) 2014, The Android Open Source Project 36bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * 46bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License"); 56bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * you may not use this file except in compliance with the License. 66bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * You may obtain a copy of the License at 76bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * 86bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * http://www.apache.org/licenses/LICENSE-2.0 96bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * 106bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software 116bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS, 126bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * See the License for the specific language governing permissions and 146bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * limitations under the License. 156bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi */ 166bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 176bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi/* 186bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * !!!!! DO NOT EDIT THIS FILE !!!!! 196bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * 206bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi * This file was generated from 2188bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi * dictionary/structure/v4/ver4_pt_node_array_reader.cpp 226bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi */ 236bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 2488bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/backward/v402/ver4_pt_node_array_reader.h" 256bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 2688bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/pt_common/dynamic_pt_reading_utils.h" 2788bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/structure/pt_common/patricia_trie_reading_utils.h" 2888bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/utils/buffer_with_extendable_buffer.h" 296bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 306bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace latinime { 316bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanaginamespace backward { 3207e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanaginamespace v402 { 336bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 346bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagibool Ver4PtNodeArrayReader::readPtNodeArrayInfoAndReturnIfValid(const int ptNodeArrayPos, 356bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int *const outPtNodeCount, int *const outFirstPtNodePos) const { 366bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (ptNodeArrayPos < 0 || ptNodeArrayPos >= mBuffer->getTailPosition()) { 376bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi // Reading invalid position because of a bug or a broken dictionary. 386bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi AKLOGE("Reading PtNode array info from invalid dictionary position: %d, dict size: %d", 396bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi ptNodeArrayPos, mBuffer->getTailPosition()); 406bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi ASSERT(false); 416bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi return false; 426bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 436bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const bool usesAdditionalBuffer = mBuffer->isInAdditionalBuffer(ptNodeArrayPos); 446bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const uint8_t *const dictBuf = mBuffer->getBuffer(usesAdditionalBuffer); 456bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int readingPos = ptNodeArrayPos; 466bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (usesAdditionalBuffer) { 476bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi readingPos -= mBuffer->getOriginalBufferSize(); 486bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 496bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const int ptNodeCountInArray = PatriciaTrieReadingUtils::getPtNodeArraySizeAndAdvancePosition( 506bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi dictBuf, &readingPos); 516bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (usesAdditionalBuffer) { 526bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi readingPos += mBuffer->getOriginalBufferSize(); 536bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 546bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (ptNodeCountInArray < 0) { 556bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi AKLOGE("Invalid PtNode count in an array: %d.", ptNodeCountInArray); 566bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi return false; 576bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 586bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *outPtNodeCount = ptNodeCountInArray; 596bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *outFirstPtNodePos = readingPos; 606bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi return true; 616bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} 626bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 636bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagibool Ver4PtNodeArrayReader::readForwardLinkAndReturnIfValid(const int forwordLinkPos, 646bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int *const outNextPtNodeArrayPos) const { 656bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (forwordLinkPos < 0 || forwordLinkPos >= mBuffer->getTailPosition()) { 666bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi // Reading invalid position because of bug or broken dictionary. 676bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi AKLOGE("Reading forward link from invalid dictionary position: %d, dict size: %d", 686bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi forwordLinkPos, mBuffer->getTailPosition()); 696bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi ASSERT(false); 706bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi return false; 716bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 726bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const bool usesAdditionalBuffer = mBuffer->isInAdditionalBuffer(forwordLinkPos); 736bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const uint8_t *const dictBuf = mBuffer->getBuffer(usesAdditionalBuffer); 746bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi int readingPos = forwordLinkPos; 756bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (usesAdditionalBuffer) { 766bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi readingPos -= mBuffer->getOriginalBufferSize(); 776bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 786bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi const int nextPtNodeArrayOffset = 796bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi DynamicPtReadingUtils::getForwardLinkPosition(dictBuf, readingPos); 806bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi if (DynamicPtReadingUtils::isValidForwardLinkPosition(nextPtNodeArrayOffset)) { 816bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *outNextPtNodeArrayPos = forwordLinkPos + nextPtNodeArrayOffset; 826bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } else { 836bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi *outNextPtNodeArrayPos = NOT_A_DICT_POS; 846bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi } 856bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi return true; 866bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} 876bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi 8807e14126318f7661f76fdce421d723d64e7ea8deKeisuke Kuroyanagi} // namespace v402 896bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace backward 906bf268132d60061fd26bd8cba63a12b56b22056eKeisuke Kuroyanagi} // namespace latinime 91