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 | 0bcea86763c6858a4e3b18bf8062739e15032474 (patch) | |
| tree | d8bca9788b6b2e10c415a3c5c177c7cd137c4fbf /src | |
| parent | 951a310989cd0dba1e765095c74e607d626c3f9f (diff) | |
| download | jancity-0bcea86763c6858a4e3b18bf8062739e15032474.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; } |
