From b30b93f67212c8d4c172972fd3399cabb8d1be6e Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Sat, 8 Feb 2020 23:29:32 -0500 Subject: [PATCH] Use fmemopen to build colored mentions string --- handle.c | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/handle.c b/handle.c index b4601e4..cf0e853 100644 --- a/handle.c +++ b/handle.c @@ -406,34 +406,25 @@ static const char *colorMentions(size_t id, struct Message *msg) { } static char buf[1024]; - size_t len = 0; + FILE *str = fmemopen(buf, sizeof(buf), "w"); + if (!str) err(EX_OSERR, "fmemopen"); + while (*mention) { size_t skip = strspn(mention, ", "); - int n = snprintf( - &buf[len], sizeof(buf) - len, - "%.*s", (int)skip, mention - ); - assert(n >= 0 && len + n < sizeof(buf)); - len += n; + fwrite(mention, skip, 1, str); mention += skip; - size_t word = strcspn(mention, ", "); - char punct = mention[word]; - mention[word] = '\0'; - - n = snprintf( - &buf[len], sizeof(buf) - len, - "\3%02d%s\3", completeColor(id, mention), mention - ); - assert(n > 0 && len + n < sizeof(buf)); - len += n; - - mention[word] = punct; - mention += word; + size_t len = strcspn(mention, ", "); + char punct = mention[len]; + mention[len] = '\0'; + fprintf(str, "\3%02d%s\3", completeColor(id, mention), mention); + mention[len] = punct; + mention += len; } - assert(len + 1 < sizeof(buf)); - buf[len++] = final; - buf[len] = '\0'; + fputc(final, str); + + fclose(str); + buf[sizeof(buf) - 1] = '\0'; return buf; }