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