diff --git a/log.cpp b/log.cpp index ba58355..addf634 100644 --- a/log.cpp +++ b/log.cpp @@ -6,9 +6,10 @@ std::vector log_entries; -LogEntry::LogEntry(time_t time_, std::string message_) : time(time_), message(std::move(message_)) { +LogEntry::LogEntry(time_t time, std::string message_) : message(std::move(message_)) { size_t pos; + localtime_r(&time, &this->time); while ((pos = this->message.find('\n')) != std::string::npos) { this->message.replace(pos, 1, 1, ' '); } @@ -16,15 +17,14 @@ LogEntry::LogEntry(time_t time_, std::string message_) : time(time_), message(st std::string to_string(const LogEntry& entry) { - struct tm tm; char time_as_str[128] = {0}; - strftime(time_as_str, 127 * sizeof(char), "%c", localtime_r(&entry.time, &tm)); + strftime(time_as_str, 127 * sizeof(char), "%c", &entry.time); return std::string(1, '[') + time_as_str + "] " + entry.message; } void print_log(const LogEntry& entry) { char time_as_str[128] = {0}; - strftime(time_as_str, 127 * sizeof(char), "%c", localtime(&entry.time)); + strftime(time_as_str, 127 * sizeof(char), "%c", &entry.time); fprintf(stderr, "[%s] %s\n", time_as_str, entry.message.c_str()); } diff --git a/log.h b/log.h index a45e464..3b3e3dd 100644 --- a/log.h +++ b/log.h @@ -1,14 +1,15 @@ #pragma once +#include #include #include struct LogEntry { - time_t time; + struct tm time; std::string message; LogEntry() = default; - LogEntry(time_t time_, std::string message_); + LogEntry(time_t time, std::string message_); }; extern std::vector log_entries; diff --git a/logcat_entry.cpp b/logcat_entry.cpp index 297c508..6c5a6ae 100644 --- a/logcat_entry.cpp +++ b/logcat_entry.cpp @@ -70,8 +70,7 @@ static inline std::string rightpad(const std::string& str, size_t characters) { std::string to_string(const LogcatEntry& logcat_entry) { char logcat_style_time_as_str[32] = {0}; - struct tm tm; - strftime(logcat_style_time_as_str, 31 * sizeof(char), "%Y-%m-%d %H:%M:%S", localtime_r(&logcat_entry.time, &tm)); + strftime(logcat_style_time_as_str, 31 * sizeof(char), "%Y-%m-%d %H:%M:%S", &logcat_entry.time); return std::string(logcat_style_time_as_str) + ' ' + leftpad(logcat_entry.user.value_or(" "), 5) @@ -138,10 +137,11 @@ std::optional try_parse_logcat_entry(char* buf, size_t length, Buff if (matches[2].rm_so > -1 && matches[2].rm_eo > -1) { user = std::string(&buf[matches[2].rm_so], static_cast(matches[2].rm_eo - matches[2].rm_so)); } + // if pcre2 gives us negative offsets then i'll die LogcatEntry logcat_entry = { .buffer = buffer, - .time = to_long(&buf[matches[1].rm_so], &buf[matches[1].rm_eo]), + // time to be set at the end .user = std::move(user), .pid = to_unsigned_long_long(&buf[matches[3].rm_so], &buf[matches[3].rm_eo]), .tid = to_unsigned_long_long(&buf[matches[4].rm_so], &buf[matches[4].rm_eo]), @@ -149,6 +149,9 @@ std::optional try_parse_logcat_entry(char* buf, size_t length, Buff .tag = std::string(&buf[matches[6].rm_so], static_cast(matches[6].rm_eo - matches[6].rm_so)), .message = std::string(&buf[matches[7].rm_so], static_cast(matches[7].rm_eo - matches[7].rm_so)), }; + + time_t time = to_long(&buf[matches[1].rm_so], &buf[matches[1].rm_eo]); + localtime_r(&time, &logcat_entry.time); return std::move(logcat_entry); } diff --git a/logcat_entry.h b/logcat_entry.h index f1bc1be..ac31782 100644 --- a/logcat_entry.h +++ b/logcat_entry.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -27,7 +28,7 @@ enum class Priority { struct LogcatEntry { Buffer buffer; - time_t time; + struct tm time; std::optional user; size_t pid; size_t tid; diff --git a/windows/debug.cpp b/windows/debug.cpp index 4a2e482..5fa4461 100644 --- a/windows/debug.cpp +++ b/windows/debug.cpp @@ -52,27 +52,33 @@ void debug_window(LogcatThread& logcat_thread, LogcatEntries& logcat_entries) { ImGui::Separator(); if (ImGui::Button("Add test entry (w/ user)")) { - logcat_entries.push_back({ + LogcatEntry entry = { .buffer = Buffer::Main, - .time = time(nullptr), + // time to be set later .user = "blankie", .pid = 69, .tid = 420, .priority = Priority::Error, .tag = "blanket, inc.", .message = "Failed to make blanket", - }); + }; + time_t entry_time = time(nullptr); + localtime_r(&entry_time, &entry.time); + logcat_entries.push_back(std::move(entry)); } if (ImGui::Button("Add test entry (w/o user)")) { - logcat_entries.push_back({ + LogcatEntry entry = { .buffer = Buffer::Crash, - .time = time(nullptr), + // time to be set later .pid = 420, .tid = 69, .priority = Priority::Fatal, .tag = "blanket, inc.", .message = "Failed to invent blankets", - }); + }; + time_t entry_time = time(nullptr); + localtime_r(&entry_time, &entry.time); + logcat_entries.push_back(std::move(entry)); } ImGui::End(); diff --git a/windows/logs.cpp b/windows/logs.cpp index 6b1d585..4d74631 100644 --- a/windows/logs.cpp +++ b/windows/logs.cpp @@ -6,9 +6,8 @@ #include "logs.h" static inline void render_table_item_context_menu(const LogEntry& log_entry) { - struct tm tm; char time_as_str[128] = {0}; - strftime(time_as_str, 127 * sizeof(char), "%c", localtime_r(&log_entry.time, &tm)); + strftime(time_as_str, 127 * sizeof(char), "%c", &log_entry.time); ImGui::TextDisabled("[%s] %s", time_as_str, log_entry.message.c_str()); ImGui::Separator(); @@ -32,9 +31,8 @@ static inline void render_table_item(const LogEntry& log_entry, size_t log_entry ImGui::TableNextRow(); if (ImGui::TableSetColumnIndex(0)) { - struct tm tm; char time_as_str[128] = {0}; - strftime(time_as_str, 127 * sizeof(char), "%c", localtime_r(&log_entry.time, &tm)); + strftime(time_as_str, 127 * sizeof(char), "%c", &log_entry.time); ImGui::TextUnformatted(time_as_str); table_item_popup(); diff --git a/windows/main.cpp b/windows/main.cpp index 27845bb..7c8ab57 100644 --- a/windows/main.cpp +++ b/windows/main.cpp @@ -19,9 +19,8 @@ static inline void render_table_item_context_menu(const LogcatEntry& logcat_entr if (ImGui::Selectable("Copy")) ImGui::SetClipboardText(text.c_str()); if (ImGui::Selectable("Copy Time")) { - struct tm tm; char time_as_str[128] = {0}; - strftime(time_as_str, 127 * sizeof(char), "%c", localtime_r(&logcat_entry.time, &tm)); + strftime(time_as_str, 127 * sizeof(char), "%c", &logcat_entry.time); ImGui::SetClipboardText(time_as_str); } if (ImGui::Selectable("Copy User", false, logcat_entry.user ? 0 : ImGuiSelectableFlags_Disabled)) { @@ -48,9 +47,8 @@ static inline void render_table_item(const LogcatEntry& logcat_entry, size_t log ImGui::TableNextRow(); if (ImGui::TableSetColumnIndex(0)) { - struct tm tm; char time_as_str[128] = {0}; - strftime(time_as_str, 127 * sizeof(char), "%c", localtime_r(&logcat_entry.time, &tm)); + strftime(time_as_str, 127 * sizeof(char), "%c", &logcat_entry.time); ImGui::TextUnformatted(time_as_str); table_item_popup();