Fix some issues with formatted_print:

* Add a va_list version which can be correctly used by ivprintf (fixes pycdas output)
* Use a `const char*` format parameter to avoid the need for clang warning workarounds
* Make better use of return values.
This commit is contained in:
Michael Hansen
2023-06-05 13:49:04 -07:00
parent 482c32d84e
commit 8bb8386764
4 changed files with 26 additions and 18 deletions

View File

@@ -1,6 +1,6 @@
#include "data.h"
#include <cstring>
#include <ostream>
#include <cstdarg>
#include <vector>
/* PycData */
@@ -83,20 +83,27 @@ int PycBuffer::getBuffer(int bytes, void* buffer)
return bytes;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wvarargs"
int formatted_print(std::ostream& stream, const std::string& format, ...) {
int formatted_print(std::ostream& stream, const char* format, ...)
{
va_list args;
va_start(args, format);
size_t len = std::vsnprintf(NULL, 0, format.c_str(), args);
int result = formatted_printv(stream, format, args);
va_end(args);
std::vector<char> vec(len + 1);
va_start(args, format);
std::vsnprintf(&vec[0], len + 1, format.c_str(), args);
va_end(args);
stream << &vec[0];
return 0;
return result;
}
int formatted_printv(std::ostream& stream, const char* format, va_list args)
{
va_list saved_args;
va_copy(saved_args, args);
int len = std::vsnprintf(nullptr, 0, format, args);
if (len < 0)
return len;
std::vector<char> vec(static_cast<size_t>(len) + 1);
int written = std::vsnprintf(&vec[0], vec.size(), format, saved_args);
va_end(saved_args);
if (written >= 0)
stream << &vec[0];
return written;
}
#pragma clang diagnostic pop