summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/stdio/printf.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/libc/stdio/printf.c b/libc/stdio/printf.c
index ea066bb87..8efa7dd5b 100644
--- a/libc/stdio/printf.c
+++ b/libc/stdio/printf.c
@@ -468,7 +468,18 @@ void _ppfs_prepargs(register ppfs_t *ppfs, va_list arg)
{
int i;
+#ifdef __va_copy
__va_copy(ppfs->arg, arg);
+#else
+ /* TODO -- maybe create a bits/vacopy.h for arch specific versions
+ * to ensure we get the right behavior? Either that or fall back
+ * on the portable (but costly in size) method of using a va_list *.
+ * That means a pointer derefs in the va_arg() invocations... */
+#warning __va_copy is not defined, using a simple copy instead...
+ /* the glibc manual suggests that this will usually suffice when
+ __va_copy doesn't exist. */
+ ppfs->arg = arg;
+#endif
if ((i = ppfs->maxposarg) > 0) { /* init for positional args */
ppfs->num_data_args = i;