diff options
author | Jack <66967891+ASpoonPlaysGames@users.noreply.github.com> | 2023-12-27 00:32:01 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-27 01:32:01 +0100 |
commit | f5ab6fb5e8be7b73e6003d4145081d5e0c0ce287 (patch) | |
tree | 90f2c6a4885dbd181799e2325cf33588697674e1 /primedev/thirdparty/spdlog/sinks/stdout_sinks-inl.h | |
parent | bb8ed59f6891b1196c5f5bbe7346cd171c8215fa (diff) | |
download | NorthstarLauncher-f5ab6fb5e8be7b73e6003d4145081d5e0c0ce287.tar.gz NorthstarLauncher-f5ab6fb5e8be7b73e6003d4145081d5e0c0ce287.zip |
Folder restructuring from primedev (#624)v1.21.2-rc3v1.21.2
Copies of over the primedev folder structure for easier cherry-picking of further changes
Co-authored-by: F1F7Y <filip.bartos07@proton.me>
Diffstat (limited to 'primedev/thirdparty/spdlog/sinks/stdout_sinks-inl.h')
-rw-r--r-- | primedev/thirdparty/spdlog/sinks/stdout_sinks-inl.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/primedev/thirdparty/spdlog/sinks/stdout_sinks-inl.h b/primedev/thirdparty/spdlog/sinks/stdout_sinks-inl.h new file mode 100644 index 00000000..25192607 --- /dev/null +++ b/primedev/thirdparty/spdlog/sinks/stdout_sinks-inl.h @@ -0,0 +1,135 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#ifndef SPDLOG_HEADER_ONLY +#include <spdlog/sinks/stdout_sinks.h> +#endif + +#include <spdlog/details/console_globals.h> +#include <spdlog/pattern_formatter.h> +#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 sinks { + +template<typename ConsoleMutex> +SPDLOG_INLINE stdout_sink_base<ConsoleMutex>::stdout_sink_base(FILE *file) + : mutex_(ConsoleMutex::mutex()) + , file_(file) + , formatter_(details::make_unique<spdlog::pattern_formatter>()) +{ +#ifdef _WIN32 + // get windows handle from the FILE* object + + handle_ = (HANDLE)::_get_osfhandle(::_fileno(file_)); + + // don't throw to support cases where no console is attached, + // and let the log method to do nothing if (handle_ == INVALID_HANDLE_VALUE). + // throw only if non stdout/stderr target is requested (probably regular file and not console). + if (handle_ == INVALID_HANDLE_VALUE && file != stdout && file != stderr) + { + throw_spdlog_ex("spdlog::stdout_sink_base: _get_osfhandle() failed", errno); + } +#endif // WIN32 +} + +template<typename ConsoleMutex> +SPDLOG_INLINE void stdout_sink_base<ConsoleMutex>::log(const details::log_msg &msg) +{ +#ifdef _WIN32 + if (handle_ == INVALID_HANDLE_VALUE) + { + return; + } + std::lock_guard<mutex_t> lock(mutex_); + memory_buf_t formatted; + formatter_->format(msg, formatted); + ::fflush(file_); // flush in case there is somthing in this file_ already + auto size = static_cast<DWORD>(formatted.size()); + DWORD bytes_written = 0; + bool ok = ::WriteFile(handle_, formatted.data(), size, &bytes_written, nullptr) != 0; + if (!ok) + { + throw_spdlog_ex("stdout_sink_base: WriteFile() failed. GetLastError(): " + std::to_string(::GetLastError())); + } +#else + std::lock_guard<mutex_t> lock(mutex_); + memory_buf_t formatted; + formatter_->format(msg, formatted); + ::fwrite(formatted.data(), sizeof(char), formatted.size(), file_); + ::fflush(file_); // flush every line to terminal +#endif // WIN32 +} + +template<typename ConsoleMutex> +SPDLOG_INLINE void stdout_sink_base<ConsoleMutex>::flush() +{ + std::lock_guard<mutex_t> lock(mutex_); + fflush(file_); +} + +template<typename ConsoleMutex> +SPDLOG_INLINE void stdout_sink_base<ConsoleMutex>::set_pattern(const std::string &pattern) +{ + std::lock_guard<mutex_t> lock(mutex_); + formatter_ = std::unique_ptr<spdlog::formatter>(new pattern_formatter(pattern)); +} + +template<typename ConsoleMutex> +SPDLOG_INLINE void stdout_sink_base<ConsoleMutex>::set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter) +{ + std::lock_guard<mutex_t> lock(mutex_); + formatter_ = std::move(sink_formatter); +} + +// stdout sink +template<typename ConsoleMutex> +SPDLOG_INLINE stdout_sink<ConsoleMutex>::stdout_sink() + : stdout_sink_base<ConsoleMutex>(stdout) +{} + +// stderr sink +template<typename ConsoleMutex> +SPDLOG_INLINE stderr_sink<ConsoleMutex>::stderr_sink() + : stdout_sink_base<ConsoleMutex>(stderr) +{} + +} // namespace sinks + +// factory methods +template<typename Factory> +SPDLOG_INLINE std::shared_ptr<logger> stdout_logger_mt(const std::string &logger_name) +{ + return Factory::template create<sinks::stdout_sink_mt>(logger_name); +} + +template<typename Factory> +SPDLOG_INLINE std::shared_ptr<logger> stdout_logger_st(const std::string &logger_name) +{ + return Factory::template create<sinks::stdout_sink_st>(logger_name); +} + +template<typename Factory> +SPDLOG_INLINE std::shared_ptr<logger> stderr_logger_mt(const std::string &logger_name) +{ + return Factory::template create<sinks::stderr_sink_mt>(logger_name); +} + +template<typename Factory> +SPDLOG_INLINE std::shared_ptr<logger> stderr_logger_st(const std::string &logger_name) +{ + return Factory::template create<sinks::stderr_sink_st>(logger_name); +} +} // namespace spdlog |