Piotr Caban : msvcrt: Fixed printf behaviour on hexadecimal, zero-padded numbers.

Alexandre Julliard julliard at winehq.org
Tue Mar 13 13:50:34 CDT 2012


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Mar 12 19:49:11 2012 +0100

msvcrt: Fixed printf behaviour on hexadecimal, zero-padded numbers.

---

 dlls/msvcrt/printf.h       |    8 +++++++-
 dlls/msvcrt/tests/printf.c |   16 ++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletions(-)

diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h
index 5c49739..b1cb53f 100644
--- a/dlls/msvcrt/printf.h
+++ b/dlls/msvcrt/printf.h
@@ -508,8 +508,14 @@ int FUNC_NAME(pf_printf)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ctx, const API
             i = 0;
         } else if(flags.Format && strchr("diouxX", flags.Format)) {
             APICHAR *tmp = buf;
-            int max_len = (flags.FieldLength>flags.Precision ? flags.FieldLength : flags.Precision) + 10;
+            int max_len;
+
+            /* 0 padding is added after '0x' in Alternate flag is in use */
+            if((flags.Format=='x' || flags.Format=='X') && flags.PadZero && flags.Alternate
+                    && !flags.LeftAlign && flags.Precision<flags.FieldLength-2)
+                flags.Precision = flags.FieldLength - 2;
 
+            max_len = (flags.FieldLength>flags.Precision ? flags.FieldLength : flags.Precision) + 10;
             if(max_len > sizeof(buf)/sizeof(APICHAR))
                 tmp = HeapAlloc(GetProcessHeap(), 0, max_len);
             if(!tmp)
diff --git a/dlls/msvcrt/tests/printf.c b/dlls/msvcrt/tests/printf.c
index 978b512..ff86516 100644
--- a/dlls/msvcrt/tests/printf.c
+++ b/dlls/msvcrt/tests/printf.c
@@ -323,6 +323,22 @@ static void test_sprintf( void )
     ok(!strcmp(buffer,"1   "),"Character zero-padded and/or not left-adjusted \"%s\"\n",buffer);
     ok( r==4, "return count wrong\n");
 
+    format = "%#012x";
+    r = sprintf(buffer,format,1);
+    ok(!strcmp(buffer,"0x0000000001"),"Hexadecimal zero-padded \"%s\"\n",buffer);
+
+    format = "%#04.8x";
+    r = sprintf(buffer,format,1);
+    ok(!strcmp(buffer,"0x00000001"), "Hexadecimal zero-padded precision \"%s\"\n",buffer);
+
+    format = "%#-08.2x";
+    r = sprintf(buffer,format,1);
+    ok(!strcmp(buffer,"0x01    "), "Hexadecimal zero-padded not left-adjusted \"%s\"\n",buffer);
+
+    format = "%#08o";
+    r = sprintf(buffer,format,1);
+    ok(!strcmp(buffer,"00000001"), "Octal zero-padded \"%s\"\n",buffer);
+
     if (sizeof(void *) == 8)
     {
         format = "%p";




More information about the wine-cvs mailing list