summaryrefslogtreecommitdiff
path: root/tools/include
diff options
context:
space:
mode:
authorThomas Weißschuh <linux@weissschuh.net>2026-04-01 17:07:29 +0200
committerThomas Weißschuh <linux@weissschuh.net>2026-04-06 19:46:51 +0200
commit12496aad10c5671d66e160487326de942cd440ba (patch)
treeb648dd3c17f3dc56129e156dc6b314dee1f02320 /tools/include
parentfd2e9f820005d63769a6662c276b1f52a72ed041 (diff)
tools/nolibc: add support for asprintf()
Add support for dynamically allocating formatted strings through asprintf() and vasprintf(). Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Acked-by: Willy Tarreau <w@1wt.eu> Link: https://patch.msgid.link/20260401-nolibc-asprintf-v1-3-46292313439f@weissschuh.net
Diffstat (limited to 'tools/include')
-rw-r--r--tools/include/nolibc/stdio.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h
index b6d14a58cfe7..ebdd413d13ec 100644
--- a/tools/include/nolibc/stdio.h
+++ b/tools/include/nolibc/stdio.h
@@ -795,6 +795,56 @@ int sprintf(char *buf, const char *fmt, ...)
return ret;
}
+static __attribute__((unused, format(printf, 2, 0)))
+int __nolibc_vasprintf(char **strp, const char *fmt, va_list args1, va_list args2)
+{
+ int len1, len2;
+ char *buf;
+
+ len1 = vsnprintf(NULL, 0, fmt, args1);
+ if (len1 < 0)
+ return -1;
+
+ buf = malloc(len1 + 1);
+ if (!buf)
+ return -1;
+
+ len2 = vsnprintf(buf, len1 + 1, fmt, args2);
+ if (len2 < 0) {
+ free(buf);
+ return -1;
+ }
+
+ *strp = buf;
+ return len1;
+}
+
+static __attribute__((unused, format(printf, 2, 0)))
+int vasprintf(char **strp, const char *fmt, va_list args)
+{
+ va_list args2;
+ int ret;
+
+ va_copy(args2, args);
+ ret = __nolibc_vasprintf(strp, fmt, args, args2);
+ va_end(args2);
+
+ return ret;
+}
+
+static __attribute__((unused, format(printf, 2, 3)))
+int asprintf(char **strp, const char *fmt, ...)
+{
+ va_list args;
+ int ret;
+
+ va_start(args, fmt);
+ ret = vasprintf(strp, fmt, args);
+ va_end(args);
+
+ return ret;
+}
+
static __attribute__((unused))
int vsscanf(const char *str, const char *format, va_list args)
{