From 168265ebb00a6f94d129b64112d071edff80a83d Mon Sep 17 00:00:00 2001 From: Francois Gouget Date: Fri, 28 Jan 2005 11:27:26 +0000 Subject: [PATCH] Fix handling of EOF for the '%c' and '%C' cases in scanf(). Add conformance tests to verify the behavior of '%c'. Improve some of the test's error messages. --- dlls/msvcrt/scanf.h | 32 ++++++++++++++++++-------------- dlls/msvcrt/tests/scanf.c | 26 ++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h index dbd08fd7c7..2558890997 100644 --- a/dlls/msvcrt/scanf.h +++ b/dlls/msvcrt/scanf.h @@ -401,21 +401,25 @@ _FUNCTION_ { else goto widecharacter; #endif /* WIDE_SCANF */ character: { /* read single character into char */ - if (!suppress) { - char*c = va_arg(ap, char*); - *c = _CHAR2SUPPORTED_(nch); - } - st = 1; - nch = _GETC_(file); - } + if (nch!=_EOF_) { + if (!suppress) { + char*c = va_arg(ap, char*); + *c = _CHAR2SUPPORTED_(nch); + } + st = 1; + nch = _GETC_(file); + } + } break; - widecharacter: { - if (!suppress) { /* read single character into a wchar_t */ - MSVCRT_wchar_t*c = va_arg(ap, MSVCRT_wchar_t*); - *c = _WIDE2SUPPORTED_(nch); - } - nch = _GETC_(file); - st = 1; + widecharacter: { /* read single character into a wchar_t */ + if (nch!=_EOF_) { + if (!suppress) { + MSVCRT_wchar_t*c = va_arg(ap, MSVCRT_wchar_t*); + *c = _WIDE2SUPPORTED_(nch); + } + nch = _GETC_(file); + st = 1; + } } break; case 'n': { diff --git a/dlls/msvcrt/tests/scanf.c b/dlls/msvcrt/tests/scanf.c index f2a27ffa31..bc121a8ec2 100644 --- a/dlls/msvcrt/tests/scanf.c +++ b/dlls/msvcrt/tests/scanf.c @@ -27,6 +27,7 @@ static void test_sscanf( void ) char buffer[100], buffer1[100]; char format[20]; int result, ret; + char c; float res1= -82.6267f, res2= 27.76f, res11, res12; static const char pname[]=" St. Petersburg, Florida\n"; int hour=21,min=59,sec=20; @@ -90,11 +91,32 @@ static void test_sscanf( void ) /* Check %i according to bug 1878 */ strcpy(buffer,"123"); ret = sscanf(buffer, "%i", &result); - ok( ret == 1 , "Wrong number of arguments read\n"); + ok(ret == 1, "Wrong number of arguments read: %d\n", ret); ok(result == 123, "Wrong number read\n"); ret = sscanf(buffer, "%d", &result); - ok( ret == 1 , "Wrong number of arguments read\n"); + ok(ret == 1, "Wrong number of arguments read: %d\n", ret); ok(result == 123, "Wrong number read\n"); + + /* Check %c */ + strcpy(buffer,"a"); + c = 0x55; + ret = sscanf(buffer, "%c", &c); + ok(ret == 1, "Wrong number of arguments read: %d\n", ret); + ok(c == 'a', "Field incorrect: '%c'\n", c); + + strcpy(buffer," a"); + c = 0x55; + ret = sscanf(buffer, "%c", &c); + ok(ret == 1, "Wrong number of arguments read: %d\n", ret); + ok(c == ' ', "Field incorrect: '%c'\n", c); + + strcpy(buffer,"18:59"); + c = 0x55; + ret = sscanf(buffer, "%d:%d%c", &hour, &min, &c); + ok(ret == 2, "Wrong number of arguments read: %d\n", ret); + ok(hour == 18, "Field 1 incorrect: %d\n", hour); + ok(min == 59, "Field 2 incorrect: %d\n", min); + ok(c == 0x55, "Field 3 incorrect: 0x%02x\n", c); } START_TEST(scanf)