79 lines
1.9 KiB
C++
79 lines
1.9 KiB
C++
/*
|
|
* File: format_string.cpp
|
|
*
|
|
* Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
|
|
* See included license file for license details.
|
|
*/
|
|
|
|
#include "format_string.h"
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <stdexcept>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
//! Size of the temporary buffer to hold the formatted output string.
|
|
#define WIN32_FMT_BUF_LEN (512)
|
|
|
|
/*!
|
|
* \brief Simple template class to free a pointer.
|
|
*/
|
|
template <typename T>
|
|
class free_ptr
|
|
{
|
|
public:
|
|
//! \brief Constructor.
|
|
free_ptr(T ptr)
|
|
: m_p(ptr)
|
|
{
|
|
}
|
|
|
|
//! \brief Destructor.
|
|
~free_ptr()
|
|
{
|
|
if (m_p)
|
|
{
|
|
free(m_p);
|
|
}
|
|
}
|
|
|
|
protected:
|
|
T m_p; //!< The value to free.
|
|
};
|
|
|
|
//! The purpose of this function to provide a convenient way of generating formatted
|
|
//! STL strings inline. This is especially useful when throwing exceptions that take
|
|
//! a std::string for a message. The length of the formatted output string is limited
|
|
//! only by memory. Memory temporarily allocated for the output string is disposed of
|
|
//! before returning.
|
|
//!
|
|
//! Example usage:
|
|
//! \code
|
|
//! throw std::runtime_error(format_string("error on line %d", line));
|
|
//! \endcode
|
|
//!
|
|
//! \param fmt Format string using printf-style format markers.
|
|
//! \return An STL string object of the formatted output.
|
|
std::string format_string(const char *fmt, ...)
|
|
{
|
|
char *buf = 0;
|
|
va_list vargs;
|
|
va_start(vargs, fmt);
|
|
int result = -1;
|
|
#if WIN32
|
|
buf = (char *)malloc(WIN32_FMT_BUF_LEN);
|
|
if (buf)
|
|
{
|
|
result = _vsnprintf(buf, WIN32_FMT_BUF_LEN, fmt, vargs);
|
|
}
|
|
#else // WIN32
|
|
result = vasprintf(&buf, fmt, vargs);
|
|
#endif // WIN32
|
|
va_end(vargs);
|
|
if (result != -1 && buf)
|
|
{
|
|
free_ptr<char *> freebuf(buf);
|
|
return std::string(buf);
|
|
}
|
|
return "";
|
|
}
|