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 80