From: Ulrich Drepper Date: Mon, 17 Mar 1997 03:59:42 +0000 (+0000) Subject: Use __va_copy if available. X-Git-Tag: cvs/glibc-2_0_4~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2047317f3b3d746b001150aa79bbb7b2a9b14f81;p=thirdparty%2Fglibc.git Use __va_copy if available. --- diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c index f201c467753..256f3eab333 100644 --- a/stdio-common/vfscanf.c +++ b/stdio-common/vfscanf.c @@ -163,8 +163,7 @@ int __vfscanf (FILE *s, const char *format, va_list argptr) #endif { - va_list arg = (va_list) argptr; - + va_list arg; register const char *f = format; register unsigned char fc; /* Current character of the format. */ register size_t done = 0; /* Assignments done. */ @@ -222,6 +221,12 @@ __vfscanf (FILE *s, const char *format, va_list argptr) } \ while (0) +#ifdef __va_copy + __va_copy (arg, argptr); +#else + arg = (va_list) argptr; +#endif + ARGCHECK (s, format); /* Figure out the decimal point character. */ @@ -243,23 +248,34 @@ __vfscanf (FILE *s, const char *format, va_list argptr) /* Extract the next argument, which is of type TYPE. For a %N$... spec, this is the Nth argument from the beginning; otherwise it is the next argument after the state now in ARG. */ -#if 0 +#ifdef __va_copy +# define ARG(type) (argpos == 0 ? va_arg (arg, type) : \ + ({ unsigned int pos = argpos; \ + va_list arg; \ + __va_copy (arg, argptr); \ + while (--pos > 0) \ + (void) va_arg (arg, void *); \ + va_arg (arg, type); \ + })) +#else +# if 0 /* XXX Possible optimization. */ -# define ARG(type) (argpos == 0 ? va_arg (arg, type) : \ +# define ARG(type) (argpos == 0 ? va_arg (arg, type) : \ ({ va_list arg = (va_list) argptr; \ arg = (va_list) ((char *) arg \ + (argpos - 1) \ * __va_rounded_size (void *)); \ va_arg (arg, type); \ })) -#else -# define ARG(type) (argpos == 0 ? va_arg (arg, type) : \ +# else +# define ARG(type) (argpos == 0 ? va_arg (arg, type) : \ ({ unsigned int pos = argpos; \ va_list arg = (va_list) argptr; \ while (--pos > 0) \ (void) va_arg (arg, void *); \ va_arg (arg, type); \ })) +# endif #endif if (!isascii (*f))