56 static int vsnprintf(
char* buffer, std::size_t size,
const char* format, va_list args) {
57 if (!buffer || size == 0)
return 0;
60 char*
const buf_end = buffer + size - 1;
61 const char* fmt = format;
63 while (*fmt && buf < buf_end) {
79 while (*fmt && (*fmt >=
'0' && *fmt <=
'9')) {
87 int c = va_arg(args,
int);
88 *buf++ =
static_cast<char>(c);
94 const char* str = va_arg(args,
const char*);
95 if (!str) str =
"(null)";
97 while (*str && buf < buf_end) {
105 int32_t value = va_arg(args, int32_t);
106 buf += formatInteger(buf, buf_end - buf, value, 10,
false);
112 uint32_t value = va_arg(args, uint32_t);
113 buf += formatUnsigned(buf, buf_end - buf, value, 10,
false);
119 uint32_t value = va_arg(args, uint32_t);
120 buf += formatUnsigned(buf, buf_end - buf, value, 16,
false);
126 uint32_t value = va_arg(args, uint32_t);
127 buf += formatUnsigned(buf, buf_end - buf, value, 16,
true);
133 if (buf < buf_end) *buf++ =
'%';
134 if (buf < buf_end) *buf++ = *fmt;
142 return static_cast<int>(buf - buffer);
173 static std::size_t formatInteger(
char* buffer, std::size_t size, int32_t value, uint8_t base,
bool uppercase) {
187 std::size_t len = formatUnsigned(buffer, size,
static_cast<uint32_t
>(value), base, uppercase);
206 static std::size_t formatUnsigned(
char* buffer, std::size_t size, uint32_t value, uint8_t base,
bool uppercase) {