aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2022-05-24 20:27:29 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2022-05-24 22:20:04 +0200
commit0bcea86763c6858a4e3b18bf8062739e15032474 (patch)
treed8bca9788b6b2e10c415a3c5c177c7cd137c4fbf /src
parent951a310989cd0dba1e765095c74e607d626c3f9f (diff)
downloadjancity-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.c38
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;
}