Updated fmto to version def687462c32ec40757e49eb6069f109d50236d6

This commit is contained in:
gabime 2016-11-18 17:13:53 +02:00
parent e12916c070
commit d142f13551
5 changed files with 4654 additions and 4638 deletions

View File

@ -25,9 +25,7 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
// commented out by spdlog #include "format.h"
// #include "format.h"
// #include "printf.h"
#include <string.h> #include <string.h>
@ -73,31 +71,37 @@ using fmt::internal::Arg;
// Dummy implementations of strerror_r and strerror_s called if corresponding // Dummy implementations of strerror_r and strerror_s called if corresponding
// system functions are not available. // system functions are not available.
static inline fmt::internal::Null<> strerror_r(int, char *, ...) { static inline fmt::internal::Null<> strerror_r(int, char *, ...)
return fmt::internal::Null<>(); {
return fmt::internal::Null<>();
} }
static inline fmt::internal::Null<> strerror_s(char *, std::size_t, ...) { static inline fmt::internal::Null<> strerror_s(char *, std::size_t, ...)
return fmt::internal::Null<>(); {
return fmt::internal::Null<>();
} }
namespace fmt { namespace fmt {
FMT_FUNC internal::RuntimeError::~RuntimeError() throw() {} FMT_FUNC internal::RuntimeError::~RuntimeError() FMT_DTOR_NOEXCEPT
FMT_FUNC FormatError::~FormatError() throw() {} {}
FMT_FUNC SystemError::~SystemError() throw() {} FMT_FUNC FormatError::~FormatError() FMT_DTOR_NOEXCEPT
{}
FMT_FUNC SystemError::~SystemError() FMT_DTOR_NOEXCEPT
{}
namespace { namespace {
#ifndef _MSC_VER #ifndef _MSC_VER
# define FMT_SNPRINTF snprintf # define FMT_SNPRINTF snprintf
#else // _MSC_VER #else // _MSC_VER
inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) { inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...)
va_list args; {
va_start(args, format); va_list args;
int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); va_start(args, format);
va_end(args); int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args);
return result; va_end(args);
} return result;
}
# define FMT_SNPRINTF fmt_snprintf # define FMT_SNPRINTF fmt_snprintf
#endif // _MSC_VER #endif // _MSC_VER
@ -107,166 +111,183 @@ inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) {
# define FMT_SWPRINTF swprintf # define FMT_SWPRINTF swprintf
#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) #endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT)
const char RESET_COLOR[] = "\x1b[0m"; const char RESET_COLOR[] = "\x1b[0m";
typedef void(*FormatFunc)(Writer &, int, StringRef); typedef void(*FormatFunc)(Writer &, int, StringRef);
// Portable thread-safe version of strerror. // Portable thread-safe version of strerror.
// Sets buffer to point to a string describing the error code. // Sets buffer to point to a string describing the error code.
// This can be either a pointer to a string stored in buffer, // This can be either a pointer to a string stored in buffer,
// or a pointer to some static immutable string. // or a pointer to some static immutable string.
// Returns one of the following values: // Returns one of the following values:
// 0 - success // 0 - success
// ERANGE - buffer is not large enough to store the error message // ERANGE - buffer is not large enough to store the error message
// other - failure // other - failure
// Buffer should be at least of size 1. // Buffer should be at least of size 1.
int safe_strerror( int safe_strerror(
int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT{ int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT
FMT_ASSERT(buffer != 0 && buffer_size != 0, "invalid buffer"); {
FMT_ASSERT(buffer != 0 && buffer_size != 0, "invalid buffer");
class StrError { class StrError
private: {
int error_code_; private:
char *&buffer_; int error_code_;
std::size_t buffer_size_; char *&buffer_;
std::size_t buffer_size_;
// A noop assignment operator to avoid bogus warnings. // A noop assignment operator to avoid bogus warnings.
void operator=(const StrError &) {} void operator=(const StrError &)
{}
// Handle the result of XSI-compliant version of strerror_r. // Handle the result of XSI-compliant version of strerror_r.
int handle(int result) { int handle(int result)
// glibc versions before 2.13 return result in errno. {
return result == -1 ? errno : result; // glibc versions before 2.13 return result in errno.
} return result == -1 ? errno : result;
}
// Handle the result of GNU-specific version of strerror_r. // Handle the result of GNU-specific version of strerror_r.
int handle(char *message) { int handle(char *message)
// If the buffer is full then the message is probably truncated. {
if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) // If the buffer is full then the message is probably truncated.
return ERANGE; if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1)
buffer_ = message; return ERANGE;
return 0; buffer_ = message;
} return 0;
}
// Handle the case when strerror_r is not available. // Handle the case when strerror_r is not available.
int handle(internal::Null<>) { int handle(internal::Null<>)
return fallback(strerror_s(buffer_, buffer_size_, error_code_)); {
} return fallback(strerror_s(buffer_, buffer_size_, error_code_));
}
// Fallback to strerror_s when strerror_r is not available. // Fallback to strerror_s when strerror_r is not available.
int fallback(int result) { int fallback(int result)
// If the buffer is full then the message is probably truncated. {
return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? // If the buffer is full then the message is probably truncated.
ERANGE : result; return result == 0 && strlen(buffer_) == buffer_size_ - 1 ?
} ERANGE : result;
}
// Fallback to strerror if strerror_r and strerror_s are not available. // Fallback to strerror if strerror_r and strerror_s are not available.
int fallback(internal::Null<>) { int fallback(internal::Null<>)
errno = 0; {
buffer_ = strerror(error_code_); errno = 0;
return errno; buffer_ = strerror(error_code_);
} return errno;
}
public: public:
StrError(int err_code, char *&buf, std::size_t buf_size) StrError(int err_code, char *&buf, std::size_t buf_size)
: error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} : error_code_(err_code), buffer_(buf), buffer_size_(buf_size)
{}
int run() { int run()
strerror_r(0, 0, ""); // Suppress a warning about unused strerror_r. {
return handle(strerror_r(error_code_, buffer_, buffer_size_)); // Suppress a warning about unused strerror_r.
} strerror_r(0, FMT_NULL, "");
}; return handle(strerror_r(error_code_, buffer_, buffer_size_));
return StrError(error_code, buffer, buffer_size).run(); }
} };
return StrError(error_code, buffer, buffer_size).run();
}
void format_error_code(Writer &out, int error_code, void format_error_code(Writer &out, int error_code,
StringRef message) FMT_NOEXCEPT{ StringRef message) FMT_NOEXCEPT
// Report error code making sure that the output fits into {
// INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential // Report error code making sure that the output fits into
// bad_alloc. // INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential
out.clear(); // bad_alloc.
static const char SEP[] = ": "; out.clear();
static const char ERROR_STR[] = "error "; static const char SEP[] = ": ";
// Subtract 2 to account for terminating null characters in SEP and ERROR_STR. static const char ERROR_STR[] = "error ";
std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; // Subtract 2 to account for terminating null characters in SEP and ERROR_STR.
typedef internal::IntTraits<int>::MainType MainType; std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2;
MainType abs_value = static_cast<MainType>(error_code); typedef internal::IntTraits<int>::MainType MainType;
if (internal::is_negative(error_code)) { MainType abs_value = static_cast<MainType>(error_code);
abs_value = 0 - abs_value; if (internal::is_negative(error_code)) {
++error_code_size; abs_value = 0 - abs_value;
} ++error_code_size;
error_code_size += internal::count_digits(abs_value); }
if (message.size() <= internal::INLINE_BUFFER_SIZE - error_code_size) error_code_size += internal::count_digits(abs_value);
out << message << SEP; if (message.size() <= internal::INLINE_BUFFER_SIZE - error_code_size)
out << ERROR_STR << error_code; out << message << SEP;
assert(out.size() <= internal::INLINE_BUFFER_SIZE); out << ERROR_STR << error_code;
} assert(out.size() <= internal::INLINE_BUFFER_SIZE);
}
void report_error(FormatFunc func, int error_code, void report_error(FormatFunc func, int error_code,
StringRef message) FMT_NOEXCEPT{ StringRef message) FMT_NOEXCEPT
MemoryWriter full_message; {
func(full_message, error_code, message); MemoryWriter full_message;
// Use Writer::data instead of Writer::c_str to avoid potential memory func(full_message, error_code, message);
// allocation. // Use Writer::data instead of Writer::c_str to avoid potential memory
std::fwrite(full_message.data(), full_message.size(), 1, stderr); // allocation.
std::fputc('\n', stderr); std::fwrite(full_message.data(), full_message.size(), 1, stderr);
} std::fputc('\n', stderr);
} // namespace }
} // namespace
namespace internal { namespace internal {
// This method is used to preserve binary compatibility with fmt 3.0. // This method is used to preserve binary compatibility with fmt 3.0.
// It can be removed in 4.0. // It can be removed in 4.0.
FMT_FUNC void format_system_error( FMT_FUNC void format_system_error(
Writer &out, int error_code, StringRef message) FMT_NOEXCEPT{ Writer &out, int error_code, StringRef message) FMT_NOEXCEPT
fmt::format_system_error(out, error_code, message); {
} fmt::format_system_error(out, error_code, message);
} // namespace internal }
} // namespace internal
FMT_FUNC void SystemError::init( FMT_FUNC void SystemError::init(
int err_code, CStringRef format_str, ArgList args) { int err_code, CStringRef format_str, ArgList args)
error_code_ = err_code; {
MemoryWriter w; error_code_ = err_code;
format_system_error(w, err_code, format(format_str, args)); MemoryWriter w;
std::runtime_error &base = *this; format_system_error(w, err_code, format(format_str, args));
base = std::runtime_error(w.str()); std::runtime_error &base = *this;
} base = std::runtime_error(w.str());
}
template <typename T> template <typename T>
int internal::CharTraits<char>::format_float( int internal::CharTraits<char>::format_float(
char *buffer, std::size_t size, const char *format, char *buffer, std::size_t size, const char *format,
unsigned width, int precision, T value) { unsigned width, int precision, T value)
if (width == 0) { {
return precision < 0 ? if (width == 0) {
FMT_SNPRINTF(buffer, size, format, value) : return precision < 0 ?
FMT_SNPRINTF(buffer, size, format, precision, value); FMT_SNPRINTF(buffer, size, format, value) :
} FMT_SNPRINTF(buffer, size, format, precision, value);
return precision < 0 ? }
FMT_SNPRINTF(buffer, size, format, width, value) : return precision < 0 ?
FMT_SNPRINTF(buffer, size, format, width, precision, value); FMT_SNPRINTF(buffer, size, format, width, value) :
} FMT_SNPRINTF(buffer, size, format, width, precision, value);
}
template <typename T> template <typename T>
int internal::CharTraits<wchar_t>::format_float( int internal::CharTraits<wchar_t>::format_float(
wchar_t *buffer, std::size_t size, const wchar_t *format, wchar_t *buffer, std::size_t size, const wchar_t *format,
unsigned width, int precision, T value) { unsigned width, int precision, T value)
if (width == 0) { {
return precision < 0 ? if (width == 0) {
FMT_SWPRINTF(buffer, size, format, value) : return precision < 0 ?
FMT_SWPRINTF(buffer, size, format, precision, value); FMT_SWPRINTF(buffer, size, format, value) :
} FMT_SWPRINTF(buffer, size, format, precision, value);
return precision < 0 ? }
FMT_SWPRINTF(buffer, size, format, width, value) : return precision < 0 ?
FMT_SWPRINTF(buffer, size, format, width, precision, value); FMT_SWPRINTF(buffer, size, format, width, value) :
} FMT_SWPRINTF(buffer, size, format, width, precision, value);
}
template <typename T> template <typename T>
const char internal::BasicData<T>::DIGITS[] = const char internal::BasicData<T>::DIGITS[] =
"0001020304050607080910111213141516171819" "0001020304050607080910111213141516171819"
"2021222324252627282930313233343536373839" "2021222324252627282930313233343536373839"
"4041424344454647484950515253545556575859" "4041424344454647484950515253545556575859"
"6061626364656667686970717273747576777879" "6061626364656667686970717273747576777879"
"8081828384858687888990919293949596979899"; "8081828384858687888990919293949596979899";
#define FMT_POWERS_OF_10(factor) \ #define FMT_POWERS_OF_10(factor) \
factor * 10, \ factor * 10, \
@ -279,277 +300,279 @@ const char internal::BasicData<T>::DIGITS[] =
factor * 100000000, \ factor * 100000000, \
factor * 1000000000 factor * 1000000000
template <typename T> template <typename T>
const uint32_t internal::BasicData<T>::POWERS_OF_10_32[] = { const uint32_t internal::BasicData<T>::POWERS_OF_10_32[] = {
0, FMT_POWERS_OF_10(1) 0, FMT_POWERS_OF_10(1)
}; };
template <typename T> template <typename T>
const uint64_t internal::BasicData<T>::POWERS_OF_10_64[] = { const uint64_t internal::BasicData<T>::POWERS_OF_10_64[] = {
0, 0,
FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1),
FMT_POWERS_OF_10(ULongLong(1000000000)), FMT_POWERS_OF_10(ULongLong(1000000000)),
// Multiply several constants instead of using a single long long constant // Multiply several constants instead of using a single long long constant
// to avoid warnings about C++98 not supporting long long. // to avoid warnings about C++98 not supporting long long.
ULongLong(1000000000) * ULongLong(1000000000) * 10 ULongLong(1000000000) * ULongLong(1000000000) * 10
}; };
FMT_FUNC void internal::report_unknown_type(char code, const char *type) { FMT_FUNC void internal::report_unknown_type(char code, const char *type)
(void)type; {
if (std::isprint(static_cast<unsigned char>(code))) { (void)type;
FMT_THROW(FormatError( if (std::isprint(static_cast<unsigned char>(code))) {
format("unknown format code '{}' for {}", code, type))); FMT_THROW(FormatError(
} format("unknown format code '{}' for {}", code, type)));
FMT_THROW(FormatError( }
format("unknown format code '\\x{:02x}' for {}", FMT_THROW(FormatError(
static_cast<unsigned>(code), type))); format("unknown format code '\\x{:02x}' for {}",
} static_cast<unsigned>(code), type)));
}
#if FMT_USE_WINDOWS_H #if FMT_USE_WINDOWS_H
FMT_FUNC internal::UTF8ToUTF16::UTF8ToUTF16(StringRef s) { FMT_FUNC internal::UTF8ToUTF16::UTF8ToUTF16(StringRef s)
static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16"; {
if (s.size() > INT_MAX) static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16";
FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG)); if (s.size() > INT_MAX)
int s_size = static_cast<int>(s.size()); FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG));
int length = MultiByteToWideChar( int s_size = static_cast<int>(s.size());
CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, 0, 0); int length = MultiByteToWideChar(
if (length == 0) CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, FMT_NULL, 0);
FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); if (length == 0)
buffer_.resize(length + 1); FMT_THROW(WindowsError(GetLastError(), ERROR_MSG));
length = MultiByteToWideChar( buffer_.resize(length + 1);
CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length); length = MultiByteToWideChar(
if (length == 0) CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length);
FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); if (length == 0)
buffer_[length] = 0; FMT_THROW(WindowsError(GetLastError(), ERROR_MSG));
} buffer_[length] = 0;
}
FMT_FUNC internal::UTF16ToUTF8::UTF16ToUTF8(WStringRef s) { FMT_FUNC internal::UTF16ToUTF8::UTF16ToUTF8(WStringRef s)
if (int error_code = convert(s)) { {
FMT_THROW(WindowsError(error_code, if (int error_code = convert(s)) {
"cannot convert string from UTF-16 to UTF-8")); FMT_THROW(WindowsError(error_code,
} "cannot convert string from UTF-16 to UTF-8"));
} }
}
FMT_FUNC int internal::UTF16ToUTF8::convert(WStringRef s) { FMT_FUNC int internal::UTF16ToUTF8::convert(WStringRef s)
if (s.size() > INT_MAX) {
return ERROR_INVALID_PARAMETER; if (s.size() > INT_MAX)
int s_size = static_cast<int>(s.size()); return ERROR_INVALID_PARAMETER;
int length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, 0, 0, 0, 0); int s_size = static_cast<int>(s.size());
if (length == 0) int length = WideCharToMultiByte(
return GetLastError(); CP_UTF8, 0, s.data(), s_size, FMT_NULL, 0, FMT_NULL, FMT_NULL);
buffer_.resize(length + 1); if (length == 0)
length = WideCharToMultiByte( return GetLastError();
CP_UTF8, 0, s.data(), s_size, &buffer_[0], length, 0, 0); buffer_.resize(length + 1);
if (length == 0) length = WideCharToMultiByte(
return GetLastError(); CP_UTF8, 0, s.data(), s_size, &buffer_[0], length, FMT_NULL, FMT_NULL);
buffer_[length] = 0; if (length == 0)
return 0; return GetLastError();
} buffer_[length] = 0;
return 0;
}
FMT_FUNC void WindowsError::init( FMT_FUNC void WindowsError::init(
int err_code, CStringRef format_str, ArgList args) { int err_code, CStringRef format_str, ArgList args)
error_code_ = err_code; {
MemoryWriter w; error_code_ = err_code;
internal::format_windows_error(w, err_code, format(format_str, args)); MemoryWriter w;
std::runtime_error &base = *this; internal::format_windows_error(w, err_code, format(format_str, args));
base = std::runtime_error(w.str()); std::runtime_error &base = *this;
} base = std::runtime_error(w.str());
}
FMT_FUNC void internal::format_windows_error( FMT_FUNC void internal::format_windows_error(
Writer &out, int error_code, StringRef message) FMT_NOEXCEPT{ Writer &out, int error_code, StringRef message) FMT_NOEXCEPT
FMT_TRY{ {
MemoryBuffer<wchar_t, INLINE_BUFFER_SIZE> buffer; FMT_TRY{
buffer.resize(INLINE_BUFFER_SIZE); MemoryBuffer<wchar_t, INLINE_BUFFER_SIZE> buffer;
for (;;) { buffer.resize(INLINE_BUFFER_SIZE);
wchar_t *system_message = &buffer[0]; for (;;) {
int result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, wchar_t *system_message = &buffer[0];
0, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), int result = FormatMessageW(
system_message, static_cast<uint32_t>(buffer.size()), 0); FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
if (result != 0) { FMT_NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
UTF16ToUTF8 utf8_message; system_message, static_cast<uint32_t>(buffer.size()), FMT_NULL);
if (utf8_message.convert(system_message) == ERROR_SUCCESS) { if (result != 0) {
out << message << ": " << utf8_message; UTF16ToUTF8 utf8_message;
return; if (utf8_message.convert(system_message) == ERROR_SUCCESS) {
} out << message << ": " << utf8_message;
break; return;
} }
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) break;
break; // Can't get error message, report error code instead. }
buffer.resize(buffer.size() * 2); if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
} break; // Can't get error message, report error code instead.
} FMT_CATCH(...) {} buffer.resize(buffer.size() * 2);
fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. }
} } FMT_CATCH(...)
{}
fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32.
}
#endif // FMT_USE_WINDOWS_H #endif // FMT_USE_WINDOWS_H
FMT_FUNC void format_system_error( FMT_FUNC void format_system_error(
Writer &out, int error_code, StringRef message) FMT_NOEXCEPT{ Writer &out, int error_code, StringRef message) FMT_NOEXCEPT
FMT_TRY{ {
internal::MemoryBuffer<char, internal::INLINE_BUFFER_SIZE> buffer; FMT_TRY{
buffer.resize(internal::INLINE_BUFFER_SIZE); internal::MemoryBuffer<char, internal::INLINE_BUFFER_SIZE> buffer;
for (;;) { buffer.resize(internal::INLINE_BUFFER_SIZE);
char *system_message = &buffer[0]; for (;;) {
int result = safe_strerror(error_code, system_message, buffer.size()); char *system_message = &buffer[0];
if (result == 0) { int result = safe_strerror(error_code, system_message, buffer.size());
out << message << ": " << system_message; if (result == 0) {
return; out << message << ": " << system_message;
} return;
if (result != ERANGE) }
break; // Can't get error message, report error code instead. if (result != ERANGE)
buffer.resize(buffer.size() * 2); break; // Can't get error message, report error code instead.
} buffer.resize(buffer.size() * 2);
} FMT_CATCH(...) {} }
fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. } FMT_CATCH(...)
} {}
fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32.
}
template <typename Char> template <typename Char>
void internal::ArgMap<Char>::init(const ArgList &args) { void internal::ArgMap<Char>::init(const ArgList &args)
if (!map_.empty()) {
return; if (!map_.empty())
typedef internal::NamedArg<Char> NamedArg; return;
const NamedArg *named_arg = 0; typedef internal::NamedArg<Char> NamedArg;
bool use_values = const NamedArg *named_arg = FMT_NULL;
args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE; bool use_values =
if (use_values) { args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE;
for (unsigned i = 0;/*nothing*/; ++i) { if (use_values) {
internal::Arg::Type arg_type = args.type(i); for (unsigned i = 0;/*nothing*/; ++i) {
switch (arg_type) { internal::Arg::Type arg_type = args.type(i);
case internal::Arg::NONE: switch (arg_type) {
return; case internal::Arg::NONE:
case internal::Arg::NAMED_ARG: return;
named_arg = static_cast<const NamedArg*>(args.values_[i].pointer); case internal::Arg::NAMED_ARG:
map_.push_back(Pair(named_arg->name, *named_arg)); named_arg = static_cast<const NamedArg*>(args.values_[i].pointer);
break; map_.push_back(Pair(named_arg->name, *named_arg));
default: break;
/*nothing*/ default:
; /*nothing*/;
} }
} }
return; return;
} }
for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) { for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) {
internal::Arg::Type arg_type = args.type(i); internal::Arg::Type arg_type = args.type(i);
if (arg_type == internal::Arg::NAMED_ARG) { if (arg_type == internal::Arg::NAMED_ARG) {
named_arg = static_cast<const NamedArg*>(args.args_[i].pointer); named_arg = static_cast<const NamedArg*>(args.args_[i].pointer);
map_.push_back(Pair(named_arg->name, *named_arg)); map_.push_back(Pair(named_arg->name, *named_arg));
} }
} }
for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) {
switch (args.args_[i].type) { switch (args.args_[i].type) {
case internal::Arg::NONE: case internal::Arg::NONE:
return; return;
case internal::Arg::NAMED_ARG: case internal::Arg::NAMED_ARG:
named_arg = static_cast<const NamedArg*>(args.args_[i].pointer); named_arg = static_cast<const NamedArg*>(args.args_[i].pointer);
map_.push_back(Pair(named_arg->name, *named_arg)); map_.push_back(Pair(named_arg->name, *named_arg));
break; break;
default: default:
/*nothing*/ /*nothing*/;
; }
} }
} }
}
template <typename Char> template <typename Char>
void internal::FixedBuffer<Char>::grow(std::size_t) { void internal::FixedBuffer<Char>::grow(std::size_t)
FMT_THROW(std::runtime_error("buffer overflow")); {
} FMT_THROW(std::runtime_error("buffer overflow"));
}
FMT_FUNC Arg internal::FormatterBase::do_get_arg( FMT_FUNC Arg internal::FormatterBase::do_get_arg(
unsigned arg_index, const char *&error) { unsigned arg_index, const char *&error)
Arg arg = args_[arg_index]; {
switch (arg.type) { Arg arg = args_[arg_index];
case Arg::NONE: switch (arg.type) {
error = "argument index out of range"; case Arg::NONE:
break; error = "argument index out of range";
case Arg::NAMED_ARG: break;
arg = *static_cast<const internal::Arg*>(arg.pointer); case Arg::NAMED_ARG:
break; arg = *static_cast<const internal::Arg*>(arg.pointer);
default: break;
/*nothing*/ default:
; /*nothing*/;
} }
return arg; return arg;
} }
FMT_FUNC void report_system_error( FMT_FUNC void report_system_error(
int error_code, fmt::StringRef message) FMT_NOEXCEPT{ int error_code, fmt::StringRef message) FMT_NOEXCEPT
// 'fmt::' is for bcc32. {
report_error(format_system_error, error_code, message); // 'fmt::' is for bcc32.
} report_error(format_system_error, error_code, message);
}
#if FMT_USE_WINDOWS_H #if FMT_USE_WINDOWS_H
FMT_FUNC void report_windows_error( FMT_FUNC void report_windows_error(
int error_code, fmt::StringRef message) FMT_NOEXCEPT{ int error_code, fmt::StringRef message) FMT_NOEXCEPT
// 'fmt::' is for bcc32. {
report_error(internal::format_windows_error, error_code, message); // 'fmt::' is for bcc32.
} report_error(internal::format_windows_error, error_code, message);
}
#endif #endif
FMT_FUNC void print(std::FILE *f, CStringRef format_str, ArgList args) { FMT_FUNC void print(std::FILE *f, CStringRef format_str, ArgList args)
MemoryWriter w; {
w.write(format_str, args); MemoryWriter w;
std::fwrite(w.data(), 1, w.size(), f); w.write(format_str, args);
} std::fwrite(w.data(), 1, w.size(), f);
}
FMT_FUNC void print(CStringRef format_str, ArgList args) { FMT_FUNC void print(CStringRef format_str, ArgList args)
print(stdout, format_str, args); {
} print(stdout, format_str, args);
}
FMT_FUNC void print_colored(Color c, CStringRef format, ArgList args) { FMT_FUNC void print_colored(Color c, CStringRef format, ArgList args)
char escape[] = "\x1b[30m"; {
escape[3] = static_cast<char>('0' + c); char escape[] = "\x1b[30m";
std::fputs(escape, stdout); escape[3] = static_cast<char>('0' + c);
print(format, args); std::fputs(escape, stdout);
std::fputs(RESET_COLOR, stdout); print(format, args);
} std::fputs(RESET_COLOR, stdout);
}
template <typename Char>
void printf(BasicWriter<Char> &w, BasicCStringRef<Char> format, ArgList args);
FMT_FUNC int fprintf(std::FILE *f, CStringRef format, ArgList args) {
MemoryWriter w;
printf(w, format, args);
std::size_t size = w.size();
return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast<int>(size);
}
#ifndef FMT_HEADER_ONLY #ifndef FMT_HEADER_ONLY
template struct internal::BasicData<void>; template struct internal::BasicData<void>;
// Explicit instantiations for char. // Explicit instantiations for char.
template void internal::FixedBuffer<char>::grow(std::size_t); template void internal::FixedBuffer<char>::grow(std::size_t);
template void internal::ArgMap<char>::init(const ArgList &args); template void internal::ArgMap<char>::init(const ArgList &args);
template void PrintfFormatter<char>::format(CStringRef format); template int internal::CharTraits<char>::format_float(
char *buffer, std::size_t size, const char *format,
unsigned width, int precision, double value);
template int internal::CharTraits<char>::format_float( template int internal::CharTraits<char>::format_float(
char *buffer, std::size_t size, const char *format, char *buffer, std::size_t size, const char *format,
unsigned width, int precision, double value); unsigned width, int precision, long double value);
template int internal::CharTraits<char>::format_float( // Explicit instantiations for wchar_t.
char *buffer, std::size_t size, const char *format,
unsigned width, int precision, long double value);
// Explicit instantiations for wchar_t. template void internal::FixedBuffer<wchar_t>::grow(std::size_t);
template void internal::FixedBuffer<wchar_t>::grow(std::size_t); template void internal::ArgMap<wchar_t>::init(const ArgList &args);
template void internal::ArgMap<wchar_t>::init(const ArgList &args); template int internal::CharTraits<wchar_t>::format_float(
wchar_t *buffer, std::size_t size, const wchar_t *format,
unsigned width, int precision, double value);
template void PrintfFormatter<wchar_t>::format(WCStringRef format); template int internal::CharTraits<wchar_t>::format_float(
wchar_t *buffer, std::size_t size, const wchar_t *format,
template int internal::CharTraits<wchar_t>::format_float( unsigned width, int precision, long double value);
wchar_t *buffer, std::size_t size, const wchar_t *format,
unsigned width, int precision, double value);
template int internal::CharTraits<wchar_t>::format_float(
wchar_t *buffer, std::size_t size, const wchar_t *format,
unsigned width, int precision, long double value);
#endif // FMT_HEADER_ONLY #endif // FMT_HEADER_ONLY

