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 <stdlib.h>
187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "../include/pinyinime.h"
197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "../include/dicttrie.h"
207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "../include/matrixsearch.h"
217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "../include/spellingtrie.h"
227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef __cplusplus
247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectextern "C" {
257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif
267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  using namespace ime_pinyin;
287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // The maximum number of the prediction items.
307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  static const size_t kMaxPredictNum = 500;
317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // Used to search Pinyin string and give the best candidate.
337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  MatrixSearch* matrix_search = NULL;
347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  char16 predict_buf[kMaxPredictNum][kMaxPredictSize + 1];
367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  bool im_open_decoder(const char *fn_sys_dict, const char *fn_usr_dict) {
387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL != matrix_search)
397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      delete matrix_search;
407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    matrix_search = new MatrixSearch();
427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search) {
437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return false;
447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->init(fn_sys_dict, fn_usr_dict);
477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  bool im_open_decoder_fd(int sys_fd, long start_offset, long length,
507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                          const char *fn_usr_dict) {
517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL != matrix_search)
527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      delete matrix_search;
537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    matrix_search = new MatrixSearch();
557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return false;
577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->init_fd(sys_fd, start_offset, length, fn_usr_dict);
597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  void im_close_decoder() {
627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL != matrix_search) {
637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      matrix_search->close();
647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      delete matrix_search;
657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    matrix_search = NULL;
677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  void im_set_max_lens(size_t max_sps_len, size_t max_hzs_len) {
707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL != matrix_search) {
717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      matrix_search->set_max_lens(max_sps_len, max_hzs_len);
727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  void im_flush_cache() {
767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL != matrix_search)
777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      matrix_search->flush_cache();
787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // To be updated.
817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t im_search(const char* pybuf, size_t pylen) {
827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return 0;
847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    matrix_search->search(pybuf, pylen);
867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->get_candidate_num();
877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t im_delsearch(size_t pos, bool is_pos_in_splid,
907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                      bool clear_fixed_this_step) {
917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return 0;
937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    matrix_search->delsearch(pos, is_pos_in_splid, clear_fixed_this_step);
947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->get_candidate_num();
957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  void im_reset_search() {
987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return;
1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    matrix_search->reset_search();
1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // To be removed
1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t im_add_letter(char ch) {
1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return 0;
1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  const char* im_get_sps_str(size_t *decoded_len) {
1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return NULL;
1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->get_pystr(decoded_len);
1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  char16* im_get_candidate(size_t cand_id, char16* cand_str,
1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                        size_t max_len) {
1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return NULL;
1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->get_candidate(cand_id, cand_str, max_len);
1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t im_get_spl_start_pos(const uint16 *&spl_start) {
1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return 0;
1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->get_spl_start(spl_start);
1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t im_choose(size_t choice_id) {
1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return 0;
1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->choose(choice_id);
1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t im_cancel_last_choice() {
1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return 0;
1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->cancel_last_choice();
1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t im_get_fixed_len() {
1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == matrix_search)
1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return 0;
1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->get_fixedlen();
1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  // To be removed
1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  bool im_cancel_input() {
1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return true;
1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  size_t im_get_predicts(const char16 *his_buf,
1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                         char16 (*&pre_buf)[kMaxPredictSize + 1]) {
1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (NULL == his_buf)
1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      return 0;
1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    size_t fixed_len = utf16_strlen(his_buf);
1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    const char16 *fixed_ptr = his_buf;
1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    if (fixed_len > kMaxPredictSize) {
1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      fixed_ptr += fixed_len - kMaxPredictSize;
1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project      fixed_len = kMaxPredictSize;
1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    pre_buf = predict_buf;
1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    return matrix_search->get_predicts(his_buf, pre_buf, kMaxPredictNum);
1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  void im_enable_shm_as_szm(bool enable) {
1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    SpellingTrie &spl_trie = SpellingTrie::get_instance();
1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    spl_trie.szm_enable_shm(enable);
1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  void im_enable_ym_as_szm(bool enable) {
1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    SpellingTrie &spl_trie = SpellingTrie::get_instance();
1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    spl_trie.szm_enable_ym(enable);
1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project  }
1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef __cplusplus
1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}
1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif
187