From 590737eb939dc35a0f4002e7869f7c102c603f72 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Wed, 5 Aug 2015 16:56:24 +0800 Subject: write zhuyin_valid_zhuyin_keys method --- src/libzhuyin.ver | 1 + src/zhuyin.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/zhuyin.h | 11 +++++++++++ 3 files changed, 63 insertions(+) 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 @@ -309,6 +309,17 @@ bool zhuyin_parse_chewing(zhuyin_instance_t * instance, 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. -- cgit