Files
jak-project/goalc/logger/Logger.cpp
T
water111 2d11e44eaf Compiler Cleanup and Documentation (#54)
* start cleanup

* fix typos

* fix syntax highlighting in doc

* lots of documentation updates

* clean and add tests

* more documentation and more error messages

* more document and try building kernel differently
2020-09-24 17:19:23 -04:00

70 lines
1.3 KiB
C++

#include <stdexcept>
#include "Logger.h"
void Logger::close() {
if (fp) {
fclose(fp);
fp = nullptr;
}
}
void Logger::set_file(std::string filename) {
if (fp) {
fclose(fp);
}
fp = fopen(filename.c_str(), "w");
if (!fp) {
throw std::runtime_error("invalid file name " + filename + " in logger");
}
}
void Logger::log(LoggerMessageKind kind, const char* format, ...) {
FILE* dest = nullptr;
auto& settings = config[kind];
switch (settings.kind) {
case LOG_STDERR:
dest = stderr;
break;
case LOG_STDOUT:
dest = stdout;
break;
case LOG_IGNORE:
dest = nullptr;
break;
case LOG_FILE:
dest = fp;
break;
default:
throw std::runtime_error("unknown log destination in log");
}
if (!dest)
return;
if (!settings.prefix.empty()) {
fprintf(dest, "%s", settings.prefix.c_str());
}
if (settings.color != COLOR_NORMAL) {
const char* color_codes[] = {"", "[0;31m", "[0;32m", "[0;36m"};
printf("\033%s", color_codes[settings.color]);
}
va_list arglist;
va_start(arglist, format);
vfprintf(dest, format, arglist);
va_end(arglist);
if (settings.color != COLOR_NORMAL) {
printf("\033[0m");
fflush(stdout);
}
// todo, does this make things slow?
if (settings.kind == LOG_FILE) {
fflush(fp);
}
}
Logger gLogger;