aboutsummaryrefslogtreecommitdiffstats
path: root/common/log.cc
diff options
context:
space:
mode:
Diffstat (limited to 'common/log.cc')
-rw-r--r--common/log.cc123
1 files changed, 32 insertions, 91 deletions
diff --git a/common/log.cc b/common/log.cc
index 6b2d6065..82e09fec 100644
--- a/common/log.cc
+++ b/common/log.cc
@@ -32,19 +32,14 @@ NEXTPNR_NAMESPACE_BEGIN
NPNR_NORETURN void logv_error(const char *format, va_list ap) NPNR_ATTRIBUTE(noreturn);
-std::vector<FILE *> log_files;
-std::vector<std::ostream *> log_streams;
-FILE *log_errfile = NULL;
+std::vector<std::pair<std::ostream *, LogLevel>> log_streams;
log_write_type log_write_function = nullptr;
-bool log_error_stderr = false;
-bool log_cmd_error_throw = false;
-bool log_quiet_warnings = false;
std::string log_last_error;
void (*log_error_atexit)() = NULL;
-// static bool next_print_log = false;
static int log_newline_count = 0;
+bool had_nonfatal_error = false;
std::string stringf(const char *fmt, ...)
{
@@ -88,7 +83,7 @@ std::string vstringf(const char *fmt, va_list ap)
return string;
}
-void logv(const char *format, va_list ap)
+void logv(const char *format, va_list ap, LogLevel level = LogLevel::LOG)
{
//
// Trim newlines from the beginning
@@ -108,90 +103,50 @@ void logv(const char *format, va_list ap)
else
log_newline_count = str.size() - nnl_pos - 1;
- for (auto f : log_files)
- fputs(str.c_str(), f);
-
for (auto f : log_streams)
- *f << str;
+ if (f.second <= level)
+ *f.first << str;
if (log_write_function)
log_write_function(str);
}
-void logv_info(const char *format, va_list ap)
+void log_with_level(LogLevel level, const char *format, ...)
{
- std::string message = vstringf(format, ap);
-
- log_always("Info: %s", message.c_str());
- log_flush();
+ va_list ap;
+ va_start(ap, format);
+ logv(format, ap, level);
+ va_end(ap);
}
-void logv_warning(const char *format, va_list ap)
+void logv_prefixed(const char *prefix, const char *format, va_list ap, LogLevel level)
{
std::string message = vstringf(format, ap);
- log_always("Warning: %s", message.c_str());
+ log_with_level(level, "%s%s", prefix, message.c_str());
log_flush();
}
-void logv_warning_noprefix(const char *format, va_list ap)
-{
- std::string message = vstringf(format, ap);
-
- log_always("%s", message.c_str());
-}
-
-void logv_error(const char *format, va_list ap)
-{
-#ifdef EMSCRIPTEN
- auto backup_log_files = log_files;
-#endif
-
- if (log_errfile != NULL)
- log_files.push_back(log_errfile);
-
- if (log_error_stderr)
- for (auto &f : log_files)
- if (f == stdout)
- f = stderr;
-
- log_last_error = vstringf(format, ap);
- log_always("ERROR: %s", log_last_error.c_str());
- log_flush();
-
- if (log_error_atexit)
- log_error_atexit();
-
-#ifdef EMSCRIPTEN
- log_files = backup_log_files;
-#endif
- throw log_execution_error_exception();
-}
-
void log_always(const char *format, ...)
{
va_list ap;
va_start(ap, format);
- logv(format, ap);
+ logv(format, ap, LogLevel::ALWAYS);
va_end(ap);
}
void log(const char *format, ...)
{
- if (log_quiet_warnings)
- return;
va_list ap;
va_start(ap, format);
- logv(format, ap);
+ logv(format, ap, LogLevel::LOG);
va_end(ap);
}
void log_info(const char *format, ...)
{
- if (log_quiet_warnings)
- return;
va_list ap;
va_start(ap, format);
- logv_info(format, ap);
+ logv_prefixed("Info: ", format, ap, LogLevel::INFO);
va_end(ap);
}
@@ -199,15 +154,7 @@ void log_warning(const char *format, ...)
{
va_list ap;
va_start(ap, format);
- logv_warning(format, ap);
- va_end(ap);
-}
-
-void log_warning_noprefix(const char *format, ...)
-{
- va_list ap;
- va_start(ap, format);
- logv_warning_noprefix(format, ap);
+ logv_prefixed("Warning: ", format, ap, LogLevel::WARNING);
va_end(ap);
}
@@ -215,41 +162,35 @@ void log_error(const char *format, ...)
{
va_list ap;
va_start(ap, format);
- logv_error(format, ap);
-}
-
-void log_cmd_error(const char *format, ...)
-{
- va_list ap;
- va_start(ap, format);
+ logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR);
- if (log_cmd_error_throw) {
- log_last_error = vstringf(format, ap);
- log_always("ERROR: %s", log_last_error.c_str());
- log_flush();
- throw log_cmd_error_exception();
- }
+ if (log_error_atexit)
+ log_error_atexit();
- logv_error(format, ap);
+ throw log_execution_error_exception();
}
void log_break()
{
- if (log_quiet_warnings)
- return;
if (log_newline_count < 2)
- log_always("\n");
+ log("\n");
if (log_newline_count < 2)
- log_always("\n");
+ log("\n");
}
-void log_flush()
+void log_nonfatal_error(const char *format, ...)
{
- for (auto f : log_files)
- fflush(f);
+ va_list ap;
+ va_start(ap, format);
+ logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR);
+ va_end(ap);
+ had_nonfatal_error = true;
+}
+void log_flush()
+{
for (auto f : log_streams)
- f->flush();
+ f.first->flush();
}
NEXTPNR_NAMESPACE_END