diff --git a/AK/PrintfImplementation.h b/AK/PrintfImplementation.h index b67cdeab6a..fc46f472d5 100644 --- a/AK/PrintfImplementation.h +++ b/AK/PrintfImplementation.h @@ -353,10 +353,15 @@ struct PrintfImpl { } ALWAYS_INLINE int format_d(ModifierState const& state, ArgumentListRefT ap) const { - if (state.long_qualifiers >= 2) - return print_signed_number(m_putch, m_bufptr, NextArgument()(ap), state.always_sign, state.left_pad, state.zero_pad, state.field_width, state.has_precision, state.precision); + i64 number = [&]() -> i64 { + if (state.long_qualifiers >= 2) + return NextArgument()(ap); + if (state.long_qualifiers == 1) + return NextArgument()(ap); + return NextArgument()(ap); + }(); - return print_signed_number(m_putch, m_bufptr, NextArgument()(ap), state.always_sign, state.left_pad, state.zero_pad, state.field_width, state.has_precision, state.precision); + return print_signed_number(m_putch, m_bufptr, number, state.always_sign, state.left_pad, state.zero_pad, state.field_width, state.has_precision, state.precision); } ALWAYS_INLINE int format_i(ModifierState const& state, ArgumentListRefT ap) const { @@ -364,9 +369,15 @@ struct PrintfImpl { } ALWAYS_INLINE int format_u(ModifierState const& state, ArgumentListRefT ap) const { - if (state.long_qualifiers >= 2) - return print_decimal(m_putch, m_bufptr, NextArgument()(ap), false, false, state.left_pad, state.zero_pad, state.field_width, state.has_precision, state.precision); - return print_decimal(m_putch, m_bufptr, NextArgument()(ap), false, false, state.left_pad, state.zero_pad, state.field_width, state.has_precision, state.precision); + u64 number = [&]() -> u64 { + if (state.long_qualifiers >= 2) + return NextArgument()(ap); + if (state.long_qualifiers == 1) + return NextArgument()(ap); + return NextArgument()(ap); + }(); + + return print_decimal(m_putch, m_bufptr, number, false, false, state.left_pad, state.zero_pad, state.field_width, state.has_precision, state.precision); } ALWAYS_INLINE int format_Q(ModifierState const& state, ArgumentListRefT ap) const { @@ -390,9 +401,15 @@ struct PrintfImpl { } ALWAYS_INLINE int format_unsigned_hex(ModifierState const& state, ArgumentListRefT ap, bool uppercase) const { - if (state.long_qualifiers >= 2) - return print_hex(m_putch, m_bufptr, NextArgument()(ap), uppercase, state.alternate_form, state.left_pad, state.zero_pad, state.field_width, state.has_precision, state.precision); - return print_hex(m_putch, m_bufptr, NextArgument()(ap), uppercase, state.alternate_form, state.left_pad, state.zero_pad, state.field_width, state.has_precision, state.precision); + u64 number = [&]() -> u64 { + if (state.long_qualifiers >= 2) + return NextArgument()(ap); + if (state.long_qualifiers == 1) + return NextArgument()(ap); + return NextArgument()(ap); + }(); + + return print_hex(m_putch, m_bufptr, number, uppercase, state.alternate_form, state.left_pad, state.zero_pad, state.field_width, state.has_precision, state.precision); } ALWAYS_INLINE int format_x(ModifierState const& state, ArgumentListRefT ap) const { diff --git a/Userland/Utilities/printf.cpp b/Userland/Utilities/printf.cpp index ec1bbf9098..2210d44ca8 100644 --- a/Userland/Utilities/printf.cpp +++ b/Userland/Utilities/printf.cpp @@ -156,8 +156,21 @@ struct ArgvNextArgument { }; template -struct ArgvNextArgument { - ALWAYS_INLINE i64 operator()(V arg) const +struct ArgvNextArgument { + ALWAYS_INLINE long int operator()(V arg) const + { + if (arg.argc == 0) + return 0; + + auto result = *arg.argv++; + --arg.argc; + return strtol(result, nullptr, 10); + } +}; + +template +struct ArgvNextArgument { + ALWAYS_INLINE long long int operator()(V arg) const { if (arg.argc == 0) return 0; @@ -169,8 +182,21 @@ struct ArgvNextArgument { }; template -struct ArgvNextArgument { - ALWAYS_INLINE u64 operator()(V arg) const +struct ArgvNextArgument { + ALWAYS_INLINE unsigned long int operator()(V arg) const + { + if (arg.argc == 0) + return 0; + + auto result = *arg.argv++; + --arg.argc; + return strtoul(result, nullptr, 10); + } +}; + +template +struct ArgvNextArgument { + ALWAYS_INLINE unsigned long long int operator()(V arg) const { if (arg.argc == 0) return 0;