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
commit77d16c32cca9f5cd7c5badb495f37a01402e5931 (patch)
tree3856fe585c07769c7fa19d9489e817b9a9f4e9a8 /src
parentdea345f412652151c256f20df0793e47673dff2b (diff)
downloadrts-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.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;
}