1 /*******************************************************************************
2  * tlx/string/ssprintf.cpp
3  *
4  * Part of tlx - http://panthema.net/tlx
5  *
6  * Copyright (C) 2007-2019 Timo Bingmann <tb@panthema.net>
7  *
8  * All rights reserved. Published under the Boost Software License, Version 1.0
9  ******************************************************************************/
10 
11 #include <tlx/string/ssprintf.hpp>
12 
13 #include <cstdarg>
14 #include <cstdio>
15 
16 namespace tlx {
17 
ssprintf(const char * fmt,...)18 std::string ssprintf(const char* fmt, ...) {
19     std::string out;
20     out.resize(128);
21 
22     va_list args;
23     va_start(args, fmt);
24 
25     int size = std::vsnprintf(
26         const_cast<char*>(out.data()), out.size() + 1, fmt, args);
27 
28     if (size >= static_cast<int>(out.size())) {
29         // error, grow buffer and try again.
30         out.resize(size);
31         size = std::vsnprintf(
32             const_cast<char*>(out.data()), out.size() + 1, fmt, args);
33     }
34 
35     out.resize(size);
36 
37     va_end(args);
38 
39     return out;
40 }
41 
ssnprintf(size_t max_size,const char * fmt,...)42 std::string ssnprintf(size_t max_size, const char* fmt, ...) {
43     std::string out;
44     out.resize(max_size);
45 
46     va_list args;
47     va_start(args, fmt);
48 
49     int size = std::vsnprintf(
50         const_cast<char*>(out.data()), out.size() + 1, fmt, args);
51 
52     if (static_cast<size_t>(size) < max_size)
53         out.resize(static_cast<size_t>(size));
54 
55     va_end(args);
56 
57     return out;
58 }
59 
60 } // namespace tlx
61 
62 /******************************************************************************/
63