format utility improvements
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
|
||||
// Copied from simdjson
|
||||
namespace {
|
||||
@@ -980,30 +982,25 @@ std::string_view format(ArenaAllocator &arena, const char *fmt, ...) {
|
||||
static_cast<std::size_t>(bytes_written));
|
||||
}
|
||||
|
||||
// Fallback: Two-pass approach when speculative formatting fails
|
||||
va_list args_fallback;
|
||||
va_start(args_fallback, fmt);
|
||||
const int required_size = std::vsnprintf(nullptr, 0, fmt, args_fallback);
|
||||
va_end(args_fallback);
|
||||
|
||||
if (required_size < 0) {
|
||||
// Handle formatting error by returning empty string_view
|
||||
return std::string_view{};
|
||||
// Fallback: vsnprintf failed or didn't fit, use two-pass approach
|
||||
if (bytes_written < 0) {
|
||||
std::fprintf(stderr, "vsnprintf failed in format()\n");
|
||||
std::abort();
|
||||
}
|
||||
|
||||
// Allocate exact buffer size needed (+1 for null terminator)
|
||||
const int buffer_size = required_size + 1;
|
||||
// We know bytes_written is the required size
|
||||
const int buffer_size = bytes_written + 1;
|
||||
char *result = arena.allocate<char>(static_cast<uint32_t>(buffer_size));
|
||||
|
||||
// Format into the exact-sized buffer
|
||||
va_start(args_fallback, fmt);
|
||||
const int actual_size = std::vsnprintf(
|
||||
result, static_cast<std::size_t>(buffer_size), fmt, args_fallback);
|
||||
va_end(args_fallback);
|
||||
va_start(args, fmt);
|
||||
const int actual_size =
|
||||
std::vsnprintf(result, static_cast<std::size_t>(buffer_size), fmt, args);
|
||||
va_end(args);
|
||||
|
||||
if (actual_size < 0 || actual_size >= buffer_size) {
|
||||
// Handle formatting error
|
||||
return std::string_view{};
|
||||
std::fprintf(stderr, "vsnprintf failed in format() fallback\n");
|
||||
std::abort();
|
||||
}
|
||||
|
||||
// Shrink to exclude null terminator for string_view
|
||||
|
||||
Reference in New Issue
Block a user