Move strprintf to Standard

strprintf works like asprintf, except it returns a std::string.
alut-include-path
Nicolas Hake 2017-03-11 20:04:20 +01:00
parent f9d78b8629
commit c5ed6e7dc8
3 changed files with 29 additions and 25 deletions

View File

@ -798,3 +798,28 @@ int GetCharacterCount(const char * s)
}
return l;
}
std::string vstrprintf(const char *format, va_list args)
{
va_list argcopy;
va_copy(argcopy, args);
int size = vsnprintf(nullptr, 0, format, argcopy);
if (size < 0)
throw std::invalid_argument("invalid argument to strprintf");
va_end(argcopy);
std::string s;
s.resize(size + 1);
size = vsnprintf(&s[0], s.size(), format, args);
assert(size >= 0);
s.resize(size);
return s;
}
std::string strprintf(const char *format, ...)
{
va_list args;
va_start(args, format);
std::string s = vstrprintf(format, args);
va_end(args);
return s;
}

View File

@ -184,4 +184,8 @@ inline int ssprintf(char(&str)[N], const char *fmt, ...)
// Checks a string for conformance with UTF-8
bool IsValidUtf8(const char *string, int length = -1);
std::string vstrprintf(const char *format, va_list args);
std::string strprintf(const char *format, ...) GNUC_FORMAT_ATTRIBUTE;
#endif // INC_STANDARD

View File

@ -29,31 +29,6 @@
#define C4AUL_SafeInherited "_inherited"
#define C4AUL_DebugBreak "__debugbreak"
static std::string vstrprintf(const char *format, va_list args)
{
va_list argcopy;
va_copy(argcopy, args);
int size = vsnprintf(nullptr, 0, format, argcopy);
if (size < 0)
throw std::invalid_argument("invalid argument to strprintf");
va_end(argcopy);
std::string s;
s.resize(size + 1);
size = vsnprintf(&s[0], s.size(), format, args);
assert(size >= 0);
s.resize(size);
return s;
}
static std::string strprintf(const char *format, ...)
{
va_list args;
va_start(args, format);
std::string s = vstrprintf(format, args);
va_end(args);
return s;
}
static std::string FormatCodePosition(const C4ScriptHost *source_host, const char *pos, const C4ScriptHost *target_host = nullptr, const C4AulScriptFunc *func = nullptr)
{
std::string s;