summaryrefslogtreecommitdiff
path: root/stdio-common/vfprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'stdio-common/vfprintf.c')
-rw-r--r--stdio-common/vfprintf.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index d24c917bc2..eda0d7bd8e 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -880,7 +880,13 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
/* Initialize local variables. */
done = 0;
grouping = (const char *) -1;
+#ifdef __va_copy
+ /* This macro will be available soon in gcc's <stdarg.h>. Me need it
+ since on some systems `va_list' is not an integral type. */
+ __va_copy (ap_save, ap);
+#else
ap_save = ap;
+#endif
nspecs_done = 0;
/* Find the first format specifier. */
@@ -1203,12 +1209,12 @@ do_positional:
/* Now we know all the types and the order. Fill in the argument
values. */
- for (cnt = 0, ap = ap_save; cnt < nargs; ++cnt)
+ for (cnt = 0; cnt < nargs; ++cnt)
switch (args_type[cnt])
{
#define T(tag, mem, type) \
case tag: \
- args_value[cnt].mem = va_arg (ap, type); \
+ args_value[cnt].mem = va_arg (ap_save, type); \
break
T (PA_CHAR, pa_char, int); /* Promoted. */
@@ -1226,7 +1232,7 @@ do_positional:
#undef T
default:
if ((args_type[cnt] & PA_FLAG_PTR) != 0)
- args_value[cnt].pa_pointer = va_arg (ap, void *);
+ args_value[cnt].pa_pointer = va_arg (ap_save, void *);
else
args_value[cnt].pa_long_double = 0.0;
break;