aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/pinyin/3rdparty/pinyin/share/pinyinime.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/pinyin/3rdparty/pinyin/share/pinyinime.cpp')
-rw-r--r--src/plugins/pinyin/3rdparty/pinyin/share/pinyinime.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/plugins/pinyin/3rdparty/pinyin/share/pinyinime.cpp b/src/plugins/pinyin/3rdparty/pinyin/share/pinyinime.cpp
new file mode 100644
index 00000000..4d206a76
--- /dev/null
+++ b/src/plugins/pinyin/3rdparty/pinyin/share/pinyinime.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include "../include/pinyinime.h"
+#include "../include/dicttrie.h"
+#include "../include/matrixsearch.h"
+#include "../include/spellingtrie.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ using namespace ime_pinyin;
+
+ // The maximum number of the prediction items.
+ static const size_t kMaxPredictNum = 500;
+
+ // Used to search Pinyin string and give the best candidate.
+ MatrixSearch* matrix_search = NULL;
+
+ char16 predict_buf[kMaxPredictNum][kMaxPredictSize + 1];
+
+ bool im_open_decoder(const char *fn_sys_dict, const char *fn_usr_dict) {
+ if (NULL != matrix_search)
+ delete matrix_search;
+
+ matrix_search = new MatrixSearch();
+ if (NULL == matrix_search) {
+ return false;
+ }
+
+ return matrix_search->init(fn_sys_dict, fn_usr_dict);
+ }
+
+ bool im_open_decoder_fd(int sys_fd, long start_offset, long length,
+ const char *fn_usr_dict) {
+ if (NULL != matrix_search)
+ delete matrix_search;
+
+ matrix_search = new MatrixSearch();
+ if (NULL == matrix_search)
+ return false;
+
+ return matrix_search->init_fd(sys_fd, start_offset, length, fn_usr_dict);
+ }
+
+ void im_close_decoder() {
+ if (NULL != matrix_search) {
+ matrix_search->close();
+ delete matrix_search;
+ }
+ matrix_search = NULL;
+ }
+
+ void im_set_max_lens(size_t max_sps_len, size_t max_hzs_len) {
+ if (NULL != matrix_search) {
+ matrix_search->set_max_lens(max_sps_len, max_hzs_len);
+ }
+ }
+
+ void im_flush_cache() {
+ if (NULL != matrix_search)
+ matrix_search->flush_cache();
+ }
+
+ // To be updated.
+ size_t im_search(const char* pybuf, size_t pylen) {
+ if (NULL == matrix_search)
+ return 0;
+
+ matrix_search->search(pybuf, pylen);
+ return matrix_search->get_candidate_num();
+ }
+
+ size_t im_delsearch(size_t pos, bool is_pos_in_splid,
+ bool clear_fixed_this_step) {
+ if (NULL == matrix_search)
+ return 0;
+ matrix_search->delsearch(pos, is_pos_in_splid, clear_fixed_this_step);
+ return matrix_search->get_candidate_num();
+ }
+
+ void im_reset_search() {
+ if (NULL == matrix_search)
+ return;
+
+ matrix_search->reset_search();
+ }
+
+ // To be removed
+ size_t im_add_letter(char ch) {
+ return 0;
+ }
+
+ const char* im_get_sps_str(size_t *decoded_len) {
+ if (NULL == matrix_search)
+ return NULL;
+
+ return matrix_search->get_pystr(decoded_len);
+ }
+
+ char16* im_get_candidate(size_t cand_id, char16* cand_str,
+ size_t max_len) {
+ if (NULL == matrix_search)
+ return NULL;
+
+ return matrix_search->get_candidate(cand_id, cand_str, max_len);
+ }
+
+ size_t im_get_spl_start_pos(const uint16 *&spl_start) {
+ if (NULL == matrix_search)
+ return 0;
+
+ return matrix_search->get_spl_start(spl_start);
+ }
+
+ size_t im_choose(size_t choice_id) {
+ if (NULL == matrix_search)
+ return 0;
+
+ return matrix_search->choose(choice_id);
+ }
+
+ size_t im_cancel_last_choice() {
+ if (NULL == matrix_search)
+ return 0;
+
+ return matrix_search->cancel_last_choice();
+ }
+
+ size_t im_get_fixed_len() {
+ if (NULL == matrix_search)
+ return 0;
+
+ return matrix_search->get_fixedlen();
+ }
+
+ // To be removed
+ bool im_cancel_input() {
+ return true;
+ }
+
+
+ size_t im_get_predicts(const char16 *his_buf,
+ char16 (*&pre_buf)[kMaxPredictSize + 1]) {
+ if (NULL == his_buf)
+ return 0;
+
+ size_t fixed_len = utf16_strlen(his_buf);
+ const char16 *fixed_ptr = his_buf;
+ if (fixed_len > kMaxPredictSize) {
+ fixed_ptr += fixed_len - kMaxPredictSize;
+ fixed_len = kMaxPredictSize;
+ }
+
+ pre_buf = predict_buf;
+ return matrix_search->get_predicts(his_buf, pre_buf, kMaxPredictNum);
+ }
+
+ void im_enable_shm_as_szm(bool enable) {
+ SpellingTrie &spl_trie = SpellingTrie::get_instance();
+ spl_trie.szm_enable_shm(enable);
+ }
+
+ void im_enable_ym_as_szm(bool enable) {
+ SpellingTrie &spl_trie = SpellingTrie::get_instance();
+ spl_trie.szm_enable_ym(enable);
+ }
+
+ void im_init_user_dictionary(const char *fn_usr_dict) {
+ if (!matrix_search)
+ return;
+ matrix_search->flush_cache();
+ matrix_search->init_user_dictionary(fn_usr_dict);
+ }
+
+ bool im_is_user_dictionary_enabled(void) {
+ return NULL != matrix_search ? matrix_search->is_user_dictionary_enabled() : false;
+ }
+
+#ifdef __cplusplus
+}
+#endif