Program Listing for File FLAMEGPUException.cpp
↰ Return to documentation for file (src/flamegpu/exception/FLAMEGPUException.cpp
)
#include "flamegpu/exception/FLAMEGPUException.h"
#include <cstdio>
#include <cstring>
#include <sstream>
#include <limits>
#include <string>
namespace flamegpu {
namespace exception {
const char * FLAMEGPUException::file = nullptr;
unsigned int FLAMEGPUException::line = std::numeric_limits<unsigned int>::max();
FLAMEGPUException::FLAMEGPUException()
: err_message("") {
if (file) {
std::stringstream ss;
ss << file << "(" << line << "): ";
err_message.append(ss.str());
file = nullptr;
}
}
const char * FLAMEGPUException::what() const noexcept {
return err_message.c_str();
}
void FLAMEGPUException::setLocation(const char *_file, const unsigned int _line) {
file = _file;
line = _line;
}
std::string FLAMEGPUException::parseArgs(const char * format, va_list argp) {
std::string rtn = format;
// Create a copy of the va_list, as vsnprintf can invalidate elements of argp and find the required buffer length
va_list argpCopy;
va_copy(argpCopy, argp);
const int buffLen = vsnprintf(nullptr, 0, format, argpCopy) + 1;
va_end(argpCopy);
char *buffer = reinterpret_cast<char *>(malloc(buffLen * sizeof(char)));
// Populate the buffer with the original va_list
int ct = vsnprintf(buffer, buffLen, format, argp);
if (ct >= 0) {
// Success!
buffer[buffLen - 1] = '\0';
rtn = std::string(buffer);
}
free(buffer);
return rtn;
}
} // namespace exception
} // namespace flamegpu