Fix EOF handling in scanf()
Francois Gouget
fgouget at codeweavers.com
Thu Jan 27 08:57:35 CST 2005
Changelog:
* dlls/msvcrt/scanf.h
dlls/msvcrt/tests/scanf.c
Francois Gouget <fgouget at codeweavers.com>
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.
--
Francois Gouget
fgouget at codeweavers.com
-------------- next part --------------
Index: dlls/msvcrt/scanf.h
===================================================================
RCS file: /var/cvs/wine/dlls/msvcrt/scanf.h,v
retrieving revision 1.18
diff -u -p -r1.18 scanf.h
--- dlls/msvcrt/scanf.h 23 Aug 2004 18:52:54 -0000 1.18
+++ dlls/msvcrt/scanf.h 27 Jan 2005 12:16:30 -0000
@@ -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': {
Index: dlls/msvcrt/tests/scanf.c
===================================================================
RCS file: /var/cvs/wine/dlls/msvcrt/tests/scanf.c,v
retrieving revision 1.15
diff -u -p -r1.15 scanf.c
--- dlls/msvcrt/tests/scanf.c 4 Nov 2004 21:03:30 -0000 1.15
+++ dlls/msvcrt/tests/scanf.c 27 Jan 2005 12:09:24 -0000
@@ -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)
More information about the wine-patches
mailing list