diff options
author | Peng Wu <alexepico@gmail.com> | 2015-08-05 16:56:24 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2015-08-05 16:56:24 +0800 |
commit | 590737eb939dc35a0f4002e7869f7c102c603f72 (patch) | |
tree | 9917da69a93777e764da9346077b34544eff9b34 | |
parent | d046e635079f21fd11766a01c0796b8f2c9df98d (diff) | |
download | libzhuyin-590737eb939dc35a0f4002e7869f7c102c603f72.tar.gz libzhuyin-590737eb939dc35a0f4002e7869f7c102c603f72.tar.xz libzhuyin-590737eb939dc35a0f4002e7869f7c102c603f72.zip |
write zhuyin_valid_zhuyin_keys method
-rw-r--r-- | src/libzhuyin.ver | 1 | ||||
-rw-r--r-- | src/zhuyin.cpp | 51 | ||||
-rw-r--r-- | src/zhuyin.h | 11 |
3 files changed, 63 insertions, 0 deletions
diff --git a/src/libzhuyin.ver b/src/libzhuyin.ver index f050d17..40c1822 100644 --- a/src/libzhuyin.ver +++ b/src/libzhuyin.ver @@ -22,6 +22,7 @@ LIBZHUYIN { zhuyin_parse_more_full_pinyins; zhuyin_parse_chewing; zhuyin_parse_more_chewings; + zhuyin_valid_zhuyin_keys; zhuyin_get_parsed_input_length; zhuyin_in_chewing_keyboard; zhuyin_guess_candidates_after_cursor; diff --git a/src/zhuyin.cpp b/src/zhuyin.cpp index 436bd54..0702a99 100644 --- a/src/zhuyin.cpp +++ b/src/zhuyin.cpp @@ -972,6 +972,57 @@ size_t zhuyin_parse_more_chewings(zhuyin_instance_t * instance, return parsed_len; } +bool zhuyin_valid_zhuyin_keys(zhuyin_instance_t * instance){ + zhuyin_context_t * & context = instance->m_context; + + gchar * new_user_input = g_strdup(""); + bool valid = TRUE; + + ChewingKeyVector & pinyin_keys = instance->m_pinyin_keys; + ChewingKeyRestVector & pinyin_key_rests = instance->m_pinyin_key_rests; + + PhraseIndexRanges ranges; + memset(ranges, 0, sizeof(ranges)); + context->m_phrase_index->prepare_ranges(ranges); + + GArray * removed = g_array_new(FALSE, FALSE, sizeof(ssize_t)); + int retval; ssize_t i; + + for (i = 0; i < pinyin_keys->len; ++i) { + ChewingKey key = g_array_index(pinyin_keys, ChewingKey, i); + retval = context->m_pinyin_table->search(1, &key, ranges); + + if (retval & SEARCH_OK) { + ChewingKeyRest key_rest = g_array_index + (pinyin_key_rests, ChewingKeyRest, i); + gchar * str = g_strndup + (instance->m_raw_user_input + key_rest.m_raw_begin, + key_rest.length()); + gchar * user_input = new_user_input; + new_user_input = g_strconcat(user_input, str, NULL); + g_free(user_input); + g_free(str); + } else { + valid = FALSE; + g_array_append_val(removed, i); + } + } + + /* remove the invalid zhuyin keys. */ + for (i = removed->len - (ssize_t)1; i >= 0; --i) { + ssize_t index = g_array_index(removed, ssize_t, i); + g_array_remove_index(pinyin_keys, index); + g_array_remove_index(pinyin_key_rests, index); + } + g_array_free(removed, TRUE); + + context->m_phrase_index->destroy_ranges(ranges); + g_free(instance->m_raw_user_input); + instance->m_raw_user_input = new_user_input; + instance->m_parsed_len = strlen(new_user_input); + return valid; +} + size_t zhuyin_get_parsed_input_length(zhuyin_instance_t * instance) { return instance->m_parsed_len; } diff --git a/src/zhuyin.h b/src/zhuyin.h index d8d8886..eb26cbc 100644 --- a/src/zhuyin.h +++ b/src/zhuyin.h @@ -310,6 +310,17 @@ size_t zhuyin_parse_more_chewings(zhuyin_instance_t * instance, const char * chewings); /** + * zhuyin_valid_zhuyin_keys: + * @instance: the zhuyin instance. + * @returns: whether all zhuyin keys are valid. + * + * Valid parsed zhuyin keys, if all valid, return true; + * if not, modify raw user input and return false. + * + */ +bool zhuyin_valid_zhuyin_keys(zhuyin_instance_t * instance); + +/** * zhuyin_get_parsed_input_length: * @instance: the zhuyin instance. * @returns: the parsed_length of the input. |