From 73d574b71a10d4661ada20275cafde75aff6c1ba Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Thu, 12 Sep 2024 13:33:18 +0200 Subject: teco_string_get_coord() returns character offsets now (refs #5) * This is used for error messages (TECO macro stackframes), so it's important to display columns in characters. * Program counters are in bytes and therefore everywhere gsize. This is by glib convention. --- src/string-utils.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'src/string-utils.c') diff --git a/src/string-utils.c b/src/string-utils.c index d9b12e0..b284760 100644 --- a/src/string-utils.c +++ b/src/string-utils.c @@ -55,13 +55,20 @@ teco_string_echo(const gchar *str, gsize len) return ret; } -/** @memberof teco_string_t */ +/** + * Get character coordinates for a given byte index. + * + * The given string must be valid UTF-8. + * + * @memberof teco_string_t + */ void -teco_string_get_coord(const gchar *str, guint pos, guint *line, guint *column) +teco_string_get_coord(const gchar *str, gsize off, guint *pos, guint *line, guint *column) { + *pos = 0; *line = *column = 1; - for (guint i = 0; i < pos; i++) { + for (guint i = 0; i < off; i = g_utf8_next_char(str+i) - str) { switch (str[i]) { case '\r': if (str[i+1] == '\n') @@ -75,6 +82,7 @@ teco_string_get_coord(const gchar *str, guint pos, guint *line, guint *column) (*column)++; break; } + (*pos)++; } } -- cgit v1.2.3