summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2015-08-05 16:56:24 +0800
committerPeng Wu <alexepico@gmail.com>2015-08-05 16:56:24 +0800
commit590737eb939dc35a0f4002e7869f7c102c603f72 (patch)
tree9917da69a93777e764da9346077b34544eff9b34
parentd046e635079f21fd11766a01c0796b8f2c9df98d (diff)
downloadlibzhuyin-590737eb939dc35a0f4002e7869f7c102c603f72.tar.gz
libzhuyin-590737eb939dc35a0f4002e7869f7c102c603f72.tar.xz
libzhuyin-590737eb939dc35a0f4002e7869f7c102c603f72.zip
write zhuyin_valid_zhuyin_keys method
-rw-r--r--src/libzhuyin.ver1
-rw-r--r--src/zhuyin.cpp51
-rw-r--r--src/zhuyin.h11
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.