From 4cc41ea186cb3983466ff6103afa236312ca8ddd Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Sat, 20 Nov 2021 00:40:57 -0800 Subject: [PATCH] Kernel: Add an error propagating KString::format(..) API :^) In the continuous effort of better handling OOM in the kernel, we want to move away from all AK::String usage. One of the final pieces left to accomplish this goal is replacing all of the usages of `String::formatted` with something that can actually propagate failure. The StringBuilder API was enhanced in the recent past to propagate failure and thus a slightly modified version of what exists in `AK::format` will work well for implementing failable format with `KString`. --- Kernel/KString.cpp | 9 +++++++++ Kernel/KString.h | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/Kernel/KString.cpp b/Kernel/KString.cpp index d20fd6e374..dbfad78d4c 100644 --- a/Kernel/KString.cpp +++ b/Kernel/KString.cpp @@ -4,6 +4,8 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include +#include #include extern bool g_in_early_boot; @@ -21,6 +23,13 @@ ErrorOr> KString::try_create(StringView string) return new_string; } +ErrorOr> KString::vformatted(StringView fmtstr, AK::TypeErasedFormatParams& params) +{ + StringBuilder builder; + TRY(AK::vformat(builder, fmtstr, params)); + return try_create(builder.string_view()); +} + NonnullOwnPtr KString::must_create(StringView string) { // We can only enforce success during early boot. diff --git a/Kernel/KString.h b/Kernel/KString.h index e5ec4d0f79..ab4bc16b5d 100644 --- a/Kernel/KString.h +++ b/Kernel/KString.h @@ -21,6 +21,15 @@ public: [[nodiscard]] static ErrorOr> try_create(StringView); [[nodiscard]] static NonnullOwnPtr must_create(StringView); + [[nodiscard]] static ErrorOr> vformatted(StringView fmtstr, AK::TypeErasedFormatParams&); + + template + [[nodiscard]] static ErrorOr> formatted(CheckedFormatString&& fmtstr, const Parameters&... parameters) + { + AK::VariadicFormatParams variadic_format_parameters { parameters... }; + return vformatted(fmtstr.view(), variadic_format_parameters); + } + void operator delete(void*); ErrorOr> try_clone() const;