Fix windows build

This commit is contained in:
Victor Zverovich
2017-02-17 06:38:53 -08:00
parent 87b691d80c
commit e022c21ddc
3 changed files with 23 additions and 20 deletions

View File

@ -341,16 +341,16 @@ FMT_FUNC int internal::UTF16ToUTF8::convert(WStringRef s) {
FMT_FUNC void WindowsError::init( FMT_FUNC void WindowsError::init(
int err_code, CStringRef format_str, args args) { int err_code, CStringRef format_str, args args) {
error_code_ = err_code; error_code_ = err_code;
MemoryWriter w; internal::MemoryBuffer<char> buffer;
internal::format_windows_error(w, err_code, vformat(format_str, args)); internal::format_windows_error(buffer, err_code, vformat(format_str, args));
std::runtime_error &base = *this; std::runtime_error &base = *this;
base = std::runtime_error(w.str()); base = std::runtime_error(to_string(buffer));
} }
FMT_FUNC void internal::format_windows_error( FMT_FUNC void internal::format_windows_error(
writer &out, int error_code, StringRef message) FMT_NOEXCEPT { buffer &out, int error_code, StringRef message) FMT_NOEXCEPT {
FMT_TRY { FMT_TRY {
MemoryBuffer<wchar_t, INLINE_BUFFER_SIZE> buffer; MemoryBuffer<wchar_t> buffer;
buffer.resize(INLINE_BUFFER_SIZE); buffer.resize(INLINE_BUFFER_SIZE);
for (;;) { for (;;) {
wchar_t *system_message = &buffer[0]; wchar_t *system_message = &buffer[0];
@ -361,9 +361,10 @@ FMT_FUNC void internal::format_windows_error(
if (result != 0) { if (result != 0) {
UTF16ToUTF8 utf8_message; UTF16ToUTF8 utf8_message;
if (utf8_message.convert(system_message) == ERROR_SUCCESS) { if (utf8_message.convert(system_message) == ERROR_SUCCESS) {
out.write(message); basic_writer<char> w(out);
out.write(": "); w.write(message);
out.write(utf8_message); w.write(": ");
w.write(utf8_message);
return; return;
} }
break; break;

View File

@ -279,11 +279,11 @@ TEST(FileTest, Size) {
EXPECT_GE(f.size(), 0); EXPECT_GE(f.size(), 0);
EXPECT_EQ(content.size(), static_cast<fmt::ULongLong>(f.size())); EXPECT_EQ(content.size(), static_cast<fmt::ULongLong>(f.size()));
#ifdef _WIN32 #ifdef _WIN32
fmt::MemoryWriter message; fmt::internal::MemoryBuffer<char> message;
fmt::internal::format_windows_error( fmt::internal::format_windows_error(
message, ERROR_ACCESS_DENIED, "cannot get file size"); message, ERROR_ACCESS_DENIED, "cannot get file size");
fstat_sim = ERROR; fstat_sim = ERROR;
EXPECT_THROW_MSG(f.size(), fmt::WindowsError, message.str()); EXPECT_THROW_MSG(f.size(), fmt::WindowsError, fmt::to_string(message));
fstat_sim = NONE; fstat_sim = NONE;
#else #else
f.close(); f.close();

View File

@ -667,7 +667,7 @@ template <typename Converter, typename Char>
void check_utf_conversion_error( void check_utf_conversion_error(
const char *message, const char *message,
fmt::BasicStringRef<Char> str = fmt::BasicStringRef<Char>(0, 0)) { fmt::BasicStringRef<Char> str = fmt::BasicStringRef<Char>(0, 0)) {
fmt::MemoryWriter out; fmt::internal::MemoryBuffer<char> out;
fmt::internal::format_windows_error(out, ERROR_INVALID_PARAMETER, message); fmt::internal::format_windows_error(out, ERROR_INVALID_PARAMETER, message);
fmt::SystemError error(0, ""); fmt::SystemError error(0, "");
try { try {
@ -676,7 +676,7 @@ void check_utf_conversion_error(
error = e; error = e;
} }
EXPECT_EQ(ERROR_INVALID_PARAMETER, error.error_code()); EXPECT_EQ(ERROR_INVALID_PARAMETER, error.error_code());
EXPECT_EQ(out.str(), error.what()); EXPECT_EQ(fmt::to_string(out), error.what());
} }
TEST(UtilTest, UTF16ToUTF8Error) { TEST(UtilTest, UTF16ToUTF8Error) {
@ -752,16 +752,17 @@ TEST(UtilTest, FormatWindowsError) {
reinterpret_cast<LPWSTR>(&message), 0, 0); reinterpret_cast<LPWSTR>(&message), 0, 0);
fmt::internal::UTF16ToUTF8 utf8_message(message); fmt::internal::UTF16ToUTF8 utf8_message(message);
LocalFree(message); LocalFree(message);
fmt::MemoryWriter actual_message; fmt::internal::MemoryBuffer<char> actual_message;
fmt::internal::format_windows_error( fmt::internal::format_windows_error(
actual_message, ERROR_FILE_EXISTS, "test"); actual_message, ERROR_FILE_EXISTS, "test");
EXPECT_EQ(fmt::format("test: {}", utf8_message.str()), EXPECT_EQ(fmt::format("test: {}", utf8_message.str()),
actual_message.str()); fmt::to_string(actual_message));
actual_message.clear(); actual_message.clear();
fmt::internal::format_windows_error( fmt::internal::format_windows_error(
actual_message, ERROR_FILE_EXISTS, actual_message, ERROR_FILE_EXISTS,
fmt::StringRef(0, std::numeric_limits<size_t>::max())); fmt::StringRef(0, std::numeric_limits<size_t>::max()));
EXPECT_EQ(fmt::format("error {}", ERROR_FILE_EXISTS), actual_message.str()); EXPECT_EQ(fmt::format("error {}", ERROR_FILE_EXISTS),
fmt::to_string(actual_message));
} }
TEST(UtilTest, FormatLongWindowsError) { TEST(UtilTest, FormatLongWindowsError) {
@ -778,11 +779,11 @@ TEST(UtilTest, FormatLongWindowsError) {
} }
fmt::internal::UTF16ToUTF8 utf8_message(message); fmt::internal::UTF16ToUTF8 utf8_message(message);
LocalFree(message); LocalFree(message);
fmt::MemoryWriter actual_message; fmt::internal::MemoryBuffer<char> actual_message;
fmt::internal::format_windows_error( fmt::internal::format_windows_error(
actual_message, provisioning_not_allowed, "test"); actual_message, provisioning_not_allowed, "test");
EXPECT_EQ(fmt::format("test: {}", utf8_message.str()), EXPECT_EQ(fmt::format("test: {}", utf8_message.str()),
actual_message.str()); fmt::to_string(actual_message));
} }
TEST(UtilTest, WindowsError) { TEST(UtilTest, WindowsError) {
@ -791,11 +792,12 @@ TEST(UtilTest, WindowsError) {
} }
TEST(UtilTest, ReportWindowsError) { TEST(UtilTest, ReportWindowsError) {
fmt::MemoryWriter out; fmt::internal::MemoryBuffer<char> out;
fmt::internal::format_windows_error(out, ERROR_FILE_EXISTS, "test error"); fmt::internal::format_windows_error(out, ERROR_FILE_EXISTS, "test error");
out.write('\n'); out.push_back('\n');
EXPECT_WRITE(stderr, EXPECT_WRITE(stderr,
fmt::report_windows_error(ERROR_FILE_EXISTS, "test error"), out.str()); fmt::report_windows_error(ERROR_FILE_EXISTS, "test error"),
fmt::to_string(out));
} }
#endif // _WIN32 #endif // _WIN32