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