diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2013-03-22 17:46:52 +0100 |
---|---|---|
committer | Bernd Schmidt <bernds@codesourcery.com> | 2013-03-22 18:00:55 +0100 |
commit | 697427cc42ca3c6794dc26f3a379866de71bb91b (patch) | |
tree | fc160fbd7efa9de152f629309820a07c588118de /libc/stdio | |
parent | 7e434242bdaa3718c7146b31dcd81e24fe7dc3c1 (diff) |
Fix a problem with scanning wide chars.
We found that the testcase
int
main (void)
{
wchar_t s[10];
memset (s, 0, sizeof (s));
int r = sscanf ("s", "%ls", s);
printf ("%d\n", r);
printf ("%ls\n", s);
return 0;
}
printed
0
<blankline>
rather than the expected
1
s
The problem was the enum in _scanf.c, which has had a 'CONV_m' value
inserted. The attached patch fixes the problem in __psfs_parse_spec by
not presuming a particular displacement between the two sets of
char-like conversion values. With this patch the above program produces
the expected output.
Signed-off-by: Nathan Sidwell <nathan@codesourcery.com>
Signed-off-by: Bernd Schmidt <bernds@codesourcery.com>
Diffstat (limited to 'libc/stdio')
-rw-r--r-- | libc/stdio/_scanf.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/libc/stdio/_scanf.c b/libc/stdio/_scanf.c index 9659423e7..e0af4863b 100644 --- a/libc/stdio/_scanf.c +++ b/libc/stdio/_scanf.c @@ -426,8 +426,8 @@ libc_hidden_def(vswscanf) /* npxXoudif eEgG CS cs[ */ /* NOTE: the 'm' flag must come before any convs that support it */ -/* NOTE: Ordering is important! In particular, CONV_LEFTBRACKET - * must immediately precede CONV_c. */ +/* NOTE: Ordering is important! The CONV_{C,S,LEFTBRACKET} must map + simply to their lowercase equivalents. */ enum { CONV_n = 0, @@ -918,7 +918,7 @@ int attribute_hidden __psfs_parse_spec(register psfs_t *psfs) psfs->dataargtype = PA_FLAG_LONG; } else if ((p_m_spec_chars >= CONV_c) && (psfs->dataargtype & PA_FLAG_LONG)) { - p_m_spec_chars -= 3; /* lc -> C, ls -> S, l[ -> ?? */ + p_m_spec_chars -= CONV_c - CONV_C; /* lc -> C, ls -> S, l[ -> ?? */ } psfs->conv_num = p_m_spec_chars; |