From 140b0a9fca5934bcfa0399d01a03a5f8ee374b84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Briano?= Date: Mon, 15 Dec 2008 22:03:04 +0000 Subject: [PATCH] Add function to get the length in characters of a string SVN revision: 38158 --- legacy/evas/src/lib/Evas.h | 1 + legacy/evas/src/lib/canvas/evas_object_text.c | 12 ++++++++++++ .../evas/src/lib/canvas/evas_object_textblock.c | 5 ++--- legacy/evas/src/lib/engines/common/evas_font.h | 1 + .../evas/src/lib/engines/common/evas_font_main.c | 15 +++++++++++++++ 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/legacy/evas/src/lib/Evas.h b/legacy/evas/src/lib/Evas.h index 4f5955a52c..4eb8a5bf9d 100644 --- a/legacy/evas/src/lib/Evas.h +++ b/legacy/evas/src/lib/Evas.h @@ -602,6 +602,7 @@ extern "C" { /* string and font handling */ EAPI int evas_string_char_next_get (const char *str, int pos, int *decoded); EAPI int evas_string_char_prev_get (const char *str, int pos, int *decoded); + EAPI int evas_string_char_len_get (const char *str); EAPI void evas_font_path_clear (Evas *e); EAPI void evas_font_path_append (Evas *e, const char *path); diff --git a/legacy/evas/src/lib/canvas/evas_object_text.c b/legacy/evas/src/lib/canvas/evas_object_text.c index 40fd01bde6..6078ede4aa 100644 --- a/legacy/evas/src/lib/canvas/evas_object_text.c +++ b/legacy/evas/src/lib/canvas/evas_object_text.c @@ -1214,6 +1214,18 @@ evas_string_char_prev_get(const char *str, int pos, int *decoded) return p; } +/** + * Get the length in characters of the string. + * @param str The string to get the length of. + * @return The length in characters (not bytes) + */ +EAPI int +evas_string_char_len_get(const char *str) +{ + if (!str) return 0; + return evas_common_font_utf8_get_len(str); +} + /** * Get the minimum padding a style adds to the text. * @param style The style to determine padding. diff --git a/legacy/evas/src/lib/canvas/evas_object_textblock.c b/legacy/evas/src/lib/canvas/evas_object_textblock.c index 030542f8f2..2680d0b5eb 100644 --- a/legacy/evas/src/lib/canvas/evas_object_textblock.c +++ b/legacy/evas/src/lib/canvas/evas_object_textblock.c @@ -1803,11 +1803,10 @@ _layout_text_append(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Text if ((repch) && (n->text)) { - int i = 0, len = 0, chlen; + int i, len, chlen; char *ptr; - while (evas_common_font_utf8_get_next(n->text, &i)) - len++; + len = evas_common_font_utf8_get_len(n->text); chlen = strlen(repch); str = alloca((len * chlen) + 1); tbase = str; diff --git a/legacy/evas/src/lib/engines/common/evas_font.h b/legacy/evas/src/lib/engines/common/evas_font.h index 0bf799c991..ab7b879e00 100644 --- a/legacy/evas/src/lib/engines/common/evas_font.h +++ b/legacy/evas/src/lib/engines/common/evas_font.h @@ -20,6 +20,7 @@ EAPI int evas_common_font_get_line_advance (RGBA_Font *fn); EAPI int evas_common_font_utf8_get_next (unsigned char *buf, int *iindex); EAPI int evas_common_font_utf8_get_prev (unsigned char *buf, int *iindex); EAPI int evas_common_font_utf8_get_last (unsigned char *buf, int buflen); +EAPI int evas_common_font_utf8_get_len (unsigned char *buf); /* draw */ diff --git a/legacy/evas/src/lib/engines/common/evas_font_main.c b/legacy/evas/src/lib/engines/common/evas_font_main.c index 7f9576087c..0099e1d5c9 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_main.c +++ b/legacy/evas/src/lib/engines/common/evas_font_main.c @@ -271,3 +271,18 @@ evas_common_font_utf8_get_last(unsigned char *buf, int buflen) } return 0; } + +EAPI int +evas_common_font_utf8_get_len(unsigned char *buf) +{ + /* returns the number of utf8 characters (not bytes) in the string */ + int index = 0, len = 0; + + while (buf[index]) + { + if ((buf[index] & 0xc0) != 0x80) + len++; + index++; + } + return len; +}