X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ad0cb80ebff7603232ec1621d9b6cfa1ea3471f6..4a69abcc786d029bd2962537f767d12a0f808d11:/src/xbt/string.cpp diff --git a/src/xbt/string.cpp b/src/xbt/string.cpp index 4489c33abe..f23e4295ff 100644 --- a/src/xbt/string.cpp +++ b/src/xbt/string.cpp @@ -4,17 +4,56 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include +#include + #include + #include +#include namespace simgrid { namespace xbt { -#ifdef HAVE_MC +#if HAVE_MC const char string::NUL = '\0'; #endif +std::string string_vprintf(const char *fmt, va_list ap) +{ + // Get the size: + va_list ap2; + va_copy(ap2, ap); + int size = std::vsnprintf(nullptr, 0, fmt, ap2); + va_end(ap2); + if (size < 0) + xbt_die("string_vprintf error"); + + // Allocate the string and format: + std::string res; + res.resize(size); + if (size != 0 && std::vsnprintf(&res[0], size + 1, fmt, ap) != size) + xbt_die("string_vprintf error"); + return res; +} + +std::string string_printf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + std::string res; + try { + res = string_vprintf(fmt, ap); + } + catch(...) { + va_end(ap); + throw; + } + va_end(ap); + return res; +} + } }