From 168265ebb00a6f94d129b64112d071edff80a83d Mon Sep 17 00:00:00 2001
From: Francois Gouget <fgouget@codeweavers.com>
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 dbd08fd7c7c..2558890997e 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 f2a27ffa311..bc121a8ec2a 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)
-- 
GitLab