diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2022-05-24 20:27:29 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2022-05-24 22:20:04 +0200 |
| commit | 77d16c32cca9f5cd7c5badb495f37a01402e5931 (patch) | |
| tree | 3856fe585c07769c7fa19d9489e817b9a9f4e9a8 /src | |
| parent | dea345f412652151c256f20df0793e47673dff2b (diff) | |
| download | rts-77d16c32cca9f5cd7c5badb495f37a01402e5931.tar.gz | |
font.c: avoid several va_list in favor of large buffer
Diffstat (limited to 'src')
| -rw-r--r-- | src/font/src/font.c | 38 |
1 files changed, 6 insertions, 32 deletions
diff --git a/src/font/src/font.c b/src/font/src/font.c index d303a5f..990a7b2 100644 --- a/src/font/src/font.c +++ b/src/font/src/font.c @@ -67,44 +67,18 @@ static int renderstr(const enum font f, const short x, short y, const char *str) int font_printf(const enum font f, const short x, const short y, const char *const fmt, ...) { - va_list ap, aq, at; + va_list ap; va_start(ap, fmt); - va_copy(aq, ap); - va_copy(at, ap); - /* Short string optimization. */ - char defstr[64]; - int sz = vsnprintf(defstr, sizeof defstr, fmt, ap); + char defstr[1024]; + const int sz = vsnprintf(defstr, sizeof defstr, fmt, ap); - if (sz < 0) - goto end; - else if (sz >= sizeof defstr) - { - va_list at; - - sz = vsnprintf(NULL, 0, fmt, ap); - - if (sz < 0) - goto end; - - /* VLAs are generally frowned upon, but using the heap - * might not be a good idea for a video game like this. */ - char str[sz + 1]; - - sz = vsnprintf(str, sizeof str, fmt, ap); - va_end(at); - - if (sz < 0) - goto end; - } + va_end(ap); - if (renderstr(f, x, y, defstr)) + if (sz < 0 || sz >= sizeof defstr + || renderstr(f, x, y, defstr)) return -1; -end: - va_end(at); - va_end(aq); - va_end(ap); return sz; } |
