Fix handling of EOF for the '%c' and '%C' cases in scanf().
authorFrancois Gouget <fgouget@codeweavers.com>
Fri, 28 Jan 2005 11:27:26 +0000 (11:27 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Fri, 28 Jan 2005 11:27:26 +0000 (11:27 +0000)
Add conformance tests to verify the behavior of '%c'.
Improve some of the test's error messages.

dlls/msvcrt/scanf.h
dlls/msvcrt/tests/scanf.c

index dbd08fd7c7c3f10e92f1cf6620259d92f1e78c7d..2558890997e046ba7fd42cbd33e54caf9856e25d 100644 (file)
@@ -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 f2a27ffa3115539c9893fdecf484ba2c8b3077ce..bc121a8ec2abb9bd1564b1a4a23ecdc5bb40502b 100644 (file)
@@ -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)