From c0ca99483c1c0966305ced16a9a7e00e4c5ecce0 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Tue, 20 Jun 2017 04:41:58 +0200 Subject: [PATCH] Store command history when terminating with an error --- kernel/driver.cc | 43 ++++++++++++++++++++++++++----------------- kernel/log.cc | 4 ++++ kernel/log.h | 1 + 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/kernel/driver.cc b/kernel/driver.cc index 7d714d079..0d331712c 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -119,6 +119,29 @@ const char *prompt() #else /* EMSCRIPTEN */ +#ifdef YOSYS_ENABLE_READLINE +int history_offset = 0; +std::string history_file; +#endif + +void yosys_atexit() +{ +#ifdef YOSYS_ENABLE_READLINE + if (!history_file.empty()) { + if (history_offset > 0) { + history_truncate_file(history_file.c_str(), 100); + append_history(where_history() - history_offset, history_file.c_str()); + } else + write_history(history_file.c_str()); + } + + clear_history(); + HIST_ENTRY **hist_list = history_list(); + if (hist_list != NULL) + free(hist_list); +#endif +} + int main(int argc, char **argv) { std::string frontend_command = "auto"; @@ -137,8 +160,6 @@ int main(int argc, char **argv) bool mode_q = false; #ifdef YOSYS_ENABLE_READLINE - int history_offset = 0; - std::string history_file; if (getenv("HOME") != NULL) { history_file = stringf("%s/.yosys_history", getenv("HOME")); read_history(history_file.c_str()); @@ -379,6 +400,7 @@ int main(int argc, char **argv) log_hasher = new SHA1; yosys_setup(); + log_error_atexit = yosys_atexit; for (auto &fn : plugin_filenames) load_plugin(fn, {}); @@ -509,25 +531,12 @@ int main(int argc, char **argv) } #endif + yosys_atexit(); + memhasher_off(); if (call_abort) abort(); -#ifdef YOSYS_ENABLE_READLINE - if (!history_file.empty()) { - if (history_offset > 0) { - history_truncate_file(history_file.c_str(), 100); - append_history(where_history() - history_offset, history_file.c_str()); - } else - write_history(history_file.c_str()); - } - - clear_history(); - HIST_ENTRY **hist_list = history_list(); - if (hist_list != NULL) - free(hist_list); -#endif - log_flush(); #if defined(_MSC_VER) _exit(0); diff --git a/kernel/log.cc b/kernel/log.cc index c7240d540..3768922cd 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -52,6 +52,7 @@ bool log_cmd_error_throw = false; bool log_quiet_warnings = false; int log_verbose_level; string log_last_error; +void (*log_error_atexit)() = NULL; vector header_count; pool log_id_cache; @@ -244,6 +245,9 @@ void logv_error(const char *format, va_list ap) log("ERROR: %s", log_last_error.c_str()); log_flush(); + if (log_error_atexit) + log_error_atexit(); + #ifdef EMSCRIPTEN log_files = backup_log_files; throw 0; diff --git a/kernel/log.h b/kernel/log.h index 34c309016..6cae4431d 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -60,6 +60,7 @@ extern bool log_cmd_error_throw; extern bool log_quiet_warnings; extern int log_verbose_level; extern string log_last_error; +extern void (*log_error_atexit)(); void logv(const char *format, va_list ap); void logv_header(RTLIL::Design *design, const char *format, va_list ap); -- 2.30.2