From 7ced2beab412c51b80155bd7ef98f9fff117f6d1 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 12 Mar 2001 10:34:04 +0000 Subject: [PATCH] added format_real_length() git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1380 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- src/fe-common/core/formats.c | 43 ++++++++++++++++++++++++++++++++++-- src/fe-common/core/formats.h | 4 ++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/fe-common/core/formats.c b/src/fe-common/core/formats.c index 43f8f275..038938c3 100644 --- a/src/fe-common/core/formats.c +++ b/src/fe-common/core/formats.c @@ -216,11 +216,14 @@ void format_create_dest(TEXT_DEST_REC *dest, dest->hilight_bg_color = 0; } +/* Return length of text part in string (ie. without % codes) */ int format_get_length(const char *str) { GString *tmp; int len; + g_return_val_if_fail(str != NULL, 0); + tmp = g_string_new(NULL); len = 0; while (*str != '\0') { @@ -233,17 +236,53 @@ int format_get_length(const char *str) /* %% or unknown %code, written as-is */ if (*str != '%') - len++; + len++; } len++; - str++; + str++; } g_string_free(tmp, TRUE); return len; } +/* Return how many characters in `str' must be skipped before `len' + characters of text is skipped. Like strip_real_length(), except this + handles %codes. */ +int format_real_length(const char *str, int len) +{ + GString *tmp; + const char *start; + + g_return_val_if_fail(str != NULL, 0); + g_return_val_if_fail(len >= 0, 0); + + start = str; + tmp = g_string_new(NULL); + while (*str != '\0' && len > 0) { + if (*str == '%' && str[1] != '\0') { + str++; + if (*str != '%' && format_expand_styles(tmp, *str)) { + str++; + continue; + } + + /* %% or unknown %code, written as-is */ + if (*str != '%') { + if (--len == 0) + break; + } + } + + len--; + str++; + } + + g_string_free(tmp, TRUE); + return (int) (str-start); +} + static char *format_get_text_args(TEXT_DEST_REC *dest, const char *text, char **arglist) { diff --git a/src/fe-common/core/formats.h b/src/fe-common/core/formats.h index fdd27015..0dd46489 100644 --- a/src/fe-common/core/formats.h +++ b/src/fe-common/core/formats.h @@ -44,6 +44,10 @@ int format_find_tag(const char *module, const char *tag); /* Return length of text part in string (ie. without % codes) */ int format_get_length(const char *str); +/* Return how many characters in `str' must be skipped before `len' + characters of text is skipped. Like strip_real_length(), except this + handles %codes. */ +int format_real_length(const char *str, int len); char *format_get_text(const char *module, WINDOW_REC *window, void *server, const char *target,