From 9a44d8280120a80d53a240cc63347e0a3dbadbae Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Thu, 28 Dec 2017 11:38:59 +0800 Subject: write is_valid_zhuyin method --- src/storage/chewing_key.cpp | 9 +++++++++ src/storage/chewing_key.h | 1 + src/storage/zhuyin_parser2.cpp | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+) (limited to 'src/storage') diff --git a/src/storage/chewing_key.cpp b/src/storage/chewing_key.cpp index 953b369..102cce5 100644 --- a/src/storage/chewing_key.cpp +++ b/src/storage/chewing_key.cpp @@ -35,6 +35,15 @@ gint _ChewingKey::get_table_index() { return index == -1 ? 0 : index; } +bool _ChewingKey::is_valid_zhuyin() { + assert(m_initial < CHEWING_NUMBER_OF_INITIALS); + assert(m_middle < CHEWING_NUMBER_OF_MIDDLES); + assert(m_final < CHEWING_NUMBER_OF_FINALS); + assert(m_tone < CHEWING_NUMBER_OF_TONES); + + return valid_zhuyin_table[((m_initial * CHEWING_NUMBER_OF_MIDDLES + m_middle) * CHEWING_NUMBER_OF_FINALS + m_final) * CHEWING_NUMBER_OF_TONES + m_tone]; +} + gchar * _ChewingKey::get_pinyin_string() { assert(m_tone < CHEWING_NUMBER_OF_TONES); gint index = get_table_index(); diff --git a/src/storage/chewing_key.h b/src/storage/chewing_key.h index 7faf144..7ec4dfb 100644 --- a/src/storage/chewing_key.h +++ b/src/storage/chewing_key.h @@ -65,6 +65,7 @@ struct _ChewingKey public: gint get_table_index(); + bool is_valid_zhuyin(); /* Note: the return value should be freed by g_free. */ gchar * get_pinyin_string(); diff --git a/src/storage/zhuyin_parser2.cpp b/src/storage/zhuyin_parser2.cpp index 9ae7fbd..99ae4d2 100644 --- a/src/storage/zhuyin_parser2.cpp +++ b/src/storage/zhuyin_parser2.cpp @@ -250,6 +250,9 @@ int ZhuyinSimpleParser2::parse(pinyin_option_t options, if (0 == i) /* no more possible chewings. */ break; + if (!key.is_valid_zhuyin()) + break; + key_rest.m_raw_begin = parsed_len; key_rest.m_raw_end = parsed_len + i; parsed_len += i; @@ -437,6 +440,9 @@ int ZhuyinDiscreteParser2::parse(pinyin_option_t options, if (0 == i) /* no more possible chewings. */ break; + if (!key.is_valid_zhuyin()) + break; + key_rest.m_raw_begin = parsed_len; key_rest.m_raw_end = parsed_len + i; parsed_len += i; @@ -741,6 +747,9 @@ int ZhuyinDaChenCP26Parser2::parse(pinyin_option_t options, if (0 == i) /* no more possible chewings. */ break; + if (!key.is_valid_zhuyin()) + break; + key_rest.m_raw_begin = parsed_len; key_rest.m_raw_end = parsed_len + i; parsed_len += i; @@ -762,6 +771,9 @@ int ZhuyinDaChenCP26Parser2::parse(pinyin_option_t options, break; } + if (!key.is_valid_zhuyin()) + return parsed_len; + if (i > 0) { /* found one */ key_rest.m_raw_begin = parsed_len; key_rest.m_raw_end = parsed_len + i; parsed_len += i; @@ -911,6 +923,13 @@ int ZhuyinDirectParser2::parse(pinyin_option_t options, next = i; if (parse_one_key(options, key, str + cur, next - cur)) { +#if 0 + /* as direct parser handles data source, + assume the data is correct when loading. */ + if (!key.is_valid_zhuyin()) + return parsed_len; +#endif + key_rest.m_raw_begin = cur; key_rest.m_raw_end = next; /* save the pinyin. */ -- cgit