X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ad0cb80ebff7603232ec1621d9b6cfa1ea3471f6..2738598c9f876339ee6f8b3fc217984b7b837539:/src/xbt/string.cpp diff --git a/src/xbt/string.cpp b/src/xbt/string.cpp index 4489c33abe..68d036f49d 100644 --- a/src/xbt/string.cpp +++ b/src/xbt/string.cpp @@ -1,20 +1,57 @@ -/* Copyright (c) 2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2015-2019. The SimGrid Team. All rights reserved. */ /* 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 +#include namespace simgrid { namespace xbt { -#ifdef HAVE_MC +#if SIMGRID_HAVE_MC -const char string::NUL = '\0'; +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; +} + } }