From f6d4d79c51d3d16646a5533ca1ac730be479cb9d Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Sun, 2 Jun 2024 22:08:17 +0800 Subject: [PATCH] :sparkles: add windows code page manager --- src/ast_dumper.h | 20 ++++---------------- src/nasal_gc.cpp | 32 ++++++++++++++++---------------- src/util/util.h | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 32 deletions(-) diff --git a/src/ast_dumper.h b/src/ast_dumper.h index d9516a9..3855509 100644 --- a/src/ast_dumper.h +++ b/src/ast_dumper.h @@ -1,10 +1,7 @@ #pragma once #include "ast_visitor.h" - -#ifdef _WIN32 -#include -#endif +#include "util/util.h" #include #include @@ -93,19 +90,10 @@ public: public: void dump(code_block* root) { -#ifdef _WIN32 - // store previous code page - auto cp = GetConsoleOutputCP(); - // allow 65001 code page - SetConsoleOutputCP(CP_UTF8); -#endif - + util::windows_code_page_manager wcpm; + wcpm.set_utf8_output(); root->accept(this); - -#ifdef _WIN32 - // restore previous code page - SetConsoleOutputCP(cp); -#endif + wcpm.restore_code_page(); } }; diff --git a/src/nasal_gc.cpp b/src/nasal_gc.cpp index dea4acf..4875ff1 100644 --- a/src/nasal_gc.cpp +++ b/src/nasal_gc.cpp @@ -301,17 +301,17 @@ void gc::info() const { for(usize i = 0; i(gcnt[i]); - std::clog << " " << left << setw(indent) << setfill(' ') << name[i]; + std::clog << "| " << left << setw(indent) << setfill(' ') << name[i]; std::clog << " | " << left << setw(indent) << setfill(' ') << gcnt[i]; std::clog << " | " << left << setw(indent) << setfill(' ') << acnt[i]; std::clog << " | " << left << setw(indent) << setfill(' ') << size[i]; - std::clog << "\n"; + std::clog << " |\n"; } - std::clog << indent_string << "\n"; + std::clog << "+" << indent_string << "+\n"; auto den = std::chrono::high_resolution_clock::duration::period::den; - std::clog << " " << left << setw(indent) << setfill(' ') << "detail"; + std::clog << "| " << left << setw(indent) << setfill(' ') << "detail"; std::clog << " | " << left << setw(indent) << setfill(' ') << "time spend"; std::clog << " | " << left << setw(indent) << setfill('x') << "x"; std::clog << " | " << left << setw(indent) << setfill('x') << "x"; - std::clog << "\n" << indent_string << "\n"; + std::clog << " |\n+" << indent_string << "+\n"; - std::clog << " " << left << setw(indent) << setfill(' ') << "gc time"; + std::clog << "| " << left << setw(indent) << setfill(' ') << "gc time"; std::clog << " | " << worktime*1.0/den*1000 << " ms\n"; - std::clog << " " << left << setw(indent) << setfill(' ') << "avg time"; + std::clog << "| " << left << setw(indent) << setfill(' ') << "avg time"; std::clog << " | " << worktime*1.0/den*1000/total << " ms\n"; - std::clog << " " << left << setw(indent) << setfill(' ') << "max gc"; + std::clog << "| " << left << setw(indent) << setfill(' ') << "max gc"; std::clog << " | " << max_time*1.0/den*1000 << " ms\n"; - std::clog << " " << left << setw(indent) << setfill(' ') << "max mark"; + std::clog << "| " << left << setw(indent) << setfill(' ') << "max mark"; std::clog << " | " << max_mark_time*1.0/den*1000 << " ms\n"; - std::clog << " " << left << setw(indent) << setfill(' ') << "max sweep"; + std::clog << "| " << left << setw(indent) << setfill(' ') << "max sweep"; std::clog << " | " << max_sweep_time*1.0/den*1000 << " ms\n"; - std::clog << " " << left << setw(indent) << setfill(' ') << "concurrent"; + std::clog << "| " << left << setw(indent) << setfill(' ') << "concurrent"; std::clog << " | " << (flag_concurrent_mark_triggered? "true\n":"false\n"); std::clog << last_line << "\n"; } diff --git a/src/util/util.h b/src/util/util.h index 4ab673e..99d7cdd 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -2,6 +2,10 @@ #include "nasal.h" +#ifdef _WIN32 +#include +#endif + #include #include @@ -38,4 +42,32 @@ f64 dec_to_f64(const char*); f64 str_to_num(const char*); +class windows_code_page_manager { +private: + u32 code_page; + +public: + windows_code_page_manager() { +#ifdef _WIN32 + code_page = GetConsoleOutputCP(); +#endif + } + + void set_utf8_output() { +#ifdef _WIN32 + // store previous code page + code_page = GetConsoleOutputCP(); + // allow 65001 code page + SetConsoleOutputCP(CP_UTF8); +#endif + } + + void restore_code_page() { +#ifdef _WIN32 + // restore previous code page + SetConsoleOutputCP(code_page); +#endif + } +}; + } \ No newline at end of file