diff --git a/include/extern.h b/include/extern.h index ba6164be2..3c74bfda0 100644 --- a/include/extern.h +++ b/include/extern.h @@ -27,7 +27,10 @@ E void NDECL(newgame); E void FDECL(welcome, (BOOLEAN_P)); E time_t NDECL(get_realtime); E int FDECL(argcheck, (int, char **, enum earlyarg)); +E void NDECL(fuzzer_start); +E void NDECL(fuzzer_stop); E void NDECL(fuzzer_toggle); +E void VDECL(fuzzer_log, (int, const char *, ...)) PRINTF_F(2, 3); E void NDECL(fuzzer_check); E void NDECL(fuzzer_auto_start); E boolean FDECL(fuzzer_msg_history, (const char *)); @@ -1940,9 +1943,6 @@ E void VDECL(raw_printf, (const char *, ...)) PRINTF_F(1, 2); E void VDECL(impossible, (const char *, ...)) PRINTF_F(1, 2); E void VDECL(config_error_add, (const char *, ...)) PRINTF_F(1, 2); E void FDECL(nhassert_failed, (const char *, int)); -E void NDECL(fuzzer_start); -E void NDECL(fuzzer_stop); -E void VDECL(fuzzer_log, (int, const char *, ...)) PRINTF_F(2, 3); /* ### polyself.c ### */ diff --git a/src/allmain.c b/src/allmain.c index b834f0a8c..957c47a44 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -4,6 +4,7 @@ /* NetHack may be freely redistributed. See license for details. */ /* various code that was replicated in *main.c */ +#define NEED_VARARGS #include "hack.h" #include @@ -926,6 +927,38 @@ const char *opts; return; } +static FILE * g_fuzzer_log_file = NULL; +static int g_fuzzer_log_level = LOG_MINIMAL; + +/* fuzzer_start() starts the fuzzer opening the fuzzer log file */ +void +fuzzer_start() +{ + if (!iflags.debug_fuzzer) { + const char * fq_replay; + + iflags.debug_fuzzer = TRUE; + iflags.fuzzer_auto_start = FALSE; + + nhassert(g_fuzzer_log_file == NULL); + fq_replay = fqname("fuzzer.log", SAVEPREFIX, 0); + + g_fuzzer_log_file = fopen(fq_replay, "w"); + } +} + +/* fuzzer_stop() stops the fuzzer and close the fuzzer log file */ +void +fuzzer_stop() +{ + if (iflags.debug_fuzzer) { + if(g_fuzzer_log_file != NULL) { + fclose(g_fuzzer_log_file); + g_fuzzer_log_file = NULL; + } + } +} + /* fuzzer_toggle() toggles fuzzer state */ void fuzzer_toggle() @@ -936,6 +969,29 @@ fuzzer_toggle() fuzzer_start(); } +/* fuzzer_log() is used to place messages in the file 'fuzzer.log'. This + * log is the primary tool for monitoring fuzzer activity and tracking down + * issues that the fuzzer is able to reproduce. + */ +void +fuzzer_log +VA_DECL2(int, level, const char *, str) +{ + VA_START(str); + VA_INIT(str, char *); + + if (!g_fuzzer_log_file) + return; + + if (iflags.verbose_logging_start != 0 && moves >= iflags.verbose_logging_start) + g_fuzzer_log_level = LOG_VERBOSE; + + if (level <= g_fuzzer_log_level) + Vfprintf(g_fuzzer_log_file, str, VA_ARGS); + + VA_END(); +} + /* fuzzer_check() is called prior to rhack(0) to allow the fuzzer to * check if it should stop and to allow it to reseed the game. */ @@ -944,8 +1000,6 @@ fuzzer_check() { if (iflags.debug_fuzzer) { - unsigned long seed; - if (moves >= iflags.fuzzer_stop_and_save) { iflags.fuzzer_saving = TRUE; dosave0(); @@ -954,7 +1008,7 @@ fuzzer_check() nh_terminate(EXIT_SUCCESS); } - seed = rul(); + unsigned long seed = rul(); set_random(seed, rn2); fuzzer_log(LOG_MINIMAL, "SEED:%ld:%lu\n", moves, seed); @@ -968,10 +1022,9 @@ void fuzzer_auto_start() { if (iflags.fuzzer_auto_start) { - unsigned long seed; nhassert(!iflags.debug_fuzzer); fuzzer_start(); - seed = rul(); + unsigned long seed = rul(); set_random(seed, rn2); fuzzer_log(LOG_MINIMAL, "START:%ld:%lu\n", moves, seed); } diff --git a/src/pline.c b/src/pline.c index 03654355e..91e825963 100644 --- a/src/pline.c +++ b/src/pline.c @@ -599,61 +599,4 @@ nhassert_failed(filepath, line) impossible("nhassert failed in file '%s' at line %d", filename, line); } -static FILE * g_fuzzer_log_file = NULL; -static int g_fuzzer_log_level = LOG_MINIMAL; - -/* fuzzer_start() starts the fuzzer opening the fuzzer log file */ -void -fuzzer_start() -{ - if (!iflags.debug_fuzzer) { - const char * fq_replay; - - iflags.debug_fuzzer = TRUE; - iflags.fuzzer_auto_start = FALSE; - - nhassert(g_fuzzer_log_file == NULL); - fq_replay = fqname("fuzzer.log", SAVEPREFIX, 0); - - g_fuzzer_log_file = fopen(fq_replay, "w"); - } -} - -/* fuzzer_stop() stops the fuzzer and close the fuzzer log file */ -void -fuzzer_stop() -{ - if (iflags.debug_fuzzer) { - if(g_fuzzer_log_file != NULL) { - fclose(g_fuzzer_log_file); - g_fuzzer_log_file = NULL; - } - } -} - -/* fuzzer_log() is used to place messages in the file 'fuzzer.log'. This - * log is the primary tool for monitoring fuzzer activity and tracking down - * issues that the fuzzer is able to reproduce. - */ -void -fuzzer_log -VA_DECL2(int, lvl, const char *, str) -{ - VA_START(str); - VA_INIT(str, char *); - - if (!g_fuzzer_log_file) - return; - - if (iflags.verbose_logging_start != 0 && - moves >= iflags.verbose_logging_start) - g_fuzzer_log_level = LOG_VERBOSE; - - if (lvl <= g_fuzzer_log_level) - Vfprintf(g_fuzzer_log_file, str, VA_ARGS); - - VA_END(); -} - - /*pline.c*/