This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Correctly handle %p in wprintf
- From: Adhemerval Zanella <azanella at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Date: Thu, 01 May 2014 15:02:02 -0300
- Subject: Re: [PATCH] Correctly handle %p in wprintf
- Authentication-results: sourceware.org; auth=none
- References: <877g65wq0l dot fsf at igel dot home>
On 01-05-2014 11:08, Andreas Schwab wrote:
> [BZ #16890]
> * stdio-common/vfprintf.c (process_arg) [%p]: Mark string as wide
> when compiling wprintf.
> * stdio-common/tstdiomisc.c (t3): New function.
> (main): Call it.
> ---
> stdio-common/tstdiomisc.c | 19 +++++++++++++++++++
> stdio-common/vfprintf.c | 3 ++-
> 2 files changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/stdio-common/tstdiomisc.c b/stdio-common/tstdiomisc.c
> index 5a25ecc..2e0663a 100644
> --- a/stdio-common/tstdiomisc.c
> +++ b/stdio-common/tstdiomisc.c
> @@ -46,6 +46,24 @@ t2 (void)
> return result;
> }
>
> +static int
> +t3 (void)
> +{
> + char buf[80];
> + wchar_t wbuf[80];
> + int result = 0;
> + int retval;
> +
> + retval = sprintf (buf, "%p", (char *) NULL);
> + result |= retval != 5 || strcmp (buf, "(nil)") != 0;
> +
> + retval = swprintf (wbuf, sizeof (wbuf) / sizeof (wbuf[0]),
> + L"%p", (char *) NULL);
> + result |= retval != 5 || wcscmp (wbuf, L"(nil)") != 0;
> +
> + return result;
> +}
> +
> volatile double qnanval;
> volatile long double lqnanval;
> /* A sNaN is only guaranteed to be representable in variables with static (or
> @@ -243,6 +261,7 @@ main (int argc, char *argv[])
>
> result |= t1 ();
> result |= t2 ();
> + result |= t3 ();
> result |= F ();
>
> result |= fflush (stdout) == EOF;
> diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
> index f7e5f61..c4ff833 100644
> --- a/stdio-common/vfprintf.c
> +++ b/stdio-common/vfprintf.c
> @@ -936,7 +936,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
> /* Make sure the full string "(nil)" is printed. */ \
> if (prec < 5) \
> prec = 5; \
> - is_long = 0; /* This is no wide-char string. */ \
> + /* This is a wide string iff compiling wprintf. */ \
> + is_long = sizeof (CHAR_T) > 1; \
> goto LABEL (print_string); \
> } \
> } \
s/iff/if , besides that LGTM.