From 5e45e62467c4d55a724c6c9058653a88fe61f21c Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Sun, 12 Jun 2016 16:14:20 +0800 Subject: write pinyin_get_*_offset functions --- src/pinyin.cpp | 112 ++++++++++++++++++++++++++++++++++++++++++++++----------- src/pinyin.h | 12 +++++-- 2 files changed, 102 insertions(+), 22 deletions(-) diff --git a/src/pinyin.cpp b/src/pinyin.cpp index f1f9276..5727382 100644 --- a/src/pinyin.cpp +++ b/src/pinyin.cpp @@ -2704,37 +2704,109 @@ bool pinyin_get_pinyin_key_rest_length(pinyin_instance_t * instance, return true; } -bool pinyin_get_pinyin_key_rest_offset(pinyin_instance_t * instance, - guint16 cursor, - guint16 * offset) { - guint len = 0; - assert (instance->m_pinyin_keys->len == - instance->m_pinyin_key_rests->len); - len = instance->m_pinyin_key_rests->len; +/* find the first zero ChewingKey "'". */ +static size_t _compute_zero_start(PhoneticKeyMatrix & matrix, size_t offset) { + ChewingKey key; ChewingKeyRest key_rest; + const ChewingKey zero_key; + + size_t index = offset - 1; + for (; index > 0; --index) { + const size_t size = matrix.get_column_size(index); + + if (1 != size) + break; - ChewingKeyRestVector & pinyin_key_rests = - instance->m_pinyin_key_rests; + matrix.get_item(index, 0, key, key_rest); + if (zero_key == key) + offset = index; + } - guint inner_cursor = len; + return offset; +} - guint16 prev_end = 0, cur_end; - for (size_t i = 0; i < len; ++i) { - ChewingKeyRest *pos = NULL; - pos = &g_array_index(pinyin_key_rests, ChewingKeyRest, i); - cur_end = pos->m_raw_end; +bool pinyin_get_pinyin_offset(pinyin_instance_t * instance, + size_t cursor, + size_t * poffset) { + PhoneticKeyMatrix & matrix = instance->m_matrix; + size_t offset = cursor; - if (prev_end <= cursor && cursor < cur_end) - inner_cursor = i; + /* find the first ChewingKey. */ + for (; offset > 0; --offset) { + const size_t size = matrix.get_column_size(offset); - prev_end = cur_end; + if (size > 0) + break; } - assert (inner_cursor >= 0); - *offset = inner_cursor; + offset = _compute_zero_start(matrix, offset); + _check_offset(matrix, offset); + *poffset = offset; return true; } +bool pinyin_get_left_character_offset(pinyin_instance_t * instance, + size_t offset, + size_t * pleft) { + PhoneticKeyMatrix & matrix = instance->m_matrix; + _check_offset(matrix, offset); + + /* find the ChewingKey ends at offset. */ + size_t left = offset - 1; + ChewingKey key; ChewingKeyRest key_rest; + for (; left > 0; --left) { + const size_t size = matrix.get_column_size(left); + + size_t i = 0; + for (; i < size; ++i) { + matrix.get_item(left, i, key, key_rest); + + if (offset == key_rest.m_raw_end) + break; + } + + if (i < size) + break; + } + + left = _compute_zero_start(matrix, left); + _check_offset(matrix, left); + + *pleft = left; + return true; +} + +bool pinyin_get_right_character_offset(pinyin_instance_t * instance, + size_t offset, + size_t * pright) { + PhoneticKeyMatrix & matrix = instance->m_matrix; + _check_offset(matrix, offset); + + /* find the first non-zero ChewingKey. */ + size_t right = offset; + for (size_t index = right; index < matrix.size(); ++index) { + const size_t size = matrix.get_column_size(index); + + if (1 != size) + break; + + matrix.get_item(index, 0, key, key_rest); + if (zero_key == key) + right = index + 1; + } + + if (0 == matrix.get_column_size(right)) + return false; + + matrix.get_item(right, 0, key, key_rest); + right = key_rest.m_raw_end; + _check_offset(matrix, right); + + *pright = right; + return true; +} + + #if 0 bool pinyin_get_raw_full_pinyin(pinyin_instance_t * instance, const gchar ** utf8_str) { diff --git a/src/pinyin.h b/src/pinyin.h index 41526b3..26ffb81 100644 --- a/src/pinyin.h +++ b/src/pinyin.h @@ -867,8 +867,16 @@ bool pinyin_get_pinyin_key_rest_length(pinyin_instance_t * instance, * */ bool pinyin_get_pinyin_offset(pinyin_instance_t * instance, - guint16 cursor, - guint16 * offset); + size_t cursor, + size_t * offset); + +bool pinyin_get_left_character_offset(pinyin_instance_t * instance, + size_t offset, + size_t * left); + +bool pinyin_get_right_character_offset(pinyin_instance_t * instance, + size_t offset, + size_t * right); #if 0 /** -- cgit