Eric Pouech : msvcrt: Support I width modifier in *scanf* family.

Alexandre Julliard julliard at winehq.org
Wed Oct 20 15:58:41 CDT 2021


Module: wine
Branch: master
Commit: 74a42c54019f28c1facc2fd8009fc0533db68207
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=74a42c54019f28c1facc2fd8009fc0533db68207

Author: Eric Pouech <eric.pouech at gmail.com>
Date:   Wed Oct 20 13:39:02 2021 +0200

msvcrt: Support I width modifier in *scanf* family.

Despite what msdn states, I and I32 are supported width modifiers.

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/scanf.h         | 10 ++++++++--
 dlls/ucrtbase/tests/scanf.c | 25 +++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h
index 3ab2efef13d..02284379854 100644
--- a/dlls/msvcrt/scanf.h
+++ b/dlls/msvcrt/scanf.h
@@ -279,13 +279,19 @@ _FUNCTION_ {
 			*(format + 2) == '4') {
 			I64_prefix = 1;
 			format += 2;
+			break;
 		    }
-		    break;
+		    else if (*(format + 1) == '3' &&
+			     *(format + 2) == '2') {
+			format += 2;
+			break;
+		    }
+		    /* fall through */
 #if _MSVCR_VER == 0 || _MSVCR_VER >= 140
                 case 'z':
+#endif
                     if (sizeof(void *) == sizeof(LONGLONG)) I64_prefix = 1;
                     break;
-#endif
 		default:
 		    prefix_finished = 1;
 		}
diff --git a/dlls/ucrtbase/tests/scanf.c b/dlls/ucrtbase/tests/scanf.c
index 3d77746d23b..12a08864642 100644
--- a/dlls/ucrtbase/tests/scanf.c
+++ b/dlls/ucrtbase/tests/scanf.c
@@ -43,6 +43,7 @@ static void test_sscanf(void)
     char buffer[100], buffer1[100];
     int result, ret, hour, min, count;
     LONGLONG result64;
+    DWORD_PTR result_ptr;
     char c;
     void *ptr;
     float ret_float1, ret_float2;
@@ -296,6 +297,30 @@ static void test_sscanf(void)
         ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
         ok(ret_size == 1, "got wrong size_t %s for flags %#x\n",
                 wine_dbgstr_longlong((LONGLONG)ret_size), tests[i]);
+
+        result64 = 0;
+        ret = vsscanf_wrapper(tests[i], "12345678901234", -1, "%I64d", &result64);
+        ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+        ok(result64 == 12345678901234ll, "got wrong number 0x%s for flags %#x\n",
+                wine_dbgstr_longlong(result64), tests[i]);
+
+        result = 0;
+        ret = vsscanf_wrapper(tests[i], "12345678901234", -1, "%I32d", &result);
+        ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+        ok(result == (int)12345678901234ll, /* this is always truncated to 32bit */
+           "got wrong number 0x%d for flags %#x\n", result, tests[i]);
+
+        result_ptr = 0;
+        ret = vsscanf_wrapper(tests[i], "0x87654321", -1, "%Ix", &result_ptr);
+        ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+        ok(result_ptr == 0x87654321,
+           "got wrong number %Ix for flags %#x\n", result_ptr, tests[i]);
+
+        result_ptr = 0;
+        ret = vsscanf_wrapper(tests[i], "0x123456789", -1, "%Ix", &result_ptr);
+        ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+        ok(result_ptr == (DWORD_PTR)0x123456789ull, /* this is truncated on 32bit systems */
+           "got wrong number %Ix for flags %#x\n", result_ptr, tests[i]);
     }
 }
 




More information about the wine-cvs mailing list