]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - tools/elftosb/common/format_string.cpp
Unified codebase for TX28, TX48, TX51, TX53
[karo-tx-uboot.git] / tools / elftosb / common / format_string.cpp
1 /*
2  * File:        format_string.cpp
3  *
4  * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5  * See included license file for license details.
6  */
7
8 #include "format_string.h"
9 #include <stdio.h>
10 #include <stdarg.h>
11 #include <stdexcept>
12 #include <string.h>
13 #include <stdlib.h>
14 //! Size of the temporary buffer to hold the formatted output string.
15 #define WIN32_FMT_BUF_LEN (512)
16
17 /*!
18  * \brief Simple template class to free a pointer.
19  */
20 template <typename T>
21 class free_ptr
22 {
23 public:
24         //! \brief Constructor.
25         free_ptr(T ptr)
26         :       m_p(ptr)
27         {
28         }
29         
30         //! \brief Destructor.
31         ~free_ptr()
32         {
33                 if (m_p)
34                 {
35                         free(m_p);
36                 }
37         }
38
39 protected:
40         T m_p;  //!< The value to free.
41 };
42
43 //! The purpose of this function to provide a convenient way of generating formatted
44 //! STL strings inline. This is especially useful when throwing exceptions that take
45 //! a std::string for a message. The length of the formatted output string is limited
46 //! only by memory. Memory temporarily allocated for the output string is disposed of
47 //! before returning.
48 //!
49 //! Example usage:
50 //! \code
51 //!             throw std::runtime_error(format_string("error on line %d", line));
52 //! \endcode
53 //!
54 //! \param fmt Format string using printf-style format markers.
55 //! \return An STL string object of the formatted output.
56 std::string format_string(const char * fmt, ...)
57 {
58         char * buf = 0;
59         va_list vargs;
60         va_start(vargs, fmt);
61         int result = -1;
62 #if WIN32
63     buf = (char *)malloc(WIN32_FMT_BUF_LEN);
64     if (buf)
65     {
66         result = _vsnprintf(buf, WIN32_FMT_BUF_LEN, fmt, vargs);
67     }
68 #else // WIN32
69         result = vasprintf(&buf, fmt, vargs);
70 #endif // WIN32
71         va_end(vargs);
72         if (result != -1 && buf)
73         {
74                 free_ptr<char *> freebuf(buf);
75                 return std::string(buf);
76         }
77         return "";
78 }
79