summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2013-03-22 17:46:52 +0100
committerBernd Schmidt <bernds@codesourcery.com>2013-03-22 18:00:55 +0100
commit697427cc42ca3c6794dc26f3a379866de71bb91b (patch)
treefc160fbd7efa9de152f629309820a07c588118de
parent7e434242bdaa3718c7146b31dcd81e24fe7dc3c1 (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>
-rw-r--r--libc/stdio/_scanf.c6
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;