17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/* 27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project 37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License. 67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at 77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and 147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License. 157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include <assert.h> 187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include <stdlib.h> 197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include <string.h> 207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "../include/dictlist.h" 217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "../include/mystdlib.h" 227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "../include/ngram.h" 237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "../include/searchutility.h" 247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectnamespace ime_pinyin { 267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source ProjectDictList::DictList() { 287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project initialized_ = false; 297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_num_ = 0; 307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_hz_ = NULL; 317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_splid_ = NULL; 327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project buf_ = NULL; 337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project spl_trie_ = SpellingTrie::get_cpinstance(); 347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(kMaxLemmaSize == 8); 367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func_[0] = cmp_hanzis_1; 377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func_[1] = cmp_hanzis_2; 387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func_[2] = cmp_hanzis_3; 397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func_[3] = cmp_hanzis_4; 407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func_[4] = cmp_hanzis_5; 417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func_[5] = cmp_hanzis_6; 427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func_[6] = cmp_hanzis_7; 437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func_[7] = cmp_hanzis_8; 447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source ProjectDictList::~DictList() { 477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project free_resource(); 487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectbool DictList::alloc_resource(size_t buf_size, size_t scis_num) { 517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Allocate memory 527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project buf_ = static_cast<char16*>(malloc(buf_size * sizeof(char16))); 537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == buf_) 547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_num_ = scis_num; 577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_hz_ = static_cast<char16*>(malloc(scis_num_ * sizeof(char16))); 597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == scis_hz_) 607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_splid_ = static_cast<SpellingId*> 637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (malloc(scis_num_ * sizeof(SpellingId))); 647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == scis_splid_) 667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return true; 697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectvoid DictList::free_resource() { 727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL != buf_) 737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project free(buf_); 747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project buf_ = NULL; 757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL != scis_hz_) 777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project free(scis_hz_); 787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_hz_ = NULL; 797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL != scis_splid_) 817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project free(scis_splid_); 827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_splid_ = NULL; 837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___BUILD_MODEL___ 867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectbool DictList::init_list(const SingleCharItem *scis, size_t scis_num, 877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const LemmaEntry *lemma_arr, size_t lemma_num) { 887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == scis || 0 == scis_num || NULL == lemma_arr || 0 == lemma_num) 897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project initialized_ = false; 927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL != buf_) 947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project free(buf_); 957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // calculate the size 977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t buf_size = calculate_size(lemma_arr, lemma_num); 987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (0 == buf_size) 997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!alloc_resource(buf_size, scis_num)) 1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project fill_scis(scis, scis_num); 1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Copy the related content from the array to inner buffer 1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project fill_list(lemma_arr, lemma_num); 1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project initialized_ = true; 1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return true; 1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectsize_t DictList::calculate_size(const LemmaEntry* lemma_arr, size_t lemma_num) { 1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t last_hz_len = 0; 1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t list_size = 0; 1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t id_num = 0; 1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (size_t i = 0; i < lemma_num; i++) { 1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (0 == i) { 1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project last_hz_len = lemma_arr[i].hz_str_len; 1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(last_hz_len > 0); 1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(lemma_arr[0].idx_by_hz == 1); 1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project id_num++; 1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_pos_[0] = 0; 1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_id_[0] = id_num; 1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project last_hz_len = 1; 1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project list_size += last_hz_len; 1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t current_hz_len = lemma_arr[i].hz_str_len; 1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(current_hz_len >= last_hz_len); 1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (current_hz_len == last_hz_len) { 1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project list_size += current_hz_len; 1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project id_num++; 1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (size_t len = last_hz_len; len < current_hz_len - 1; len++) { 1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_pos_[len] = start_pos_[len - 1]; 1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_id_[len] = start_id_[len - 1]; 1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_pos_[current_hz_len - 1] = list_size; 1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project id_num++; 1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_id_[current_hz_len - 1] = id_num; 1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project last_hz_len = current_hz_len; 1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project list_size += current_hz_len; 1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (size_t i = last_hz_len; i <= kMaxLemmaSize; i++) { 1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (0 == i) { 1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_pos_[0] = 0; 1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_id_[0] = 1; 1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_pos_[i] = list_size; 1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_id_[i] = id_num; 1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return start_pos_[kMaxLemmaSize]; 1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectvoid DictList::fill_scis(const SingleCharItem *scis, size_t scis_num) { 1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(scis_num_ == scis_num); 1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (size_t pos = 0; pos < scis_num_; pos++) { 1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_hz_[pos] = scis[pos].hz; 1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_splid_[pos] = scis[pos].splid; 1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectvoid DictList::fill_list(const LemmaEntry* lemma_arr, size_t lemma_num) { 1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t current_pos = 0; 1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project utf16_strncpy(buf_, lemma_arr[0].hanzi_str, 1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project lemma_arr[0].hz_str_len); 1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project current_pos = lemma_arr[0].hz_str_len; 1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t id_num = 1; 1877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (size_t i = 1; i < lemma_num; i++) { 1897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project utf16_strncpy(buf_ + current_pos, lemma_arr[i].hanzi_str, 1907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project lemma_arr[i].hz_str_len); 1917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project id_num++; 1937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project current_pos += lemma_arr[i].hz_str_len; 1947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(current_pos == start_pos_[kMaxLemmaSize]); 1977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(id_num == start_id_[kMaxLemmaSize]); 1987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 1997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectchar16* DictList::find_pos2_startedbyhz(char16 hz_char) { 2017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 *found_2w = static_cast<char16*> 2027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (mybsearch(&hz_char, buf_ + start_pos_[1], 2037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (start_pos_[2] - start_pos_[1]) / 2, 2047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project sizeof(char16) * 2, cmp_hanzis_1)); 2057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == found_2w) 2067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return NULL; 2077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while (found_2w > buf_ + start_pos_[1] && *found_2w == *(found_2w - 1)) 2097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project found_2w -= 2; 2107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return found_2w; 2127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 2137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif // ___BUILD_MODEL___ 2147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectchar16* DictList::find_pos_startedbyhzs(const char16 last_hzs[], 2167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t word_len, int (*cmp_func)(const void *, const void *)) { 2177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 *found_w = static_cast<char16*> 2187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (mybsearch(last_hzs, buf_ + start_pos_[word_len - 1], 2197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (start_pos_[word_len] - start_pos_[word_len - 1]) 2207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project / word_len, 2217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project sizeof(char16) * word_len, cmp_func)); 2227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == found_w) 2247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return NULL; 2257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while (found_w > buf_ + start_pos_[word_len -1] && 2277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func(found_w, found_w - word_len) == 0) 2287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project found_w -= word_len; 2297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return found_w; 2317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 2327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectsize_t DictList::predict(const char16 last_hzs[], uint16 hzs_len, 2347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project NPredictItem *npre_items, size_t npre_max, 2357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t b4_used) { 2367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(hzs_len <= kMaxPredictSize && hzs_len > 0); 2377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 1. Prepare work 2397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int (*cmp_func)(const void *, const void *) = cmp_func_[hzs_len - 1]; 2407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project NGram& ngram = NGram::get_instance(); 2427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t item_num = 0; 2447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 2. Do prediction 2467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (uint16 pre_len = 1; pre_len <= kMaxPredictSize + 1 - hzs_len; 2477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project pre_len++) { 2487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 word_len = hzs_len + pre_len; 2497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 *w_buf = find_pos_startedbyhzs(last_hzs, word_len, cmp_func); 2507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == w_buf) 2517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project continue; 2527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while (w_buf < buf_ + start_pos_[word_len] && 2537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project cmp_func(w_buf, last_hzs) == 0 && 2547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project item_num < npre_max) { 2557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project memset(npre_items + item_num, 0, sizeof(NPredictItem)); 2567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project utf16_strncpy(npre_items[item_num].pre_hzs, w_buf + hzs_len, pre_len); 2577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project npre_items[item_num].psb = 2587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ngram.get_uni_psb((size_t)(w_buf - buf_ - start_pos_[word_len - 1]) 2597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project / word_len + start_id_[word_len - 1]); 2607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project npre_items[item_num].his_len = hzs_len; 2617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project item_num++; 2627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project w_buf += word_len; 2637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t new_num = 0; 2677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (size_t i = 0; i < item_num; i++) { 2687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Try to find it in the existing items 2697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t e_pos; 2707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (e_pos = 1; e_pos <= b4_used; e_pos++) { 2717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (utf16_strncmp((*(npre_items - e_pos)).pre_hzs, npre_items[i].pre_hzs, 2727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project kMaxPredictSize) == 0) 2737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project break; 2747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (e_pos <= b4_used) 2767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project continue; 2777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If not found, append it to the buffer 2797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project npre_items[new_num] = npre_items[i]; 2807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project new_num++; 2817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return new_num; 2847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 2857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectuint16 DictList::get_lemma_str(LemmaIdType id_lemma, char16 *str_buf, 2877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 str_max) { 2887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!initialized_ || id_lemma >= start_id_[kMaxLemmaSize] || NULL == str_buf 2897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project || str_max <= 1) 2907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return 0; 2917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Find the range 2937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (uint16 i = 0; i < kMaxLemmaSize; i++) { 2947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (i + 1 > str_max - 1) 2957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return 0; 2967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (start_id_[i] <= id_lemma && start_id_[i + 1] > id_lemma) { 2977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t id_span = id_lemma - start_id_[i]; 2987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 *buf = buf_ + start_pos_[i] + id_span * (i + 1); 3007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (uint16 len = 0; len <= i; len++) { 3017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project str_buf[len] = buf[len]; 3027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project str_buf[i+1] = (char16)'\0'; 3047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return i + 1; 3057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return 0; 3087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 3097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectuint16 DictList::get_splids_for_hanzi(char16 hanzi, uint16 half_splid, 3117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 *splids, uint16 max_splids) { 3127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 *hz_found = static_cast<char16*> 3137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (mybsearch(&hanzi, scis_hz_, scis_num_, sizeof(char16), cmp_hanzis_1)); 3147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(NULL != hz_found && hanzi == *hz_found); 3157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Move to the first one. 3177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while (hz_found > scis_hz_ && hanzi == *(hz_found - 1)) 3187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project hz_found--; 3197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // First try to found if strict comparison result is not zero. 3217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 *hz_f = hz_found; 3227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool strict = false; 3237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while (hz_f < scis_hz_ + scis_num_ && hanzi == *hz_f) { 3247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 pos = hz_f - scis_hz_; 3257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (0 == half_splid || scis_splid_[pos].half_splid == half_splid) { 3267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project strict = true; 3277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project hz_f++; 3297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 found_num = 0; 3327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while (hz_found < scis_hz_ + scis_num_ && hanzi == *hz_found) { 3337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 pos = hz_found - scis_hz_; 3347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (0 == half_splid || 3357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (strict && scis_splid_[pos].half_splid == half_splid) || 3367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (!strict && spl_trie_->half_full_compatible(half_splid, 3377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project scis_splid_[pos].full_splid))) { 3387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(found_num + 1 < max_splids); 3397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project splids[found_num] = scis_splid_[pos].full_splid; 3407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project found_num++; 3417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project hz_found++; 3437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return found_num; 3467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 3477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source ProjectLemmaIdType DictList::get_lemma_id(const char16 *str, uint16 str_len) { 3497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == str || str_len > kMaxLemmaSize) 3507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return 0; 3517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 *found = find_pos_startedbyhzs(str, str_len, cmp_func_[str_len - 1]); 3537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == found) 3547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return 0; 3557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(found > buf_); 3577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(static_cast<size_t>(found - buf_) >= start_pos_[str_len - 1]); 3587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return static_cast<LemmaIdType> 3597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (start_id_[str_len - 1] + 3607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (found - buf_ - start_pos_[str_len - 1]) / str_len); 3617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 3627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectvoid DictList::convert_to_hanzis(char16 *str, uint16 str_len) { 3647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(NULL != str); 3657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (uint16 str_pos = 0; str_pos < str_len; str_pos++) { 3677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project str[str_pos] = scis_hz_[str[str_pos]]; 3687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 3707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectvoid DictList::convert_to_scis_ids(char16 *str, uint16 str_len) { 3727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project assert(NULL != str); 3737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (uint16 str_pos = 0; str_pos < str_len; str_pos++) { 3757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project str[str_pos] = 0x100; 3767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 3787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectbool DictList::save_list(FILE *fp) { 3807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!initialized_ || NULL == fp) 3817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 3827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == buf_ || 0 == start_pos_[kMaxLemmaSize] || 3847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project NULL == scis_hz_ || NULL == scis_splid_ || 0 == scis_num_) 3857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 3867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fwrite(&scis_num_, sizeof(size_t), 1, fp) != 1) 3887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 3897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fwrite(start_pos_, sizeof(size_t), kMaxLemmaSize + 1, fp) != 3917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project kMaxLemmaSize + 1) 3927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 3937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fwrite(start_id_, sizeof(size_t), kMaxLemmaSize + 1, fp) != 3957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project kMaxLemmaSize + 1) 3967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 3977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fwrite(scis_hz_, sizeof(char16), scis_num_, fp) != scis_num_) 3997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fwrite(scis_splid_, sizeof(SpellingId), scis_num_, fp) != scis_num_) 4027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fwrite(buf_, sizeof(char16), start_pos_[kMaxLemmaSize], fp) != 4057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_pos_[kMaxLemmaSize]) 4067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return true; 4097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 4107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectbool DictList::load_list(FILE *fp) { 4127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (NULL == fp) 4137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project initialized_ = false; 4167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fread(&scis_num_, sizeof(size_t), 1, fp) != 1) 4187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fread(start_pos_, sizeof(size_t), kMaxLemmaSize + 1, fp) != 4217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project kMaxLemmaSize + 1) 4227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fread(start_id_, sizeof(size_t), kMaxLemmaSize + 1, fp) != 4257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project kMaxLemmaSize + 1) 4267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project free_resource(); 4297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!alloc_resource(start_pos_[kMaxLemmaSize], scis_num_)) 4317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fread(scis_hz_, sizeof(char16), scis_num_, fp) != scis_num_) 4347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fread(scis_splid_, sizeof(SpellingId), scis_num_, fp) != scis_num_) 4377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (fread(buf_, sizeof(char16), start_pos_[kMaxLemmaSize], fp) != 4407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project start_pos_[kMaxLemmaSize]) 4417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 4427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project initialized_ = true; 4447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return true; 4457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 4467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} // namespace ime_pinyin 447