Fix #1675
This commit is contained in:
		@@ -11,6 +11,15 @@
 | 
				
			|||||||
#include <spdlog/pattern_formatter.h>
 | 
					#include <spdlog/pattern_formatter.h>
 | 
				
			||||||
#include <memory>
 | 
					#include <memory>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					// under windows using fwrite to non-binary stream results in \r\r\n (see issue #1675)
 | 
				
			||||||
 | 
					// so instead we use ::FileWrite
 | 
				
			||||||
 | 
					#include <spdlog/details/windows_include.h>
 | 
				
			||||||
 | 
					#include <fileapi.h> // WriteFile (..)
 | 
				
			||||||
 | 
					#include <io.h>      // _get_osfhandle(..)
 | 
				
			||||||
 | 
					#include <stdio.h>   // _fileno(..)
 | 
				
			||||||
 | 
					#endif               // WIN32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace spdlog {
 | 
					namespace spdlog {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace sinks {
 | 
					namespace sinks {
 | 
				
			||||||
@@ -20,7 +29,16 @@ SPDLOG_INLINE stdout_sink_base<ConsoleMutex>::stdout_sink_base(FILE *file)
 | 
				
			|||||||
    : mutex_(ConsoleMutex::mutex())
 | 
					    : mutex_(ConsoleMutex::mutex())
 | 
				
			||||||
    , file_(file)
 | 
					    , file_(file)
 | 
				
			||||||
    , formatter_(details::make_unique<spdlog::pattern_formatter>())
 | 
					    , formatter_(details::make_unique<spdlog::pattern_formatter>())
 | 
				
			||||||
{}
 | 
					{
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					    // get windows handle from the FILE* object
 | 
				
			||||||
 | 
					    handle_ = (HANDLE)::_get_osfhandle(::_fileno(file_));
 | 
				
			||||||
 | 
					    if (handle_ == INVALID_HANDLE_VALUE)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        throw_spdlog_ex("spdlog::stdout_sink_base: _get_osfhandle() failed", errno);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif // WIN32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename ConsoleMutex>
 | 
					template<typename ConsoleMutex>
 | 
				
			||||||
SPDLOG_INLINE void stdout_sink_base<ConsoleMutex>::log(const details::log_msg &msg)
 | 
					SPDLOG_INLINE void stdout_sink_base<ConsoleMutex>::log(const details::log_msg &msg)
 | 
				
			||||||
@@ -28,8 +46,14 @@ SPDLOG_INLINE void stdout_sink_base<ConsoleMutex>::log(const details::log_msg &m
 | 
				
			|||||||
    std::lock_guard<mutex_t> lock(mutex_);
 | 
					    std::lock_guard<mutex_t> lock(mutex_);
 | 
				
			||||||
    memory_buf_t formatted;
 | 
					    memory_buf_t formatted;
 | 
				
			||||||
    formatter_->format(msg, formatted);
 | 
					    formatter_->format(msg, formatted);
 | 
				
			||||||
    fwrite(formatted.data(), sizeof(char), formatted.size(), file_);
 | 
					#ifdef _WIN32
 | 
				
			||||||
    fflush(file_); // flush every line to terminal
 | 
					    auto size = static_cast<DWORD>(formatted.size());
 | 
				
			||||||
 | 
					    DWORD bytes_written = 0;
 | 
				
			||||||
 | 
					    ::WriteFile(handle_, formatted.data(), size, &bytes_written, nullptr);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    ::fwrite(formatted.data(), sizeof(char), formatted.size(), file_);
 | 
				
			||||||
 | 
					    ::fflush(file_); // flush every line to terminal
 | 
				
			||||||
 | 
					#endif // WIN32    
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename ConsoleMutex>
 | 
					template<typename ConsoleMutex>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@
 | 
				
			|||||||
#include <spdlog/details/synchronous_factory.h>
 | 
					#include <spdlog/details/synchronous_factory.h>
 | 
				
			||||||
#include <spdlog/sinks/sink.h>
 | 
					#include <spdlog/sinks/sink.h>
 | 
				
			||||||
#include <cstdio>
 | 
					#include <cstdio>
 | 
				
			||||||
 | 
					#include <spdlog/details/windows_include.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace spdlog {
 | 
					namespace spdlog {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,6 +37,9 @@ protected:
 | 
				
			|||||||
    mutex_t &mutex_;
 | 
					    mutex_t &mutex_;
 | 
				
			||||||
    FILE *file_;
 | 
					    FILE *file_;
 | 
				
			||||||
    std::unique_ptr<spdlog::formatter> formatter_;
 | 
					    std::unique_ptr<spdlog::formatter> formatter_;
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					    HANDLE handle_;    
 | 
				
			||||||
 | 
					#endif // WIN32
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename ConsoleMutex>
 | 
					template<typename ConsoleMutex>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user