File diff suppressed because it is too large Load Diff

View File

@ -11,25 +11,27 @@ For the license information refer to format.h.
namespace fmt { namespace fmt {
namespace internal { namespace internal {
FMT_FUNC void write(std::ostream &os, Writer &w) { FMT_FUNC void write(std::ostream &os, Writer &w)
const char *data = w.data(); {
typedef internal::MakeUnsigned<std::streamsize>::Type UnsignedStreamSize; const char *data = w.data();
UnsignedStreamSize size = w.size(); typedef internal::MakeUnsigned<std::streamsize>::Type UnsignedStreamSize;
UnsignedStreamSize max_size = UnsignedStreamSize size = w.size();
internal::to_unsigned((std::numeric_limits<std::streamsize>::max)()); UnsignedStreamSize max_size =
do { internal::to_unsigned((std::numeric_limits<std::streamsize>::max)());
UnsignedStreamSize n = size <= max_size ? size : max_size; do {
os.write(data, static_cast<std::streamsize>(n)); UnsignedStreamSize n = size <= max_size ? size : max_size;
data += n; os.write(data, static_cast<std::streamsize>(n));
size -= n; data += n;
} while (size != 0); size -= n;
} } while (size != 0);
} }
}
FMT_FUNC void print(std::ostream &os, CStringRef format_str, ArgList args) { FMT_FUNC void print(std::ostream &os, CStringRef format_str, ArgList args)
MemoryWriter w; {
w.write(format_str, args); MemoryWriter w;
internal::write(os, w); w.write(format_str, args);
} internal::write(os, w);
}
} // namespace fmt } // namespace fmt

View File

@ -11,104 +11,101 @@ For the license information refer to format.h.
#define FMT_OSTREAM_H_ #define FMT_OSTREAM_H_
// commented out by spdlog // commented out by spdlog
//#include "format.h" // #include "format.h"
#include <ostream> #include <ostream>
namespace fmt namespace fmt {
{
namespace internal namespace internal {
{
template <class Char> template <class Char>
class FormatBuf : public std::basic_streambuf<Char> class FormatBuf: public std::basic_streambuf<Char>
{ {
private: private:
typedef typename std::basic_streambuf<Char>::int_type int_type; typedef typename std::basic_streambuf<Char>::int_type int_type;
typedef typename std::basic_streambuf<Char>::traits_type traits_type; typedef typename std::basic_streambuf<Char>::traits_type traits_type;
Buffer<Char> &buffer_; Buffer<Char> &buffer_;
Char *start_; Char *start_;
public: public:
FormatBuf(Buffer<Char> &buffer) : buffer_(buffer), start_(&buffer[0]) FormatBuf(Buffer<Char> &buffer): buffer_(buffer), start_(&buffer[0])
{ {
this->setp(start_, start_ + buffer_.capacity()); this->setp(start_, start_ + buffer_.capacity());
} }
int_type overflow(int_type ch = traits_type::eof()) int_type overflow(int_type ch = traits_type::eof())
{ {
if (!traits_type::eq_int_type(ch, traits_type::eof())) if (!traits_type::eq_int_type(ch, traits_type::eof())) {
{ size_t buf_size = size();
size_t buf_size = size(); buffer_.resize(buf_size);
buffer_.resize(buf_size); buffer_.reserve(buf_size * 2);
buffer_.reserve(buf_size * 2);
start_ = &buffer_[0]; start_ = &buffer_[0];
start_[buf_size] = traits_type::to_char_type(ch); start_[buf_size] = traits_type::to_char_type(ch);
this->setp(start_ + buf_size + 1, start_ + buf_size * 2); this->setp(start_ + buf_size + 1, start_ + buf_size * 2);
} }
return ch; return ch;
} }
size_t size() const size_t size() const
{ {
return to_unsigned(this->pptr() - start_); return to_unsigned(this->pptr() - start_);
} }
}; };
Yes &convert(std::ostream &); Yes &convert(std::ostream &);
struct DummyStream : std::ostream struct DummyStream: std::ostream
{ {
DummyStream(); // Suppress a bogus warning in MSVC. DummyStream(); // Suppress a bogus warning in MSVC.
// Hide all operator<< overloads from std::ostream. // Hide all operator<< overloads from std::ostream.
void operator<<(Null<>); void operator<<(Null<>);
}; };
No &operator<<(std::ostream &, int); No &operator<<(std::ostream &, int);
template<typename T> template<typename T>
struct ConvertToIntImpl<T, true> struct ConvertToIntImpl<T, true>
{ {
// Convert to int only if T doesn't have an overloaded operator<<. // Convert to int only if T doesn't have an overloaded operator<<.
enum enum
{ {
value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No) value = sizeof(convert(get<DummyStream>() << get<T>())) == sizeof(No)
}; };
}; };
// Write the content of w to os. // Write the content of w to os.
void write(std::ostream &os, Writer &w); void write(std::ostream &os, Writer &w);
} // namespace internal } // namespace internal
// Formats a value. // Formats a value.
template <typename Char, typename ArgFormatter, typename T> template <typename Char, typename ArgFormatter, typename T>
void format_arg(BasicFormatter<Char, ArgFormatter> &f, void format_arg(BasicFormatter<Char, ArgFormatter> &f,
const Char *&format_str, const T &value) const Char *&format_str, const T &value)
{ {
internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer; internal::MemoryBuffer<Char, internal::INLINE_BUFFER_SIZE> buffer;
internal::FormatBuf<Char> format_buf(buffer); internal::FormatBuf<Char> format_buf(buffer);
std::basic_ostream<Char> output(&format_buf); std::basic_ostream<Char> output(&format_buf);
output << value; output << value;
BasicStringRef<Char> str(&buffer[0], format_buf.size()); BasicStringRef<Char> str(&buffer[0], format_buf.size());
typedef internal::MakeArg< BasicFormatter<Char> > MakeArg; typedef internal::MakeArg< BasicFormatter<Char> > MakeArg;
format_str = f.format(format_str, MakeArg(str)); format_str = f.format(format_str, MakeArg(str));
} }
/** /**
\rst \rst
Prints formatted data to the stream *os*. Prints formatted data to the stream *os*.
**Example**:: **Example**::
print(cerr, "Don't {}!", "panic"); print(cerr, "Don't {}!", "panic");
\endrst \endrst
*/ */
FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args); FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args);
FMT_VARIADIC(void, print, std::ostream &, CStringRef) FMT_VARIADIC(void, print, std::ostream &, CStringRef)
} // namespace fmt } // namespace fmt
#ifdef FMT_HEADER_ONLY #ifdef FMT_HEADER_ONLY

File diff suppressed because it is too large Load Diff