Skip to content

Commit

Permalink
Fix some issues with formatted_print:
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
zrax committed Jun 5, 2023
1 parent 482c32d commit 8bb8386
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 18 deletions.
35 changes: 21 additions & 14 deletions data.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include "data.h"
#include <cstring>
#include <ostream>
#include <cstdarg>
#include <vector>

/* PycData */
Expand Down Expand Up @@ -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);
va_end(args);
std::vector<char> vec(len + 1);
va_start(args, format);
std::vsnprintf(&vec[0], len + 1, format.c_str(), args);
int result = formatted_printv(stream, format, 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 changes: 2 additions & 1 deletion data.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class PycBuffer : public PycData {
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
1 change: 0 additions & 1 deletion pyc_string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#include "pyc_module.h"
#include "data.h"
#include <stdexcept>
#include <ostream>

static bool check_ascii(const std::string& data)
{
Expand Down
5 changes: 3 additions & 2 deletions pycdas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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, ...)
Expand Down

0 comments on commit 8bb8386

Please sign in to comment.