mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	Store command history when terminating with an error
This commit is contained in:
		
							parent
							
								
									f6421c83a2
								
							
						
					
					
						commit
						c0ca99483c
					
				
					 3 changed files with 31 additions and 17 deletions
				
			
		|  | @ -119,6 +119,29 @@ const char *prompt() | ||||||
| 
 | 
 | ||||||
| #else /* EMSCRIPTEN */ | #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) | int main(int argc, char **argv) | ||||||
| { | { | ||||||
| 	std::string frontend_command = "auto"; | 	std::string frontend_command = "auto"; | ||||||
|  | @ -137,8 +160,6 @@ int main(int argc, char **argv) | ||||||
| 	bool mode_q = false; | 	bool mode_q = false; | ||||||
| 
 | 
 | ||||||
| #ifdef YOSYS_ENABLE_READLINE | #ifdef YOSYS_ENABLE_READLINE | ||||||
| 	int history_offset = 0; |  | ||||||
| 	std::string history_file; |  | ||||||
| 	if (getenv("HOME") != NULL) { | 	if (getenv("HOME") != NULL) { | ||||||
| 		history_file = stringf("%s/.yosys_history", getenv("HOME")); | 		history_file = stringf("%s/.yosys_history", getenv("HOME")); | ||||||
| 		read_history(history_file.c_str()); | 		read_history(history_file.c_str()); | ||||||
|  | @ -379,6 +400,7 @@ int main(int argc, char **argv) | ||||||
| 		log_hasher = new SHA1; | 		log_hasher = new SHA1; | ||||||
| 
 | 
 | ||||||
| 	yosys_setup(); | 	yosys_setup(); | ||||||
|  | 	log_error_atexit = yosys_atexit; | ||||||
| 
 | 
 | ||||||
| 	for (auto &fn : plugin_filenames) | 	for (auto &fn : plugin_filenames) | ||||||
| 		load_plugin(fn, {}); | 		load_plugin(fn, {}); | ||||||
|  | @ -509,25 +531,12 @@ int main(int argc, char **argv) | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | 	yosys_atexit(); | ||||||
|  | 
 | ||||||
| 	memhasher_off(); | 	memhasher_off(); | ||||||
| 	if (call_abort) | 	if (call_abort) | ||||||
| 		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(); | 	log_flush(); | ||||||
| #if defined(_MSC_VER) | #if defined(_MSC_VER) | ||||||
| 	_exit(0); | 	_exit(0); | ||||||
|  |  | ||||||
|  | @ -52,6 +52,7 @@ bool log_cmd_error_throw = false; | ||||||
| bool log_quiet_warnings = false; | bool log_quiet_warnings = false; | ||||||
| int log_verbose_level; | int log_verbose_level; | ||||||
| string log_last_error; | string log_last_error; | ||||||
|  | void (*log_error_atexit)() = NULL; | ||||||
| 
 | 
 | ||||||
| vector<int> header_count; | vector<int> header_count; | ||||||
| pool<RTLIL::IdString> log_id_cache; | pool<RTLIL::IdString> 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("ERROR: %s", log_last_error.c_str()); | ||||||
| 	log_flush(); | 	log_flush(); | ||||||
| 
 | 
 | ||||||
|  | 	if (log_error_atexit) | ||||||
|  | 		log_error_atexit(); | ||||||
|  | 
 | ||||||
| #ifdef EMSCRIPTEN | #ifdef EMSCRIPTEN | ||||||
| 	log_files = backup_log_files; | 	log_files = backup_log_files; | ||||||
| 	throw 0; | 	throw 0; | ||||||
|  |  | ||||||
|  | @ -60,6 +60,7 @@ extern bool log_cmd_error_throw; | ||||||
| extern bool log_quiet_warnings; | extern bool log_quiet_warnings; | ||||||
| extern int log_verbose_level; | extern int log_verbose_level; | ||||||
| extern string log_last_error; | extern string log_last_error; | ||||||
|  | extern void (*log_error_atexit)(); | ||||||
| 
 | 
 | ||||||
| void logv(const char *format, va_list ap); | void logv(const char *format, va_list ap); | ||||||
| void logv_header(RTLIL::Design *design, const char *format, va_list ap); | void logv_header(RTLIL::Design *design, const char *format, va_list ap); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue