diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h index a60ba749110..79a03a96470 100644 --- a/dlls/msvcrt/printf.h +++ b/dlls/msvcrt/printf.h @@ -525,11 +525,13 @@ int FUNC_NAME(pf_printf)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ctx, const API FUNC_NAME(pf_integer_conv)(tmp, max_len, &flags, pf_args(args_ctx, pos, VT_I8, valist).get_longlong); else if(flags.Format=='d' || flags.Format=='i') - FUNC_NAME(pf_integer_conv)(tmp, max_len, &flags, pf_args(args_ctx, pos, - VT_INT, valist).get_int); + FUNC_NAME(pf_integer_conv)(tmp, max_len, &flags, flags.IntegerLength!='h' ? + pf_args(args_ctx, pos, VT_INT, valist).get_int : + (short)pf_args(args_ctx, pos, VT_INT, valist).get_int); else - FUNC_NAME(pf_integer_conv)(tmp, max_len, &flags, (unsigned)pf_args( - args_ctx, pos, VT_INT, valist).get_int); + FUNC_NAME(pf_integer_conv)(tmp, max_len, &flags, flags.IntegerLength!='h' ? + (unsigned)pf_args(args_ctx, pos, VT_INT, valist).get_int : + (unsigned short)pf_args(args_ctx, pos, VT_INT, valist).get_int); #ifdef PRINTF_WIDE i = FUNC_NAME(pf_output_format_wstr)(pf_puts, puts_ctx, tmp, -1, &flags, locinfo); diff --git a/dlls/msvcrt/tests/printf.c b/dlls/msvcrt/tests/printf.c index ff86516b12a..1507a0185d1 100644 --- a/dlls/msvcrt/tests/printf.c +++ b/dlls/msvcrt/tests/printf.c @@ -607,6 +607,16 @@ static void test_sprintf( void ) r = sprintf(buffer, format); ok(!strcmp(buffer,"%0"), "failed: \"%s\"\n", buffer); ok( r==2, "return count wrong\n"); + + format = "%hx"; + r = sprintf(buffer, format, 0x12345); + ok(!strcmp(buffer,"2345"), "failed \"%s\"\n", buffer); + + format = "%hhx"; + r = sprintf(buffer, format, 0x123); + ok(!strcmp(buffer,"123"), "failed: \"%s\"\n", buffer); + r = sprintf(buffer, format, 0x12345); + ok(!strcmp(buffer,"2345"), "failed \"%s\"\n", buffer); } static void test_swprintf( void )