From 6afa2994d50a223bc723d9380b9f330ee4bf37a9 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Thu, 28 Feb 2013 10:47:20 -0800 Subject: [PATCH] Allocate large enough buffer to make _ecvt_s happy. Swap the order of template parameters in TempFormatter for convenience. --- format.h | 14 +++++++------- format_test.cc | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/format.h b/format.h index fa73382f..543d345b 100644 --- a/format.h +++ b/format.h @@ -191,8 +191,8 @@ inline int SignBit(double value) { if (value < 0) return 1; if (value == value) return 0; int dec = 0, sign = 0; - char dummy; - _ecvt_s(&dummy, 1, value, 0, &dec, &sign); + char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail. + _ecvt_s(&buffer, sizeof(buffer), value, 0, &dec, &sign); return sign; } @@ -1155,7 +1155,7 @@ class NoAction { Objects of this class normally exist only as temporaries returned by one of the formatting functions which explains the name. */ -template +template class TempFormatter : public internal::ArgInserter { private: BasicFormatter formatter_; @@ -1232,8 +1232,8 @@ class TempFormatter : public internal::ArgInserter { See also `Format String Syntax`_. \endrst */ -inline TempFormatter Format(StringRef format) { - return TempFormatter(format); +inline TempFormatter<> Format(StringRef format) { + return TempFormatter<>(format); } // A formatting action that writes formatted output to stdout. @@ -1246,8 +1246,8 @@ struct Write { // Formats a string and prints it to stdout. // Example: // Print("Elapsed time: {0:.2f} seconds") << 1.23; -inline TempFormatter Print(StringRef format) { - return TempFormatter(format); +inline TempFormatter Print(StringRef format) { + return TempFormatter(format); } // Throws Exception(message) if format contains '}', otherwise throws diff --git a/format_test.cc b/format_test.cc index fff02860..c7c0b15a 100644 --- a/format_test.cc +++ b/format_test.cc @@ -1086,7 +1086,7 @@ struct CountCalls { TEST(TempFormatterTest, Action) { int num_calls = 0; { - fmt::TempFormatter af("test", CountCalls(num_calls)); + fmt::TempFormatter af("test", CountCalls(num_calls)); EXPECT_EQ(0, num_calls); } EXPECT_EQ(1, num_calls); @@ -1095,7 +1095,7 @@ TEST(TempFormatterTest, Action) { TEST(TempFormatterTest, ActionNotCalledOnError) { int num_calls = 0; { - typedef fmt::TempFormatter TestFormatter; + typedef fmt::TempFormatter TestFormatter; EXPECT_THROW(TestFormatter af("{0", CountCalls(num_calls)), FormatError); } EXPECT_EQ(0, num_calls); @@ -1108,8 +1108,8 @@ TEST(TempFormatterTest, ActionNotCalledOnError) { TEST(TempFormatterTest, ArgLifetime) { // The following code is for testing purposes only. It is a definite abuse // of the API and shouldn't be used in real applications. - const fmt::TempFormatter &af = fmt::Format("{0}"); - const_cast&>(af) << std::string("test"); + const fmt::TempFormatter<> &af = fmt::Format("{0}"); + const_cast&>(af) << std::string("test"); // String object passed as an argument to TempFormatter has // been destroyed, but ArgInserter dtor hasn't been called yet. // But that's OK since the Arg's dtor takes care of this and @@ -1128,8 +1128,8 @@ struct PrintError { } }; -fmt::TempFormatter ReportError(const char *format) { - return fmt::TempFormatter(format); +fmt::TempFormatter ReportError(const char *format) { + return fmt::TempFormatter(format); } TEST(TempFormatterTest, Examples) {