diff --git a/wpiutil/src/main/native/cpp/FileLogger.cpp b/wpiutil/src/main/native/cpp/FileLogger.cpp index 742d57e9281..6964e706b42 100644 --- a/wpiutil/src/main/native/cpp/FileLogger.cpp +++ b/wpiutil/src/main/native/cpp/FileLogger.cpp @@ -4,6 +4,21 @@ #include "wpi/FileLogger.h" +#ifdef __linux__ +#include +#include +#include +#endif + +#include +#include +#include +#include + +#include + +#include "wpi/StringExtras.h" + namespace wpi { FileLogger::FileLogger(std::string_view file, std::function callback) @@ -26,6 +41,25 @@ FileLogger::FileLogger(std::string_view file, #endif { } +FileLogger::FileLogger(std::string_view file, log::DataLog& log, + std::string_view key) + : FileLogger(file, [entry = log.Start(key, "string"), + buf = wpi::SmallVector{}, + &log](std::string_view data) mutable { + if (!wpi::contains(data, "\n")) { + buf.append(data.begin(), data.end()); + return; + } + std::string_view left; + std::string_view right; + std::string combinedData = fmt::format("{}{}", buf.data(), data); + buf.clear(); + do { + std::tie(left, right) = wpi::rsplit(data, "\n"); + log.AppendString(entry, left, 0); + } while (wpi::contains(right, "\n")); + buf.append(right.begin(), right.end()); + }) {} FileLogger::FileLogger(FileLogger&& other) #ifdef __linux__ : m_fileHandle{std::exchange(other.m_fileHandle, -1)}, diff --git a/wpiutil/src/main/native/include/wpi/FileLogger.h b/wpiutil/src/main/native/include/wpi/FileLogger.h index 49e7163f9b2..55d1f804e0c 100644 --- a/wpiutil/src/main/native/include/wpi/FileLogger.h +++ b/wpiutil/src/main/native/include/wpi/FileLogger.h @@ -4,20 +4,11 @@ #pragma once -#ifdef __linux__ -#include -#include -#include -#endif - #include #include #include -#include #include "wpi/DataLog.h" -#include "wpi/SmallVector.h" -#include "wpi/StringExtras.h" namespace wpi { /** @@ -45,15 +36,7 @@ class FileLogger { * @param log A data log. * @param key The log key to append data to. */ - FileLogger(std::string_view file, log::DataLog& log, std::string_view key) - : FileLogger(file, [entry = log.Start(key, "string"), - &log](std::string_view data) { - wpi::SmallVector parts; - wpi::split(data, parts, "\n"); - for (auto line : parts) { - log.AppendString(entry, line, 0); - } - }) {} + FileLogger(std::string_view file, log::DataLog& log, std::string_view key); FileLogger(FileLogger&& other); FileLogger& operator=(FileLogger&& rhs); ~FileLogger();