summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2016-06-12 16:14:20 +0800
committerPeng Wu <alexepico@gmail.com>2016-06-12 16:14:20 +0800
commit5e45e62467c4d55a724c6c9058653a88fe61f21c (patch)
treedfecfffdc18224a727b84dd36629f24f86ad7d80
parent008edeec2e2aba365e1ece63667fb56cab213f97 (diff)
downloadlibpinyin-5e45e62467c4d55a724c6c9058653a88fe61f21c.tar.gz
libpinyin-5e45e62467c4d55a724c6c9058653a88fe61f21c.tar.xz
libpinyin-5e45e62467c4d55a724c6c9058653a88fe61f21c.zip
write pinyin_get_*_offset functions
-rw-r--r--src/pinyin.cpp112
-rw-r--r--src/pinyin.h12
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
/**