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