mirror of
https://github.com/RGBCube/serenity
synced 2025-07-28 10:17:34 +00:00
AK: Convert AK::Format formatting helpers to returning ErrorOr<void>
This isn't a complete conversion to ErrorOr<void>, but a good chunk. The end goal here is to propagate buffer allocation failures to the caller, and allow the use of TRY() with formatting functions.
This commit is contained in:
parent
008355c222
commit
216e21a1fa
87 changed files with 450 additions and 448 deletions
115
AK/Format.h
115
AK/Format.h
|
@ -11,6 +11,8 @@
|
|||
#include <AK/AllOf.h>
|
||||
#include <AK/AnyOf.h>
|
||||
#include <AK/Array.h>
|
||||
#include <AK/Error.h>
|
||||
#include <AK/Forward.h>
|
||||
#include <AK/Optional.h>
|
||||
#include <AK/StringView.h>
|
||||
|
||||
|
@ -125,7 +127,7 @@ struct TypeErasedParameter {
|
|||
|
||||
const void* value;
|
||||
Type type;
|
||||
void (*formatter)(TypeErasedFormatParams&, FormatBuilder&, FormatParser&, const void* value);
|
||||
ErrorOr<void> (*formatter)(TypeErasedFormatParams&, FormatBuilder&, FormatParser&, void const* value);
|
||||
};
|
||||
|
||||
class FormatBuilder {
|
||||
|
@ -148,18 +150,18 @@ public:
|
|||
{
|
||||
}
|
||||
|
||||
void put_padding(char fill, size_t amount);
|
||||
ErrorOr<void> put_padding(char fill, size_t amount);
|
||||
|
||||
void put_literal(StringView value);
|
||||
ErrorOr<void> put_literal(StringView value);
|
||||
|
||||
void put_string(
|
||||
ErrorOr<void> put_string(
|
||||
StringView value,
|
||||
Align align = Align::Left,
|
||||
size_t min_width = 0,
|
||||
size_t max_width = NumericLimits<size_t>::max(),
|
||||
char fill = ' ');
|
||||
|
||||
void put_u64(
|
||||
ErrorOr<void> put_u64(
|
||||
u64 value,
|
||||
u8 base = 10,
|
||||
bool prefix = false,
|
||||
|
@ -171,7 +173,7 @@ public:
|
|||
SignMode sign_mode = SignMode::OnlyIfNeeded,
|
||||
bool is_negative = false);
|
||||
|
||||
void put_i64(
|
||||
ErrorOr<void> put_i64(
|
||||
i64 value,
|
||||
u8 base = 10,
|
||||
bool prefix = false,
|
||||
|
@ -183,7 +185,7 @@ public:
|
|||
SignMode sign_mode = SignMode::OnlyIfNeeded);
|
||||
|
||||
#ifndef KERNEL
|
||||
void put_f80(
|
||||
ErrorOr<void> put_f80(
|
||||
long double value,
|
||||
u8 base = 10,
|
||||
bool upper_case = false,
|
||||
|
@ -193,7 +195,7 @@ public:
|
|||
char fill = ' ',
|
||||
SignMode sign_mode = SignMode::OnlyIfNeeded);
|
||||
|
||||
void put_f64(
|
||||
ErrorOr<void> put_f64(
|
||||
double value,
|
||||
u8 base = 10,
|
||||
bool upper_case = false,
|
||||
|
@ -205,7 +207,7 @@ public:
|
|||
SignMode sign_mode = SignMode::OnlyIfNeeded);
|
||||
#endif
|
||||
|
||||
void put_hexdump(
|
||||
ErrorOr<void> put_hexdump(
|
||||
ReadonlyBytes,
|
||||
size_t width,
|
||||
char fill = ' ');
|
||||
|
@ -233,12 +235,12 @@ private:
|
|||
};
|
||||
|
||||
template<typename T>
|
||||
void __format_value(TypeErasedFormatParams& params, FormatBuilder& builder, FormatParser& parser, const void* value)
|
||||
ErrorOr<void> __format_value(TypeErasedFormatParams& params, FormatBuilder& builder, FormatParser& parser, const void* value)
|
||||
{
|
||||
Formatter<T> formatter;
|
||||
|
||||
formatter.parse(params, parser);
|
||||
formatter.format(builder, *static_cast<const T*>(value));
|
||||
return formatter.format(builder, *static_cast<const T*>(value));
|
||||
}
|
||||
|
||||
template<typename... Parameters>
|
||||
|
@ -298,7 +300,7 @@ struct Formatter<T, typename EnableIf<IsIntegral<T>>::Type> : StandardFormatter
|
|||
{
|
||||
}
|
||||
|
||||
void format(FormatBuilder&, T value);
|
||||
ErrorOr<void> format(FormatBuilder&, T);
|
||||
};
|
||||
|
||||
template<>
|
||||
|
@ -309,7 +311,7 @@ struct Formatter<StringView> : StandardFormatter {
|
|||
{
|
||||
}
|
||||
|
||||
void format(FormatBuilder&, StringView value);
|
||||
ErrorOr<void> format(FormatBuilder&, StringView);
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
|
@ -320,12 +322,12 @@ requires(HasFormatter<T>) struct Formatter<Vector<T>> : StandardFormatter {
|
|||
: StandardFormatter(move(formatter))
|
||||
{
|
||||
}
|
||||
void format(FormatBuilder& builder, Vector<T> value)
|
||||
ErrorOr<void> format(FormatBuilder& builder, Vector<T> value)
|
||||
{
|
||||
if (m_mode == Mode::Pointer) {
|
||||
Formatter<FlatPtr> formatter { *this };
|
||||
formatter.format(builder, reinterpret_cast<FlatPtr>(value.data()));
|
||||
return;
|
||||
TRY(formatter.format(builder, reinterpret_cast<FlatPtr>(value.data())));
|
||||
return {};
|
||||
}
|
||||
|
||||
if (m_sign_mode != FormatBuilder::SignMode::Default)
|
||||
|
@ -343,33 +345,34 @@ requires(HasFormatter<T>) struct Formatter<Vector<T>> : StandardFormatter {
|
|||
m_precision = m_precision.value_or(NumericLimits<size_t>::max());
|
||||
|
||||
Formatter<T> content_fmt;
|
||||
builder.put_literal("[ "sv);
|
||||
TRY(builder.put_literal("[ "sv));
|
||||
bool first = true;
|
||||
for (auto& content : value) {
|
||||
if (!first) {
|
||||
builder.put_literal(", "sv);
|
||||
TRY(builder.put_literal(", "sv));
|
||||
content_fmt = Formatter<T> {};
|
||||
}
|
||||
first = false;
|
||||
content_fmt.format(builder, content);
|
||||
TRY(content_fmt.format(builder, content));
|
||||
}
|
||||
builder.put_literal(" ]"sv);
|
||||
TRY(builder.put_literal(" ]"sv));
|
||||
return {};
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct Formatter<ReadonlyBytes> : Formatter<StringView> {
|
||||
void format(FormatBuilder& builder, ReadonlyBytes value)
|
||||
ErrorOr<void> format(FormatBuilder& builder, ReadonlyBytes value)
|
||||
{
|
||||
if (m_mode == Mode::Pointer) {
|
||||
Formatter<FlatPtr> formatter { *this };
|
||||
formatter.format(builder, reinterpret_cast<FlatPtr>(value.data()));
|
||||
} else if (m_mode == Mode::Default || m_mode == Mode::HexDump) {
|
||||
m_mode = Mode::HexDump;
|
||||
Formatter<StringView>::format(builder, value);
|
||||
} else {
|
||||
Formatter<StringView>::format(builder, value);
|
||||
return formatter.format(builder, reinterpret_cast<FlatPtr>(value.data()));
|
||||
}
|
||||
if (m_mode == Mode::Default || m_mode == Mode::HexDump) {
|
||||
m_mode = Mode::HexDump;
|
||||
return Formatter<StringView>::format(builder, value);
|
||||
}
|
||||
return Formatter<StringView>::format(builder, value);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -379,14 +382,13 @@ struct Formatter<Bytes> : Formatter<ReadonlyBytes> {
|
|||
|
||||
template<>
|
||||
struct Formatter<const char*> : Formatter<StringView> {
|
||||
void format(FormatBuilder& builder, const char* value)
|
||||
ErrorOr<void> format(FormatBuilder& builder, const char* value)
|
||||
{
|
||||
if (m_mode == Mode::Pointer) {
|
||||
Formatter<FlatPtr> formatter { *this };
|
||||
formatter.format(builder, reinterpret_cast<FlatPtr>(value));
|
||||
} else {
|
||||
Formatter<StringView>::format(builder, value);
|
||||
return formatter.format(builder, reinterpret_cast<FlatPtr>(value));
|
||||
}
|
||||
return Formatter<StringView>::format(builder, value);
|
||||
}
|
||||
};
|
||||
template<>
|
||||
|
@ -397,14 +399,13 @@ struct Formatter<char[Size]> : Formatter<const char*> {
|
|||
};
|
||||
template<size_t Size>
|
||||
struct Formatter<unsigned char[Size]> : Formatter<StringView> {
|
||||
void format(FormatBuilder& builder, const unsigned char* value)
|
||||
ErrorOr<void> format(FormatBuilder& builder, const unsigned char* value)
|
||||
{
|
||||
if (m_mode == Mode::Pointer) {
|
||||
Formatter<FlatPtr> formatter { *this };
|
||||
formatter.format(builder, reinterpret_cast<FlatPtr>(value));
|
||||
} else {
|
||||
Formatter<StringView>::format(builder, { value, Size });
|
||||
return formatter.format(builder, reinterpret_cast<FlatPtr>(value));
|
||||
}
|
||||
Formatter<StringView>::format(builder, { value, Size });
|
||||
}
|
||||
};
|
||||
template<>
|
||||
|
@ -416,33 +417,33 @@ struct Formatter<FlyString> : Formatter<StringView> {
|
|||
|
||||
template<typename T>
|
||||
struct Formatter<T*> : StandardFormatter {
|
||||
void format(FormatBuilder& builder, T* value)
|
||||
ErrorOr<void> format(FormatBuilder& builder, T* value)
|
||||
{
|
||||
if (m_mode == Mode::Default)
|
||||
m_mode = Mode::Pointer;
|
||||
|
||||
Formatter<FlatPtr> formatter { *this };
|
||||
formatter.format(builder, reinterpret_cast<FlatPtr>(value));
|
||||
return formatter.format(builder, reinterpret_cast<FlatPtr>(value));
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct Formatter<char> : StandardFormatter {
|
||||
void format(FormatBuilder&, char value);
|
||||
ErrorOr<void> format(FormatBuilder&, char);
|
||||
};
|
||||
template<>
|
||||
struct Formatter<wchar_t> : StandardFormatter {
|
||||
void format(FormatBuilder& builder, wchar_t value);
|
||||
ErrorOr<void> format(FormatBuilder& builder, wchar_t);
|
||||
};
|
||||
template<>
|
||||
struct Formatter<bool> : StandardFormatter {
|
||||
void format(FormatBuilder&, bool value);
|
||||
ErrorOr<void> format(FormatBuilder&, bool);
|
||||
};
|
||||
|
||||
#ifndef KERNEL
|
||||
template<>
|
||||
struct Formatter<float> : StandardFormatter {
|
||||
void format(FormatBuilder&, float value);
|
||||
ErrorOr<void> format(FormatBuilder&, float value);
|
||||
};
|
||||
template<>
|
||||
struct Formatter<double> : StandardFormatter {
|
||||
|
@ -452,7 +453,7 @@ struct Formatter<double> : StandardFormatter {
|
|||
{
|
||||
}
|
||||
|
||||
void format(FormatBuilder&, double value);
|
||||
ErrorOr<void> format(FormatBuilder&, double);
|
||||
};
|
||||
|
||||
template<>
|
||||
|
@ -463,13 +464,13 @@ struct Formatter<long double> : StandardFormatter {
|
|||
{
|
||||
}
|
||||
|
||||
void format(FormatBuilder&, long double value);
|
||||
ErrorOr<void> format(FormatBuilder&, long double value);
|
||||
};
|
||||
#endif
|
||||
|
||||
template<>
|
||||
struct Formatter<std::nullptr_t> : Formatter<FlatPtr> {
|
||||
void format(FormatBuilder& builder, std::nullptr_t)
|
||||
ErrorOr<void> format(FormatBuilder& builder, std::nullptr_t)
|
||||
{
|
||||
if (m_mode == Mode::Default)
|
||||
m_mode = Mode::Pointer;
|
||||
|
@ -478,7 +479,7 @@ struct Formatter<std::nullptr_t> : Formatter<FlatPtr> {
|
|||
}
|
||||
};
|
||||
|
||||
void vformat(StringBuilder&, StringView fmtstr, TypeErasedFormatParams&);
|
||||
ErrorOr<void> vformat(StringBuilder&, StringView fmtstr, TypeErasedFormatParams&);
|
||||
|
||||
#ifndef KERNEL
|
||||
void vout(FILE*, StringView fmtstr, TypeErasedFormatParams&, bool newline = false);
|
||||
|
@ -582,16 +583,16 @@ private:
|
|||
};
|
||||
template<typename T, bool Supported = false>
|
||||
struct __FormatIfSupported : Formatter<StringView> {
|
||||
void format(FormatBuilder& builder, const FormatIfSupported<T>&)
|
||||
ErrorOr<void> format(FormatBuilder& builder, FormatIfSupported<T> const&)
|
||||
{
|
||||
Formatter<StringView>::format(builder, "?");
|
||||
return Formatter<StringView>::format(builder, "?");
|
||||
}
|
||||
};
|
||||
template<typename T>
|
||||
struct __FormatIfSupported<T, true> : Formatter<T> {
|
||||
void format(FormatBuilder& builder, const FormatIfSupported<T>& value)
|
||||
ErrorOr<void> format(FormatBuilder& builder, FormatIfSupported<T> const& value)
|
||||
{
|
||||
Formatter<T>::format(builder, value.value());
|
||||
return Formatter<T>::format(builder, value.value());
|
||||
}
|
||||
};
|
||||
template<typename T>
|
||||
|
@ -605,12 +606,22 @@ struct FormatString {
|
|||
template<>
|
||||
struct Formatter<FormatString> : Formatter<StringView> {
|
||||
template<typename... Parameters>
|
||||
void format(FormatBuilder& builder, StringView fmtstr, const Parameters&... parameters)
|
||||
ErrorOr<void> format(FormatBuilder& builder, StringView fmtstr, const Parameters&... parameters)
|
||||
{
|
||||
VariadicFormatParams variadic_format_params { parameters... };
|
||||
vformat(builder, fmtstr, variadic_format_params);
|
||||
return vformat(builder, fmtstr, variadic_format_params);
|
||||
}
|
||||
ErrorOr<void> vformat(FormatBuilder& builder, StringView fmtstr, TypeErasedFormatParams& params);
|
||||
};
|
||||
|
||||
template<>
|
||||
struct Formatter<Error> : Formatter<FormatString> {
|
||||
ErrorOr<void> format(FormatBuilder& builder, Error const& error)
|
||||
{
|
||||
if (error.is_errno())
|
||||
return Formatter<FormatString>::format(builder, "Error(errno={})", error.code());
|
||||
return Formatter<FormatString>::format(builder, "Error({})", error.string_literal());
|
||||
}
|
||||
void vformat(FormatBuilder& builder, StringView fmtstr, TypeErasedFormatParams& params);
|
||||
};
|
||||
|
||||
} // namespace AK
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue