diff --git a/AK/Format.cpp b/AK/Format.cpp index 9868a559b2..18a3819c25 100644 --- a/AK/Format.cpp +++ b/AK/Format.cpp @@ -142,6 +142,12 @@ void vformat(StringBuilder& builder, StringView fmtstr, AK::Span parameters) +{ + StringBuilder builder; + vformat(builder, fmtstr, parameters); + stream << builder.to_string(); +} bool Formatter::parse(StringView flags) { diff --git a/AK/Format.h b/AK/Format.h index 0d9ba16349..8646915da0 100644 --- a/AK/Format.h +++ b/AK/Format.h @@ -92,5 +92,6 @@ Array make_type_erased_parameters(co } void vformat(StringBuilder& builder, StringView fmtstr, Span, size_t argument_index = 0); +void vformat(const LogStream& stream, StringView fmtstr, Span); } // namespace AK diff --git a/AK/LogStream.h b/AK/LogStream.h index cfe88f1d14..5cbafccadf 100644 --- a/AK/LogStream.h +++ b/AK/LogStream.h @@ -26,6 +26,7 @@ #pragma once +#include #include #include #include @@ -206,13 +207,38 @@ DebugLogStream klog(); void dump_bytes(ReadonlyBytes); +#ifndef KERNEL +template +void outf(StringView fmtstr, const Parameters&... parameters) +{ + const auto type_erased_parameters = make_type_erased_parameters(parameters...); + vformat(out(), fmtstr, type_erased_parameters); +} +template +void warnf(StringView fmtstr, const Parameters&... parameters) +{ + const auto type_erased_parameters = make_type_erased_parameters(parameters...); + vformat(warn(), fmtstr, type_erased_parameters); +} +#endif + +template +void dbgf(StringView fmtstr, const Parameters&... parameters) +{ + const auto type_erased_parameters = make_type_erased_parameters(parameters...); + vformat(dbg(), fmtstr, type_erased_parameters); +} + } using AK::dbg; +using AK::dbgf; using AK::klog; using AK::LogStream; #if !defined(KERNEL) using AK::out; +using AK::outf; using AK::warn; +using AK::warnf; #endif