| 31 | |
| 32 | #if defined(NO_FMTLIB) |
| 33 | std::string format(const char* fmt, ...) { |
| 34 | const int size = 512; |
| 35 | struct deleter |
| 36 | { |
| 37 | static void delarray(char* p) { |
| 38 | delete[] p; |
| 39 | } |
| 40 | }; // to use delete[] |
| 41 | shared_ptr<char> buffer(new char[size], deleter::delarray); // I'd prefer unique_ptr, but it's only available since c++11 |
| 42 | va_list vl; |
| 43 | va_start(vl, fmt); |
| 44 | int nsize = vsnprintf(buffer.get(), size, fmt, vl); |
| 45 | if (size <= nsize) { //fail delete buffer and try again |
| 46 | buffer.reset(new char[++nsize], deleter::delarray); //+1 for /0 |
| 47 | nsize = vsnprintf(buffer.get(), nsize, fmt, vl); |
| 48 | } |
| 49 | va_end(vl); |
| 50 | return buffer.get(); |
| 51 | } |
| 52 | #endif |
| 53 | |
| 54 | #if defined(ENABLE_CATCH) |