#include #include #include #include using namespace std; string vstrf(const char *format, va_list argPtr) { static size_t buf_size = 16; static char *buffer = new char[buf_size]; size_t length; while (1) { if (!buffer) { assert(buffer); // to stop when debugging return ""; } length = vsnprintf(buffer, buf_size, format, argPtr); if (length < buf_size) break; // string fits into current buffer // otherwise resize buffer : buf_size += buf_size/2; // fprintf(stderr, "Reallocating vstrf-buffer to size=%u\n", buf_size); delete [] buffer; buffer = new char[buf_size]; } return string(buffer, length); } string strf(const char *format, ...) { va_list argPtr; va_start(argPtr, format); string result = vstrf(format, argPtr); va_end(argPtr); return result; } string strf2(const char *format, ...) { static size_t buf_size = 512; static char *buffer = new char[buf_size]; va_list argPtr; size_t length; while (true) { if (!buffer) { assert(buffer); // to stop when debugging return ""; } va_start(argPtr, format); length = vsnprintf(buffer, buf_size, format, argPtr); va_end(argPtr); if (length >= 0 && length < buf_size - 1) // string fits into current buffer return std::string(buffer, length); // otherwise resize buffer : buf_size *= 2; // fprintf(stderr, "Reallocating vstrf-buffer to size=%u\n", buf_size); delete [] buffer; buffer = new char[buf_size]; } } #define FOO "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" int main(int argc, char** argv) { fprintf(stderr, "Trying new strf function.\n"); strf2("%s%s%s",FOO FOO FOO FOO, FOO FOO FOO FOO, FOO FOO FOO FOO); fprintf(stderr, "New function completed successfully.\n"); fprintf(stderr, "Trying old strf function.\n"); strf("%s%s%s",FOO FOO FOO FOO, FOO FOO FOO FOO, FOO FOO FOO FOO); fprintf(stderr, "Old function completed successfully.\n"); }