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

3
data.h
View File

@@ -57,6 +57,7 @@ private:
int m_size, m_pos;
};
int formatted_print(std::ostream& stream, const std::string& format, ...);
int formatted_print(std::ostream& stream, const char* format, ...);
int formatted_printv(std::ostream& stream, const char* format, va_list args);
#endif

View File

@@ -2,7 +2,6 @@
#include "pyc_module.h"
#include "data.h"
#include <stdexcept>
#include <ostream>
static bool check_ascii(const std::string& data)
{

View File

@@ -58,11 +58,12 @@ static void iputs(std::ostream& pyc_output, int indent, const char* text)
pyc_output << text;
}
static void ivprintf(std::ostream& pyc_output, int indent, const char* fmt, va_list varargs)
static void ivprintf(std::ostream& pyc_output, int indent, const char* fmt,
va_list varargs)
{
for (int i=0; i<indent; i++)
pyc_output << " ";
formatted_print(pyc_output, fmt, varargs);
formatted_printv(pyc_output, fmt, varargs);
}
static void iprintf(std::ostream& pyc_output, int indent, const char* fmt, ...)