Piotr Caban : msvcrt: Support mixing length and width in scanf format.

Alexandre Julliard julliard at winehq.org
Fri Dec 6 16:06:39 CST 2019


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Dec  6 15:57:09 2019 +0100

msvcrt: Support mixing length and width in scanf format.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45967
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/scanf.h       | 13 +++++++------
 dlls/msvcrt/tests/scanf.c | 24 ++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h
index de2a2af975..da65bf8a6b 100644
--- a/dlls/msvcrt/scanf.h
+++ b/dlls/msvcrt/scanf.h
@@ -197,14 +197,14 @@ _FUNCTION_ {
 		format++;
 		suppress=1;
 	    }
-	    /* look for width specification */
-	    while (_ISDIGIT_(*format)) {
-		width*=10;
-		width+=*format++ - '0';
-	    }
-	    if (width==0) width=-1; /* no width spec seen */
 	    /* read prefix (if any) */
 	    while (!prefix_finished) {
+                /* look for width specification */
+                while (_ISDIGIT_(*format)) {
+                    width *= 10;
+                    width += *format++ - '0';
+                }
+
 		switch(*format) {
 		case 'h': h_prefix++; break;
 		case 'l':
@@ -228,6 +228,7 @@ _FUNCTION_ {
 		}
 		if (!prefix_finished) format++;
 	    }
+	    if (width==0) width=-1; /* no width spec seen */
 	    /* read type */
             switch(*format) {
 	    case 'p':
diff --git a/dlls/msvcrt/tests/scanf.c b/dlls/msvcrt/tests/scanf.c
index 5db9d43935..95fd043e6f 100644
--- a/dlls/msvcrt/tests/scanf.c
+++ b/dlls/msvcrt/tests/scanf.c
@@ -205,6 +205,30 @@ static void test_sscanf( void )
     ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
     ok(result == 0xdead614e, "Wrong number read (%x)\n", result);
 
+    result = 0xdeadbeef;
+    strcpy(buffer,"12345678");
+    ret = p_sscanf(buffer, "%02hd", &result);
+    ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
+    ok(result == 0xdead000c, "Wrong number read (%x)\n", result);
+
+    result = 0xdeadbeef;
+    strcpy(buffer,"12345678");
+    ret = p_sscanf(buffer, "%h02d", &result);
+    ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
+    ok(result == 0xdead000c, "Wrong number read (%x)\n", result);
+
+    result = 0xdeadbeef;
+    strcpy(buffer,"12345678");
+    ret = p_sscanf(buffer, "%000h02d", &result);
+    ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
+    ok(result == 0xdead000c, "Wrong number read (%x)\n", result);
+
+    result = 0xdeadbeef;
+    strcpy(buffer,"12345678");
+    ret = p_sscanf(buffer, "%2h0d", &result);
+    ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
+    ok(result == 0xdead614e, "Wrong number read (%x)\n", result);
+
     result = 0xdeadbeef;
     ret = p_sscanf(buffer, "%hhd", &result);
     ok(ret == 1, "Wrong number of arguments read: %d\n", ret);




More information about the wine-cvs mailing list