"C" character set (again)
Andy Koppe
andy.koppe@gmail.com
Sat Jan 9 06:28:00 GMT 2010
2010/1/8 Corinna Vinschen:
>> But I think it would actually be quite easy to wave invalid bytes
>> through anyway: print the byte, reset the multibyte conversion state,
>> and continue processing the string. Still valid according to POSIX,
>> but also Linux-compatible. I'll propose a patch.
>
> I hacked a patch already yesterday:
Cool. Got round to trying it now.
> Index: libc/stdio/vfprintf.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdio/vfprintf.c,v
> retrieving revision 1.76
> diff -u -p -r1.76 vfprintf.c
> --- libc/stdio/vfprintf.c 18 Nov 2009 09:49:56 -0000 1.76
> +++ libc/stdio/vfprintf.c 8 Jan 2010 12:47:31 -0000
> @@ -724,8 +724,12 @@ _DEFUN(_VFPRINTF_R, (data, fp, fmt0, ap)
> cp = fmt;
> #ifdef _MB_CAPABLE
> while ((n = __mbtowc (data, &wc, fmt, MB_CUR_MAX,
> - __locale_charset (), &state)) > 0) {
> - if (wc == '%')
> + __locale_charset (), &state)) != 0) {
> + if (n < 0) {
> + memset (&state, 0, sizeof state);
> + n = 1;
> + }
> + else if (wc == '%')
> break;
> fmt += n;
> }
>
> It works, but I'm feeling uneasy about this.
Looks good to me, and works here too. As far as I can see, there's
nothing down the line (i.e. in __(s)sprint_r) that would choke on
invalid bytes.
(Btw, I was surprised to discover the integer-only variants of the
printf functions. Those seem rather unnecessary for Cygwin, but I
guess once they're in it's impossible to throw them out ...)
Andy
More information about the Cygwin-developers
mailing list