From 23d42138c61931d870a5f549d0b5e999ecd66bd4 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Fri, 13 Jan 2012 17:47:19 -0500 Subject: [PATCH] Move truncation logic to FORMAT_BUFFER --- io.c | 4 ++-- tig.c | 10 ++-------- tig.h | 12 +++++++++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/io.c b/io.c index b94d006..2f7456f 100644 --- a/io.c +++ b/io.c @@ -155,7 +155,7 @@ io_open(struct io *io, const char *fmt, ...) io_init(io); - FORMAT_BUFFER(name, sizeof(name), fmt, retval); + FORMAT_BUFFER(name, sizeof(name), fmt, retval, FALSE); if (retval < 0) { io->error = ENAMETOOLONG; return FALSE; @@ -411,7 +411,7 @@ io_printf(struct io *io, const char *fmt, ...) char buf[SIZEOF_STR] = ""; int retval; - FORMAT_BUFFER(buf, sizeof(buf), fmt, retval); + FORMAT_BUFFER(buf, sizeof(buf), fmt, retval, FALSE); if (retval < 0) { io->error = ENAMETOOLONG; return FALSE; diff --git a/tig.c b/tig.c index f024f20..af660b8 100644 --- a/tig.c +++ b/tig.c @@ -2857,7 +2857,7 @@ add_line_format(struct view *view, enum line_type type, const char *fmt, ...) char buf[SIZEOF_STR]; int retval; - FORMAT_BUFFER(buf, sizeof(buf), fmt, retval); + FORMAT_BUFFER(buf, sizeof(buf), fmt, retval, FALSE); return retval >= 0 ? add_line_text(view, buf, type) : NULL; } @@ -6702,13 +6702,7 @@ report(const char *msg, ...) char buf[SIZEOF_STR]; int retval; - FORMAT_BUFFER(buf, sizeof(buf), msg, retval); - if (retval >= sizeof(buf)) { - buf[sizeof(buf) - 1] = 0; - buf[sizeof(buf) - 2] = '.'; - buf[sizeof(buf) - 3] = '.'; - buf[sizeof(buf) - 4] = '.'; - } + FORMAT_BUFFER(buf, sizeof(buf), msg, retval, TRUE); die("%s", buf); } diff --git a/tig.h b/tig.h index e483c56..b356363 100644 --- a/tig.h +++ b/tig.h @@ -206,13 +206,19 @@ string_ncopy_do(char *dst, size_t dstlen, const char *src, size_t srclen) /* Shorthands for safely copying into a fixed buffer. */ -#define FORMAT_BUFFER(buf, bufsize, fmt, retval) \ +#define FORMAT_BUFFER(buf, bufsize, fmt, retval, allow_truncate) \ do { \ va_list args; \ va_start(args, fmt); \ retval = vsnprintf(buf, bufsize, fmt, args); \ va_end(args); \ - if (0 < retval && retval >= bufsize) { \ + if (retval >= (bufsize) && allow_truncate) { \ + (buf)[(bufsize) - 1] = 0; \ + (buf)[(bufsize) - 2] = '.'; \ + (buf)[(bufsize) - 3] = '.'; \ + (buf)[(bufsize) - 4] = '.'; \ + retval = (bufsize) - 1; \ + } else if (retval < 0 || retval >= (bufsize)) { \ retval = -1; \ } \ } while (0) @@ -272,7 +278,7 @@ string_nformat(char *buf, size_t bufsize, size_t *bufpos, const char *fmt, ...) size_t pos = bufpos ? *bufpos : 0; int retval; - FORMAT_BUFFER(buf + pos, bufsize - pos, fmt, retval); + FORMAT_BUFFER(buf + pos, bufsize - pos, fmt, retval, FALSE); if (bufpos && retval > 0) *bufpos = pos + retval; -- 2.11.4.GIT