mirror of https://github.com/aria2/aria2
Merge 25abe60164
into b519ce04e3
commit
44fb54ac9b
38
src/fmt.cc
38
src/fmt.cc
|
@ -37,29 +37,37 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
std::string fmt(const char* fmtTemplate, ...)
|
std::string fmt(const char* fmtTemplate, ...)
|
||||||
{
|
{
|
||||||
|
// guess initial buffer size!
|
||||||
|
std::vector<char> buf(strlen(fmtTemplate) * 4);
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
va_start(ap, fmtTemplate);
|
va_start(ap, fmtTemplate);
|
||||||
char buf[2048];
|
int rv = vsnprintf(buf.data(), buf.size(), fmtTemplate, ap);
|
||||||
int rv;
|
|
||||||
rv = vsnprintf(buf, sizeof(buf), fmtTemplate, ap);
|
|
||||||
#ifdef __MINGW32__
|
|
||||||
// MINGW32 vsnprintf returns -1 if output is truncated.
|
|
||||||
if (rv < 0 && rv != -1) {
|
|
||||||
// Reachable?
|
|
||||||
buf[0] = '\0';
|
|
||||||
}
|
|
||||||
#else // !__MINGW32__
|
|
||||||
if (rv < 0) {
|
|
||||||
buf[0] = '\0';
|
|
||||||
}
|
|
||||||
#endif // !__MINGW32__
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return buf;
|
|
||||||
|
if (rv >= buf.size()) { // truncated
|
||||||
|
buf.resize(rv + 1);
|
||||||
|
}
|
||||||
|
else if (rv >= 0) { // success
|
||||||
|
return buf.data();
|
||||||
|
}
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
else if (rv == -1 && buf.size() < 4096) { // truncated?
|
||||||
|
buf.resize(buf.size() * 4);
|
||||||
|
}
|
||||||
|
#endif // __MINGW32__
|
||||||
|
else { // error
|
||||||
|
buf[0] = '\0';
|
||||||
|
return buf.data();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
Loading…
Reference in New Issue