mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-09-29 07:21:20 +00:00
Formatting Library: Implement byte arrays formatting
This commit is contained in:
parent
1f6ca25820
commit
1e9afdc289
@ -173,6 +173,37 @@ void fmt_class_string<std::vector<char8_t>>::format(std::string& out, u64 arg)
|
|||||||
out.append(obj.cbegin(), obj.cend());
|
out.append(obj.cbegin(), obj.cend());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void format_byte_array(std::string& out, const uchar* data, usz size)
|
||||||
|
{
|
||||||
|
if (!size)
|
||||||
|
{
|
||||||
|
out += "{ EMPTY }";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
out += "{ ";
|
||||||
|
|
||||||
|
for (usz i = 0;; i++)
|
||||||
|
{
|
||||||
|
if (i == size - 1)
|
||||||
|
{
|
||||||
|
fmt::append(out, "%02X", data[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i % 4)
|
||||||
|
{
|
||||||
|
// Place a comma each 4 bytes for ease of byte placement finding
|
||||||
|
fmt::append(out, "%02X ", data[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt::append(out, "%02X, ", data[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
out += " }";
|
||||||
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
void fmt_class_string<char>::format(std::string& out, u64 arg)
|
void fmt_class_string<char>::format(std::string& out, u64 arg)
|
||||||
{
|
{
|
||||||
|
@ -86,7 +86,13 @@ struct fmt_unveil<T*, void>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, usz N>
|
namespace fmt
|
||||||
|
{
|
||||||
|
template <typename T>
|
||||||
|
concept CharT = (std::is_same_v<const T, const char> || std::is_same_v<const T, const char8_t>);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <fmt::CharT T, usz N>
|
||||||
struct fmt_unveil<T[N], void>
|
struct fmt_unveil<T[N], void>
|
||||||
{
|
{
|
||||||
using type = std::add_const_t<T>*;
|
using type = std::add_const_t<T>*;
|
||||||
@ -215,6 +221,30 @@ struct fmt_class_string<char8_t*, void> : fmt_class_string<const char8_t*>
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace fmt
|
||||||
|
{
|
||||||
|
// Both uchar and std::byte are allowed
|
||||||
|
template <typename T>
|
||||||
|
concept ByteArray = requires (T& t) { static_cast<const std::conditional_t<std::is_same_v<decltype(std::as_const(t[0])), const std::byte&>, std::byte, uchar>&>(std::data(t)[0]); };
|
||||||
|
}
|
||||||
|
|
||||||
|
template <fmt::ByteArray T>
|
||||||
|
struct fmt_class_string<T, void>
|
||||||
|
{
|
||||||
|
static FORCE_INLINE SAFE_BUFFERS(const T&) get_object(u64 arg)
|
||||||
|
{
|
||||||
|
return *reinterpret_cast<const T*>(static_cast<uptr>(arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void format(std::string& out, u64 arg)
|
||||||
|
{
|
||||||
|
const auto& obj = get_object(arg);
|
||||||
|
|
||||||
|
void format_byte_array(std::string&, const uchar*, usz);
|
||||||
|
format_byte_array(out, reinterpret_cast<const uchar*>(std::data(obj)), std::size(obj));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct fmt_type_info
|
struct fmt_type_info
|
||||||
{
|
{
|
||||||
decltype(&fmt_class_string<int>::format) fmt_string;
|
decltype(&fmt_class_string<int>::format) fmt_string;
|
||||||
|
@ -160,21 +160,7 @@ void fmt_class_string<SceNpCommunicationSignature>::format(std::string& out, u64
|
|||||||
{
|
{
|
||||||
const auto& sign = get_object(arg);
|
const auto& sign = get_object(arg);
|
||||||
|
|
||||||
// Format as a C byte array for ease of use
|
fmt::append(out, "%s", sign.data);
|
||||||
fmt::append(out, "{ ");
|
|
||||||
|
|
||||||
for (usz i = 0;; i++)
|
|
||||||
{
|
|
||||||
if (i == std::size(sign.data) - 1)
|
|
||||||
{
|
|
||||||
fmt::append(out, "0x%02X", sign.data[i]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt::append(out, "0x%02X, ", sign.data[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt::append(out, " }");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helpers
|
// Helpers
|
||||||
|
Loading…
Reference in New Issue
Block a user