diff options
author | ailin-nemui <ailin-nemui@users.noreply.github.com> | 2017-05-05 14:45:13 +0200 |
---|---|---|
committer | ailin-nemui <ailin-nemui@users.noreply.github.com> | 2018-01-06 00:26:48 +0100 |
commit | 451019d05dfabbac2463f0d835c5113ac140c5c4 (patch) | |
tree | 78e0f0c108e09a3bfc590a5f2bd30ae2e28776aa | |
parent | e405330e04dc344797f00c12cf8fd7f63b17e0e4 (diff) | |
download | irssi-451019d05dfabbac2463f0d835c5113ac140c5c4.zip |
make format_real_length left-collecting
-rw-r--r-- | src/fe-common/core/formats.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/src/fe-common/core/formats.c b/src/fe-common/core/formats.c index 37db6f7c..4c819c2d 100644 --- a/src/fe-common/core/formats.c +++ b/src/fe-common/core/formats.c @@ -480,27 +480,30 @@ int format_real_length(const char *str, int len) start = str; tmp = g_string_new(NULL); - while (*str != '\0' && len > 0) { + while (*str != '\0') { + oldstr = str; if (*str == '%' && str[1] != '\0') { str++; if (*str != '%') { adv = format_expand_styles(tmp, &str, NULL); - str += adv; - if (adv) - continue; - } - - /* %% or unknown %code, written as-is */ - if (*str != '%') { - if (--len == 0) - break; + if (adv) { + str += adv; + continue; + } + /* discount for unknown % */ + if (--len < 0) { + str = oldstr; + break; + } + oldstr = str; } } - oldstr = str; len -= string_advance(&str, utf8); - if (len < 0) + if (len < 0) { str = oldstr; + break; + } } g_string_free(tmp, TRUE); |