summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNagi5Yeq <wu@x-nagi.com>2020-06-01 15:35:07 +0800
committerNagi5Yeq <wu@x-nagi.com>2020-06-01 15:35:07 +0800
commitf90115fba35887aea8d4064b57f4909cd6937134 (patch)
tree026130ea8c58e5f3ae2e65769d87d2c69b76acb0
parent31d35de96576d2cddc134cdd0646ce4966052ae3 (diff)
color support
-rw-r--r--CMakeLists.txt1
-rw-r--r--Color.cc45
-rw-r--r--Color.hh21
-rw-r--r--Lexer.l4
-rw-r--r--Log.cc16
-rw-r--r--main.cc4
6 files changed, 81 insertions, 10 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f403ace..f1dbd46 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,6 +7,7 @@ include_directories(${LLVM_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})
set(PCC_SOURCE
+ Color.cc
Context.cc
Driver.cc
Log.cc
diff --git a/Color.cc b/Color.cc
new file mode 100644
index 0000000..55fa3d5
--- /dev/null
+++ b/Color.cc
@@ -0,0 +1,45 @@
+#ifdef _MSC_VER
+#include <Windows.h>
+#endif
+
+#include <map>
+
+#include "Color.hh"
+
+namespace pcc {
+#if _MSC_VER
+static const std::map<Color, WORD> ColorMap = {
+ {Color::BLACK, 0},
+ {Color::RED, FOREGROUND_INTENSITY | FOREGROUND_RED},
+ {Color::GREEN, FOREGROUND_INTENSITY | FOREGROUND_GREEN},
+ {Color::BLUE, FOREGROUND_INTENSITY | FOREGROUND_BLUE},
+ {Color::YELLOW, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN},
+ {Color::CYAN, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE},
+ {Color::MAGENTA, FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED},
+ {Color::WHITE, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN |
+ FOREGROUND_BLUE},
+ {Color::DEFAULT, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE}};
+#else
+static const std::map<Color, const char*> ColorMap = {
+ {Color::BLACK, "\e[30;1m"}, {Color::RED, "\e[31;1m"},
+ {Color::GREEN, "\e[32;1m"}, {Color::BLUE, "\e[34;1m"},
+ {Color::YELLOW, "\e[33;1m"}, {Color::CYAN, "\e[36;1m"},
+ {Color::MAGENTA, "\e[35;1m"}, {Color::WHITE, "\e[37;1m"},
+ {Color::DEFAULT, "\e[0m"}};
+#endif // _MSC_VER
+
+std::ostream& operator<<(std::ostream& out, Color color) {
+#ifdef _MSC_VER
+ HANDLE h = GetStdHandle(STD_ERROR_HANDLE);
+ CONSOLE_SCREEN_BUFFER_INFO info;
+ GetConsoleScreenBufferInfo(h, &info);
+ WORD attr = info.wAttributes;
+ attr &= ~(FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN |
+ FOREGROUND_BLUE);
+ SetConsoleTextAttribute(h, attr | ColorMap.at(color));
+#else
+ out << ColorMap.at(color);
+#endif // _MSC_VER
+ return out;
+}
+} // namespace pcc
diff --git a/Color.hh b/Color.hh
new file mode 100644
index 0000000..91804d2
--- /dev/null
+++ b/Color.hh
@@ -0,0 +1,21 @@
+#ifndef PCC_COLOR_HH
+#define PCC_COLOR_HH
+
+#include <iostream>
+
+namespace pcc {
+enum class Color {
+ BLACK,
+ RED,
+ BLUE,
+ GREEN,
+ YELLOW,
+ CYAN,
+ MAGENTA,
+ WHITE,
+ DEFAULT
+};
+
+std::ostream& operator<<(std::ostream& out, Color color);
+} // namespace pcc
+#endif // !PCC_COLOR_HH
diff --git a/Lexer.l b/Lexer.l
index 9f63e79..caaf43d 100644
--- a/Lexer.l
+++ b/Lexer.l
@@ -168,7 +168,7 @@ comment {comment1}|{comment2}|{comment3}
{comment} {}
. {
- pcc::Log(pcc::PCC_ERROR, "Unrecognized token \"%s\"", yytext);
+ pcc::Log(pcc::PCC_ERROR, "unrecognized token \"%s\"", yytext);
}
<<EOF>> {return Parser::make_FILE_END(loc);}
@@ -180,7 +180,7 @@ int Driver::StartLexer(std::string& filename) {
yy_flex_debug = (GetLogLevel()==LogLevel::PCC_DEBUG);
yyin = std::fopen(filename.c_str(), "r");
if (yyin == NULL) {
- Log(LogLevel::PCC_ERROR, "Failed to open file %s", filename.c_str());
+ Log(LogLevel::PCC_ERROR, "failed to open file %s", filename.c_str());
return -1;
}
return 0;
diff --git a/Log.cc b/Log.cc
index 765c9e8..f08cc05 100644
--- a/Log.cc
+++ b/Log.cc
@@ -1,28 +1,32 @@
+#include <iostream>
#include <string>
+#include "Color.hh"
#include "Log.hh"
namespace pcc {
void Log(LogLevel level, const char* format, ...) {
+ char buf[1024];
va_list va;
va_start(va, format);
if (GetLogLevel() <= level) {
+ std::cerr << GetExecutableName() << ": ";
switch (level) {
case PCC_ERROR:
- std::fprintf(stderr, "[ERROR] ");
+ std::cerr << Color::RED << "error: ";
break;
case PCC_WARNING:
- std::fprintf(stderr, "[WARNING] ");
+ std::cerr << Color::YELLOW << "warning: ";
break;
case PCC_INFO:
- std::fprintf(stderr, "[INFO] ");
+ std::cerr << Color::CYAN << "info: ";
break;
case PCC_DEBUG:
- std::fprintf(stderr, "[DEBUG] ");
+ std::cerr << Color::GREEN << "remark: ";
break;
}
- std::vfprintf(stderr, format, va);
- std::fputc('\n', stderr);
+ std::vsnprintf(buf, sizeof(buf), format, va);
+ std::cerr << Color::WHITE << buf << Color::DEFAULT << std::endl;
}
va_end(va);
}
diff --git a/main.cc b/main.cc
index a010bc4..54255bf 100644
--- a/main.cc
+++ b/main.cc
@@ -57,7 +57,7 @@ int main(int argc, char* argv[]) {
}
break;
default:
- pcc::Log(pcc::PCC_ERROR, "Unknown option");
+ pcc::Log(pcc::PCC_ERROR, "unknown option");
pcc::ShowHelp();
}
}
@@ -88,7 +88,7 @@ int main(int argc, char* argv[]) {
llvm::DataLayout layout = machine->createDataLayout();
if (optind >= argc) {
- pcc::Log(pcc::PCC_ERROR, "No input file specified");
+ pcc::Log(pcc::PCC_ERROR, "no input file specified");
return -1;
}
if (!OutputFileName.empty() && optind != argc - 1) {