From 1eac84f9673fe26603c80b80b57c4480bfd64ae0 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Mon, 31 Jan 2005 04:58:41 +0000 Subject: [PATCH] - fill in the evas_object_textblock_text_get function SVN revision: 13150 --- legacy/evas/src/lib/Evas.h | 2 +- .../src/lib/canvas/evas_object_textblock.c | 69 +++++++++++++++++-- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/legacy/evas/src/lib/Evas.h b/legacy/evas/src/lib/Evas.h index 444bdea0ba..ab8f79bfd1 100644 --- a/legacy/evas/src/lib/Evas.h +++ b/legacy/evas/src/lib/Evas.h @@ -442,7 +442,7 @@ extern "C" { EAPI int evas_object_textblock_cursor_pos_get (Evas_Object *obj); EAPI int evas_object_textblock_length_get (Evas_Object *obj); EAPI void evas_object_textblock_text_insert (Evas_Object *obj, const char *text); - EAPI char *evas_object_textblock_text_get (Evas_Object *obj, int len); + EAPI char *evas_object_textblock_text_get (Evas_Object *obj, int start, int len); EAPI void evas_object_textblock_text_del (Evas_Object *obj, int len); EAPI void evas_object_textblock_format_insert (Evas_Object *obj, const char *format); EAPI int evas_object_textblock_format_next_pos_get (Evas_Object *obj); diff --git a/legacy/evas/src/lib/canvas/evas_object_textblock.c b/legacy/evas/src/lib/canvas/evas_object_textblock.c index d6416d09eb..d2a9f2a9f6 100644 --- a/legacy/evas/src/lib/canvas/evas_object_textblock.c +++ b/legacy/evas/src/lib/canvas/evas_object_textblock.c @@ -1,3 +1,7 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + #include "evas_common.h" #include "evas_private.h" #include "Evas.h" @@ -807,11 +811,21 @@ evas_object_textblock_text_insert(Evas_Object *obj, const char *text) evas_object_change(obj); } +/** + * Gets length bytes from the textblock from the given start position + * @param obj The given textblock. + * @param start The position to start getting text from. + * @param len The number of characters to get from the textblock. + * @return Returns NULL on failure, or as many of len characters as were + * available. The returned memory must be free'd by the caller. + */ char * -evas_object_textblock_text_get(Evas_Object *obj, int len) +evas_object_textblock_text_get(Evas_Object *obj, int start, int len) { Evas_Object_Textblock *o; - + char *ret = NULL; + int my_len = len; + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); return NULL; MAGIC_CHECK_END(); @@ -819,8 +833,55 @@ evas_object_textblock_text_get(Evas_Object *obj, int len) MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); return NULL; MAGIC_CHECK_END(); - /* FIXME: get from pos up to len bytes of string - malloc it */ - return NULL; + + if (len <= 0) return NULL; + if (start > o->len) return NULL; + if (len > (o->len - start)) my_len = o->len - start; + + ret = malloc(sizeof(char) * (my_len + 1)); + if (ret) + { + Node *node; + int ps = 0; + + node = evas_object_textblock_node_pos_get(obj, start, &ps); + if (node) + { + if ((node->text_len - (start - ps)) >= my_len) + memcpy(ret, node->text + (start - ps), my_len); + else + { + int remaining = my_len - (node->text_len - (start - ps)); + int count = (node->text_len - (start - ps)); + + memcpy(ret, node->text + (start - ps), node->text_len - (start - ps)); + + while(remaining > 0) + { + node = evas_object_textblock_node_pos_get(obj, start + count, &ps); + if (node) + { + int amt = 0; + if (node->text_len >= remaining) + amt = remaining; + else + amt = node->text_len; + + memcpy(ret + count, node->text, amt); + remaining -= amt; + count += amt; + } + else + { + /* we ran out of nodes ... */ + break; + } + } + } + } + ret[my_len] = '\0'; + } + return ret; } void