[PATCH] msvcrt: support I width modifier in *scanf* family

Eric Pouech eric.pouech at gmail.com
Tue Oct 19 08:22:32 CDT 2021


Signed-off-by: Eric Pouech <eric.pouech at gmail.com>

---
 dlls/msvcrt/scanf.h       |    4 ++--
 dlls/msvcrt/tests/scanf.c |   26 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h
index 3ab2efef13d..c4697da0c44 100644
--- a/dlls/msvcrt/scanf.h
+++ b/dlls/msvcrt/scanf.h
@@ -280,12 +280,12 @@ _FUNCTION_ {
 			I64_prefix = 1;
 			format += 2;
 		    }
-		    break;
+		    /* fall through */
 #if _MSVCR_VER == 0 || _MSVCR_VER >= 140
                 case 'z':
                     if (sizeof(void *) == sizeof(LONGLONG)) I64_prefix = 1;
-                    break;
 #endif
+                    break;
 		default:
 		    prefix_finished = 1;
 		}
diff --git a/dlls/msvcrt/tests/scanf.c b/dlls/msvcrt/tests/scanf.c
index e175342796b..ea897c3e09a 100644
--- a/dlls/msvcrt/tests/scanf.c
+++ b/dlls/msvcrt/tests/scanf.c
@@ -74,6 +74,7 @@ static void test_sscanf( void )
     int hour=21,min=59,sec=20;
     int  number,number_so_far;
     HMODULE hmod = GetModuleHandleA("msvcrt.dll");
+    DWORD_PTR result_ptr;
 
     p_sprintf = (void *)GetProcAddress( hmod, "sprintf" );
     p_sscanf = (void *)GetProcAddress( hmod, "sscanf" );
@@ -264,6 +265,31 @@ static void test_sscanf( void )
     if(ret == 14)
         ok(!strcmp(buffer, buffer1), "got %s, expected %s\n", buffer1, buffer);
 
+    strcpy(buffer,"12345678901234");
+    ret = p_sscanf(buffer, "%I64d", &result64);
+    ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
+    ret = p_sprintf(buffer1, "%I64d", result64);
+    ok(ret==14 || broken(ret==10), "sprintf returned %d\n", ret);
+    if(ret == 14)
+        ok(!strcmp(buffer, buffer1), "got %s, expected %s\n", buffer1, buffer);
+
+    strcpy(buffer,"0x123456789");
+    ret = p_sscanf(buffer, "%Ix", &result_ptr);
+    ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
+    ret = p_sprintf(buffer1, "%#Ix", result_ptr);
+    if (sizeof(void*) == sizeof(LONGLONG))
+    {
+        ok(ret==11, "sprintf returned %d\n", ret);
+        if(ret == 11)
+            ok(!strcmp(buffer, buffer1), "got %s, expected %s\n", buffer1, buffer);
+    }
+    else
+    {
+        ok(ret==10, "sprintf returned %d\n", ret);
+        if(ret == 10)
+            ok(!strcmp("0x23456789", buffer1), "got %s, expected %s\n", buffer1, buffer);
+    }
+
     /* Check %i according to bug 1878 */
     strcpy(buffer,"123");
     ret = p_sscanf(buffer, "%i", &result);




More information about the wine-devel mailing list