Piotr Caban : msvcrt: Added more length modifiers in scanf function.

Alexandre Julliard julliard at winehq.org
Mon Apr 16 13:35:47 CDT 2012


Module: wine
Branch: master
Commit: 7240170ceedecef6aac674e795fdc4e1a74e131a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7240170ceedecef6aac674e795fdc4e1a74e131a

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Apr 16 16:32:57 2012 +0200

msvcrt: Added more length modifiers in scanf function.

---

 dlls/msvcrt/scanf.h       |   12 +++++++++---
 dlls/msvcrt/tests/scanf.c |   20 ++++++++++++++++++++
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h
index 9f6911e..cc2b861 100644
--- a/dlls/msvcrt/scanf.h
+++ b/dlls/msvcrt/scanf.h
@@ -198,8 +198,14 @@ _FUNCTION_ {
 	    /* read prefix (if any) */
 	    while (!prefix_finished) {
 		switch(*format) {
-		case 'h': h_prefix = 1; break;
-		case 'l': l_prefix = 1; break;
+		case 'h': h_prefix++; break;
+		case 'l':
+                    if(*(format+1) == 'l') {
+                        I64_prefix = 1;
+                        format++;
+                    }
+                    l_prefix = 1;
+                    break;
 		case 'w': w_prefix = 1; break;
 		case 'L': L_prefix = 1; break;
 		case 'I':
@@ -294,7 +300,7 @@ _FUNCTION_ {
 #define _SET_NUMBER_(type) *va_arg(ap, type*) = negative ? -cur : cur
 			if (I64_prefix) _SET_NUMBER_(LONGLONG);
 			else if (l_prefix) _SET_NUMBER_(LONG);
-			else if (h_prefix) _SET_NUMBER_(short int);
+			else if (h_prefix == 1) _SET_NUMBER_(short int);
 			else _SET_NUMBER_(int);
 		    }
                 }
diff --git a/dlls/msvcrt/tests/scanf.c b/dlls/msvcrt/tests/scanf.c
index 8b13bdc..fb9d8e8 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;
+    LONGLONG result64;
     char c;
     void *ptr;
     float res1= -82.6267f, res2= 27.76f, res11, res12;
@@ -125,6 +126,25 @@ static void test_sscanf( void )
     ok(ret == 0 , "problem with format arg \"%%*c%%n\"\n");
     ok(number_so_far == 1,"Read wrong arg for \"%%n\" %d instead of 2\n",number_so_far);
 
+    result = 0xdeadbeef;
+    strcpy(buffer,"12345678");
+    ret = sscanf(buffer, "%hd", &result);
+    ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
+    ok(result == 0xdead614e, "Wrong number read (%x)\n", result);
+
+    result = 0xdeadbeef;
+    ret = sscanf(buffer, "%hhd", &result);
+    ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
+    ok(result == 0xbc614e, "Wrong number read (%x)\n", result);
+
+    strcpy(buffer,"12345678901234");
+    ret = sscanf(buffer, "%lld", &result64);
+    ok(ret == 1, "Wrong number of arguments read: %d\n", ret);
+    ret = sprintf(buffer1, "%lld", result64);
+    ok(ret==14 || broken(ret==10), "sprintf retuned %d\n", ret);
+    if(ret == 14)
+        ok(!strcmp(buffer, buffer1), "got %s, expected %s\n", buffer1, buffer);
+
     /* Check %i according to bug 1878 */
     strcpy(buffer,"123");
     ret = sscanf(buffer, "%i", &result);




More information about the wine-cvs mailing list