From: Piotr Caban Subject: msvcrt: Fixed printf behaviour on hexadecimal, zero-padded numbers Message-Id: <4F5DF28E.6000508@codeweavers.com> Date: Mon, 12 Mar 2012 13:56:46 +0100 --- dlls/msvcrt/printf.h | 6 +++++- dlls/msvcrt/tests/printf.c | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletions(-) diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h index 5c49739..bba14f7 100644 --- a/dlls/msvcrt/printf.h +++ b/dlls/msvcrt/printf.h @@ -508,8 +508,12 @@ 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; + + if((flags.Format=='x' || flags.Format=='X') && flags.PadZero && !flags.LeftAlign) + 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..1b15644 100644 --- a/dlls/msvcrt/tests/printf.c +++ b/dlls/msvcrt/tests/printf.c @@ -323,6 +323,18 @@ 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 = "%#-08x"; + r = sprintf(buffer,format,1); + ok(!strcmp(buffer,"0x1 "), "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";